自动下载Youtube视频并上传
软件选择
- yt-dlp 用来下载 Youtube 频道的视频
- rclone 用于将下载好的视频上传到网盘里
- Onedrive 借助 Microsoft E5 账号,可以获得 5TB 的空间,并且下载上传的速度也比较快
依赖安装
安装 yt-dle
- 从 GitHub 存储库下载最新版本的 yt-dlp
sudo wget -qO /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp
- 设置文件的读取和执行权限
现在yt-dlp可以作为系统的命令用于所有用户。sudo chmod a+rx /usr/local/bin/yt-dlp
- 测试
yt-dlp --version
- 可以使用以下命令将 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
参考文章
- 在 Ubuntu 20.04 安装 yt-dlp
- 瓦力箱子 Rclone安装配置教程: 挂载OneDrive同步文件
- AhauFun 挂载神器:Rclone使用教程 这篇文章的标题好难复制嗷…(小声)
- YT-DLP: 2023年最完整指南— RapidSeedbox
- 使用 yt-dlp 定时下载 youtube 频道视频并且上传到 onedrive
最后修改于 2023-11-25