这个工具已经准备第二版,读者了解编程软件,可以直接使用,请阅读和使用这个场地
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. effective c++ 条款7 declare virtual destructor for polymophyc base class

    这似乎很明显. 如果base class的destructor不是virtual,当其derived class作为基类使用,析构的时候derived class的数据成员将不会被销毁. 举个例子 我 ...

  2. CareerCup chapter 1 Arrays and Strings

    1.Implement an algorithm to determine if a string has all unique characters What if you can not use ...

  3. 微软中国裁员曝光:在CD结束后!薪酬不变!

    聚众抗议的前诺基亚员工(腾讯科技配图) 腾讯科技 郭晓峰 腾讯科技刚刚获取了一份微软设备事业部中国区管理团队4日晚间发给被裁员工的补偿方案邮件. 邮件内容显示,微软承诺在收购诺基亚交易结束(2014年 ...

  4. Appium0.18.x迁移到Appium1.x须知事项(灰常实用,解答了本人几个疑问)

    英文原版:https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/migrating-to-1-0.md Migr ...

  5. javascript中的三角学

    三角学主要研究三角形和它们的边角关系,包含一个90度角的三角形被称为直角三角形.在这里主要研究直角三角形相关的知识. 1. 角度和弧度 360(角度) = 2*Math.PI(弧度) degrees ...

  6. javascript动画中的“帧”

    在写游戏的时候,动画移动的速度需要保持一致,为了在各个软硬件环境中速度的一致,需要考虑帧频的不同. 计算时间系数: 时间系数 = 目标FPS / 实际FPS 计算实际FPS actualFPS = 1 ...

  7. 在SQL Server引用dll的流程

    原文:在SQL Server引用dll的流程 在SQL Server中引用dll分为两个步骤 1.创建一个dll文件 2.把dll文件放进SQL Server的程序集中.然后定义一个Function, ...

  8. IIS安装asp组件:JMail 邮件收发组件

    JMail简介 jmail是一种服务器端的邮件发送组件,和个人用的客户端邮件软件不一样的.jmail是在服务器上给程序用来发邮件用的,除了软件编程人员,其他人一般平常用不上. jmail是一个第三方邮 ...

  9. Webots入门(二)-build up a controller

    A simple controller 控制器程序读取传感器的值,然后改动行走速度来避开障碍物. 以下是控制器源码mybot_simple.c: #include<webots/robot.h& ...

  10. SUPPORTDIR引用的文件的加入

    上一篇转载了SUPPORTDIR的理论解释,如今截图说明实际操作: 选择依赖的语言,在右面的files框里右键点击,选择Insert Files插入文件,编译.由于安装得时候,压缩包会解压成一个暂时文 ...