为了我的另一个开源项目,先写了个 media-get,下载想要的媒体资源

2022-03-30 22:31:24 +08:00
 foam

media-get

写了一款类似 youtube-dl, you-get 的应用,在给定的 url 里解析出媒体文件,例如音频视频

欢迎朋友们给个 star 鼓励一下~ 也欢迎 PR 、issue

💕💕💕 GitHub 地址: https://github.com/foamzou/media-get

说下背景吧,去年年底,想写一个开源项目:私人音乐助理(具体做什么的,过段时间写完了再分享出来)。其中需要一个组件,用于从指定的 url 下载媒体资源。原本想使用 youtube-dl 或 you-get 的,但发现一些点不是很满足我的诉求:

  1. Python 写的,所以部署会有环境依赖
  2. 我的使用场景对音频具有专门的诉求,以上两款应用没有专门对音频场景进行优化。例如下载 b 站音频,我其实只需要下载其中的音频 m4s 文件即可,下载速度会快很多。
  3. 音频没有覆盖完整,例如网易云某些链接无法下载音频

针对以上诉求,我还是决定用 golang 写了一个,将作为我另一个开源项目的核心组件。

示例

在 url 所在的网页下载资源

# 下载 b 站的视频
media-get -u "https://www.bilibili.com/video/BV1eb4y187AG?spm_id_from=444.41.0.0"

# 只下载音频,加上该参数 `-t audio`
media-get -u "https://www.bilibili.com/video/BV1eb4y187AG?spm_id_from=444.41.0.0" -t audio

使用关键字搜索资源

本应用会以关键字相关性,对搜索结果进行排序并列出来。然后你可以用列出的 url 下载资源

# 使用 keyword ,例如 "歌名 歌手名"
media-get -k "搁浅 周杰伦" 

# 如果你传入更多信息的话,排序会更准一些
media-get --searchSongName="搁浅" --searchArtist="周杰伦" 
media-get --searchSongName="搁浅" --searchArtist="周杰伦" --searchAlbum="七里香"

# 如果只希望从指定网站搜索
media-get -k "搁浅 周杰伦" --sources="migu,bilibili"

# 如果希望排除一些网站,例如 youtube 国内一般搜索不了。后续会考虑加入代理配置(粒度会在网站而不是全局,因为考虑到某些网站判断到非国内 IP 就不返回结果)
media-get -k "搁浅 周杰伦" --excludeSource="youtube"

你可以在你的程序里调用本应用

本应用支持以 JSON 格式输出信息。你可以使用搜索功能得到一些列表,然后以你的需求找到目标后再调用本应用下载资源

另外, 我的另一个开源项目 Personal Music Assistant , 也会使用本应用做一些很棒的事情

media-get --searchSongName="그리움에 가까운" --searchArtist="Hello Gayoung" --infoFormat=json 

如何下载或更新该工具

支持 Win 、Mac 和 Linux

以下方式任选一种

依赖

需要预先安装 ffmpeg

参数说明

Usage:
  media-get [OPTIONS]

Application Options:
  -u, --url=         以 http[s]:// 开头的 url
  -o, --out=         下载文件存储目录, 文件名可选. (默认: 当前目录)
  -t, --type=        希望下载的媒体类型 [auto/audio/video/all] (默认: auto)
      --addMediaTag  将歌曲名、专辑名、歌手等 tag 信息添加到歌曲文件里
  -m, --metaOnly     只获取媒体信息,不下载文件
      --infoFormat=  媒体信息以何种形式展示。支持 plain/json. 默认为 plain
  -l, --logLevel=    日志输出级别。支持 silence/error/warn/info/debug. 默认为 info

Search Options:
  -k, --keyword=        若想使用搜索功能,keyword 或 searchSongName 是必传的. 如果都传入的话,会使用 keyword 进行搜索. Such as "歌名 歌手名"
      --searchSongName= 歌名
      --searchArtist=   歌手名
      --searchAlbum=    专辑名
      --searchType=     暂时只支持: song, 默认: song
      --sources=        在指定的网站中搜索,使用英文逗号隔开. 目前支持: bilibili,douyin,kugou,kuwo,migu,netease,qq,youtube. 默认在全部网站中搜索
      --excludeSource=  排除指定的网站,使用英文逗号隔开

Help Options:
  -h, --help         Show this help message

编译

make build

支持的网站

Site Source Name Audio Video Search
b 站 bilibili
youtube youtube
网易云音乐 netease
qq 音乐 qq
抖音 douyin
咪咕音乐 migu
酷狗 kugou
酷我 kuwo
2918 次点击
所在节点    分享创造
16 条回复
shadows
2022-03-30 22:51:25 +08:00
”Python 写的,所以部署会有环境依赖“ --> youtube-dl/yt-dl 有打包好的二进制文件
foam
2022-03-30 22:55:57 +08:00
@shadows #1 感谢告知,还真没了解过可以编译成无 py 依赖的二进制包。
shadows
2022-03-30 22:56:44 +08:00
”两款应用没有专门对音频场景进行优化。例如下载 b 站音频,我其实只需要下载其中的音频 m4s 文件即可,下载速度会快很多。“ --> yt-dl 可以只下载音频啊,`yt-dlp -f "ba"`就是只下最好的音频
shadows
2022-03-30 22:59:17 +08:00
不过 OP 的工具还是有亮点的,可以搜索。

