V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
foam
V2EX  ›  分享创造

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

  •  2
     
  •   foam ·
    foamzou · 2022-03-30 22:31:24 +08:00 · 2864 次点击
    这是一个创建于 729 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

    以下方式任选一种

    • 在 release 页面下载: Click me
    • Mac 用户可以使用 brew install (等 star 多了才能在 brew 申请通过,可以支持一下)

    依赖

    需要预先安装 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
    16 条回复    2022-04-05 00:12:41 +08:00
    shadows
        1
    shadows  
       2022-03-30 22:51:25 +08:00
    ”Python 写的,所以部署会有环境依赖“ --> youtube-dl/yt-dl 有打包好的二进制文件
    foam
        2
    foam  
    OP
       2022-03-30 22:55:57 +08:00
    @shadows #1 感谢告知,还真没了解过可以编译成无 py 依赖的二进制包。
    shadows
        3
    shadows  
       2022-03-30 22:56:44 +08:00
    ”两款应用没有专门对音频场景进行优化。例如下载 b 站音频,我其实只需要下载其中的音频 m4s 文件即可,下载速度会快很多。“ --> yt-dl 可以只下载音频啊,`yt-dlp -f "ba"`就是只下最好的音频
    shadows
        4
    shadows  
       2022-03-30 22:59:17 +08:00
    不过 OP 的工具还是有亮点的,可以搜索。

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

    @shadows #4
    A01514035
        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 版的可执行文件有点问题。
    foam
        7
    foam  
    OP
       2022-03-30 23:39:14 +08:00
    @A01514035 #6 感谢反馈。OpenCC 库 panic 了,原因未知,该库是用于将繁体中文转换为简体中文的,目的是当搜索结果出现与关键字相同意义的汉字,只是简繁体不同时,不会干扰排序的分值。
    现在的做法是先 recovery ,没有这个转换在大部分场景是没有影响的,后面再看看具体原因。
    先 fix 了个版本
    mlhadoop
        8
    mlhadoop  
       2022-03-30 23:46:03 +08:00
    cool ,有支持视频号计划吗
    foam
        9
    foam  
    OP
       2022-03-30 23:48:31 +08:00
    指的是微信的视频号吗?假期可以看看
    @mlhadoop #8
    ttys001
        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 等视频网站提供支持吗?
    missdeer
        11
    missdeer  
       2022-03-31 15:04:06 +08:00
    先 star 为敬
    我为了听歌也写过个程序有类似的模块,维护接口变更有点累
    Juszoe
        12
    Juszoe  
       2022-03-31 19:30:38 +08:00
    @shadows #1 说到 youtube-dl 的打包,PY 项目打包出来的文件只有 1MB 太让人惊奇,我就特别研究了一下,除了 win 平台确实是二进制文件,linux 平台其实是把 py 代码和依赖 zip 到一起了,不算是二进制,还是挺巧妙的
    foam
        13
    foam  
    OP
       2022-03-31 21:53:33 +08:00
    @missdeer #11 谢谢~
    regent
        14
    regent  
       2022-04-04 21:36:23 +08:00
    QQ 音乐的音质下载和网页版相同吗?可以通过登录下载质量高一点的吗?
    foam
        15
    foam  
    OP
       2022-04-05 00:10:06 +08:00
    @regent #14 和网页版相同,一般是 128 KHZ 的,暂未有支持登录的计划。
    foam
        16
    foam  
    OP
       2022-04-05 00:12:41 +08:00
    @foam #15 纠正下,应该是 128Kbps 码率
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   946 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:03 · PVG 05:03 · LAX 14:03 · JFK 17:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.