开源音乐下载神器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的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事

最新文章

  1. 如何很好的Review自己的代码
  2. Flowplayer-JavaScript API
  3. eclipse里面构建maven项目详解(转载)
  4. 自动化测试管理平台ATMS(V2.0.1_8.12)下载
  5. JSON转换类(一)--过滤特殊字符,格式化字符型、日期型、布尔型
  6. ruby Mixin用法
  7. matlab GUI之常用对话框(四)-- 输入对话框 inputdlg、目录对话框 uigetdir、列表对话框 listdlg
  8. css6种隐藏元素的方法
  9. On the first day here
  10. ASP.NET中登录时记住用户名和密码(附源码下载)--ASP.NET
  11. Linux常用命令(一)--系统命令
  12. BZOJ4870: [Shoi2017]组合数问题
  13. 洛谷P1073 最优贸易
  14. Kettle 和数据建模的几个学习资料
  15. Webpack 2 视频教程 007 - 配置 WDS 进行浏览器自动刷新
  16. 二级菜单(avalon+jquery动画)
  17. gitbash上使用tree
  18. 雷林鹏分享:C# 反射(Reflection)
  19. 软件工程作业 - 实现WC功能(java)
  20. https证书pfx 生成 pem,crt,key

热门文章

  1. vue--组件性别选择器和仿百度搜索栏
  2. MLlib特征变换方法
  3. python如何将一个多位数数值转换为列表类型
  4. Spring_AOP基于AspectJ的注解开发&amp;JDBC的模板使用&amp;事务管理(学习笔记3)
  5. 抽象数据类型与C++
  6. 从后端到前端之Vue(三)小结以及一颗真实的大树
  7. php laravel5.6引入geetest 行为验证
  8. java读写文件小心缓存数组
  9. java并发笔记之java线程模型
  10. [ PyQt入门教程 ] Qt Designer工具的使用