1. 程式人生 > >網易雲音樂無版權音樂補全工具

網易雲音樂無版權音樂補全工具

## 緣起 網易雲音樂的不少歌曲因為版權下架了,或者變成收費的,導致無法收聽,因此需要一個小工具,希望可以從其他來源補全歌曲。 ![](https://gitee.com/jadepeng/pic/raw/master/pic/2020/8/25/1598352099450.png) 如圖所示,不能聽的顯示為灰色。 之前寫的小工具XMusicDownloader(https://github.com/jadepeng/XMusicDownloader) 可以從多個來源搜尋歌曲並下載,因此以這個為基礎,可以很快實現需求。 檢視本文之前,建議檢視[開源工具軟體XMusicDownloader——音樂下載神器](https://www.cnblogs.com/xiaoqi/p/xmusicdownloader.html#4277262913). ## 工具原理 1. 獲取使用者歌單,找出無版權和收費歌曲 2. 從QQ、咪咕、百度等源搜尋這些歌曲,匹配成功的可以下載 3. 下載後可以手動上傳到雲盤 ### 獲取使用者歌單 藉助[NeteaseCloudMusicApi](https://github.com/wwh1004/NeteaseCloudMusicApi),可以方便呼叫雲音樂的api。 分析獲取到的json,可以發現,包含`noCopyrightRcmd`的是沒有版權的,包含`fee`的是收費的,我們可以將這些歌曲提取出來,變為song物件。 ``` csharp private static List FetchNoCopyrightSongs(JObject json) { List noCopyrightsSongs = new List(); foreach (JObject songObj in json["songs"]) { int id = 0; if (songObj["noCopyrightRcmd"].HasValues || songObj["fee"].Value() == 1) { noCopyrightsSongs.Add(NeteaseProvider.extractSong(ref id, songObj)); } } return noCopyrightsSongs; } public static Song extractSong(ref int index, JToken songItem) { var song = new Song { id = (string)songItem["id"], name = (string)songItem["name"], album = (string)songItem["al"]["name"], //rate = 128, index = index++, //size = (double)songItem["FileSize"], source = "網易", duration = (double)songItem["dt"] / 1000 }; song.singer = ""; foreach (var ar in songItem["ar"]) { song.singer += ar["name"] + " "; } if (songItem.Contains("privilege") && songItem["privilege"].HasValues) { song.rate = ((int)songItem["privilege"]["fl"]) / 1000; var fl = (int)songItem["privilege"]["fl"]; if (songItem["h"] != null && fl >= 320000) { song.size = (double)songItem["h"]["size"]; } else if (songItem["m"] != null && fl >= 192000) { song.size = (double)songItem["m"]["size"]; } else if (songItem["l"] != null) { song.size = (double)songItem["l"]["size"]; } } else { song.rate = 128; song.size = 0; } return song; } ``` ### 從其他來源獲取歌曲 在之前的博文[開源工具軟體XMusicDownloader——音樂下載神器](https://www.cnblogs.com/xiaoqi/p/xmusicdownloader.html#4277262913)裡,我們有一個聚合的搜尋歌曲的方法: ``` csharp public List SearchSongs(string keyword, int page, int pageSize) { var songs = new List(); Providers.AsParallel().ForAll(provider => { var currentSongs = provider.SearchSongs(keyword, page, pageSize); songs.AddRange(currentSongs); }); // merge return songs.GroupBy(s => s.getMergedKey()).Select(g => new MergedSong(g.ToList())).OrderByDescending(s => s.score).ToList(); } ``` 類似的,匹配也是先搜尋,但是要排除網易源,然後根據搜尋結果去匹配。搜尋的時候,可以將 “歌曲名稱 + 歌手名稱” 組合用來搜尋。 ``` csharp public MergedSong SearchSong(string singer, string songName, string exceptProvider) { // search var songs = new List(); Providers.AsParallel().ForAll(provider => { try { if (provider.Name != exceptProvider) { var currentSongs = provider.SearchSongs(singer + " " + songName, 1, 10); songs.AddRange(currentSongs); } } catch (Exception e) { } }); // merge List mergedSongs = songs.GroupBy(s => s.getMergedKey()).Select(g => new MergedSong(g.ToList())).OrderByDescending(s => s.score).ToList(); // match foreach (MergedSong song in mergedSongs) { if (song.singer == singer && song.name == songName) { return song; } } return null; } ``` ## 軟體介面 軟體介面,增加使用者、密碼輸入 ![介面](https://gitee.com/jadepeng/pic/raw/master/pic/2020/8/25/1598352954630.png) 搜尋結果,設定為預設選中: ``` csharp List listViewItems = new List(); mergedSongs.ForEach(item => { ListViewItem lvi = new ListViewItem(); lvi.Text = item.name; lvi.SubItems.Add(item.singer); lvi.SubItems.Add(item.rate + "kb"); lvi.SubItems.Add((item.size / (1024 * 1024)).ToString("F2") + "MB"); //將檔案大小裝換成MB的單位 TimeSpan ts = new TimeSpan(0, 0, (int)item.duration); //把秒數換算成分鐘數 lvi.SubItems.Add(ts.Minutes + ":" + ts.Seconds.ToString("00")); lvi.SubItems.Add(item.source); lvi.Tag = item; lvi.Checked = true; // 預設選中 listViewItems.Add(lvi); }); ``` 搜尋出來後,下載可以完全複用之前邏輯。 ## 下載歌曲使用 下載後的歌曲,可以通過網易雲音樂客戶端,上傳到雲盤,然後批量選中,新增到我喜歡的音樂 ![上傳](https://gitee.com/jadepeng/pic/raw/master/pic/2020/8/25/1598353051852.png) 批量選中後收藏到歌單: ![批量收藏](https://gitee.com/jadepeng/pic/raw/master/pic/2020/8/25/1598353082913.png) ## 工具下載地址 - 可以從github下載 https://github.com/jadepeng/music163tool - 國內gitee地址: https://gitee.com/jadepeng/music163tool --- >作者:Jadepeng 出處:jqpeng的技術記事本--[http://www.cnblogs.com/xiaoqi](http://www.cnblogs.com/xiaoqi) 您的支援是對博主最大的鼓勵,感謝您的認真閱讀。 本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。