如何從ios酷我音樂盒中匯出已下載的音樂檔案(使用Java編程實現),iosjava
如何從ios酷我音樂盒中匯出已下載的音樂檔案
本文所涉及內容用於技術學習,請勿用於不正當用途,否則後果自負。
酷我音樂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
從ios版的酷我音樂盒把音樂匯出後在電腦上顯示 1129 1134 1246 等格式,用播放器可以播放
1,電腦的播放器是否也是酷我?如果是,換個別的試試。2,你確定開啟顯示檔案尾碼的開關了?
ios酷我音樂盒怎下載視頻
用itunes下載上傳~