【完美版】自动下载B站收藏视频
本文最后更新于 921 天前,其中的信息可能已经有所发展或是发生改变。

之前写的那个 脚本 虽然能用,但我依然有很多不满意的地方,比如说4K下载,封面图下载,完成下载后邮件通知,下载完成自动同步到onedrive,自动将 xml 文件转换为 ass 。

于是这两天好好研究了下,算是把这个脚本优化到极致了,途中也算是学习了不少新知识,接下来就把遇到的坑记录下吧。

注意:本篇所有内容基于 Debian10 系统

4K 下载

原本我还以为 you-get 不支持4K下载,认真看了文档后才发现是我之前没认真看。

当然,4K并不能白嫖,还是需要你有B站的大会员,在下载时使用你大会员的cookies来进行下载。

获取cookies需要用到一个Chrome插件:EditThisCookie

安装完插件后,在设置中将 cookies 格式改为如图所示:

然后打开B站主页,登录账号,导出即可

导出后 cookies 自行创建 txt 文件粘贴即可,下载命令

you-get -c cookies.txt URL

下载完成邮件通知

这部分算是我头疼比较久的,因为 you-get 并不像 Aria 有一个下载完成执行脚本的命令。再加上我自己也只是个半桶水,linux也是一知半解,处于有兴致的时候才会去学习的状态。

琢磨了半天,我最后想到的解决办法是:监控进程;具体流程大概是这样:

每2秒检测 you-get 进程 → 检测到进程 → 标记 → you-get 进程消失 → 判定下载完成

当然这里还加了其它条件保证只有自动化下载的时候有效

每秒检测是为了防止下载速度过快一分钟内就下载完了

xml 转换为 ass字幕

you-get 在下载时会自动下载一个 xml 文件,其实就是弹幕文件,需要把它转换为 ass 才能正常播放。这里我用的是 danmu2ass 这个项目

需要安装 python3,下载到 vps 给予运行权限,用法:

python3 danmaku2ass.py abc.xml

脚本

这次一共有两个脚本,一个是检查收藏列表更新,还有一个是检查 you-get 进程,建议放在一个文件夹下面,方便管理;第一个脚本:

