之前写的那个 脚本 虽然能用,但我依然有很多不满意的地方,比如说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 上了,以后都在上面更新,此文不再更新
2020/8/1
- 开始和完成下载邮件增加显示文件大小,方便检查是否下载完
- you-get进程检测增加条件更加精准判断是否下载完
- 下载部分增加出错自动重试
2020/8/18
- 添加 flv 文件格式的识别
- 上传完成后删除本地文件
评论