/// <summary> /// 获取单个音乐的播放链接 /// </summary> /// <param name="api"></param> /// <param name="id"></param> /// <param name="strMediaMid"></param> /// <returns></returns> public string GetMusicUrl(int api, string id, string strMediaMid = "") { if (api == 1) { string u = NeteaseApiUrl + "song/url?id=" + id + "&br=320000"; Json.GetUrl.Root urls = JsonConvert.DeserializeObject <Json.GetUrl.Root>(GetHTML(u)); if (urls.data[0].url == null) { u = NeteaseApiUrl + "song/url?id=" + id + "&br=128000"; urls = JsonConvert.DeserializeObject <Json.GetUrl.Root>(GetHTML(u)); } return(urls.data[0].url); } if (api == 2) { string url = QQApiUrl + "song/url?id=" + id + "&type=320&mediaId=" + strMediaMid; QQmusicdetails json = JsonConvert.DeserializeObject <QQmusicdetails>(GetHTML(url)); if (json.data == null) { url = QQApiUrl + "song/url?id=" + id + "&type=128&mediaId=" + strMediaMid; json = JsonConvert.DeserializeObject <QQmusicdetails>(GetHTML(url)); } return(json.data); } return(""); }
/// <summary> /// 解析网易云音乐歌单的内部方法 /// </summary> /// <param name="ids"></param> /// <returns></returns> private List <MusicInfo> _GetNeteaseMusicList(string ids) { List <Json.MusicInfo> ret = new List <Json.MusicInfo>(); string _u = NeteaseApiUrl + "song/detail?ids=" + ids; string j = GetHTML(_u); Json.NeteaseMusicDetails.Root mdr = JsonConvert.DeserializeObject <Json.NeteaseMusicDetails.Root>(j); string u = NeteaseApiUrl + "song/url?id=" + ids + "&br=" + setting.DownloadQuality; Json.GetUrl.Root urls = JsonConvert.DeserializeObject <Json.GetUrl.Root>(GetHTML(u)); for (int i = 0; i < mdr.songs.Count; i++) { string singer = ""; List <string> singerid = new List <string>(); string _url = ""; for (int x = 0; x < mdr.songs[i].ar.Count; x++) { singer += mdr.songs[i].ar[x].name + "、"; singerid.Add(mdr.songs[i].ar[x].id.ToString()); } for (int x = 0; x < urls.data.Count; x++) { if (urls.data[x].id == mdr.songs[i].id) { _url = urls.data[x].url; } } MusicInfo mi = new MusicInfo() { Album = mdr.songs[i].al.name, Id = mdr.songs[i].id.ToString(), LrcUrl = NeteaseApiUrl + "lyric?id=" + mdr.songs[i].id.ToString(), PicUrl = mdr.songs[i].al.picUrl + "?param=300y300", Singer = singer.Substring(0, singer.Length - 1), Title = mdr.songs[i].name, Api = 1 }; ret.Add(mi); } return(ret); }
/// <summary> /// 下载方法 /// </summary> /// <param name="dl"></param> public void Download(List <DownloadList> dl, int api) { string ids = ""; if (api == 1) { int times = dl.Count / 500; int remainder = dl.Count % 500; if (remainder == 0) { remainder = 500; } if (times == 0) { times = 1; } for (int i = 0; i < times; i++) { if (i == times - 1 && times >= 1) { ids = ""; for (int x = 0; x < remainder; x++) { ids += dl[i * 500 + x].Id + ","; } ids = ids.Substring(0, ids.Length - 1); string u = NeteaseApiUrl + "song/url?id=" + ids + "&br=" + dl[0].Quality; Json.GetUrl.Root urls = JsonConvert.DeserializeObject <Json.GetUrl.Root>(GetHTML(u)); for (int x = 0; x < remainder; x++) { for (int y = 0; y < dl.Count; y++) { if (urls.data[x].id.ToString() == dl[y].Id) { dl[y].Url = urls.data[x].url; dl[y].State = "准备下载"; } } } } else { ids = ""; for (int x = 0; x < 500; x++) { ids += dl[i * 500 + x].Id + ","; } ids = ids.Substring(0, ids.Length - 1); string u = NeteaseApiUrl + "song/url?id=" + ids + "&br=" + dl[0].Quality; Json.GetUrl.Root urls = JsonConvert.DeserializeObject <Json.GetUrl.Root>(GetHTML(u)); for (int x = 0; x < 100; x++) { for (int y = 0; y < dl.Count; y++) { if (urls.data[x].id.ToString() == dl[y].Id) { dl[y].Url = urls.data[x].url; dl[y].State = "准备下载"; } } } } } } else if (api == 2) { for (int i = 0; i < dl.Count; i++) { string url = QQApiUrl + "song/url?id=" + dl[i].Id + "&type=" + dl[i].Quality.Replace("128000", "128").Replace("320000", "320").Replace("999000", "flac") + "&mediaId=" + dl[i].strMediaMid; using (WebClientPro wc = new WebClientPro()) { StreamReader sr = new StreamReader(wc.OpenRead(url)); string httpjson = sr.ReadToEnd(); QQmusicdetails json = JsonConvert.DeserializeObject <QQmusicdetails>(httpjson); if (json.result != 100) { url = url.Replace("flac", "320").Replace("128", "320"); sr = new StreamReader(wc.OpenRead(url)); httpjson = sr.ReadToEnd(); json = JsonConvert.DeserializeObject <QQmusicdetails>(httpjson); if (url.IndexOf("flac") != -1 && json.result == 100) { dl[i].Quality = "320000"; } } dl[i].Url = json.data; dl[i].State = "准备下载"; } } } downloadlist.AddRange(dl); UpdateDownloadPage(); if (th_Download == null || th_Download?.ThreadState == ThreadState.Stopped) { th_Download = new Thread(_Download); th_Download.Start(); } }