百科.dev
全部条目AI 编程趋势榜开源项目技术资讯提交条目
登录
< 返回工具列表
X

XMusicDownloader

> 编程语言
开源

这是一款支持从百度、网易、QQ、酷狗、咪咕等音乐网站搜索并下载歌曲的程序,支持下载无损音乐。

2.1K stars0 点赞0 次浏览
访问官网GitHub

工具介绍

这是一款支持从百度、网易、QQ、酷狗、咪咕等音乐网站搜索并下载歌曲的程序,支持下载无损音乐。

XMusicDownloader

XMusicDownloader,一款 支持从百度、网易、qq和酷狗、咪咕音乐等音乐网站搜索并下载歌曲的程序。

开源音乐下载神器XMusicDownloader更新啦,新增网易、腾讯音乐歌单歌曲、歌手歌曲、专辑歌曲一键下载,同时支持下载flac无损音乐。

功能

V1.0 功能开源工具软件XMusicDownloader——音乐下载神器

  • 聚合搜索多家音乐网站
  • 支持音乐批量下载
  • 搜索结果综合排序
  • 可以编写Provider程序,支持其他音乐网站

V1.1 新增功能支持歌单、专辑、歌手歌曲下载,支持无损下载

  • 支持歌单、专辑、歌手歌曲下载(腾讯、网易)
  • 支持flac无损、320,128 码率下载

关联软件

网易云音乐歌单收费歌曲补全工具

原理以及使用方法见: https://www.cnblogs.com/xiaoqi/p/music163tool.html

扩展功能说明

主要是调用了一个第三方接口实现歌单、歌手和专辑歌曲读取,以及获取真实下载地址。

扩展provider接口,增加获取歌曲列表接口

增加Support接口判断url地址是否是歌单地址,增加GetSongList用于获取歌单的歌曲列表,增加getDownloadUrl(string id, string rate)获取歌曲下载地址。

public interface IMusicProvider
    {
        string Name { get; }

        string getDownloadUrl(Song song);
        List<Song> SearchSongs(string keyword, int page, int pageSize);

        // 歌单
        bool Support(string url);
        List<Song> GetSongList(string url);
        /// <summary>
        /// 获取下载地址
        /// </summary>
        /// <param name="id">歌曲id</param>
        /// <param name="rate">码率,音质 如果最大音质获取出错则自动转其他音质	</param>
        /// <returns>歌曲下载地址</returns>
        string getDownloadUrl(string id, string rate);
    }

实现provider

以QQ为例:

先判断是否是支持的url,主要是判断是否符合歌单、专辑、歌手的url格式。

…

然后调用itooi.cn的api获取歌曲

  • 歌单接口 https://v1.itooi.cn/tencent/songList?id=
  • 歌手歌曲接口 https://v1.itooi.cn/tencent/song/artist?id=
  • 专辑歌曲接口 https://v1.itooi.cn/tencent/album?id=
…

最后获取下载地址,接口地址是https://v1.itooi.cn/tencent/url?id=${id}&quality=[128,320,flac]

 public string getDownloadUrl(string id, string rate)
        {
            return HttpHelper.DetectLocationUrl("https://v1.itooi.cn/tencent/url?id=" + id + "&quality=" + rate, DEFAULT_CONFIG);
        }

这里要检测下真实url,递归检测302跳转:

 public static string DetectLocationUrl(string url, HttpConfig config)
        {
            if (config == null) config = new HttpConfig();
            using (HttpWebResponse response = GetResponse(url, "GET", null, config))
            {
                string detectUrl =  response.GetResponseHeader("Location");
                if(detectUrl.Length == 0)
                {
                    return url;
                }
                // 递归获取
                return DetectLocationUrl(detectUrl, config);
            }
        }

缘起:

一直用网易音乐听歌,但是诸如李健、周杰伦的不少歌曲,网易都没有版权,要从QQ等音乐去下载,因此一直想写一个小程序,可以从其他音乐网站下载相关歌曲,趁放假,花了几小时做了这样一个程序。

BTW: 之前写过一个从酷狗和网易音乐提取缓存文件的程序,感兴趣的可以查看。

功能

  • 聚合搜索多家音乐网站
  • 支持音乐批量下载
  • 搜索结果综合排序
  • 可以编写Provider程序,支持其他音乐网站

实现IMusicProvider即可,主要是搜索和获取下载链接的方法。

    public interface IMusicProvider
    {
        string Name { get; }

        string getDownloadUrl(Song song);
        List<Song> SearchSongs(string keyword, int page, int pageSize);
    }

界面截图

下载程序

https://github.com/jadepeng/XMusicDownloader/releases

实现方案介绍

定义song实体

…

封装各个音乐网站

抽象为MusicProvider,音乐提供方:),定义Name为名称,SearchSongs搜索歌曲,getDownloadUrl获取音乐下载地址。


    public interface IMusicProvider
    {
        string Name { get; }

        string getDownloadUrl(Song song);
        List<Song> SearchSongs(string keyword, int page, int pageSize);
    }

然后就是依次实现百度、网易等音乐网站,以QQ为例。

…
  • 搜索调用http://c.y.qq.com/soso/fcgi-bin/search_for_qq_cp?w={0}&format=json&p={1}&n={2}接口,获取下载地址调用http://base.music.qq.com/fcgi-bin/fcg_musicexpress.fcg?guid={0}&format=json&json=3,然后再组合。

聚合搜索

设计一个MusicProviders,加载所有的IMusicProvider,提供一个SearchSongs方法,并发调用各个网站的搜索,然后merge到一起。


  public List<MergedSong> SearchSongs(string keyword, int page, int pageSize)
        {
            var songs = new List<Song>();
            Providers.AsParallel().ForAll(provider =>
            {
                var currentSongs = provider.SearchSongs(keyword, page, pageSize);
                songs.AddRange(currentSongs);
            });

            // merge

            return songs.GroupBy(s => s.getMergedKey()).Select(g => new MergedSong(g.ToList())).OrderByDescending(s => s.score).ToList();
        }

关于merge,核心就是将相同的歌曲合并到一起,我们暂且认为歌手+歌曲名相同的为同一首歌曲:

   public string getMergedKey()
        {
            return singer.Replace(" ", "") + name.Replace(" ", "");
        }
		

因此按megekey分组,就能实现聚合。我们设计一个MergedSong来包裹。

…

MergedSong的核心是定义了一个score,我们通过投票+搜索结果排序,用来决定合并结果的排序。

下载

下载主要是通过provider获取真实url,然后下载即可。

…

参考

  • 程序界面,使用了 https://github.com/Gsangu/KugouDownloader 代码
  • 搜索和下载方案参考 https://github.com/0xHJK/music-dl

GitHub Issues· 0 开放

在 GitHub 查看全部

暂无开放 Issues,或尚未同步最近议题。

核心特点

  • •聚合搜索多家音乐网站
  • •支持音乐批量下载
  • •搜索结果综合排序
  • •可以编写Provider程序,支持其他音乐网站
  • •支持歌单、专辑、歌手歌曲下载(腾讯、网易)
  • •支持flac无损、320,128 码率下载
  • •歌单接口 https://v1.itooi.cn/tencent/songList?id=
  • •歌手歌曲接口 https://v1.itooi.cn/tencent/song/artist?id=
  • •专辑歌曲接口 https://v1.itooi.cn/tencent/album?id=
  • •聚合搜索多家音乐网站

> 标签

C#

暂无评论,来聊聊你的看法吧

> 工具信息

发布日期2026年8月1日
最后更新2026年9月17日
分类编程语言
定价开源

> 相关工具

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言