XMusicDownloader,一款 支持从百度、网易、qq和酷狗等音乐网站搜索并下载歌曲的程序。

缘起:

一直用网易音乐听歌,但是诸如李健、周杰伦的不少歌曲,网易都没有版权,要从QQ等音乐去下载,因此一直想写一个小程序,可以从其他音乐网站下载相关歌曲,趁放假,花了几小时做了这样一个程序。

BTW: 之前写过一个从酷狗和网易音乐提取缓存文件的程序,感兴趣的可以查看。

功能

  • 聚合搜索多家音乐网站
  • 支持音乐批量下载
  • 搜索结果综合排序
  • 可以编写Provider程序,支持其他音乐网站

实现IMusicProvider即可,主要是搜索和获取下载链接的方法。

    public interface IMusicProvider{string Name { get; }string getDownloadUrl(Song song);List<Song> SearchSongs(string keyword, int page, int pageSize);}

界面截图

下载程序

https://github.com/jadepeng/XMusicDownloader/releases

实现方案介绍

定义song实体

public class Song{public string id { get; set; }public string name { get; set; }public string singer { get; set; }public string album { get; set; }public string source { get; set; }public double duration { get; set; }public double size { get; set; }public string url { get; set; }public int rate { get; set; }public int index { get; set; }public string getFileName(){return singer + "-" + name + ".mp3";}public string getMergedKey(){return singer.Replace(" ", "") + name.Replace(" ", "");}}

封装各个音乐网站

抽象为MusicProvider,音乐提供方:),定义Name为名称,SearchSongs搜索歌曲,getDownloadUrl获取音乐下载地址。

public interface IMusicProvider{string Name { get; }string getDownloadUrl(Song song);List<Song> SearchSongs(string keyword, int page, int pageSize);}

然后就是依次实现百度、网易等音乐网站,以QQ为例。

 public class QQProvider : IMusicProvider{static HttpConfig DEFAULT_CONFIG = new HttpConfig{Referer = "http://m.y.qq.com",};public string Name { get; } = "QQ";static string[] prefixes = new string[] { "M800", "M500", "C400" };public List<Song> SearchSongs(string keyword,int page,int pageSize){var searchResult = HttpHelper.GET(string.Format("http://c.y.qq.com/soso/fcgi-bin/search_for_qq_cp?w={0}&format=json&p={1}&n={2}", keyword, page,pageSize), DEFAULT_CONFIG);var searchResultJson = JsonParser.Deserialize(searchResult).data.song;var result = new List<Song>();var index = 1;foreach(var songItem in searchResultJson.list){var song = new Song{id = songItem["songmid"],name = songItem["songname"],album = songItem["albumname"],rate = 128,size = songItem["size128"],source = Name,index = index++,duration = songItem["interval"]};song.singer = "";foreach (var ar in songItem["singer"]){song.singer += ar["name"] + " ";}result.Add(song);}return result;}public string getDownloadUrl(Song song){var guid = new Random().Next(1000000000, 2000000000);var key = JsonParser.Deserialize(HttpHelper.GET(string.Format("http://base.music.qq.com/fcgi-bin/fcg_musicexpress.fcg?guid={0}&format=json&json=3",guid), DEFAULT_CONFIG)).key;foreach(var prefix in prefixes){var musicUrl = string.Format("http://dl.stream.qqmusic.qq.com/{0}{1}.mp3?vkey={2}&guid={3}&fromtag=1", prefix, song.id, key, guid);if (HttpHelper.GetUrlContentLength(musicUrl) > 0){return musicUrl;}}return null;}}
  • 搜索调用http://c.y.qq.com/soso/fcgi-bin/search_for_qq_cp?w={0}&format=json&p={1}&n={2}接口,获取下载地址调用http://base.music.qq.com/fcgi-bin/fcg_musicexpress.fcg?guid={0}&format=json&json=3,然后再组合。

聚合搜索

