发布一个开源小工具,支持将酷狗和网易云音乐的缓存文件转码为MP3文件。

以前写过kgtemp文件转mp3工具,正好当前又有网易云音乐缓存文件需求,因此就在原来小工具的基础上做了一点修改,增加了对网易云音乐的支持,并简单调整了下代码结构,方便后续增加其他音乐软件的支持。

工具使用介绍

下载程序(点击下载),然后启动程序,

  • 首先,设置输入目录,也就是解密后的文件存放在哪里
  • 然后将酷狗或者网易的缓存文件 or 整个文件夹,拖入到程序即可

打开转码结果目录,可以看到转码后的结果

缓存目录如何找

网易云音乐的缓存目录

打开设置 -- 下载设置 - 缓存目录就是了

酷狗缓存目录

如图,在设置--下载设置里

工具代码简要说明

类图

ICacheDecrypt

我们定义一个解码接口ICacheDecrypt,实现将缓存文件字节流转换为mp3字节流。

 /// <summary>/// 解密接口/// </summary>public interface ICacheDecrypt{string AcceptableExtension{get;}bool isAcceptable(string cacheFile);/// <summary>/// 解密文件/// </summary>/// <param name="cacheFile">缓存文件</param>/// <returns>解密后二进制数据</returns>byte[] Decrypt(string cacheFile);/// <summary>/// 解密文件/// </summary>/// <param name="cacheFileData">缓存文件数据</param>/// <returns></returns>byte[] Decrypt(byte[] cacheFileData);/// <summary>/// 解密文件/// </summary>/// <param name="cacheFile">cache文件</param>/// <param name="decodedFile">解密后文件</param>void Decrypt(string cacheFile,string decodedFile);}

BaseCacheDecrypt

然后,实现一个默认的抽象类BaseCacheDecrypt,实现一些公共的东西,具体的转码工作让子类去实现,比如网易和酷狗可以分别建一个子类。

public abstract class BaseCacheDecrypt : ICacheDecrypt{protected string currentCacheFile;public abstract string AcceptableExtension{get;}public abstract byte[] Decrypt(byte[] cacheFileData);public byte[] Decrypt(string cacheFile){currentCacheFile = cacheFile;return Decrypt(File.ReadAllBytes(cacheFile));}public void Decrypt(string cacheFile, string decodedFile){File.WriteAllBytes(decodedFile, Decrypt(cacheFile));}public  bool isAcceptable(string cacheFile){return cacheFile.EndsWith(AcceptableExtension);}}

NetMusicCacheDecrypt

然后,分别实现酷狗和网易云音乐的解码工作,酷狗的上次已经写了如何解码,这里只贴网易的,解码很简单,异或0xa3就可以了。网易音乐在测试时发现好多mp3没有ID3信息,经过观察发现缓存文件名里包含歌曲的id信息,因此可以根据这个id信息去抓取歌曲网页,解析出歌手和歌曲名称,然后写入到ID3里,这里ID3的读写采用了GitHub上的一个开源库

/// <summary>/// 网易云缓存解密/// </summary>public class NetMusicCacheDecrypt : BaseCacheDecrypt{public override string AcceptableExtension{get{return ".uc";}}string cut(string str,string start,string end){var startIndex = str.IndexOf(start);if (startIndex == -1){return "";}startIndex += start.Length;var endIndex = str.IndexOf(end, startIndex);if (endIndex == -1){return "";}return str.Substring(startIndex, endIndex - startIndex);}public override byte[] Decrypt(byte[] cacheFileData){         for (var i = 0; i < cacheFileData.Length; i++){// 异或0xa3cacheFileData[i] ^= 0xa3;}var fileName = new FileInfo(currentCacheFile).Name;var songId = fileName.Substring(0, fileName.IndexOf("-"));var html = HttpHelper.SendGet("http://music.163.com/song?id=" + songId);if (html.Length > 0){var title = cut(html, "<title>", "</title>").Trim();var tempFile = currentCacheFile+ Guid.NewGuid().ToString();File.WriteAllBytes(tempFile, cacheFileData);Track theTrack = new Track(tempFile);// 父亲写的散文诗(时光版) - 许飞 - 单曲 - 网易云音乐theTrack.Artist = cut(title, "-", "-").Trim();theTrack.Title = title.Substring(0, title.IndexOf("-")).Trim();// Save modifications on the disctheTrack.Save();cacheFileData = File.ReadAllBytes(tempFile);File.Delete(tempFile);}return cacheFileData;}}

