scad 发表于 2022-11-20 20:16:24

一个自动加载b站弹幕的mpv脚本

本帖最后由 scad 于 2024-6-16 14:06 编辑

以 github.com/itKelis/MPV-Play-BiliBili-Comments 为基础,修改得到自动加载bilibili弹幕的脚本,放在这里分享给大家。

由于yt-dlp无法下载b站某些视频的弹幕,所以在脚本里有一个备用的下载方法,但是不会实现自动替代,只能暂且用键绑定(shift+b),希望有会代码的大佬指点迷津。备用方法也有一个问题,遇到播放列表会下载所有视频的弹幕,所以目前只作为备用

依赖python3,yt-dlp,https://github.com/nilaoda/BBDown,https://github.com/muzuiget/niconvert
niconvert作为备用弹幕转换方式,如有需要请到github自行下载脚本,将niconvert目录放到python的lib\site-packages里面


ps. 感谢 @shadows 的帮助,已经可以自动切换到备用方法了

221214更新:bilidown参数变化
231231更新:用bbdown替换bilidown下载弹幕
240616更新:根据屏幕刷新率设置弹幕fps










shadows 发表于 2022-11-20 21:26:18

本帖最后由 shadows 于 2022-11-20 21:41 编辑

我个人想法哈,还没实践,纯属空谈
整个加载分为下载和显示2部分,可能的失败在于下载部分
所以要想办法获取下载的状态结果,按理来说应该可以。mp.command_native_async可以把结果告诉回调函数
mp.command_native_async(table [,fn])
Like mp.command_native(), but the command is ran asynchronously (as far as possible), and upon completion, fn is called. fn has three arguments: fn(success, result, error)
可以写一个负责处理的回调函数,通过参数得知下载成功了没有,没成功就调用方法2再次下载

------
可能加这一行就行了??主要还得看前面失败了能不能好好返回错误
或者检查一下下载的文件存不存在,不存在肯定是失败了

sillonae 发表于 2022-11-20 21:32:43

有一个问题,b站番剧由于删减导致时长不一致结果弹幕错位这种情况怎么办呢

shadows 发表于 2022-11-20 21:34:51

本帖最后由 shadows 于 2022-11-20 21:44 编辑

sillonae 发表于 2022-11-20 21:32
有一个问题,b站番剧由于删减导致时长不一致结果弹幕错位这种情况怎么办呢 ...
这种问题估计只能人工解决,自己去核对删减时间,目前没有现成的数据,程序没办法知道哪里被删减了(至少只依靠mpv脚本做这个估计费劲)
我设想的可能方法,下载B站的音频与现有的音频比对(用外部程序完成),然后得出删减的区间,再处理弹幕/ass文件(可能又需要一个外部程序?)

scad 发表于 2022-11-20 21:51:52

本帖最后由 scad 于 2022-11-20 21:53 编辑

shadows 发表于 2022-11-20 21:26
我个人想法哈,还没实践,纯属空谈
整个加载分为下载和显示2部分,可能的失败在于下载部分
所以要想办法获 ...
是的,之前我就在else后面直接写的第二种mp.command_native_async,但是只要前面的yt-dlp下载失败以后,这个loadsub function内,之后的程序似乎就不再执行了。试过在 if biliurl:lower():match("bili") ~= nil 这个 if 后面再写 if 语句(判断是否有ass文件)也不会执行。

scad 发表于 2022-11-20 22:03:47

大佬有兴趣的话可以用这个视频测试 www .bilibili. com/video/BV1SW411u7Go

shadows 发表于 2022-11-20 22:47:51

scad 发表于 2022-11-20 21:51
是的,之前我就在else后面直接写的第二种mp.command_native_async,但是只要前面的yt-dlp下载失败以后,这 ...
想起2个最重要的问题,函数在使用前需要先定义,所以loadsub2要在louadsub1前面;判断成功也应该用回调的第一个参数,而不是error,那个是错误的原因,出错了也有可能是空的。
不过,最大的问题还是这个判断是不是可靠,可以学习官方脚本ytdl_hook.lua,先试试能不能得到弹幕信息(-J, --dump-single-json),能得到再下载


我先溜了,我也没有在mpv看B站的需求

scad 发表于 2022-11-21 15:05:19

shadows 发表于 2022-11-20 22:47
想起2个最重要的问题,函数在使用前需要先定义,所以loadsub2要在louadsub1前面;判断成功也应该用回调的 ...

感谢,确实是结果判断上的问题,不管yt-dlp是否出错返回的err都是nil,要用result表里面的status判断,这下解决了

马可solo 发表于 2022-12-9 14:56:06

两个都没有用过,想问一下,链接里的也是自动加载弹幕啊,这个修改版区别在哪呢

scad 发表于 2022-12-14 21:23:41

马可solo 发表于 2022-12-9 14:56
两个都没有用过,想问一下,链接里的也是自动加载弹幕啊,这个修改版区别在哪呢 ...
原版需要搭配Play-With-MPV脚本,从网页上解析视频地址用mpv播放
修改版是在mpv里输入b站链接,调用yt-dlp解析播放,不必先打开网页
页: [1] 2
查看完整版本: 一个自动加载b站弹幕的mpv脚本