開源音樂下載神器XMusicDownloader更新,支援歌單一鍵下載,支援無損音樂
阿新 • • 發佈:2019-08-20
開源音樂下載神器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的精美圖片設定為桌布,並且支援隨機切換歷史桌布,檢視桌布故事