接着介绍核心的Decryptor,实现转码的调度,这里的思路就是将所有的解码器放到一个list里,当一个文件过来的时候,遍历所有解码器,如果accetbale,就处理,否则跳过。
两个主要工作:

  • 加载所有的BaseCacheDecrypt
  • 进行解码工作

加载所有的BaseCacheDecrypt

两种方法,一是自己实例化,一是使用反射,这里当然用反射了:)


private Decryptor(){}public static Decryptor Instance{get{return Holder.decryptor;}}static class Holder{public static Decryptor decryptor = Load();/// <summary>/// 从当前Assembly加载/// </summary>/// <returns></returns>private static Decryptor Load(){Assembly assembly = Assembly.GetExecutingAssembly();List<Type> hostTypes = new List<Type>();foreach (var type in assembly.GetExportedTypes()){//确定type为类并且继承自(实现)IMyInstanceif (type.IsClass && typeof(BaseCacheDecrypt).IsAssignableFrom(type) && !type.IsAbstract)hostTypes.Add(type);}Decryptor decryptor = new Decryptor();foreach (var type in hostTypes){ICacheDecrypt instance = (ICacheDecrypt)Activator.CreateInstance(type);decryptor.cacheDecryptors.Add(instance);}return decryptor;}}

Decryptor通过单例模式对外提供调用。

进行解码

判断拖入的是文件夹还是文件,文件夹的话遍历子文件,依次处理。解码方式就是钢说的,遍历decryptors,如果支持就解码。
解码完后,读取ID3信息,对文件进行重命名。

 public int Process(string path){int success = 0;if (Directory.Exists(path))//如果是文件夹{DirectoryInfo dinfo = new DirectoryInfo(path);//实例化一个DirectoryInfo对象foreach (FileInfo fs in dinfo.GetFiles()) //查找.kgtemp文件{ProcessFile(fs.FullName);success++;}}else{ProcessFile(path);success = 1;}return success;}private string GetCleanFileName(string fileName){StringBuilder rBuilder = new StringBuilder(fileName);foreach (char rInvalidChar in Path.GetInvalidFileNameChars())rBuilder.Replace(rInvalidChar.ToString(), string.Empty);return rBuilder.ToString();}private string GetTargetFileName(string fileName){var fileinfo = new FileInfo(fileName);var rawName = fileinfo.Name.Substring(0, fileinfo.Name.IndexOf("."));return TargetDirectory + Path.DirectorySeparatorChar + rawName + ".mp3";}void ProcessFile(string fileName){_logger.Info("开始处理" + fileName);try{foreach (var decryptor in cacheDecryptors){if (decryptor.isAcceptable(fileName)){var targetName = TargetDirectory + Path.DirectorySeparatorChar + new FileInfo(fileName).Name + ".mp3";decryptor.Decrypt(fileName, targetName);// 重命名if (AutoRename){var mp3 = ID3Helper.ReadMp3(targetName);if (mp3.Title.Length > 0){string realFileName = GetTargetFileName(GetCleanFileName(mp3.Title + "-" + mp3.Artist + ".mp3"));_logger.Info("重命名" + realFileName);if (File.Exists(realFileName)){File.Delete(realFileName);}File.Move(targetName, realFileName);}}}}_logger.Info(fileName + "处理完成");}catch(Exception ex){_logger.Error(fileName + "出现异常" + ex.Message);}}

开源地址

代码托管到了GitHub,musicDecryptor, 感兴趣的可以访问进行


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

开源小工具 酷狗、网易音乐缓存文件转mp3工具相关推荐

  1. scrapy 爬取酷狗T500音乐

    scrapy 爬取酷狗T500音乐 开始工作 代码的编写 开始工作 1.创建项目scrapy startproject kugouScrapy 2.创建spider cd kugou scrapy g ...

  2. 酷狗软件测试用例,仿酷狗的音乐搜软件的开发与测试.doc

    仿酷狗的音乐搜软件的开发与测试 仿酷狗的音乐搜索软件的开发与测试 摘 要 当前,面对浩瀚的网络资源,搜索引擎为所有网上冲浪的用户提供了一个入口,毫不夸张的说,所有的用户都可以搜索引擎到达自己想去的网上 ...

  3. ubuntu 安装 酷狗在线音乐桌面版

    安装依赖条件: sudo apt-get install python-gtk2 python-webkit 安装包  kugou-0.1.0-1~ubuntu~all.deb 下载地址: http: ...

  4. 爬虫练习-爬取酷狗TOP500音乐信息

    前言: 同上篇爬虫练习-爬取小猪短租网北京地区短租房信息一样,均为极简的爬虫,仅仅爬取酷狗TOP500音乐信息(排名.歌手名.歌曲名.歌曲时长),可供入门和想入门的朋友学习. 本文为整理代码,梳理思路 ...

  5. 【强烈推荐】音频文件免费批量一键格式转换好工具——酷狗音乐

    简介: 最近买了一个U盘,想把偶像JAY的歌曲拷贝到U盘里面,放到车里听,类似车载U盘.但是我的歌曲格式是无损FLAC格式的,车载系统对FLAC格式的音乐兼容性不好,一首歌没听多久就解析失败放下一首了 ...

  6. linux安装酷狗软件下载,Ubuntu 9.04安装kugou(酷狗)音乐

    都说使用Linux系统的人喜欢安静,但工作累了听会歌也是一件挺惬意的事情,系统的播放器只能实现简单的播放,这里给大家推荐在Ubuntu 9.04下安装kugou音乐,可以实现在线听歌,很爽阿.呵呵. ...

  7. 【thinkPhP】96PHPCN音乐电台(支持收听酷狗收费音乐)

    开发框架:ThinkPHP3.2 音乐接口:酷狗音乐 开源地址:点击打开 演示地址:点击打开 转载于:https://my.oschina.net/u/2367105/blog/826240

  8. HttpClient 实现酷狗 Top500 音乐下载

    使用java的HttpClient实现酷狗音乐Top500歌曲的下载 歌单URL https://www.kugou.com/yy/rank/home/1-8888.html?from=rank 访问 ...

  9. 小叙酷狗和酷我音乐盒

    使用感受: 酷我音乐盒比较人性化,有MV搜索,有音乐推荐: 酷狗目前也支持MV搜索,支持ape等无损音乐的搜索,能搜索到高码率的mp3. 大致原理: 酷我音乐盒可能通过类似搜索引擎的爬虫等将博客,或者 ...

  10. python爬取酷狗付费音乐_python爬蟲教程:爬取酷狗音樂

    在常見的幾個音樂網站里,酷狗可以說是最好爬取的啦,什么彎都沒有,也沒加密啥的,所以最適合小白入門爬蟲 本篇針對爬蟲零基礎的小白,所以每一步驟我都截圖並詳細解釋了,其實我自己看着都啰嗦,歸根到底就是兩個 ...

最新文章

  1. 快速入门linux系统的iptables防火墙 1 本机与外界的基本通信管理
  2. CCF201612-3 权限查询(100分)
  3. redis3.0.2 分布式集群安装详细步骤
  4. Html基础Part1:Htmla标签的几种跳转姿势
  5. 毫米波雷达_最新的7个毫米波雷达应用案例
  6. “QQ尾巴病毒”核心技术的实现
  7. PostgreSQL 13隐藏杀手锏特性
  8. 教程和攻略之悪戯極~いたずらリアル~(3D电车监禁)+初回特典
  9. 中国喷漆室保护膜市场趋势报告、技术动态创新及市场预测
  10. 学习PriorityQueue源码
  11. 以太坊POA共识机制Clique源码分析
  12. IE浏览器中a:hover设置background失效的解决方法
  13. ios中webview的高级用法(二)
  14. 用ping IP的方法测试网卡
  15. QT widget宽高比
  16. 灵魂有香气的女子李筱懿|讲述女性自我成长的重要性
  17. java locale zh_国际化:Java平台下的Locale类
  18. J - 山峰和山谷 Ridges and Valleys
  19. VMware虚拟机安装Linux系统(详细版)
  20. 211硕士 进大厂美团亲身经验分享-面试不算难(学累了进来看看)

热门文章

  1. Martin Fowler谈微服务的优缺点
  2. 日常运维管理 常用命令(3)
  3. JavaScript继承方式详解[转]
  4. windbg调试C#代码(二)
  5. 【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
  6. java面试题之什么是ThreadLocal?底层如何实现的?
  7. FFMPEG 的学习
  8. ecshop数据库操作类
  9. 用c#中的WebBrowser抢小米F码,抢小米手机以及自动测试实现原理
  10. ubuntu 修改IP,网关等