如何从ios酷我音乐盒中导出已下载的音乐文件(使用Java编程实现)
生活随笔
收集整理的這篇文章主要介紹了
如何从ios酷我音乐盒中导出已下载的音乐文件(使用Java编程实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本工具已經編寫了第二版,為不了解編程的讀者提供了可以直接使用的軟件,請移步這里閱讀和使用 http://blog.csdn.net/jzj1993/article/details/44459983
本文所涉及內容用于技術學習,請勿用于不正當用途,否則后果自負。
酷我音樂ios版下載的音樂文件,通過同步助手等軟件查看時,發(fā)現音樂文件都是一串數字命名。通過網上查找和自己嘗試,發(fā)現那些文件都是音頻文件改了文件名而已。只要修改回文件名,就能和正常的音樂一樣播放了。
參考網址: http://blog.sina.com.cn/s/blog_4d5428240101enzu.html
在網上找到了一個軟件,也就是上面參考網址中的軟件,但是使用的時候出現了問題,提示subscript out of range,程序不能繼續(xù)執(zhí)行。于是就決定自己用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()) { // 默認將一首歌放在編號最大的播放列表中(也就是最新創(chuàng)建的列表)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,執(zhí)行程序即可整流導出的音頻文件,實測700多首音樂,只需不到一分鐘時間即可完成重命名和移動工作。
完整工程可在此下載: http://pan.baidu.com/s/1hGNT0
總結
以上是生活随笔為你收集整理的如何从ios酷我音乐盒中导出已下载的音乐文件(使用Java编程实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 野鸡公司碰瓷?交通部称强国交通 App
- 下一篇: 安卓设置Activity切换动画无效的问