作者:Chancel Yang, 更新:2019 Jul 25, 字数:5211, 已阅:711
关注一些Youtube的频道,想保存这些视频,网上查找了一下下载方案,找到了不少Windows的客户端,但基本都收费,收费倒是算了,很多都下不动,最后找到了youtube-dl,查了些资料简单配置了youtube就可以批量下载频道视频
youtube-dl虽然叫youtube-dl,但实际上他不单单支持youtube下载,支持的抓取视频的网站多达上千个,包括爱奇艺/Bilibili/Youku等国内主流视频网站,可以通过命令行查询,简单罗列一下支持的列表
$ youtube-dl --list-extractors
1tv
1up.com
20min
220.ro
23video
24video
3qsdn
3sat
4tube
56.com
5min
6play
...(这里省略上千行)
YouJizz
youku
youku:show
YouNowChannel
YouNowLive
YouNowMoment
YouPorn
YourPorn
YourUpload
youtube
youtube:channel
youtube:favorites
youtube:history
youtube:live
youtube:playlist
youtube:playlists
youtube:recommended
youtube:search
youtube:search:date
youtube:search_url
youtube:show
youtube:subscriptions
youtube:truncated_id
youtube:truncated_url
youtube:user
youtube:watchlater
Zapiks
Zaq1
Zattoo
ZattooLive
ZDF
ZDFChannel
zingmp3
Zype
youtube-dl是一个命令行工具,没有UI界面,如果你要考虑有UI界面的,可以参考这个使用Python构建的Youtube-GUI项目MrS0m30n3/youtube-dl-gui
因为youtube-dl是命令行工具,所以构建合理的脚本,搭配Nas可以做到完美定时同步Youtube频道视频到本地
使用youtube-dl有几个条件
接下来说说如何配置youtube-dl
关于如何配置,如果有自定义需求的同学建议参考本文和项目地址直接安装配置自己的脚本
官网安装指南:https://ytdl-org.github.io/youtube-dl/download.html
安装的3种方式
通过pip安装,youtube-dl通过pypi分发,如果你的系统已经安装pip3,则直接使用如下指令安装
sudo pip3 install --upgrade youtube_dl
通过curl安装
sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl
通过wget安装
sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl
如果你要下载youtube上1080P以上资源时,会发现视频没有声音,因为1080P以上的视频采用了音视频分流设计,可以通过安装ffmpeg将音视频压制在一起。
安装ffmpeg
apt-get install ffmpeg
先尝试最简单的下载方式
youtube-dl 'https://www.youtube.com/watch?v=CxyVYiM6FQQ'
这便是最简单的下载方式了,但很多时候我们需要指定格式/使用代理/指定清晰度/指定下载位置,更重要的是批量下载对吧(邪恶)
这里简单介绍下日常使用到最多的参数支持,更多的可以参考官网介绍MrS0m30n3/youtube-dl-gui
使用代理进行下载
# HTTP代理
youtube-dl --proxy 192.168.10.1:1080 'https://www.youtube.com/watch?v=CxyVYiM6FQQ'
# Socks代理
youtube-dl --proxy socks5://192.168.10.1:1080 'https://www.youtube.com/watch?v=CxyVYiM6FQQ'
指定文件名字
# 指定名字
youtube-dl 'https://www.youtube.com/watch?v=CxyVYiM6FQQ' -o '你要的名字'
# 利用 OUTPUT TEMPLATE(参考Python字符串格式)自动命名文件
youtube-dl 'https://www.youtube.com/watch?v=CxyVYiM6FQQ' -o '%(title)s.%(ext)s'
下载格式选择
# 查看视频所有格式(不触发下载)
youtube-dl --list-formats 'https://www.youtube.com/watch?v=CxyVYiM6FQQ'
# 下载所有格式
youtube-dl --all-formats 'https://www.youtube.com/watch?v=CxyVYiM6FQQ'
# 下载指定格式(数字来自第一条指令查询)
youtube-dl -f 137 'https://www.youtube.com/watch?v=CxyVYiM6FQQ'
# 下载最高清的版本
youtube-dl -f bestvideo+bestaudio 'https://www.youtube.com/watch?v=CxyVYiM6FQQ'
字幕选择
# 列出所有可用字幕
youtube-dl --list-subs 'https://www.youtube.com/watch?v=CxyVYiM6FQQ'
# 写入字幕
youtube-dl --write-sub 'https://www.youtube.com/watch?v=CxyVYiM6FQQ'
# 写入youtube自动生成的字幕
youtube-dl --write-auto-sub 'https://www.youtube.com/watch?v=CxyVYiM6FQQ'
# 下载所有字幕文件
youtube-dl --all-subs 'https://www.youtube.com/watch?v=CxyVYiM6FQQ'
批量下载
# 读取下载连接列表
youtube-dl -a video_url.txt
# 批量下载频道列表
youtube-dl --yes-playlist -f bestvideo+bestaudio -k 'https://www.youtube.com/playlist?list=PLWAtCzJzHiz8rVsn8UF5fWkc-G_n6f0oz'
懒癌患者喜欢在沙发上无脑观看视频,而不是开启科学上网找到频道选择视频,太麻烦了,想把视频直接保存到本地
但又不想每次都自己手动更新频道视频,聪明的你应该想到了使用Crontab配合上面的下载专辑视频列表就可以解决这个问题了
但那样有一个问题,可能会重复下载视频(虽然实测每次遇到已经下完的视频是直接显示下载完成了)
经过搜索找到一篇少数派的文章,有现成的方案,稍微改一下就可以自动获取视频了,原文链接:少数派 - 如何使用 youtube-dl 抓取 Apple 官方 YouTube 频道
在存放视频的目录新建三个youtube-dl的辅助文件
用于记录已经下载的视频ID,每次执行时可以通过记录的视频ID跳过已经下载的视频
touch youtube-dl-archive.cfg
用于记录频道地址的文件,可添加多个频道
vim youtube-dl-channels.cfg
# xx视频专辑
'https://www.youtube.com/playlist?list=PLWAtCzJzHiz8rVsn8UF5fWkc-G_n6f0oz'
用于存放youtube-dl参数的文件,需要自定义什么参数可以从这个文件里面修改
vim youtube-dl.conf
-i
-o "%(uploader)s (%(uploader_id)s)/%(upload_date)s - %(title)s - (%(duration)ss) [%(resolution)s] [%(id)s].%(ext)s"
# 设置代理
--proxy 192.168.11.11:3128
# 记录已下载文件以及需要下载的频道
--download-archive youtube-dl-archive.cfg
-a youtube-dl-channels.cfg
# 设置每个任务间隔30秒(过快的下载会导致被youtube封禁IP)
--sleep-interval 30
# 统一输出格式
--prefer-ffmpeg
--merge-output-format mkv
# 下载字幕
--write-sub
--all-subs
--convert-subs srt
# 下载元数据和配图
--add-metadata
--write-description
--write-thumbnail
# Debug
-v
最后,写一个脚本,用于给crontab定时调用
vim crontab_script.sh
#!/bin/bash
# 切换到要下载的目录下,请确保 youtube-dl所需三个文件均在这个目录下
cd /mnt/hdd/downloads/youtube-dl
youtube-dl --config-location youtube-dl.conf
授予执行权限
chmod +x crontab_script.sh
接下来只需要添加定时任务即可
crontab -e
到此,根据自定义的时间按时调用youtube-dl脚本即可定时下载到视频,不过即使设置定时30秒下载一次,似乎也会触发youtube的IP封禁策略
这个问题暂时无解,如果有什么好的解决方案欢迎告知我