«

»

1月 19

一些简单的论坛往来

被吞了233,直接开主题贴再发一遍。。。

这是一个有关于BiliLoca以及一些在Linux实现Bilibili本地化的讨论帖(真爱电脑,远离Adobe Flash) @AncientLysine

也希望其他吧友能够给出一些意见,谢谢

(首先感动。。。这年头给Linux编方便程序的人不多了。。。好评!!!谢大神)

在您给出的GitHub里,愣是没找到编译方法。。。难道是我太弱。。。求如何编译,Linux x64 Ubuntu/Fedora/Mint/Porteus/…,难道不是用make?没看见makefile啊。。。求指点

还有我一看scr目录瞬间觉得这个程序好复杂。。。个人觉得是不是不用这么复杂。。。至少在Linux下可以用更简单的方法。。。(以下纯属个人意见):
-------------------------------------
首先解析可以用Flvcd解析,然后之间处理Flvcd解析完成的HTML的代码找里面的视屏地址

然后下载可以用Axel进行,一个命令多线下载,我一般用 -n5 5线程

至于弹幕下载可以用 “http://blog.sina.com.cn/s/blog_58c506600100utap.html” 给出的方法,随便试了一下貌似可行,wget就行了,这个不用多线下

然后播放可以用MPlayer进行,自带Ass等弹幕(明明是字幕)功能

(这里就有问题了,貌似MPlayer不支持XML弹幕,求大神能不能直接告诉我怎么转成Ass之类的方法,在源码里翻了半天各种看不懂…,谢谢!)

