做策划的网站,北京的招聘网站有哪些,腾讯新闻最新消息,实体店营销案例100例本工具已经编写了第二版#xff0c;为不了解编程的读者提供了可以直接使用的软件#xff0c;请移步这里阅读和使用 http://blog.csdn.net/jzj1993/article/details/44459983 本文所涉及内容用于技术学习#xff0c;请勿用于不正当用途#xff0c;否则后果自负。酷我音乐ios…
本工具已经编写了第二版为不了解编程的读者提供了可以直接使用的软件请移步这里阅读和使用 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打开看到里面和音乐关系比较密切的主要有三个tableplaylistsInfo中保存着播放列表信息字段title为列表名称字段id为列表id。playlistMusics保存了音乐和播放列表的对应关系字段title、artist等为音乐信息rid为音乐资源id字段playlist_id对应了所属播放列表id。musicResource中是音乐信息和文件对应关系字段file为对应的文件名format为文件格式rid为音乐资源id。于是程序的工作流程是这样的1、首先从musicResource逐一读取每首音乐的rid2、通过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();// 读取播放列表ListPlayList lists new ArrayListTest.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(ListPlayList 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