如何从ios酷我音乐盒中导出已下载的音乐文件(使用Java编程实现)

本工具已经编写了第二版,为不了解编程的读者提供了可以直接使用的软件,请移步这里阅读和使用 http://blog.csdn.net/jzj1993/article/details/44459983



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

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

参考网址:
http://blog.sina.com.cn/s/blog_4d5428240101enzu.html

在网上找到了一个软件,也就是上面参考网址中的软件,但是使用的时候出现了问题,提示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;// 获取音乐ridint rid = rs_res.getInt("rid");// 查找该音乐所在播放列表id, 如果没有找到则为-1ResultSet 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;}
}


由于涉及数据库操作,需要在Java工程中添加数据库支持包,可参看这篇文章 http://ttitfly.iteye.com/blog/143934
使用nested包:sqlitejdbc-v037-nested.jar

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

完整工程可在此下载:
http://pan.baidu.com/s/1hGNT0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018年中国人均GDP接近1万美元,这在全球处于什么样的水平?

按照人均1万美元计算&#xff0c;目前我国大概可以排在世界第64位&#xff0c;比2017年的上升6位左右。中国人均GDP突破1万亿美元&#xff0c;属于中等偏上收入国家1月16日有媒体爆料&#xff0c;预计2018年人均国内生产总值可接近1万美元。1万美元的人均GDP略高于中等偏上收入…

信用卡逾期不还是否要坐牢?看法律是怎么规定的

信用卡不还款要坐牢&#xff1f;估计这事情说的有点严重&#xff0c;但事实上确实有不少人因为信用卡逾期还不上而被法院判刑了的。我们先来看2个实际的案例。案例1&#xff1a;萍乡一贸易老板经常套现信用卡用于偿还债务。2014年5月开始&#xff0c;黄某开始不按期归还信用卡账…

安卓设置Activity切换动画无效的问题

做安卓App时&#xff0c;常会设置Activity之间切换的动画。常用的方法有两种&#xff0c;一种是用Activity的overridePendingTransition方法&#xff1b;另一种是用style文件通过xml进行设置。 一开始使用style的时候&#xff0c;我只设置了Window的动画&#xff0c;在大部分手…

优惠到期,2月1日起支付宝将恢复0.6%的手续费

这个题目相信很多网友都会一脸茫然&#xff0c;支付宝优惠到期是什么优惠呢&#xff1f;我们怎么没有享受过&#xff1f;其实这个所谓的优惠就是刷卡手续费的费率优惠&#xff0c;当然这个主要是针对商家而言&#xff0c;对普通消费者暂时没有什么影响。可能说到刷卡手续费&…

安卓创建快捷方式相关问题 Intent Intent-filter

Intent在安卓中&#xff0c;Activity启动时通常需要Intent参数。Intent参数中包含以下几个常用的属性&#xff1a;Component&#xff0c;指定了要启动的Activity&#xff0c;以及启动的context&#xff0c;使用Intent.setClass或Intent.setComponent方法可以设置&#xff1b;Ac…

安卓动画知识总结 Animation AnimationSet LayoutAnimation

本文由PurpleSword(jzj1993)原创&#xff0c;转载请注明原文网址 http://blog.csdn.net/jzj1993常见动画有几种控件View的动画(如Dialog窗口中的圆形进度条)空间Window的动画(如DialogWindow&#xff0c;PopupWindow的动画&#xff0c;Activity切换时整个Window页面的动画)View…

Activity和Service通信 Bind方式

本文由PurpleSword(jzj1993)原创&#xff0c;转载请注明原文网址 http://blog.csdn.net/jzj1993在Service中自定义Binder类&#xff0c;实现方法getService&#xff1b;覆写Service的onBind方法public class MainService extends Service {Overridepublic void onCreate() {sup…

语义分析 文本矛盾点解析_关于解析文本的几点思考

语义分析 文本矛盾点解析Yesterday I wrote about three course modules in Oslo, and the fact that most of the presentation material is online. Today I will be writing about one lesson in the curriculum about ‘Parsing’. First I will share a few general thoug…

专家建议用南方的养老金拿去救济东北,网友炸锅了