#!/bin/sh
you=/usr/local/bin/you-get
#RSS地址自行修改
content=$(wget https://rsshub.app/bilibili/fav/10385631/928435831/0 -q -O -)
#获得时间戳
subpubdate=${content#*<pubDate>}
pubdate=${subpubdate%%</pubDate>*}
#获得封面图下载链接
subcontent=${content#*<img src=\"}
photolink=${subcontent%%\"*}
#如果时间戳记录文本不存在则创建(此处文件地址自行修改)
if [ ! -f "/root/bili/date.txt" ];then
		echo 313340 > /root/bili/date.txt
	fi
#获得上一个视频的时间戳(文件地址自行修改)
olddate=$(cat /root/bili/date.txt)
#获得视频下载链接
sublink=${subpubdate#*<link>}
link=${sublink%%</link>*}
av=${link#*video/}
#获得视频标题并记录(文件地址自行修改)
content1=$(wget https://rsshub.app/bilibili/video/reply/$av -q -O -)
subname=${content1#*\[CDATA\[}
name=${subname%% 的 评*}
echo $name > /root/bili/title.txt

#此处为视频存储位置,自行修改
filename="/var/www/webdav/Bilibili/"$name""
#判断当前时间戳和上次记录是否相同,不同则代表收藏列表更新
if [ $pubdate != $olddate ];
then
	#判断文件是否存在(防止删除收藏导致的重复下载)
	if [ -d $filename ];then
      echo $pubdate > /root/bili/date.txt
	else
		  #下载封面图(图片存储位置应和视频一致)
		  nohup wget -P /var/www/webdav/Bilibili/"$name" $photolink &
		  #记录时间戳
	      echo $pubdate > /root/bili/date.txt
          #获取视频清晰度以及大小信息
          stat=$($you -i -c /root/cookies.txt $link)
	      substat=${stat#*quality:}
	      data=${substat%%#*}
	      quality=${data%%size*}
	      size=${data#*size:}
		  #发送开始下载邮件(自行修改邮件地址)
          echo "$name<br>Quality: $quality<br>Size: $size" | mail -s "$(echo -e "=?UTF-8?B?$(echo -n '开始下载' | base64)?=\nContent-Type:text/html;charset=UTF-8")" 1379771811@qq.com
          #下载视频到指定位置(视频存储位置自行修改;you-get下载B站经常会出错,所以添加了出错重试代码)
          while true
	      do
	      $you -k -l -c /root/cookies.txt -o /var/www/webdav/Bilibili/"$name" $link
    	      if [ $? -eq 0 ]; then
       	 	break;
    	      else
        	sleep 2
    	      fi
	      done
    fi
fi

第二个脚本:

#!/bin/sh
#每两秒检测
step=2
for (( i = 0; i < 60; i=(i+step) )); do
#记录进程输出(文件位置自行修改)
ps -f -C you-get > /root/bili/check.txt
#获取视频标题(从上一个脚本存储位置获取,注意)
title=$(cat /root/bili/title.txt)
#根据条件判断进程状态(第二个判断条件是存储视频文件夹的文件名,自行修改)
content=$(cat /root/bili/check.txt)
result=$(echo $content | grep "you-get" | grep "Bilibili")
if [ "$result" != "" ];then
    #自动下载中,标记(文件位置自行修改)
    echo y > /root/bili/check1.txt
else
    #下载完成
    check1=$(cat /root/bili/check1.txt)
    if [ "$check1" = "y" ];then
        #检查文件是否下载完成
        mp4check=$(find /var/www/webdav/Bilibili/"$title" -name "*.download")
        if [ "$mp4check" = "" ];then
            #获取封面图文件名
            content1=$(wget https://rsshub.app/bilibili/fav/10385631/928435831/0 -q -O -)
            subcontent=${content1#*<img src=\"}
            photolink=${subcontent%%\"*}
            pname=${photolink#*archive/}
            #重命名封面图(封面图位置和上一个脚本位置一致)
            result1=$(echo $pname | grep "jpg")
            if [ "$result1" != "" ];then
                mv /var/www/webdav/Bilibili/"$title"/$pname /var/www/webdav/Bilibili/"$title"/poster.jpg
            else
                mv /var/www/webdav/Bilibili/"$title"/$pname /var/www/webdav/Bilibili/"$title"/poster.png
            fi
            #xml转ass(同样是上一个脚本的存储位置)
            filename=$(find /var/www/webdav/Bilibili/"$title" -name "*.xml")
            /usr/bin/python3 /root/bili/danmaku2ass.py /var/www/webdav/Bilibili/"$title"/"$filename"
            echo n > /root/bili/check1.txt
            #获取下载完的视频文件大小
            videoname=$(find /var/www/webdav/Bilibili/"$title" -name "*.mp4")
            if [ "$videoname" = "" ];then
                videoname=$(find /var/www/webdav/Bilibili/"$title" -name "*.flv")
            fi
            videostat=$(du -h "$videoname")
            videosize=${videostat%%\/*}
            #发送下载完成邮件(自行修改邮件地址)
            echo "$title<br>Size: $videosize" | mail -s "$(echo -e "=?UTF-8?B?$(echo -n '下载完成' | base64)?=\nContent-Type:text/html;charset=UTF-8")" 1379771811@qq.com
            #上传至onedrive(自行修改文件位置)
            while true
            do
                /usr/bin/rclone copy /var/www/webdav/Bilibili OneDrive:Bilibili
            if [ $? -eq 0 ]; then
       	 	    break;
    	    else
        	    sleep 2
    	    fi
	        done
            echo "已成功上传至OneDrive" | mail -s "$(echo -e "=?UTF-8?B?$(echo -n '上传完成' | base64)?=\nContent-Type:text/html;charset=UTF-8")" 1379771811@qq.com
            #上传完成删除本地文件(可选)
            rm -rf /var/www/webdav/Bilibili/"$title"
        fi
    fi
fi
sleep $step
done
exit 0

具体的文件地址啥的自行修改,注释都写了,自行查看

不想改也可以和我保持一致,自行创建相关文件夹

编辑完脚本后,授予运行权限,crontab 设置为每分钟执行一次。

*/1 * * * * /bin/bash /root/bili/bili.sh >/dev/null 2>&1
*/1 * * * * /bin/bash /root/bili/bilicheck.sh >/dev/null 2>&1

最终效果

看视频时看到想要下载的视频,直接点击收藏:

开始下载和结束下载会收到邮件提醒:

下载完成后每一个视频单独文件夹,包含视频,视频封面以及转换好的弹幕文件

重命名封面图是为了让 emby 或者其它自建媒体库识别:

播放时加载ass字幕即有弹幕效果

可以说是无限接近于B站的播放体验了


因为写这篇文章,我发现收藏列表好几个视屏都没了,好在之前都自动下载了,除了封面。

所以,如果你是一个重度B站用户且经常收藏视频的话,那么这个脚本无疑是非常适合你的,即使视频没了,你依然可以怀念这个视频,并且味道也不会差多少。

更新日志

2021/09/19

github 上了,以后都在 github 更新,此文不再更新

2020/8/1

  • 开始和完成下载邮件增加显示文件大小,方便检查是否下载完
  • you-get进程检测增加条件更加精准判断是否下载完
  • 下载部分增加出错自动重试

2020/8/18

  • 添加 flv 文件格式的识别
  • 上传完成后删除本地文件

评论

  1. 路过的刘先生
    4年前
    2020-8-03 17:39:12

    学习了

  2. 路过的熊先生
    4年前
    2020-8-18 18:33:31

    大佬,可以加一下上传成功后,删除下载到vps的本地文件吗

    • Left
      博主
      路过的熊先生
      4年前
      2020-8-18 20:39:07

      已添加,第二个脚本

  3. 路过的熊先生
    4年前
    2020-8-18 19:25:44

    可不可以实现同一个脚本下载两个不同用户的收藏夹呢

    • Left
      博主
      路过的熊先生
      4年前
      2020-8-18 20:39:25

      还没思路

      • 路过的熊先生
        Left
        4年前
        2020-8-18 20:53:11

        多谢大佬
        可不可以这样:将多个不同用户的rss链接存放在 url.txt 里,然后 wget -i url.txt ?

        • Left
          博主
          路过的熊先生
          4年前
          2020-8-18 20:55:15

          应该可以吧,你可以自己试试,我最近没啥时间研究

  4. Yalisiting
    4年前
    2020-8-21 10:05:09

    有点没看懂,rss地址怎么获取额…

    • Left
      博主
      Yalisiting
      4年前
      2020-8-21 10:09:21

      这里有说明:https://docs.rsshub.app/social-media.html#bilibili

  5. yalisiting
    4年前
    2020-8-30 16:50:56

    bili.sh第三十行提示“syntax error: unexpected end of file”,貌似需要给两个变量都加上”,另外不知道是不是我服务器问题,you-get需要用-k才能下载。。。

    • Left
      博主
      yalisiting
      4年前
      2020-8-30 17:31:14

      ?

  6. zbttl
    3年前
    2021-1-08 5:12:48

    第二个脚本转换弹幕的那一句

     /usr/bin/python3 /root/bili/danmaku2ass.py /var/www/webdav/Bilibili/"$title"/"$fullfilen"

    报错
    似乎得改成

    /usr/bin/python3 /root/bili//danmaku2ass.py "$filename"

    • Left
      博主
      zbttl
      3年前
      2021-1-08 9:24:44

      注意到了,已经修改了

  7. verity
    2年前
    2021-11-07 23:40:09

    博主有没有兴趣写一个自动检测up主投稿然后自动下载的脚本

    • Left
      博主
      verity
      2年前
      2021-11-07 23:42:13

      没时间,想了想根据这个脚本修改的话实现难度不大,你可以自己试试

      • verity
        Left
        2年前
        2021-11-10 23:20:18

        我见rsshub里有up主投稿的地址,这个脚本是不是可以只需要换rss地址就能实现检测投稿,其他不用改
        不好意思我不会写代码

  8. 司马鹤轩
    2年前
    2021-12-12 23:21:05

    发现自己收藏夹视频消失,有了收藏自动下载的想法;先在百度搜了下,没搜到,再到Google上搜到这了。有人做好轮子真好∠( ᐛ 」∠)_

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