日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

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

發(fā)布時間:2023/12/15 java 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何从ios酷我音乐盒中导出已下载的音乐文件(使用Java编程实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本工具已經(jīng)編寫了第二版,為不了解編程的讀者提供了可以直接使用的軟件,請移步這里閱讀和使用 http://blog.csdn.net/jzj1993/article/details/44459983



本文所涉及內(nèi)容用于技術(shù)學(xué)習(xí),請勿用于不正當(dāng)用途,否則后果自負(fù)。
酷我音樂ios版下載的音樂文件,通過同步助手等軟件查看時,發(fā)現(xiàn)音樂文件都是一串?dāng)?shù)字命名。通過網(wǎng)上查找和自己嘗試,發(fā)現(xiàn)那些文件都是音頻文件改了文件名而已。只要修改回文件名,就能和正常的音樂一樣播放了。
參考網(wǎng)址: http://blog.sina.com.cn/s/blog_4d5428240101enzu.html
在網(wǎng)上找到了一個軟件,也就是上面參考網(wǎng)址中的軟件,但是使用的時候出現(xiàn)了問題,提示subscript out of range,程序不能繼續(xù)執(zhí)行。于是就決定自己用Java寫一個來處理。
首先從手機(jī)復(fù)制出cloud.db數(shù)據(jù)庫文件,為SQLite數(shù)據(jù)庫文件。用SQLite Database Browser打開,看到里面和音樂關(guān)系比較密切的主要有三個table,playlistsInfo中保存著播放列表信息,字段title為列表名稱,字段id為列表id。playlistMusics保存了音樂和播放列表的對應(yīng)關(guān)系,字段title、artist等為音樂信息,rid為音樂資源id,字段playlist_id對應(yīng)了所屬播放列表id。musicResource中是音樂信息和文件對應(yīng)關(guān)系,字段file為對應(yīng)的文件名,format為文件格式,rid為音樂資源id。

于是程序的工作流程是這樣的: 1、首先從musicResource逐一讀取每首音樂的rid; 2、通過rid在playlistMusics中查找playlist_id,可能找不到,也可能不止一個,因為同一首音樂可能在多個列表中,這里簡單的取最大的playlist_id,通常應(yīng)該是相對比較新的播放列表; 3、然后在playlistsInfo中找到playlist_id對應(yīng)的播放列表名,作為目標(biāo)音樂的子文件夾; 4、最后把源文件重命名為“歌手名 - 歌曲名.擴(kuò)展名”,并移動到目標(biāo)文件夾即可。
為方便交流學(xué)習(xí),這里提供本程序源碼。
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 {/*** 存儲播放列表的數(shù)據(jù)結(jié)構(gòu)* * @author jzj*/static class PlayList {int id;String name;public PlayList(String name, int id) {this.name = name;this.id = id;}}// 數(shù)據(jù)庫完整路徑static final String db_path = "G:\\IOS\\cloud.db";// 源文件夾static final String src_dir = "G:\\IOS\\Music\\";// 目標(biāo)文件夾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 "默認(rèn)列表":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()) { // 默認(rèn)將一首歌放在編號最大的播放列表中(也就是最新創(chuàng)建的列表)int p_id = rs_pl.getInt("playlist_id");if (p_id > playlist_id)playlist_id = p_id;}rs_pl.close();// 目標(biāo)文件夾路徑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();// 目標(biāo)文件名: "藝術(shù)家 - 歌曲名.擴(kuò)展名"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;} }

由于涉及數(shù)據(jù)庫操作,需要在Java工程中添加數(shù)據(jù)庫支持包,可參看這篇文章?http://ttitfly.iteye.com/blog/143934 使用nested包:sqlitejdbc-v037-nested.jar
將音頻文件全部復(fù)制出來,放到程序中src_dir所指定的目錄,數(shù)據(jù)庫文件cloud.db保存在db_path指定的位置,設(shè)置好目標(biāo)文件夾dst_dir,執(zhí)行程序即可整流導(dǎo)出的音頻文件,實測700多首音樂,只需不到一分鐘時間即可完成重命名和移動工作。
完整工程可在此下載: http://pan.baidu.com/s/1hGNT0

總結(jié)

以上是生活随笔為你收集整理的如何从ios酷我音乐盒中导出已下载的音乐文件(使用Java编程实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。