随着我国老龄化的不断加剧&#xff0c;养老资金已经成为了社会要面临的一个艰巨问题&#xff0c;特别是在东北地区&#xff0c;这些年来东北地区经济发展比较缓慢&#xff0c;导致养老资金收入也跟着放慢&#xff0c;目前有的省份养老基金结余已经为负数&#xff0c;这对于如何…

安卓屏幕尺寸相关知识

本文由PurpleSword(jzj1993)原创&#xff0c;转载请注明原文网址 http://blog.csdn.net/jzj19931.px Pixels,像素值2.dp dip device independent pixel,设备独立像素(安卓专用虚拟像素单位)3.density,屏幕密度(1)近似换算关系 px dip*density, dip px/density(2)相同像素值…

明明知道银行存款会贬值,为什么还有那么多人把钱放在银行?

钱存在银行肯定是贬值的&#xff0c;但是对于那些风险意识比较低&#xff0c;或者从风险承受能力比较低的人来说&#xff0c;你除了存在银行&#xff0c;还有别的更好选择吗&#xff1f;没有&#xff01;银行存款利率基本上跑不赢通货膨胀。最近几年&#xff0c;我国货币量的不…

pandas 机器学习_机器学习的PANDAS

pandas 机器学习Pandas is one of the tools in Machine Learning which is used for data cleaning and analysis. It has features which are used for exploring, cleaning, transforming and visualizing from data.Pandas是机器学习中用于数据清理和分析的工具之一。 它具…

家族信托是什么东东?为何受到富豪们的大力吹捧?

说到信托相信很多人都知道是怎么回事&#xff0c;但是说到家族信托就未必有人知道是啥回事了。不过大家对于家族信托不了解&#xff0c;并不妨碍家族信托的迅猛发展&#xff0c;最近几年家族信托这个概念在富豪圈已经成为了一个热门的话题&#xff0c;很多有钱的人都在尝试搞家…

安卓SlidingDrawer

本文由PurpleSword(jzj1993)原创&#xff0c;转载请注明原文网址 http://blog.csdn.net/jzj1993Layout<RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wrap…

鸭子目标检测数据集VOC格式300张

鸭子是一种较为常见的水禽&#xff0c;属于鸟纲鸭科动物&#xff0c;是人们生活中的常见动物之一。鸭子的外形特征独特&#xff0c;身体小巧灵活&#xff0c;身长约30-40厘米左右&#xff0c;体重在1-2千克左右。鸭子的嘴宽大而扁平&#xff0c;呈圆形&#xff0c;嘴边有着细小…

为什么支付宝不提供房贷业务?原因在这里

大家都知道房贷是银行的一块肥肉&#xff0c;也是银行利润最丰厚最稳定的一部分&#xff0c;目前房贷业务占到银行整体业务基本上都是在30%以上&#xff0c;有部分银行甚至达到50%以上。尽管房贷业务和很肥&#xff0c;但是并不是所有银行都会开展房贷业务&#xff0c;比如蚂蚁…

文本摘要提取_了解自动文本摘要-1:提取方法

文本摘要提取Text summarization is commonly used by several websites and applications to create news feed and article summaries. It has become very essential for us due to our busy schedules. We prefer short summaries with all the important points over read…

安卓json的解析

本文由PurpleSword(jzj1993)原创&#xff0c;转载请注明原文网址 http://blog.csdn.net/jzj1993方法一&#xff08;使用安卓包含的JSON解析类&#xff09;import org.json.JSONArray;import org.json.JSONObject;import org.json.JSONTokener;try {JSONTokener tokener new JS…

安卓线程相关 HandlerThread Handler Thread Looper Message Runnable

本文由PurpleSword(jzj1993)原创&#xff0c;转载请注明原文网址 http://blog.csdn.net/jzj1993安卓主线程&#xff08;UI线程&#xff09;是线程不安全的&#xff1a;对UI控件的操作都应在主线程中完成&#xff1b;UI线程不应执行耗时操作&#xff0c;以免程序不响应&#xff…

用户细分_基于购买历史的用户细分

用户细分介绍 (Introduction) The goal of this analysis was to identify different user groups based on the deals they have availed, using a discount app, in order to re-target them with offers similar to ones they have availed in the past.该分析的目的是使用折…