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

功能

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

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

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

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

扩展功能说明

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

扩展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格式。

        // 歌单: https://y.qq.com/n/yqq/playsquare/6924336223.html#stat=y_new.playlist.dissname
// 专辑 https://y.qq.com/n/yqq/album/00153q8l2vldMz.html
// 歌手 https://y.qq.com/n/yqq/singer/000CK5xN3yZDJt.html Regex regex = new Regex("\\/(\\w+).html");
public bool Support(string url)
{
if (url == null)
{
return false;
} if (!regex.IsMatch(url))
{
return false;
} return url.StartsWith("https://y.qq.com/n/yqq/playsquare") || url.StartsWith("https://y.qq.com/n/yqq/album") || url.StartsWith("https://y.qq.com/n/yqq/singer");
}

然后调用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=
 public List<Song> GetSongList(string url)
{
var isSongList = url.StartsWith("https://y.qq.com/n/yqq/playsquare"); var id = regex.Match(url).Groups[1].Value; var result = new List<Song>(); if (isSongList)
{
GetSongListDetail(id, result);
}
else if (url.StartsWith("https://y.qq.com/n/yqq/albu"))
{
GetAlbum(id, result);
}
else
{
GetSingerSong(id, result);
} return result; } private void GetSongListDetail(string id, List<Song> result)
{
var requestUrl = "https://v1.itooi.cn/tencent/songList?id=" + id;
var searchResult = HttpHelper.GET(requestUrl, DEFAULT_CONFIG); var songList = JObject.Parse(searchResult)["data"][0]["songlist"];
var index = 1; foreach (var songItem in songList)
{
var song = new Song
{
id = (string)songItem["songmid"],
name = (string)songItem["title"],
album = (string)songItem["album"]["name"],
rate = 320,
index = index++,
size = (double)songItem["file"]["size_320mp3"],
source = Name,
//singer = (string)songItem["author"],
duration = (double)songItem["interval"]
};
if (song.size == 0d)
{
song.size = (double)songItem["file"]["size_128mp3"];
song.rate = 128;
}
song.singer = "";
foreach (var ar in songItem["singer"])
{
song.singer += ar["name"] + " ";
}
result.Add(song); }
}

最后获取下载地址,接口地址是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、网易实现了全部接口,其余的由于时间和使用频率关系,未实现,欢迎感兴趣的网友实现后贡献代码。

开源地址: https://github.com/jadepeng/XMusicDownloader,欢迎大家下载使用。

号外,安利作者的另外一个开源小工具,bing每日壁纸,自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事

开源音乐下载神器XMusicDownloader更新,支持歌单一键下载,支持无损音乐的更多相关文章

  1. 调皮的QQ音乐API:修复无法获取歌单

    上一篇完整版:http://www.cnblogs.com/TwilightLemon/p/7076938.html QQ音乐的API真是太调皮了,获取歌单的API又更换了好多次,喵喵喵 旧版API( ...

  2. 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)

    1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...

  3. 【Python3爬虫】网易云音乐歌单下载

    一.目标: 下载网易云音乐热门歌单 二.用到的模块: requests,multiprocessing,re. 三.步骤: (1)页面分析:首先打开网易云音乐,选择热门歌单,可以看到以下歌单列表,然后 ...

  4. QQ音乐2019客户端-获取任意歌单完整歌曲列表和下载音乐文件方法

    步骤 1.在web网站上搜搜任意歌单 https://y.qq.com/#type=index/ 例如:中国好声音4.5.6.7.8季 打开后显示网址:  https://y.qq.com/n/yqq ...

  5. Android 常用开源库总结(持续更新)

    前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 TextView HTextView 一 ...

  6. Linux终端音乐播放器cmus攻略: 操作歌单

    目录 1. 安装 2. 操作说明 2.1. *PlayList歌单 2.2. 其他 3. 视图切换 4. 使响应Media/play按键 4.1. 编译安装 cmus是一款开源的终端音乐播放器.它小巧 ...

  7. paip.QQ音乐导出歌单总结

    paip.QQ音乐导出歌单总结 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/attilax ...

  8. 「下载神器」aria2 懒人安装教程 [Windows]

    是一款开源.轻量级的多协议命令行下载工具,支持 HTTP/HTTPS.FTP.SFTP.BitTorrent 和 Metalink 协议,拥有众多第三方支持插件,被誉为「下一代下载工具」和「下载神器」 ...

  9. 力推:无限制下载神器aria2

    百度网盘是一个非常方便的存储以及寻找资源的好帮手,但是百度为了挣钱把非会员的下载网速一再限制(无力吐槽),还还好一直使用油猴插件加idm下载神器来下载百度云文件.奈何idm对bt种子文件不支持下载,终 ...

随机推荐

  1. [笨方法学python]习题51自动化测试笔记

    习题51 本节自动化测试部分看不大懂,自己每步都打印出来,帮助理解.(代码标红部分为自己加入调试为打印变量值所用) tests/tools.py from nose.tools import * im ...

  2. 【Android UI】自定义带按钮的标题栏

    自定义标题栏在很多的android app中很常见,可以说是一种很有用的UI设计方法.自 己也本着学习的态度,经过一番各种坑,终于实现了,现总结如下: 一:大致流程 1.      对指定的andro ...

  3. springboot+mongodb 按日期分组分页查询

    List<Integer> types = new ArrayList<>(); types.add("条件1"); types.add("条件2 ...

  4. HttpServlet cannot be resolved to a type 解决办法

    刚开始学习Servlet,在Eclipse中新建了一个Servlet,不过页面上报错: Httpservlet cannot be resolved to a type,显然是Eclipse找不到相应 ...

  5. Chrome离线安装包+谷歌访问助手

    Chrome离线安装包+谷歌访问助手 所有chrome版本离线安装包下载地址 谷歌访问助手v2.3.0.crx(需要修改主页) 谷歌上网助手v1.4.3.crx(不用修改主页,需要注册) 两个插件为2 ...

  6. php--学习封装类 (一)(操作mysql数据库的数据访问)

    <?php class DBDA //定义一个类 { //定义成员变量,不能直接定义,前面要加上public或者是private public $host = "localhost&q ...

  7. memset函数怎么用嘞↓↓↓

    1.我也曾天真的以为 memset(a,0,sizeof(a))中的0可以用任意数替换 实际上这是错误的 memset的功能是将一快内存中的内容以单个字节逐个拷贝的方式放到指定的内存中去. 2.介绍几 ...

  8. idea使用技巧总结

    1.idea代码自动补全 https://jingyan.baidu.com/article/36d6ed1f62e9821bcf4883af.html 2.优化_生成main方法_sysout方法 ...

  9. javascript基础学习第三天

    ☞ 命名法: 小驼峰命名法 和 大驼峰命名法(帕斯卡命名法) 变量命名规则:遵循小驼峰命名法 [变量名第一个字母小写后面每一个单词的首字母大写] var userNameAge; 函数命名规则:遵循帕 ...

  10. C语言和内存

    1.程序的运行 对cpu来说,内存只是一个存放指令和数据的地方,具体的运算在cpu内完成. 1.寄存器(Register) 是CPU内部非常小.非常快速的存储部件,它的容量很有限,对于32位的CPU, ...