有个疑问:网易云这些版权音乐,下载的是未加密的格式吗?
foam
2022-03-30 23:12:19 +08:00
真正有版权的音乐,在这些音乐平台是无法被下载的哦。网易云直接不给下载,qq 或酷狗是给一些试听片段。
所以采取的方案是全平台搜索,大概率是能够找到目标资源的。
其中咪咕的开放性最好,所以我给它的权重是最高的。另外,如果非音乐平台(例如 b 站和 youtube )的搜索结果命中了 MV 关键字,权重也会大大提高,因为 MV 的可靠性也是很高的。

@shadows #4
A01514035
2022-03-30 23:16:54 +08:00
➜ ~ media-get -k "晴天 周杰伦"
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x12fc43a]

goroutine 1 [running]:
github.com/ApesPlan/OpenCC-go.(*OpenCC).Convert(0x0, 0x7ff7bfeff83d, 0x10, 0x10, 0xc00048a000, 0x0, 0x0)
/Users/f.zou/.gvm/pkgsets/go1.13/global/pkg/mod/github.com/!apes!plan/!open!c!c-go@v0.0.2/open_cc.go:199 +0x3a
github.com/foamzou/audio-get/processor.convertTC2SC(...)
/Users/f.zou/my_projects/github/audio-get/processor/search.go:181
github.com/foamzou/audio-get/processor.(*Processor).calculateTheScore(0xc00023ff68, 0x7ff7bfeff83d, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/Users/f.zou/my_projects/github/audio-get/processor/search.go:88 +0xa8
github.com/foamzou/audio-get/processor.(*Processor).sortTheResult.func1(0x1, 0x0, 0x0)
/Users/f.zou/my_projects/github/audio-get/processor/search.go:78 +0x158
sort.insertionSort_func(0xc00023fe00, 0xc0001b0060, 0x0, 0x3)
/usr/local/Cellar/go/1.16.5/libexec/src/sort/zfuncversion.go:12 +0xab
sort.stable_func(0xc00023fe00, 0xc0001b0060, 0x3)
/usr/local/Cellar/go/1.16.5/libexec/src/sort/zfuncversion.go:171 +0x87
sort.SliceStable(0x132d160, 0xc0006da018, 0xc000280e00)
/usr/local/Cellar/go/1.16.5/libexec/src/sort/slice.go:32 +0xcd
github.com/foamzou/audio-get/processor.(*Processor).sortTheResult(0xc000280f68, 0xc00066c7e0, 0x3, 0x3)
/Users/f.zou/my_projects/github/audio-get/processor/search.go:76 +0xb3
github.com/foamzou/audio-get/processor.(*Processor).SearchSong(0xc00023ff68, 0x0, 0x1334620)
/Users/f.zou/my_projects/github/audio-get/processor/search.go:70 +0x229
github.com/foamzou/audio-get/processor.(*Processor).Search(0xc00012bf68, 0x1695040, 0x0)
/Users/f.zou/my_projects/github/audio-get/processor/search.go:21 +0x39
github.com/foamzou/audio-get/processor.(*Processor).Process(0xc00012bf68, 0x0, 0x0)
/Users/f.zou/my_projects/github/audio-get/processor/processor.go:18 +0x45
main.main()
/Users/f.zou/my_projects/github/audio-get/main.go:22 +0x93
mac 版的可执行文件有点问题。
foam
2022-03-30 23:39:14 +08:00
@A01514035 #6 感谢反馈。OpenCC 库 panic 了,原因未知,该库是用于将繁体中文转换为简体中文的,目的是当搜索结果出现与关键字相同意义的汉字,只是简繁体不同时,不会干扰排序的分值。
现在的做法是先 recovery ,没有这个转换在大部分场景是没有影响的,后面再看看具体原因。
先 fix 了个版本
mlhadoop
2022-03-30 23:46:03 +08:00
cool ,有支持视频号计划吗
foam
2022-03-30 23:48:31 +08:00
指的是微信的视频号吗?假期可以看看
@mlhadoop #8
ttys001
2022-03-31 03:18:37 +08:00
想问有计划对 p*rnhub, xvide*s, sp*nkbang, ep*rner, tnafl*x, xh*mster, youp*rn, r*dtube 等视频网站提供支持吗?
missdeer
2022-03-31 15:04:06 +08:00
先 star 为敬
我为了听歌也写过个程序有类似的模块,维护接口变更有点累
Juszoe
2022-03-31 19:30:38 +08:00
@shadows #1 说到 youtube-dl 的打包,PY 项目打包出来的文件只有 1MB 太让人惊奇,我就特别研究了一下,除了 win 平台确实是二进制文件,linux 平台其实是把 py 代码和依赖 zip 到一起了,不算是二进制,还是挺巧妙的
foam
2022-03-31 21:53:33 +08:00
@missdeer #11 谢谢~
regent
2022-04-04 21:36:23 +08:00
QQ 音乐的音质下载和网页版相同吗?可以通过登录下载质量高一点的吗?
foam
2022-04-05 00:10:06 +08:00
@regent #14 和网页版相同,一般是 128 KHZ 的,暂未有支持登录的计划。
foam
2022-04-05 00:12:41 +08:00
@foam #15 纠正下,应该是 128Kbps 码率

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/843975

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX