写了一款类似 youtube-dl, you-get 的应用,在给定的 url 里解析出媒体文件,例如音频视频
欢迎朋友们给个 star 鼓励一下~ 也欢迎 PR 、issue
💕💕💕 GitHub 地址: https://github.com/foamzou/media-get
说下背景吧,去年年底,想写一个开源项目:私人音乐助理(具体做什么的,过段时间写完了再分享出来)。其中需要一个组件,用于从指定的 url 下载媒体资源。原本想使用 youtube-dl 或 you-get 的,但发现一些点不是很满足我的诉求:
针对以上诉求,我还是决定用 golang 写了一个,将作为我另一个开源项目的核心组件。
# 下载 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
brew install 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 音乐 | ✅ | ⌛ | ✅ | |
抖音 | douyin | ✅ | ✅ | ✅ |
咪咕音乐 | migu | ✅ | ⌛ | ✅ |
酷狗 | kugou | ✅ | ⌛ | ✅ |
酷我 | kuwo | ✅ | ⌛ | ✅ |
1
shadows 2022-03-30 22:51:25 +08:00
”Python 写的,所以部署会有环境依赖“ --> youtube-dl/yt-dl 有打包好的二进制文件
|
3
shadows 2022-03-30 22:56:44 +08:00
”两款应用没有专门对音频场景进行优化。例如下载 b 站音频,我其实只需要下载其中的音频 m4s 文件即可,下载速度会快很多。“ --> yt-dl 可以只下载音频啊,`yt-dlp -f "ba"`就是只下最好的音频
|
4
shadows 2022-03-30 22:59:17 +08:00
不过 OP 的工具还是有亮点的,可以搜索。
有个疑问:网易云这些版权音乐,下载的是未加密的格式吗? |
5
foam OP 真正有版权的音乐,在这些音乐平台是无法被下载的哦。网易云直接不给下载,qq 或酷狗是给一些试听片段。
所以采取的方案是全平台搜索,大概率是能够找到目标资源的。 其中咪咕的开放性最好,所以我给它的权重是最高的。另外,如果非音乐平台(例如 b 站和 youtube )的搜索结果命中了 MV 关键字,权重也会大大提高,因为 MV 的可靠性也是很高的。 @shadows #4 |
6
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/[email protected]/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 版的可执行文件有点问题。 |
7
foam OP @A01514035 #6 感谢反馈。OpenCC 库 panic 了,原因未知,该库是用于将繁体中文转换为简体中文的,目的是当搜索结果出现与关键字相同意义的汉字,只是简繁体不同时,不会干扰排序的分值。
现在的做法是先 recovery ,没有这个转换在大部分场景是没有影响的,后面再看看具体原因。 先 fix 了个版本 |
8
mlhadoop 2022-03-30 23:46:03 +08:00
cool ,有支持视频号计划吗
|
10
ttys001 2022-03-31 03:18:37 +08:00 2
想问有计划对 p*rnhub, xvide*s, sp*nkbang, ep*rner, tnafl*x, xh*mster, youp*rn, r*dtube 等视频网站提供支持吗?
|
11
missdeer 2022-03-31 15:04:06 +08:00
先 star 为敬
我为了听歌也写过个程序有类似的模块,维护接口变更有点累 |
12
Juszoe 2022-03-31 19:30:38 +08:00
@shadows #1 说到 youtube-dl 的打包,PY 项目打包出来的文件只有 1MB 太让人惊奇,我就特别研究了一下,除了 win 平台确实是二进制文件,linux 平台其实是把 py 代码和依赖 zip 到一起了,不算是二进制,还是挺巧妙的
|
14
regent 2022-04-04 21:36:23 +08:00
QQ 音乐的音质下载和网页版相同吗?可以通过登录下载质量高一点的吗?
|