melody: 一个自动下载 YouTube 视频的简易脚本和工具

陪她去流浪 桃子 2024年03月23日 阅读次数:534

从多年前的网易云音乐与周杰伦的合作关系结束时开始,做一个自己的媒体库就深深地埋在我的待办事项内。 并且随着后来自己喜欢的音乐不断地被从网易云音乐下架、网易云音乐下载到本地的格式从 mp3 变成加密的 ncm、QQ 音乐使用不习惯…… 各种原因。后来,我开始使用 Apple Music。但是说实话,Apple Music 是我用过的最难用的音乐播放器(不想说理由了)。

然而,Apple Music 虽然大而全,但也难免缺少一些小众音乐人、个人翻唱(无版权)、Piano Cover、整理的游戏音乐合集等曲子, (你别说,有时候它们真的蛮好听的),所以我总是来回在各种播放器之间横跳。 这就导致,我在各个平台都维护了一份自己的“喜爱♥️”列表。以前还有心情给列表分个组,后面嘛,太累了,就只加 ♥️ 了。 但是最可恶的事情是,很多被下架的歌曲就完全彻底地从列表中消失了,就像从来没有出现过一样。慢慢地,我就忘记了。

人世间 慢慢地我才发现,YouTube 才是我喜欢听的歌曲最全的地方,几乎任何我想听的音乐,我都能找到资源,看 MV 也比光听 Music 有劲儿。 所以,当我在电脑面前办公时,我用得最多的音乐播放器———不是网易云音乐、不是QQ音乐、不是 Apple Music———而是 YouTube。 YouTube 会很贴心地按照曲风、流派把我 👍 过的音乐形成一个随机的列表,里面几乎都是我喜欢的。 但是,YouTube 偶尔也会下架(见右图)。好在,youtube-dl 打赢了和 YouTube 的官司,用 youtube-dl 下载 YouTube 的视频合法

去年有幸和一位网友聊过“自建媒体库”这个话题,但是当时我们并没有得出一致的方案。 (我)最后的结论是:先不管那么多,把资源搞到手再说,不管后期有没有用(只是听、或者是拿来作为数据训练)。 没过多久,我就写了一个脚本来帮我做这件事:服务端运行在小主机上,在浏览器上装一个小“用户脚本(user script)”,在页面上增加一个按钮,一键就可以下载。

可是后来啊,这名网友突然就完全消失不见了,彻底地从我的生命中消失了,连同所有这些年的聊天记录。这操蛋的人生…… 正如本项目的 README 写的那样:

起源

写一个本地音乐🎵库方案书。(讨论细节见 2023-03-28 20:58 分与谢于 Telegram 上的聊天记录)。

我是一个喜欢听音乐的人,各种曲风、风格、流派、年代……都听,并且时常能连续几个小时边看视频边唱歌而不做其它事情,如痴如醉。 而当我朋友知道我今年过完年独自一人驾车从重庆开到深圳(全程 1500 公里)而没有听歌时,他为之非常诧异。我的解释是:鬼知道我经历了什么,高速路上车祸不断……

介绍

项目的代码开源在这里:movsb/melody

肯定有很多人做过类似的事情,但是,我只是习惯性地造适合我自己的轮子🛞。

别看我上面长篇大论,但是项目代码可以说非常简单:一个 Go 文件,一个 JS 文件。 Go 代码负责提供 API 和下载归档功能。JS 负责修改 YouTube 页面,创建下载按钮 & 发送跨源请求给服务端通知其下载。 完了,就这么点功能。

使用方式

首先把服务端跑起来,go run main.go 就行,用 Docker 也行。需要确保 Go 程序能运行 yt-dlp(Docker 镜像内已经有了)。

这个服务会在 :80 端口上启动一个 HTTP 服务(由于是 80 端口,建议用 Docker 更好),这个服务上有一个静态的地址访问到前面的“用户脚本 user script” JS 文件:http://localhost:80/melody.user.js(按需修改)。 如果你有自己的域名,记得修改一下 melody.user.js 里面的 apiBase 指向的地址。 (由于是私用,所以 Hardcode 的地方比较多,莫怪。)

然后在你的浏览器上安装“暴力猴🐵”(或类似扩展),通过上述地址安装上述用户脚本即可(打开应该就能自动提示安装,因为名字是一个 pattern 的)。 刷新一下浏览器页面即可看到,作者的旁边会多出一个“下载”按钮,点击即可下载到服务端当前目前下的 data 目录中。如右图所示:

  • 没下载时显示的是“Not Downloaded”
  • 下载中显示的是“Downloading”
  • 下载成功后显示“Downloaded”
  • 下载失败时显示“Failed”

在之前的时候,其实是没有这个按钮的,而是只要我 👍 了一个视频,就会自动下载。后来我移除了这个特性。

后来

虽然已经下载了很多很多,但其实占用空间并不多:

nuc:media → du -sh music/
20G	music/

如果把它们 rsync 到车机的 U 盘内,我是不是就有免流量的、听不完的、全部是我喜欢的歌了?想想还是有点开心呢。

其实我有点儿资源控/收藏癖,除了音乐外,我还跑了一个服务,已经连续几年爬取某站的图片资源了,我去看看有多少了(我猜有不少了🤭)……

nuc:data → find -type f | wc -l
1219939
nuc:data → du -sh .
430G	.

哈哈哈,120+ 万张图片,430GB 大小了。能拿来做点儿什么呢?😈

今天就先写到这儿吧,明天一早还要陪同学一家人去莲花山🪷/笔架山🖊️看粤港澳大湾区花展🌸呢。约?

标签:我的小项目 · YouTube