设计一个MusicProviders,加载所有的IMusicProvider,提供一个SearchSongs方法,并发调用各个网站的搜索,然后merge到一起。

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);});// mergereturn songs.GroupBy(s => s.getMergedKey()).Select(g => new MergedSong(g.ToList())).OrderByDescending(s => s.score).ToList();}

关于merge,核心就是将相同的歌曲合并到一起,我们暂且认为歌手+歌曲名相同的为同一首歌曲:

   public string getMergedKey(){return singer.Replace(" ", "") + name.Replace(" ", "");}

因此按megekey分组,就能实现聚合。我们设计一个MergedSong来包裹。

public class MergedSong{public List<Song> items{get; set;}public MergedSong(List<Song> items){this.items = items;}public string name{get{return this.items[0].name;}}public string singer{get{return this.items[0].singer;}}public string album{get{return this.items[0].album;}}public string source{get{return string.Join(",", this.items.Select(i => i.source).ToArray());}}public double duration{get{return this.items[0].duration;}}public double size{get{return this.items[0].size;}}public double rate{get{return this.items[0].rate;}}public double score{get{// 投票+排序加权  (各50%)return this.items.Count / (MusicProviders.Instance.Providers.Count - 1) + (20 - this.items.Average(i => i.index)) / 20;}}}

MergedSong的核心是定义了一个score,我们通过投票+搜索结果排序,用来决定合并结果的排序。

下载

下载主要是通过provider获取真实url,然后下载即可。

public class SongItemDownloader{MusicProviders musicProviders;string target;MergedSong song;public event DownloadFinishEvent DownloadFinish;public SongItemDownloader(MusicProviders musicProviders, string target, MergedSong song){this.musicProviders = musicProviders;this.target = target;this.song = song;}public long totalBytes;public long bytesReceived;public double ReceiveProgress;public double receiveSpeed;DateTime lastTime = DateTime.Now;public void Download(){WebClient client = new WebClient();client.DownloadProgressChanged += Client_DownloadProgressChanged;new Thread(() =>{// 多来源,防止单个来源出错foreach (var item in song.items){try{client.DownloadFile(musicProviders.getDownloadUrl(item), target + "\\" + item.getFileName());DownloadFinish?.Invoke(this, this);break;}catch{}}}).Start();}private void Client_DownloadProgressChanged(object sender, DownloadEventArgs e){this.bytesReceived = e.bytesReceived;this.totalBytes = e.totalBytes;this.receiveSpeed = e.receiveSpeed;this.ReceiveProgress = e.ReceiveProgress;}}

参考

  • 程序界面,使用了https://github.com/Gsangu/KugouDownloader代码
  • 搜索和下载方案参考 https://github.com/0xHJK/music-dl

作者:Jadepeng
出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/xiaoqi/p/xmusicdownloader.html

开源工具软件XMusicDownloader——音乐下载神器相关推荐

  1. chrome remote desktop_无损音乐下载神器!洛雪音乐助手lx-music-desktop

    推荐一款多平台音乐下载神器!洛雪音乐助手lx-music-desktop主界面简单明了,非常的好用.该软件涵盖了QQ音乐.酷我音乐.网易音乐等多个平台的音乐歌曲资源,用户可随意输入歌手.歌曲名.专辑名 ...

  2. 10款屏幕取色器/颜色拾取工具软件介绍及下载地址[转]

    10款屏幕取色器/颜色拾取工具软件介绍及下载地址(附截图) 2009年12月07日 14:13 在做网页设计和程序界面的时候,看到比较喜欢的图片颜色,总是要拾取下来应用到自己的网页或图片的颜色中,但是 ...

  3. [工具]再更新音乐下载软件,MP3音乐无损音乐下载器

    昨天发的音乐下载软件我没有多做几次测试,导致误导大家了,昨天分享的那个只能听音乐不能下载,知道后我又赶紧为大家找了一款(一个网站),不知道什么情况链接不能发自动回复里,我也不敢直接放文章里,大家回复转 ...

  4. 推荐一款开源的音乐下载神器,8个平台VIP任你选

    来源:资源搜罗精选(ID:ziyuanPick) https://github.com/lyswhut/lx-music-desktop 喜欢音乐的朋友都需要一个好用的下载器,今天就和大家分享一款超级 ...

  5. 开源工具,又是免费的神器 ,有点意思

    hello大家好,今天我要给大家推荐几款好用的开源工具,比较适合PC工作时操作,操作还是6的飞起 ,不用在依赖其他软件~~ 万磁王 它是一款在线反向词典,使用深度学习算法(如果你想了解模型可以去看官网 ...

  6. 数据可视化开源工具软件

    数据可视化工具用于通过图形.图表.表格.地图和其他详细的视觉对象来表示信息. 它们通常将数据呈现和分析结合起来,以帮助专业人员在数据驱动领域(如工程.数据科学和业务分析)做出更明智的决策. 选择正确的 ...

  7. Windows系统下的PDF编辑工具软件-PDF编辑器下载

    PDF编辑器是一款Windows系统下的PDF编辑工具软件,它支持修改编辑PDF文件并向PDF添加文字.擦除内容.插入图片.绘制直线.加椭圆框.加矩形框和旋转PDF等功能.PDF编辑器可以让您在PDF ...

  8. python小工具开发_python音乐下载小工具源码(tkinter)

    [实例简介]入门级示例源码,搜狗音乐下载 [实例截图] [核心代码] import requests import re import tkinter #获取gethush def gethush(m ...

  9. 【Python】一个小工具竟是万能视频下载神器?

    文章目录 前言 一.准备 二使用方法 三其他功能 1.暂停和继续下载 2.选择视频格式和清晰度 拿到格式名称后,如果你想下载 高清 1080P 的视频,只需要带 --format 参数就可以下载指定格 ...

  10. 常用工具软件-官网下载地址

    Putty --ssh/telnet等远程小工具 https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html https://the. ...

最新文章

  1. electron调用python_在Electron app中运行python脚本
  2. 最牛逼的 Java 日志框架,性能无敌,横扫所有对手.....
  3. 《Python数据分析与挖掘实战》一第1章 数据挖掘基础1.1 某知名连锁餐饮企业的困惑...
  4. 安装和配置以下合同 14.1管理
  5. 详细图文演示——排除启动类故障以及Linux操作系统引导、运行级别和优化启动等相关知识
  6. 调用本地电脑摄像头并进行按P进行捕获照片并保存,按下Q退出
  7. oracle 移动日志文件,Oracle数据库移动数据文件、日志文件和控制文件
  8. Information Retrieval --- Outline
  9. 禁止用户打开控制台调试代码
  10. python operator.itemgetter
  11. Eltima SDK 中存在27个漏洞,影响多家云服务提供商
  12. 《梦断代码》读后感2
  13. 7.override a layout
  14. html网页屏保,屏幕保护是什么
  15. Android类似钉钉类的APP 实现禁止用户虚拟定位
  16. html中图片连续滚动代码,[转载]网页设计中的图片连续滚动效果——代码
  17. JavaScript--JavaScript和web API、JS(提供案例)
  18. 核心解读 - 2022版智慧城市数字孪生标准化白皮书
  19. GEE:使用Sentinel-2数据做基于NDVI的长势监测(求5年影像集的NDVI均值,和当前年份的NDVI,两个影像做数学运算)
  20. 用Compose shape把外框做成封闭图形

热门文章

  1. 博弈论与最优化的关系
  2. 9102年,曝光这几个高质量的公众号,年薪7位数!
  3. 几个北大和南开学霸的公众号,值得学习
  4. R_ggplot2地理信息可视化_史上最全(一)
  5. java中vector和list_java中vector和list的区别
  6. Egret入门学习日记 --- 第十三篇(书中 5.2~5.3节 内容)
  7. SqlServer 2008的tempdb数据文件大小暴增处理
  8. 二进制流 最后一段数据是最后一次读取的byte数组没填满造成的
  9. Maven 项目添加jetty 插件
  10. IDF2013:可信计算在中国的发展