hynking

Former game developer

hynking

下载YouTube上的playlist的所有视频(音频)

下载YouTube上的playlist的所有视频(音频)

起因:打算将某游戏(黄油)的OST取出来,但游戏的文件基本是打包成pack,又懒得像其它广大神通的网友去提取游戏文件,而且又搜索到其它网友已经将全套OST上传到网易云和YouTube之类的网站,包括贴吧也有,但是由于某些喜闻乐见的原因,链接经常失效,又懒得做伸手党去直接问人家要资源。网易云的服务似乎要安装客户端,直接pass。况且之前也从YouTube下载过东西,干脆从YouTube下载算了。

使用别人搭建好的服务

能不用自己动手的话,何必大费周章(笑)。使用别人已经搭建好的服务快多了。视频列表下载这个,这些网站已经有成熟方案让你付费使用,或者免费试用部分服务。通常几个视频,或者几个音频,这种小规模可以使用这种网站,又或者直接手动获取里面视频的URL,然后去其它转换网站一个一个下载就可以了,例如这种转换网站,大都能满足需求了。但是对于几十个视频的playlist,这些网站就爱莫能助了。

另外,应该也有软件用来下载playlist,搜索知乎上找到的关键字都有好几个,但是没敢去尝试,所以也不清楚使用效果如何。

自己动手用工具下载

首先你要准备:

使用youtube-dl

youtube-dl --extract-audio --audio-format mp3 -o "%(title)s.%(ext)s" <url to playlist>
youtube-dl --proxy socks5://127.0.0.1:1080 --extract-audio --audio-format mp3 -o "%(title)s.%(ext)s" <url to playlist>

我以为一行就能搞定。这么轻松的话,我就没必要写这篇东西了。但是过程中出现ERROR: 0obeWPk4HaI: "token" parameter not in video info for unknown reason; 这时候,要么手动一个个去下载,要么换种方法下载。妥协是不能妥协的,我就是想找方法一次下完整个playlist。其实直接一个个copy URL再用youtube-dl可能更快,或许先将URL保存到txt再写脚本下载。

使用you-get和ffmpeg

看到知乎上看到you-get这个工具能下载整个playlist,我就去试试运气了,的确能用,不过文档说,在YouTube上只能支持下载视频,而不能直接下载音频,也就是下载完视频之后,我还需要将它们转换成音频格式例如mp3之类的,在我印象中ffmpeg估计就是最好的选择唯一选择

那么步骤就是:

  1. 使用you-get下载视频you-get -x 127.0.0.1:9999 --playlist URL,其中-x是指定代理,文档上只提到了http代理,用ss的话,还得想办法将socks5转换http。URL是playlist的url。

  2. 将视频使用ffmpeg转换成音频mp3

由于下载回来的都是mp4,接下来就是使用ffmpeg提取mp4里面的音频。

for i in *.mp4; do
  fileName=${i%.*};
  ffmpeg -i "$i"   -f mp3 -acodec libmp3lame "$fileName.mp3";
done

但发现转换出来的mp3没有封面,但是没有封面的mp3怎能培养情操呢?笑容逐渐猥琐。于是搜索一番终于将mp4中的图片提取出来了。

AlbumImg

for i in *.mp4; do
  fileName=${i%.*};
  tmpName=$fileName"_tmp";
  ffmpeg -i "$i"   -f mp3 -acodec libmp3lame "$tmpName.mp3";
  ffmpeg -i "$i" -vf "select=eq(n\,0)" -q:v 3 "$fileName.jpg";

  ffmpeg -i "$tmpName.mp3" -i "$fileName.jpg" -map 0:0 -map 1:0 -c copy -id3v2_version 3 -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" "$fileName.mp3";

  rm "$tmpName.mp3";
  rm "$fileName.jpg";
done

就是将视频的第一帧提取出来,然后将提取出来的音频进行混合,得到的就是带有封面的音频了。然后将中间产生的多余临时文件删除。由于不太会写Shell,如果有写错地方或是有更好的方法请帮忙指正,谢谢。

Screenshot

写脚本的时候参考了如何提取MP3,还有如何提取封面。期间由于网络抽风,断断续续花了快一天的时间,感觉还是手动操作或者找其它资源更快呢