(B站没了弹幕真是一点也不欢乐,求转换方法。。。这样就能在我下方的Bash Script里加弹幕功能了)
-------------------------------------
于是乎我有一个自己变得Bash Script专门来集成这中间所有的过程(除了没有弹幕)
#!/bin/bash
case $1 in d)m=”echo mplayer -fs”;shift;;p)mplayer -fs ls;exit;;a)m=”$2″;shift 2;;*)m=”mplayer -fs”;;esac;n=0;for t in $@; do if [ ${#t} -gt 6 ];then C=1;N=${t:6:4};t=${t:0:6};while [ $N -gt $C ];do d+=’http://www.flvcd.com/parse.php?format=&kw=http%3A%2F%2Fwww.bilibili.tv%2Fvideo%2Fav‘$t’%2Findex_’$C’.html&sbt=%BF%AA%CA%BCGO%21 ‘;let C+=1;done;else d+=’http://www.flvcd.com/parse.php?format=&kw=http%3A%2F%2Fwww.bilibili.tv%2Fvideo%2Fav‘$t’%2F ‘;fi;done;for t in $d;do wget $t -OB&>/dev/null;N=sed -n '/br>/,/br>/p' B|tr '"' '\n'|grep p:|grep -v '>'|sed '$d';for C in $N;do axel -n8 -o$n $C&>/dev/null&if [ $n = 0 ];then p=$!;fi;let n+=1;done;done;(while [ $n != 0 ];do n=ps|grep axel|wc -l;echo -en “\033[s\033[1;78f$n\033[u”;done)&N=0;while [ $n -gt $N ];do m+=” $N”;let N+=1;done;wait $p;$m
-------------------------------------
有点乱,好吧我整理一下

#!/bin/bash
case $1 in #处理不同的模式
d) #Download模式,只下载不播放,最后会输出用于播放的命令
m=”echo mplayer -fs”;
shift;;
p) #Play模式,用于播放“Download”下载的视频,不过最好还是直接用Download给出的命令
mplayer -fs ls;
exit;;
a) #ABC模式,自己来写播放命令,例如写 “mplayer” 会不全屏的播放(默认全屏),“mplayer -fs”和没写模式没区别
m=”$2″;
shift 2;;
*) #没认出来什么模式,视为没写模式
m=”mplayer -fs”;;
esac; #到此模式部分处理完成
n=0; #初始化计数器
for t in $@; #对所有Argument(av号+(p数+1))进行For循环, 得到所有下载地址
do if [ ${#t} -gt 6 ]; #如果是正常小于6位AV号那就不处理,否则的话就是写了(分P数+1)在后面(比如说总共2P就写3在后面如1234563)
then C=1;
N=${t:6:4};
t=${t:0:6};
while [ $N -gt $C ]; # 对每一个Part进行For循环
do d+=’http://www.flvcd.com/parse.php?format=&kw=http%3A%2F%2Fwww.bilibili.tv%2Fvideo%2Fav‘$t’%2Findex_’$C’.html&sbt=%BF%AA%CA%BCGO%21 ‘;
let C+=1;
done; #每一个Part的For循环完了
else d+=’http://www.flvcd.com/parse.php?format=&kw=http%3A%2F%2Fwww.bilibili.tv%2Fvideo%2Fav‘$t’%2F ‘;
fi;
done; #得到了所有的Part的地址
for t in $d; #开始解析所有视频
do wget $t -OB&>/dev/null;N=sed -n '/br>/,/br>/p' B|tr '"' '\n'|grep p:|grep -v '>'|sed '$d'; ##用FLVCD解析
for C in $N; #下载解析到的每一个Part的所有自动分P(6分钟)
do axel -n8 -o$n $C&>/dev/null& # 用 “&” 结尾来多线下载所有的P
if [ $n = 0 ];then p=$!;fi;let n+=1; #记录下第1个视频的第1个Part的第1个自动分P的下载进程的id
done;
done; #到这儿为止所有的P都开始下载了
(while [ $n != 0 ];do n=ps|grep axel|wc -l;echo -en “\033[s\033[1;78f$n\033[u”;done)& #一个小插件在终端的右上角显示还有几个P没下完,0或什么都没有就是都下完了,这是你可以关无线网开关了
N=0;while [ $n -gt $N ];do m+=” $N”;let N+=1;done;wait $p;$m #等第1个视频的第1个Part的第1个自动分P下完开始播放
-------------------------------------
顺便贴上使用方法: (这个script叫“B”,大写) B (d/p/a) (cmd@a) [avNum+(PCount+1)]

d: 在Download模式下只下载不播放,最后会给出播放整个视屏的命令

p: 在Play模式下只播放不下载,适用于当你错失D模式给出的命令时,这是你不用输入任何av号了,直接“B p”
a: 在ABC模式下可以自定义播放命令,例如输入”B a mplayer XXXXXX”可以用非全屏的方式关看,跟高级的功能请RTFSC(Read The F**king Source Code)
【avNum+(PCount+1)】:例如“av917506”有总共3个P,你想看所有的三个P,只需使用 “B 9175064” (7位数字,最后一个数字是3+1的意思)
-------------------------------------
至于播放时的快捷键,具体请“man mplayer”或“mplayer --help”。以下列举几个简单的快捷键
“ ”(空格),播放暂停
”(回车)”,放下一Part
“Esc,q”,退出播放
“9,0”,(左右小括号的位置),音量
”【,】“ (左右中括号),播放速度(可以三倍速播放哟…)
“o” (opq的o),开关屏显
“左右箭头”,快进快退
”f”,退出全屏
“。。。”(忘记了,键盘左上角部分):视频缩放
-------------------------------------
至于UI,我觉得Linux用户不至于水到没有UI就用不了,Linux用户也不需要特别的UI,就让它用命令行的方式会方便很多

至于弹幕屏蔽,我们可以使用正!则!表!达!式!(优越中。。。),这个在命令行下也是很容易直接实现的,只需要额外一个Filter就行了

至于发弹幕。。。这个,比较复杂,我们只考虑简单的问题。。。

这样写的话Dependency也少了很多,像我那种Live OS的Porteus,超迷你Linux的Puppy甚至没有X server的Linux(纯粹一黑屏命令行Linux)都可以正常使用(当前这个Linux版本我没有lib×××用不了)

(神马你不知道MPlayer可以通过直接渲染到/dev/fb0的fbdev来在没有X server的情况下照常运行?明明是一个命令行黑屏,可突然开始看B站了!)

(配合W3M,Lynx这些终网页端浏览器这个甚至可以做到没有X server上B站,看B站!《== 胡说!终端根本不能显示中文! 《== 不要在意那些细节。。。)
-------------------------------------
大神觉得这个怎么样,我是觉得挺省资源的,现在就差利用好MPlayer的字幕功能了,求XML to Ass方法!谢谢!

也希望其他吧友能给出回复!

———–

 

同病相怜 把我的办法扔过来参考:

(以下全都是开源软件。。。)

http://www.cnbeining.com/?p=330
自卖自夸。

Biligrab(呃,我这人不大会起名。。。),弹幕和视频都能下载,自动合并,封装成MP4。(为啥要MP4?因为我还有个别的东西。。。)

流程简单,参考了ACDown、Bilibili助手等的代码:
尝试API获取cid和视频名称、分P名称等信息(如失败,抓网页找cid,再没有我也没辙了,aid猜cid这办法太神棍了)-API抓下载地址(如失败,抓flvcd找下载地址,再没有我也没辙了,因为不知道vid,所以不能用A站的科技)-写个list,aria2c 16线程下载-写个文件,ffmpeg concate,封装MP4,收工。

然后就是两个咱封装的播放项目:
https://github.com/superwbd/Mukioplayer-Py-Mac
(Flash实现,明白了吧)
https://github.com/superwbd/ABPlayerHTML5-Py–nix
(HTML5实现,跑起来不错,但是不能跑的时候还是需要Mukioplayer接手)

readme写的明白,不多说了。等研究明白了再看看能不能实现AcPlay,因为复杂程度增加很多。。

XML2ASS?
两个实现:
https://danmu2ass.codeplex.com/
.NET的
https://github.com/muzuiget/niconvert
Python的
具体不了解了,因为没有这个需求。。。

嘛还需要啥呢?
需要更多的开发者吧。。。这圈子真够小的。。。

 

——–

好的我们折腾了半天成功的把一个高级的XML文件打成了最低级的SRT格式,哈哈哈哈哈哈。。。现在终于能看弹幕啦!

附上Bash Script:

chromium-browser http://comment.bilibili.tv/wget http://www.bilibili.tv/video/av$1 -O-|gzip -cd|tr , '\n'|tr '&' '\n'|grep cid|sed 's:[^0-9]::g'.xml&mousepad S&n=0;for t in wget 'http://www.flvcd.com/parse.php?format=&kw=http%3A%2F%2Fwww.bilibili.tv%2Fvideo%2Fav'$1%2F -O-|sed -n '/br>/,/br>/p'|tr '"' '\n'|grep p:|grep -v '>'|sed '$d';do axel -n5 -o$n $t&let n+=1;done;sed ‘s:<d p=”‘ S|sort -n>s;T=(sed 's:\([0-9]*\).*:\1:' s);C=(tr '<' '\n'<s|tr '>' '\n'|grep -P '[\x80-\xFF]');x=-1;c=0;b=0;t=0;l=mplayer -novideo -ao null -frames 0 -identify 0|grep ttimestamp:|sed s:[^0-9]::g;for((i=0;i<${#T[@]};i++));do let n=${T[$i]}-$b;if [ $n -gt $l ];then let b+=$l;let t+=1;c=0;x=-1;n=0;l=mplayer -novideo -ao null -frames 0 -identify $t|grep ttimestamp:|sed s:[^0-9]::g;fi;if [ $n -gt $x ];then echo>>$t.srt;x=$n;echo $c>>$t.srt;let ta=$x/3600;let tb=$x%3600/60;let tc=$x%60;echo -n “$ta:$tb:$tc,000–>”>>$t.srt;let tc+=2;echo $ta:$tb:$tc,000>>$t.srt;let c+=1;fi;echo ${C[$i]}>>$t.srt;done;mplayer -subcp utf-8 -font ‘WenQuanYi Micro Hei’ -subfont-text-scale 2 ls|sort -n;

神马?太乱了?好吧,我就来解释一遍(再过2小时就是起床时间了,,,)

chromium-browser http://comment.bilibili.tv/wget http://www.bilibili.tv/video/av$1 -O-|gzip -cd|tr , '\n'|tr '&' '\n'|grep cid|sed 's:[^0-9]::g'.xml&
mousepad S&

n=0

for t in wget 'http://www.flvcd.com/parse.php?format=&kw=http%3A%2F%2Fwww.bilibili.tv%2Fvideo%2Fav'$1%2F -O-|sed -n '/br>/,/br>/p'|tr '"' '\n'|grep p:|grep -v '>'|sed '$d';do axel -n5 -o$n $t&let n+=1;done;

sed ‘s:<d p=”‘ S|sort -n>s;

T=(sed 's:\([0-9]*\).*:\1:' s);
C=(tr '<' '\n'<s|tr '>' '\n'|grep -P '[\x80-\xFF]');

x=-1;
c=0;
b=0;
t=0;
l=mplayer -novideo -ao null -frames 0 -identify 0|grep ttimestamp:|sed s:[^0-9]::g;

for((i=0;i<${#T[@]};i++));do let n=${T[$i]}-$b;if [ $n -gt $l ];then let b+=$l;let t+=1;c=0;x=-1;n=0;l=mplayer -novideo -ao null -frames 0 -identify $t|grep ttimestamp:|sed s:[^0-9]::g;fi;if [ $n -gt $x ];then echo>>$t.srt;x=$n;echo $c>>$t.srt;let ta=$x/3600;let tb=$x%3600/60;let tc=$x%60;echo -n “$ta:$tb:$tc,000–>”>>$t.srt;let tc+=2;echo $ta:$tb:$tc,000>>$t.srt;let c+=1;fi;echo ${C[$i]}>>$t.srt;done;

mplayer -subcp utf-8 -font ‘WenQuanYi Micro Hei’ -subfont-text-scale 2 ls|sort -n;

(我会告诉我懒得解释了吗?)

那么就这样了。。。算了还是说一下那坨最长的吧,我主要做的就是在提取XML文件中的时间和弹幕内容后(其余数据忽略),跟据分P长度来吧完整的弹幕文件分配补偿给每个分P,把所有集中在一秒内的弹幕和并在一起(不同行)写到字幕文件里去。每个弹幕出现至少1秒至多2秒

发现弹幕不正常?好的恭喜你你必须修改那个 ‘WenQuanYi Micro Hei’ 成你电脑了有的”中文“字体。。。

最后的”2“是字体大小,大约是整数吧。。。

 

 

@ZisIsNotZis

容我挨个具体说明一下。
—————-
1。这个是我目前面临的问题,为什么我用wget下载下来的XML文件都是乱码。。。(地址绝对没错),而用Chromium输入那个地址就能得到文字内容呢。。。我也没看见您用特别的方式处理XML文件,这让我很费解。。。

gzip压缩惹的祸。一开始我也没想到这点,然后也是乱码。
看第77行:
os.system(‘curl -o “‘+filename+’.xml” –compressed http://comment.bilibili.tv/‘+cid+’.xml’)

–compressed:解开gzip压缩。之前想手工转换,后来发现还不如这么傻瓜化解决呢。

—————

2。 第二个问题还是关于XML的。。。(问题这么多)我貌似没看见有对XML文件的特殊处理,那个文件是不是到输出“xml should be ready”那边的时候就已经处理完了?那那个弹幕是怎么播放的呢?播放器直接支持?还是什么其他的

是又不是。。。看你如何定义“处理”了。实际上,对原始文件数据,我唯一的处理是gzip解压,之后不做其他处理。弹幕播放用我上面提到的软件(我自己封装的那2个)。直接支持,因为这些就是专门的弹幕播放器。

—————

3。 因为不知道ffmepg是干嘛的,我最后一部分基本上没看懂。。。这个文件到底是被播放了呢,还是被下载了呢?那些弹幕有没有被播放呢,还是说就是下载了,还是内嵌进去了(这个狠)?

129行:
os.system(‘ffmpeg -f concat -i ff.txt -c copy “‘+filename+'”.mp4’)

请看一下ffmpeg文档关于Concat的用法。Concat是直接连接文件,不重新转码。(恩,我一直准备把ffmpeg的文档整个翻译了,但是自己做起来太累,只能一点点弄。。。https://github.com/superwbd/ffmpeg-all-translate 如果谁有兴趣,随时fork跑然后发pull request啊。)

Biligrab只起到下载作用。播放是播放软件做的,虽然我在写Biligrab的时候考虑到为后面的播放打基础。

————–

顺便吐槽几句。。。吐槽1:目前我那个程序的下载弹幕部分因为问题1的问题的解决方法是:让Chrome打开那个XML页面,打开一个Mousepad/Leafpad之类的,然后让用户复制黏贴进去。。。

无论是curl,还是wget,都有解压的选项。只不过考虑到有些机器可能没有wget(OSX你懂的。。。这毕竟不是真linux),所以变成了curl。

————-

吐槽2:关于您上面说的“hope it never happens”,我觉得直接用FLVCD就行了呀,既然有这么方便的工具,为什么还要自己想办法解析呢。。。又要随着时间更新,又要处理其他网站播放器的问题什么的我个人是觉得太麻烦了啦,毕竟Unix的系统的相当大一个奥义就是“一环套一环”啊(FIFO,PIPE,虚拟文件系统,接口,stdin/out神马的)。总之就是我觉得要尽量发挥FLVCD存在的价值,,,

Biligrab 0.1的时候,我直接用了FLVCD,根本不去考虑API。因为这个API怎么调用我死活看不懂。。。
之所以只作为备选:
1)这个是专门解析BIlibili的,所以我首选使用API,还可以起到一部分黑科技的效果。(详情见Bilibili助手的代码)
2)API给出的地址是随地理位置不同、网络环境不同而不同的。Bilibili有自己的CDN服务器,位置我已经找到2处了,在中国大陆。sina使用的CDN是蓝汛的,全球布站,但是不一定全球都缓存。因为咱人在加拿大,如果用FLVCD解析,由于FLVCD本身在大陆,基本解析的结果都是B站自己的CDN,速度会受到一定影响。如果是API,对于海外,就会给出sina的CDN,对速度帮助很大。(其实是因为去年光缆漏光导致我刚写好这东西就跑不起来了。。。于是只能又写一个)
3)速度快啊。API的返回肯定字数少啊。

FLVCD?如果有API,我还是会尽可能使用API的解析。因为我的速度考虑是海外的。。。

————-

吐槽3:我总觉得这个程序的速度不给力,不够强劲。。。为什么呢,首先虽然弹幕下载部分和视频下载部分并不冲突,不需要有先后顺序之分,可以并行,然后每一个视屏的分P之间也不一定需要有严格的顺序。我的想法就是一起下,下的快,校园网带宽无限。。。有的时候我所有下载任务线程数能超过500个(每个6分钟8线程)

我首先说一点,咱不知道国内的校园网具体是什么样的,所有了解都是查资料得到的。。。

之所以不这么用,有几点考虑,我复现了,不知你是不是也遇到过:
1)我这里的校园网每天限制下行流量8G上行1G,如果连接数太多,恐怕会招致网管喝茶。。。虽然我平时做事情会挂上SSH,但是还是不想麻烦。
2)aria2c的下载是如此,容我再研究一下。
3)(重点)在特别极端情况下,我发现,蓝汛的CDN有时cache有问题,造成下载文件不完整。由于怀疑是反攻击策略,为了规避,暂时先这么用。

———-

最后是其实第一个视屏下完后就可以开始放了,其他的部分可以在放第一P的时候下完

由于我使用专门的弹幕播放器,这个是没法实现的。。。

——–
用下载而不是Stream的好处就是绝对不会有卡顿和6分钟诅咒之类的东西,进度条顺畅,想怎么跳OP怎么跳OP。不过带来的就是一丁点的准备时间。所有还是摇尽快开始播放。。。

嘛。。。因为我网速没什么压力,所以等几分钟也没什么障碍。。。

——–

我看着这个源码觉得Python编程好简单(但代码好长。。。)(大一,正好学Python),不过出于我有强迫症,我一般只会用2种语言:最直接,最方便,最短的Bash,和最快的C++。。。

同大一,只科班学过简单Python,所以就用它了。。。Bash还没学。。。

——-

算了再吐槽一句吧,”封装“这个词对我太深奥了。。。怎么世界上各种大触,太可怕,太可怕。无关的吐槽另一句:革命尚未成功,同志任需努力啊!我们总有一天会打败Windows的!(然后就是Linux和Mac互掐了?)

这是视频处理部分了,因为咱兼职压制君,所以这个也在研究。。。如果不准备做,这个坑不跳也罢。。。

Windows。。。无他,乱七八糟的事情太多,懒得弄了。

——-

我成功加入弹幕功能了!见此贴10楼。

可喜可贺~建议用ASS,但是这个咱就没有专门研究过了。。。因为不用。。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">