这个工具已经准备第二版,读者了解编程软件,可以直接使用,请阅读和使用这个场地
http://blog.csdn.net/jzj1993/article/details/44459983



本文所涉及内容用于技术学习。请勿用于不正当用途,否则后果自负。

酷我音乐ios版下载的音乐文件,通过同步助手等软件查看时,发现音乐文件都是一串数字命名。通过网上查找和自己尝试,发现那些文件都是音频文件改了文件名称而已。仅仅要改动回文件名称,就能和正常的音乐一样播放了。


在网上找到了一个软件。也就是上面參考网址中的软件。可是使用的时候出现了问题,提示subscript out of range,程序不能继续运行。于是就决定自己用Java写一个来处理。


首先从手机复制出cloud.db数据库文件。为SQLite数据库文件。用SQLite Database Browser打开,看到里面和音乐关系比較密切的主要有三个table,playlistsInfo中保存着播放列表信息,字段title为列表名称,字段id为列表id。playlistMusics保存了音乐和播放列表的相应关系,字段title、artist等为音乐信息。rid为音乐资源id,字段playlist_id相应了所属播放列表id。musicResource中是音乐信息和文件相应关系。字段file为相应的文件名称,format为文件格式。rid为音乐资源id。



于是程序的工作流程是这种:
1、首先从musicResource逐一读取每首音乐的rid。
2、通过rid在playlistMusics中查找playlist_id。可能找不到,也可能不止一个,由于同一首音乐可能在多个列表中,这里简单的取最大的playlist_id,通常应该是相对照较新的播放列表。
3、然后在playlistsInfo中找到playlist_id相应的播放列表名。作为目标音乐的子目录;
4、最后把源文件重命名为“歌手名 - 歌曲名.扩展名”,并移动到目标目录就可以。

为方便交流学习,这里提供本程序源代码。

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; public class Test { /**
* 存储播放列表的数据结构
*
* @author jzj
*/
static class PlayList {
int id;
String name; public PlayList(String name, int id) {
this.name = name;
this.id = id;
}
} // 数据库完整路径
static final String db_path = "G:\\IOS\\cloud.db";
// 源目录
static final String src_dir = "G:\\IOS\\Music\\";
// 目标目录
static final String dst_dir = "G:\\IOS\\Music1\\"; public static void main(String[] args) throws Exception { Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:" + db_path); Statement stat1 = conn.createStatement();
Statement stat2 = conn.createStatement(); // 读取播放列表
List<PlayList> lists = new ArrayList<Test.PlayList>();
ResultSet rs_list = stat1.executeQuery("select * from playlistsInfo;");
while (rs_list.next()) {
final int id = rs_list.getInt("id");
final String name = rs_list.getString("title");
switch (name) {
// 忽略这几个列表
case "本地歌曲":
case "默认列表":
case "近期播放":
case "我的电台":
break;
case "我喜欢听":
default:
lists.add(new PlayList(name, id));
}
} // 读取音乐信息
ResultSet rs_res = stat1.executeQuery("select * from musicResource;");
while (rs_res.next()) { // 源文件路径
String fname = rs_res.getString("file");
if (fname == null || fname.length() == 0) // 假设file字段为空则跳过
continue; String src_path = src_dir + fname; File src = new File(src_path);
if (!src.exists()) // 假设源文件不存在则跳过
continue; // 获取音乐rid
int rid = rs_res.getInt("rid"); // 查找该音乐所在播放列表id, 假设没有找到则为-1
ResultSet rs_pl = stat2.executeQuery(new StringBuilder(
"select playlist_id from playlistMusics where rid=")
.append(rid).append(';').toString());
int playlist_id = -1;
while (rs_pl.next()) { // 默认将一首歌放在编号最大的播放列表中(也就是最新创建的列表)
int p_id = rs_pl.getInt("playlist_id");
if (p_id > playlist_id)
playlist_id = p_id;
}
rs_pl.close(); // 目标目录路径
StringBuilder b2 = new StringBuilder(dst_dir);
if (playlist_id >= 0) {
String playlist_name = getPlaylist(lists, playlist_id);
if (playlist_name != null) {
b2.append(playlist_name).append('\\');
}
}
String dir = b2.toString();
new File(dir).mkdirs(); // 目标文件名称: "艺术家 - 歌曲名.扩展名"
StringBuilder b3 = new StringBuilder();
b3.append(rs_res.getString("artist")).append(" - ")
.append(rs_res.getString("title")).append('.')
.append(rs_res.getString("format"));
String dst_path = dir + b3.toString(); // 移动和重命名
File dst = new File(dst_path);
src.renameTo(dst); // 输出信息
System.out.println(new StringBuilder(src_path).append(" ---> ")
.append(dst_path));
}
rs_res.close();
conn.close();
} static String getPlaylist(List<PlayList> lists, int playlist_id) {
for (PlayList pl : lists) {
if (pl.id == playlist_id)
return pl.name;
}
return null;
}
}

因为涉及数据库操作,须要在Javaproject中加入数据库支持包,可參看这篇文章 http://ttitfly.iteye.com/blog/143934
使用nested包:sqlitejdbc-v037-nested.jar

