自动下载Youtube视频并上传

在23年11月23日,马督工又放寒假了...并且有一些视频被封掉了,不只是在B站,连油管的视频都会删除。所以决定写一个脚本,自动下载Youtube的视频并上传到网盘上去。马督工说的不一定对,但至少是唯一一个敢说的,所以备份一下还是有价值的。

软件选择

  1. yt-dlp 用来下载 Youtube 频道的视频
  2. rclone 用于将下载好的视频上传到网盘里
  3. Onedrive 借助 Microsoft E5 账号,可以获得 5TB 的空间,并且下载上传的速度也比较快

依赖安装

安装 yt-dle

  1. 从 GitHub 存储库下载最新版本的 yt-dlp
    sudo wget -qO /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp
    
  2. 设置文件的读取和执行权限
    sudo chmod a+rx /usr/local/bin/yt-dlp
    
    现在yt-dlp可以作为系统的命令用于所有用户。
  3. 测试
    yt-dlp --version
    
  4. 可以使用以下命令将 yt-dlp 更新到最新版本:
    sudo yt-dlp -U
    

安装 ffmpeg

这个不用太追求新版,所以直接

sudo apt install ffmpeg

可以使用

ffmpeg -version

就说明安装成功了

安装 rclone

使用官方提供的脚本即可

sudo -v ; curl https://rclone.org/install.sh | sudo bash

添加网盘

这部分由 瓦力箱子 Rclone安装配置教程: 挂载OneDrive同步文件 稍加修改而来

获取OneDrive授权

这一步是在本地电脑Windows系统操作,进入Rclone下载页面,点击下载Windows版本的Rclone软件,选择Intel/AMD-64Bit即可。如果是32位操作系统,那么选择32Bit的。

下载后将全部文件解压到文件夹,在文件夹处打开CMD,输入下面的命令。

.\rclone.exe authorize "onedrive"

命令输入完回车后会自动打开浏览器,登录你的OneDrive账号,点击“是”按钮同意授权。成功后返回到命令窗口就能看到长串授权码,即花括号以及里面的内容。

将花括号内的内容复制下来保存备用,有效期1个小时。

配置Rclone

和安装相同,Rclone配置也只需要一条命令。不同的是后续操作比较繁琐,需要有耐心哈。在配置过程中如果输错字母,可以按Ctrl+Backspace删除。

我们首先在VPS远程登录窗口输入下面命令:

rclone config

新建远程网盘连接,输入字母n回车。

No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n

给远程网盘随便起个名字,我这里就叫onedrive了

name> onedrive

接着会出现一系列网盘名字列表,我输入26选择OneDrive网盘。需要注意的是这个序号以后可能会有变动,填写的时候再次确认下。

Storage> 26

Client ID无需设置,直接回车使用默认的。
Client Secret也不用填写,回车使用默认值。

选择OneDrive网盘服务器的区域,我用的是国际版输入1,如果你用的是世纪互联,那就输入4

Choose national cloud region for OneDrive.
Choose a number from below, or type in your own value
 1 / Microsoft Cloud Global
   \ "global"
 2 / Microsoft Cloud for US Government
   \ "us"
 3 / Microsoft Cloud Germany
   \ "de"
 4 / Azure and Office 365 operated by 21Vianet in China
   \ "cn"
region> 1

不需要设置高级配置,输入n后回车

Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> n

因为我们是远程连接VPS主机,不能自动配置,填写n回车。

Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes (default)
n) No
y/n> n

这时候将第二步获取的OneDrive授权码粘贴到config_token>后面,回车。

Enter a string value. Press Enter for the default ("").
config_token> 

选择OneDrive网盘,输入1

Choose a number from below, or type in an existing value
 1 / OneDrive Personal or Business
   \ "onedrive"
 2 / Root Sharepoint site
   \ "sharepoint"
 3 / Sharepoint site name or URL (e.g. mysite or https://contoso.sharepoint.com/sites/mysite)
   \ "url"
 4 / Search for a Sharepoint site
   \ "search"
 5 / Type in driveID (advanced)
   \ "driveid"
config_type> 1

Rclone找到一个OneDrive盘,输入y确定回车。

Drive OK?
...
y) Yes (default)
n) No
y/n> y

确认OneDrive网盘的所有信息,输入y回车。

[onedrive]
type = onedrive
...
drive_type = personal
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d > y

