网易云音乐无版权音乐补全工具
2020-08-25 19:05
816 查看
缘起
网易云音乐的不少歌曲因为版权下架了,或者变成收费的,导致无法收听,因此需要一个小工具,希望可以从其他来源补全歌曲。
如图所示,不能听的显示为灰色。
之前写的小工具XMusicDownloader(https://github.com/jadepeng/XMusicDownloader) 可以从多个来源搜索歌曲并下载,因此以这个为基础,可以很快实现需求。
查看本文之前,建议查看开源工具软件XMusicDownloader——音乐下载神器.
工具原理
获取用户歌单
借助NeteaseCloudMusicApi,可以方便调用云音乐的api。
分析获取到的json,可以发现,包含
noCopyrightRcmd的是没有版权的,包含
fee的是收费的,我们可以将这些歌曲提取出来,变为song对象。
private static List<Song> FetchNoCopyrightSongs(JObject json) { List<Song> noCopyrightsSongs = new List<Song>(); foreach (JObject songObj in json["songs"]) { int id = 0; if (songObj["noCopyrightRcmd"].HasValues || songObj["fee"].Value<int>() == 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——音乐下载神器里,我们有一个聚合的搜索歌曲的方法:
public List<MergedSong> SearchSongs(string keyword, int page, int pageSize) { var songs = new List<Song>(); 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(); }
类似的,匹配也是先搜索,但是要排除网易源,然后根据搜索结果去匹配。搜索的时候,可以将 “歌曲名称 + 歌手名称” 组合用来搜索。
public MergedSong SearchSong(string singer, string songName, string exceptProvider) { // search var songs = new List<Song>(); 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<MergedSong> 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; }
软件界面
软件界面,增加用户、密码输入
搜索结果,设置为默认选中:
List<ListViewItem> listViewItems = new List<ListViewItem>(); 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); });
搜索出来后,下载可以完全复用之前逻辑。
下载歌曲使用
下载后的歌曲,可以通过网易云音乐客户端,上传到云盘,然后批量选中,添加到我喜欢的音乐
批量选中后收藏到歌单:
工具下载地址
-
可以从github下载
https://github.com/jadepeng/music163tool -
国内gitee地址:
https://gitee.com/jadepeng/music163tool
作者:Jadepeng
出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- mycli---数据库工具(提示、自动补全)
- ubuntu下vim 安装插件管理工具Vundle和自动补全插件YouCompleteMe
- 源码和工具(12.4):Xcode自动补全功能补充,3D效果分段控件
- idea工具中项目pom文件中maven依赖自动补全方法(在idea中更新maven仓库指向)
- PLSQL Develop PlugIn 之脚本自动匹配补全工具CnPlugin
- mysql 自动补全工具 mycli
- linux下的新的ftp工具lftp-支持文件名补全提示功能
- MySQL5.7 命令自动补全工具mycli
- MySQL命令自动补全工具——mycli安装
- 工具系列1 剪贴板增强工具 phraseexpress 全局环境下的自动补全工具
- 控制台程序小工具:输入密码、指令指派、自动补全与帮助集成
- jquery UI学习笔记-知问前端之自动补全工具UI的tooltip
- VS Code插件之Vue 2 Snippets(Vue2 片段补全工具)
- unity lua 自动补全工具
- 虾米收藏音乐迁移到网易云音乐方法及工具
- javascript工具 JSEclipse自动补全
- autocomplete自动补全工具完整版使用(springMVC后台)
- vim+ycm(YouCompleteMe),手把手教你配置C++开发工具,支持基于语议的自动补全和第三方库补全(史上最简单、史上最透彻、史上最全的终极解决方案)
- 将Vim配置成为一款强大的编辑工具之 自动补全
- 关于IDE 开发工具代码智能补全功能