将音频文件所有复制出来,放到程序中src_dir所指定的文件夹,数据库文件cloud.db保存在db_path指定的位置,设置好目标文件夹dst_dir。运行程序就可以整流导出的音频文件,实測700多首音乐,仅仅需不到一分钟时间就可以完毕重命名和移动工作。

完整project可在此下载:

版权声明:本文博客原创文章,博客,未经同意,不得转载。

如何为ios酷我音乐盒下载导出的音乐文件(使用Java程序设计)的更多相关文章

  1. ios学习:AVAudioPlayer播放音乐文件及读取ipod库中的音乐文件

    首先要导入AVFoundation框架及 #import <AVFoundation/AVFoundation.h>头文件 注意:要在真机上调试 下面是ipad上的调试效果 下面是代码,代 ...

  2. PHP 下载导出中文名的文件的编码注意事项

    我的页面全部都为utf-8 在代码中我的文件名是中文名. 在创建文件时,就要将utf-8转码成gbk(用以支持中文) $file = iconv('utf-8',"gbk",$fi ...

  3. [有料组每日学习分享计划--00087]32行代码帮你导出IOS酷我音乐下载的无损音乐

    需求与研究: 1.IOS的酷我音乐软件,还是不错滴,可以直接下载APE或是320K的MP3音乐,但是我发现PC上的酷我反而没这个功能,而且其他的音乐软件一般只能下载中低品质的音乐.所以能够从IOS中找 ...

  4. iOS APP下载安装时,如果出现此时无法下载安装APP的字样时,一些解决思路

    1.在iosAPP下载安装时,如果出现此时无法下载安装APP的字样时,可能是苹果系统进行了支持更新,并需要我们确认条约.至于如何判断是否是苹果系统进行了更改,只需要我们进入开发者账号,进入我的账户(A ...

  5. 把页面上的图表导出为pdf文件,分享一种请求下载文件的方法

    最近客户提出一个需求,就是把页面上的图表导出为pdf文件. 找了很多资料.终于有了点头绪.最主要是参考了HighCharts的做法.http://www.hcharts.cn/ 实现原理:把页面图表的 ...

  6. IOS开发-加载本地音乐

    IOS开发-加载本地音乐 $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text() ...

  7. datagrid数据导出到excel文件给客户端下载的几种方法

    方法一:导出到csv文件,存放在服务器端任一路径,然后给客户下载 优点: 1.可以进行身份认证后给客户下载,如果放到非web目录就没有对应的url,客户无法随时下载. 2.也是因为生成了文件,所以占用 ...

  8. ios 后台下载,断点续传总结

    2018年12月05日 16:09:00 weixin_34101784 阅读数:5 https://blog.csdn.net/weixin_34101784/article/details/875 ...

  9. Python爬虫下载酷狗音乐

    目录 1.Python下载酷狗音乐 1.1.前期准备 1.2.分析 1.2.1.第一步 1.2.2.第二步 1.2.3.第三步 1.2.4.第四步 1.3.代码实现 1.4.运行结果 1.Python ...

随机推荐

  1. 3、Spring4之Bean 配置的细节

    1). 若字面值中包括特殊字符,则能够使用 value 节点的 <![CDATA[]]> 把字面值包裹起来.      <constructor-arg>           ...

  2. Tomcat部署发布JSP应用程序的三种方法 (转)

    Tomcat部署发布JSP应用程序的三种方法     1.直接放到Webapps目录下      Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应 ...

  3. ExtJS4 根据分配不同的树形菜单在不同的角色登录后

    继续我的最后.建立cookie后,带他们出去 var userName = Ext.util.Cookies.get('userName'); var userAuthority = Ext.util ...

  4. 【从翻译mos文章】不再用par file如果是,export or import 包含大写和小写表名称表

    不再用par file如果是,export or import 包含大写和小写表名称表 参考原始: How to Export or Import Case Sensitive Tables With ...

  5. Visual Studio 连接不上NuGet 官方程序包源的解决办法

    修改dns 即可

  6. hdu4185 Oil Skimming(偶匹配)

    <span style="font-family: Arial; font-size: 14.3999996185303px; line-height: 26px;"> ...

  7. ZOJ 2412 Farm Irrigation(DFS 条件通讯块)

    意甲冠军  两个农田管内可直接连接到壳体  他们将能够共享一个水源   有11种农田  管道的位置高于一定  一个农田矩阵  问至少须要多少水源 DFS的连通块问题  两个相邻农田的管道能够直接连接的 ...

  8. 3.cocos2dx它Menu,由menu为了实现场景切换

     1 头文件 TMenu.h #ifndef __TMENU_H__ #define __TMENU_H__ #include "cocos2d.h" USING_NS_CC; ...

  9. Objective-C语法简记学习

    開始学习iPhone开发了,尽管如今已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,如今来学Objective-C,这篇仅仅是一些非 ...

  10. 数据结构(C达到)------- 双链表

    双链表中的每个节点包含两个指针域,指针域包含其后继节点的内存地址,还有一个指针所存储的存储器地址其领域前驱节点. 双向链表结点的类型描写叙述: //双向链表的类型描写叙述 typedef int El ...