1 yt-dlp介绍

yt-dlp 是非常牛的项目,可以用来下载国内外绝大部分网站的视频。它是基于现已停用的 youtube-dlc 的 youtube-dl 分支。yt-dlp 这个项目的主要重点是添加新功能和补丁,同时会与原始项目保持同步。

2 linux上安装

2.1 安装发行版,注意平台差异

# amd
wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux
# arm64
wget -O yt-dlp_linux https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux_aarch64

mv yt-dlp_linux /usr/bin/yt-dlp
chmod +x /usr/bin/yt-dlp

2.2 debian/ubuntu安装ffmpeg,用于视频转码:

apt-get update -y
apt-get install ffmpeg -y
ffmpeg -version

2.3 使用过程中报错解决

  • 报错提示"ERROR: 'latin-1' codec can't encode characters in position 36-37: ordinal not in range(256)":
  • 这个错误提示,表示某些字符无法被编码为 latin-1 字符集。通常情况下,这是由于操作系统或 shell 配置不正确所致。
  • 设置环境变量 LANG 为一个合适的区域设置 (locale),如 en_US.UTF-8 或者 C.UTF-8
    echo "export LANG=C.UTF-8" >> ~/.bashrc
    reboot

3 简单命令指南

3.1 参数介绍

-f ba+bv -P /path/to/save_directory

  • -f ba+bv,最好的画质与音频
  • -P /path/to/save_directory,下载文件的保存目录

--cookies /path/to/cookies

  • 加载账号cookies文件;
  • youtube"成人视频"/非公开视频需要账号cookies才能下载;
  • chrome浏览器可用EditThisCookie插件获取cookies,导出格式为"Netscape http cookie file"

--download-archive videos.txt

  • 下载前,yt-dlp 查看videos.txt文件,不下载该文件中记录的视频;
  • 下载后,yt-dlp 将已完成下载的视频id,记录到videos.txt文件中;
  • 此参数可避免视频重复下载,常用来追更。

-o '%(channel_id)s/%(playlist_id)s/%(id)s.%(ext)s'

  • 自定义文件的"保存位置与重命名";
  • 此处为"./频道id/播放列表id/视频id.视频后缀[如mp4]"

3.2 下载示范

以最好的画质与音频下载视频,不加载cookies
yt-dlp -f ba+bv <视频链接> -P <保存目录>

以最好的画质与音频下载视频,加载cookies
yt-dlp -f ba+bv <视频链接> --cookies <cookies文件位置> -P <保存目录>

以最好的画质与音频下载youtube播放列表
yt-dlp -f 'bv*+ba' --download-archive videos.txt  https://www.youtube.com/playlist?list=****** -o '%(channel_id)s/%(playlist_id)s/%(id)s.%(ext)s'

以最好的画质与音频下载youtube某频道的所有公开内容,非公开需加载cookies文件
yt-dlp -f 'bv*+ba' --download-archive videos.txt https://www.youtube.com/@******/videos -o '%(channel)s/%(upload_date)s-%(title).200Bs.%(ext)s'

4 脚本下载

youtube上不少频道主由于被封号、下架视频等,导致我自己喜欢的视频常常找不到;故本博主喜欢将某些频道主视频进行onedrive备份,下面为下载脚本。可以实现:自动定时下载youtube指定频道内容;并且调用rclone上传到onedrive。

4.1 脚本内容

#!/bin/bash
[[ ! -f "/home/yetpage" ]] && mkdir -p /home/yetpage
[[ ! -f "/home/log" ]] && mkdir -p /home/log
[[ ! -f "/home/yetpage/videotxt" ]] && mkdir -p /home/yetpage/videotxt

## 自定义文件下载主目录
cd /home/yetpage

## 指定下载频道
channels=(
    ## 下面为youtube频道主页链接,按照格式增加或者删减频道链接
    'https://www.youtube.com/@111/videos'
    'https://www.youtube.com/@222/videos'
    'https://www.youtube.com/@333/videos'
)

## 逐个下载视频,自动生成中文简体字幕并嵌入视频文件中
for channel in "${channels[@]}"; do
    /usr/bin/yt-dlp -f 'bv*+ba' \
    --download-archive videos.txt \
    --write-auto-sub --sub-format srt \
    --sub-lang zh-Hans --embed-sub \
    -i "$channel" \
    -o '%(channel)s/%(upload_date)s-%(id)s-%(title).200Bs.%(ext)s'
done

## 将下载视频id的记录保存到/home/yetpage/videotxt/videois.txt
cat videos.txt > /home/yetpage/videotxt/videois.txt

## rclone上传到网盘,不使用的直接注释下面代码,
## 指定rclone配置文件可添加参数: --config /home/yetpage/rclone.conf
/usr/bin/rclone move /home/yetpage 盘符:/yt \
-v --exclude "videos.txt" \
-P >> /home/log/yt-rclone.log 2>&1

## 说明一下
## --write-auto-sub 表示自动生成字幕。
## --write-sub 表示只下载存在的字幕文件
## --sub-format srt 表示字幕格式为 SRT 格式。
## --sub-lang zh-Hans 表示字幕语言为中文简体。
## --embed-sub 表示将生成的字幕嵌入到视频文件中。
## -i "$channel" 表示输入的视频文件路径或者链接地址是 $channel。

4.2 部署脚本,定时执行

  • 将脚本内容复制到/home/yt.sh文件
  • 赋予脚本执行权限:
    chmod +x /home/yt.sh
  • crontab 每天6点定时执行脚本:
    0 6 * * * bash /home/yt.sh

“一花一世界,一叶一天堂。君掌盛无边,刹那成永恒。”