配置完成后 Rclone 显示远程网盘列表,至此配置结束,输入 q 退出。

Current remotes:
Name                 Type
====                 ====
onedrive             onedrive
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q > q

经过上面的设置后,我们就成功地将 Rclone 连接挂载到 OneDrive 网盘啦。

编写脚本

脚本由 使用 yt-dlp 定时下载 youtube 频道视频并且上传到 onedrive 修改而来

main.sh

#!/bin/bash

# ------------------------------
# 用户可配置的变量
# ------------------------------

# 网盘的上传目录(请确保这个路径在您的网盘中是有效的)
REMOTE_PATH = "网盘: 路径"
YT_DLP_PATH = "yt-dlp"
RCLONE_PATH = "rclone"

# 指定下载频道的链接数组
channels =(
    'https://www.youtube.com/@aaa/videos'
    'https://www.youtube.com/@bbb/videos'
)

# 每下载多少个视频后上传
VIDEOS_PER_BATCH = 5

# 下载视频数量(从最新的视频往后算)
END = 10

# ------------------------------
# 脚本逻辑(一般无需修改)
# ------------------------------

# 获取脚本所在目录的路径
SCRIPT_DIR = "$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"

# 在脚本所在目录中创建必要的目录
mkdir -p "${SCRIPT_DIR}/yetpage "
mkdir -p "${SCRIPT_DIR}/log "
mkdir -p "${SCRIPT_DIR}/yetpage/videotxt "

# 进入下载目录
cd "${SCRIPT_DIR}/yetpage "

# 下载视频并上传
for channel in "${channels[@]}"; do
    # 定义计数器
    download_count = 0
    processed_count = 0

    # 使用 yt-dlp 获取频道视频列表
    video_list = $("$ YT_DLP_PATH " --flat-playlist -J --playlist-end " $END" -- "$ channel " | jq -r '.entries [] | "\(.url) \(.id)"')
    total_videos = $(echo "$ video_list " | wc -l)
    echo "频道:$channel, 总视频数:$ total_videos"

    # 遍历视频列表
    while IFS = read -r line; do
        video_url = $(echo "$ line " | awk '{print $1}')
        video_id = $(echo "$ line " | awk '{print $2}')
        echo " 处理视频 ID:$video_id, 进度:$((++processed_count)) / $total_videos "

        # 下载单个视频
        if "$YT_DLP_PATH " -f 'bv*+ba' \
        --download-archive videos.txt \
        --write-auto-sub --sub-format srt \
        --sub-lang zh-Hans --embed-sub \
        -o '%(channel)s/%(upload_date)s-%(title).200Bs.%(ext)s' \
        -- "$video_url "; then
            # 成功下载视频后递增下载计数器
            ((download_count++))
        fi

        # 检查是否达到上传阈值
        if [ $download_count -eq $VIDEOS_PER_BATCH ]; then
            # 上传视频并重置下载计数器
            "$RCLONE_PATH" move . "$ REMOTE_PATH" -v --onedrive-chunk-size 100M --exclude "videos.txt" -P >> "${SCRIPT_DIR}/log/yt-rclone.log " 2 >&1
            download_count = 0
        fi
    done <<< "$video_list "
done

# 将下载视频 id 的记录保存到视频文本目录
cat videos.txt > "${SCRIPT_DIR}/videotxt/videois.txt "

# 上传剩余的视频文件
"$RCLONE_PATH" move . "$ REMOTE_PATH" \
-v --exclude "videos.txt" \
-P >> "${SCRIPT_DIR}/log/yt-rclone.log " 2 >&1

添加到定时任务

定时任务使用 crontab 就好了
使用下面命令进行编辑,如果是第一次使用,会让你选择使用的编辑器,选择一个自己习惯的就好(如果都没用过…就先去研究 一下怎么用吧…来自可以让新手随机字符的 Vim)

crontab -e

接下来,在最后一行添加上一句即可

0 1 * * * bash 脚本路径/main.sh

0 1 * * * 分别代表分钟、小时、日、月、周。所以这句就表示脚本会在每天的一点执行一次。

修改时区

如果发现脚本没有在自己设置的时间执行,很有可能是系统时区的原因。
可以使用下面命令来看到当前的系统时间。

date

如果时区不对,可以使用下面命令来修改为东八区

sudo timedatectl set-timezone Asia/Shanghai

参考文章


最后修改于 2023-11-25