找回密码
 立即注册
查看: 4146|回复: 14

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

  • TA的每日心情
    开心
    2020-2-27 20:06
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    12

    回帖

    0

    VC币

    中级会员

    Rank: 3Rank: 3

    积分
    3620
    scad 发表于 2022-11-20 20:16:24 | 显示全部楼层 |阅读模式
    本帖最后由 scad 于 2023-12-31 16:40 编辑

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

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

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


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

    221214更新:bilidown参数变化
    231231更新:用bbdown替换bilidown下载弹幕









    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    评分

    参与人数 1活跃度 +3200 收起 理由
    Finn + 3200 赞一个!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-6 15:37
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    2

    主题

    324

    回帖

    32

    VC币

    荣誉会员

    Rank: 14Rank: 14Rank: 14Rank: 14

    积分
    128282

    活跃达人

    shadows 发表于 2022-11-20 21:26:18 | 显示全部楼层
    本帖最后由 shadows 于 2022-11-20 21:41 编辑

    我个人想法哈,还没实践,纯属空谈
    整个加载分为下载和显示2部分,可能的失败在于下载部分
    所以要想办法获取下载的状态结果,按理来说应该可以。mp.command_native_async可以把结果告诉回调函数
    1. mp.command_native_async(table [,fn])
    2. 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再次下载

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

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    回复 支持 0 反对 1

    使用道具 举报

  • TA的每日心情
    无聊
    2023-9-8 20:09
  • 签到天数: 30 天

    [LV.5]常住居民I

    8

    主题

    136

    回帖

    67

    VC币

    中级会员

    Rank: 3Rank: 3

    积分
    6396
    sillonae 发表于 2022-11-20 21:32:43 | 显示全部楼层
    有一个问题,b站番剧由于删减导致时长不一致结果弹幕错位这种情况怎么办呢
    回复 支持 0 反对 1

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-6 15:37
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    2

    主题

    324

    回帖

    32

    VC币

    荣誉会员

    Rank: 14Rank: 14Rank: 14Rank: 14

    积分
    128282

    活跃达人

    shadows 发表于 2022-11-20 21:34:51 | 显示全部楼层
    本帖最后由 shadows 于 2022-11-20 21:44 编辑
    sillonae 发表于 2022-11-20 21:32
    有一个问题,b站番剧由于删减导致时长不一致结果弹幕错位这种情况怎么办呢 ...

    这种问题估计只能人工解决,自己去核对删减时间,目前没有现成的数据,程序没办法知道哪里被删减了(至少只依靠mpv脚本做这个估计费劲)
    我设想的可能方法,下载B站的音频与现有的音频比对(用外部程序完成),然后得出删减的区间,再处理弹幕/ass文件(可能又需要一个外部程序?)
    回复 支持 0 反对 1

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-27 20:06
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    12

    回帖

    0

    VC币

    中级会员

    Rank: 3Rank: 3

    积分
    3620
    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文件)也不会执行。
    回复 支持 0 反对 1

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-27 20:06
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    12

    回帖

    0

    VC币

    中级会员

    Rank: 3Rank: 3

    积分
    3620
    scad  楼主| 发表于 2022-11-20 22:03:47 | 显示全部楼层
    大佬有兴趣的话可以用这个视频测试 www .bilibili. com/video/BV1SW411u7Go
    回复 支持 0 反对 1

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-6 15:37
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    2

    主题

    324

    回帖

    32

    VC币

    荣誉会员

    Rank: 14Rank: 14Rank: 14Rank: 14

    积分
    128282

    活跃达人

    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站的需求
    回复 支持 0 反对 1

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-27 20:06
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    12

    回帖

    0

    VC币

    中级会员

    Rank: 3Rank: 3

    积分
    3620
    scad  楼主| 发表于 2022-11-21 15:05:19 | 显示全部楼层
    shadows 发表于 2022-11-20 22:47
    想起2个最重要的问题,函数在使用前需要先定义,所以loadsub2要在louadsub1前面;判断成功也应该用回调的 ...

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

    使用道具 举报

  • TA的每日心情
    擦汗
    5 小时前
  • 签到天数: 751 天

    [LV.10]以坛为家III

    2

    主题

    82

    回帖

    16

    VC币

    至尊会员

    Rank: 16Rank: 16Rank: 16Rank: 16

    积分
    195951
    马可solo 发表于 2022-12-9 14:56:06 | 显示全部楼层
    两个都没有用过,想问一下,链接里的也是自动加载弹幕啊,这个修改版区别在哪呢
    Le vent se leve, il faut tenter de vivre.
    回复 支持 0 反对 1

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-27 20:06
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    12

    回帖

    0

    VC币

    中级会员

    Rank: 3Rank: 3

    积分
    3620
    scad  楼主| 发表于 2022-12-14 21:23:41 | 显示全部楼层
    马可solo 发表于 2022-12-9 14:56
    两个都没有用过,想问一下,链接里的也是自动加载弹幕啊,这个修改版区别在哪呢 ...

    原版需要搭配Play-With-MPV脚本,从网页上解析视频地址用mpv播放
    修改版是在mpv里输入b站链接,调用yt-dlp解析播放,不必先打开网页

    评分

    参与人数 1活跃度 +6 收起 理由
    马可solo + 6 6

    查看全部评分

    回复 支持 0 反对 1

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表