这个工具已经准备第二版,读者了解编程软件,可以直接使用,请阅读和使用这个场地
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. VS2012 编译程序时报无法载入PDB文件错误解决方式

    VS2012 编译程序时报无法载入PDB文件错误解决方式 "ConsoleApplication1.exe"(Win32): 已载入"C:\Users\hp\Docume ...

  2. Java代码检查工具

    FindBugs:不注重样式和格式,重视真正的缺陷和潜在的性能问题,,基于Bug Patterns,在不运行的情况下检查字节码代码质量. Jalopy:Java源代码格式化工具,可自定义规则. PMD ...

  3. skyeye安装+arm-elf-gdb安装+模拟s3c44b0x+执行ucos4skyeye

    [假设你要引用.请阅读所有,这里是我的为期两天的过程只是一个记录] skyeye安装:ubuntu12.0432 llvm2.8 skyeye1.3.3 http://blog.chinaunix.n ...

  4. 流量计算-Jstorm提交Topology过程(下一个)

    马上部分流量计算-Jstorm提交Topology过程(上), 5.上篇任务已经ServiceHandler.submitTopologyWithOpts()方法.在该方法中,会实例化一个Topolo ...

  5. sql 添加用户

    use master GO EXEC sp_addlogin 'infos1', '1', 'master' exec sp_grantdbaccess 'infos311' -- 给访问权限 USE ...

  6. linux基于学习

    1.还有一个文件名前".",它代表的文件""隐藏文件". 2.chgrp:改变文件所属用户组 chown:改变文件全部者 chmod:改变文件的权限 ...

  7. 终结者单身——setAccessible(true)

    首先看一下"传说"Singleton模式 package go.derek; public class Singleton{ public static int times; pr ...

  8. Android ELF文件格式

    最近一直在学习elf相关信息.一个小总结,这里记录,也方便以后查阅. ELF是类Unix类系统,当然也包含Android系统上的可运行文件格式(也包含.so和.o类文件). 能够理解为Android系 ...

  9. SQLSERVER存储过程语法的具体解释

    SQL SERVER存储过程语法: Create PROC [ EDURE ] procedure_name [ ; number ]     [ { @parameter data_type }   ...

  10. .NET应用架构设计—工作单位模式(摆脱程序代码的重要思想,反击DDD)

    阅读文件夹: 1.背景介绍 2.过程式代码的真正困境 3.工作单元模式的简单演示样例 4.总结 1.背景介绍 一直都在谈论面向对象开发.可是开发企业应用系统时.使用面向对象开发最大的问题就是在于,多个 ...