一些简单的论坛往来

      No Comments on 一些简单的论坛往来

被吞了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,但是这个咱就没有专门研究过了。。。因为不用。。。

Leave a Reply

Your email address will not be published. Required fields are marked *