開源音樂下載神器XMusicDownloader更新,支持歌單一鍵下載,支持無損音樂


開源音樂下載神器XMusicDownloader更新啦,新增網易、騰訊音樂歌單歌曲、歌手歌曲、專輯歌曲一鍵下載,同時支持下載flac無損音樂。

功能

V1.0 功能開源工具軟件XMusicDownloader——音樂下載神器

  • 聚合搜索多家音樂網站
  • 支持音樂批量下載
  • 搜索結果綜合排序
  • 可以編寫Provider程序,支持其他音樂網站

V1.1 新增功能支持歌單、專輯、歌手歌曲下載,支持無損下載

  • 支持歌單、專輯、歌手歌曲下載(騰訊、網易)
  • 支持flac無損、320,128 碼率下載

V1.1截圖

擴展功能說明

主要是調用了一個[第三方接口 實現歌單、歌手和專輯歌曲讀取,以及獲取真實下載地址。

擴展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的精美圖片設置為壁紙,並且支持隨機切換歷史壁紙,查看壁紙故事

gecko


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM