如何从ipad(iphone)的酷我音乐盒中导出已下载的音乐文件
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
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;
// 获取音乐rid
int rid = rs_res.getInt("rid");
// 查找该音乐所在播放列表id, 如果没有找到则为-1
ResultSet 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;
}
}
转载于:https://www.cnblogs.com/jzj1993/p/3859461.html
如何从ipad(iphone)的酷我音乐盒中导出已下载的音乐文件相关推荐
- 如何从ios酷我音乐盒中导出已下载的音乐文件(使用Java编程实现)
本工具已经编写了第二版,为不了解编程的读者提供了可以直接使用的软件,请移步这里阅读和使用 http://blog.csdn.net/jzj1993/article/details/44459983 本 ...
- 怎么从Chrome浏览器中导出扩展程序为crx文件?
在chrome浏览器中安装好一些我们需要的chrome扩展程序后,有一天如果浏览器需求卸载后重新安装,但是我们这些插件又不好备份,当然用户可以始终在我们chrome插件网( http://www.cn ...
- Vue中实现图片下载到本地功能和导出(下载)excel文件功能:
一.实现图片下载到本地功能 需求: 将勾选的列表项的id传给后台,让后台处理并下载对应的图片 1. 后台接口: 下载图片zip: GET /download 请求数据类型 application/x- ...
- Asp.NET中如何一次性下载多个文件
在ASP.NET中,我们可以很方便的下载单个文件,当需要一次性下载多个文件的时候,如果提示用户一次一次保存的话,会导致用户体验特别的不好.我这里找到一种比较合理的解决方案,就是先把要下载的所有文件打包 ...
- vue移动端h5中a标签下载/预览文件
需求:项目分PC端和移动端,PC端(react)以实现列表页附件下载,现需同步移动端(vue)h5页面在原有的列表页中增加一行查看(下载)附件. 只写结构,暂不考虑其他,增加附件行的代码如下: < ...
- iPhone用户干货:袋鼠下载,如何导出已下载的视频到其他播放器?
今天要给大家带来相关教程,袋鼠下载一键导出转存,视频永久保留. 要达到袋鼠下载器里面的视频一键导出转存,使视频永久保留的目的,我们需要使用一款叫袋鼠播放器的软件,这也是袋鼠的又一大神器,这款软件能在A ...
- 使用MediaPlayer播放USB中读取到的MP3音乐文件,遇到java.io.FileNotFoundException异常总结
项目背景: 多媒体USB音乐,底层调用MediaPlayer来播放U盘中读取的歌曲,由于最初版本将一首MP3歌曲甜蜜蜜写到了AS的raw目录,直接本地播放,做了一首假数据: 即: //临时代码,写死歌 ...
- 全名k歌导出已发布的音乐方法
1. 登录网页版的全民k歌,进入自己的个人主页 2. 选择一个自己的作品,比如下面的"依然爱你" 3.点击作品,我们可以看到已经播放音乐了. 4.此刻按下F12 ...
- java.util.zip包 OutputStream ZipOutputStream以压缩包的方式导出或下载多个文件,比如图片,文档,Excel表格等
目录 前言 逻辑流程 代码 请求接口 压缩文件方法 关闭文件流 前言 接到个需求,从数据库查询出多个用户,每个用户都会有头像,以压缩包的方式下载这些用户的头像,这里用到了java.util.zip包下 ...
最新文章
- LeetCode简单题之自除数
- POPUP_GET_VALUES_DB_CHECKED’
- shop--10.店铺详情(后台+前端类似于shoplist)
- mysql查询活跃连接,mysql – 使用大量可能的连接进行查询的最佳方法
- set python_使用dict和set
- Anaconda3使用过程中遇到的问题
- ionic入门教程第五课-举例子说明异步回调$q及$q在项目中的用法
- 基于seq2seq模型的chatbot对话系统的tensorflow实现
- 读《An Adaptable and Extensible Geometry Kernel》
- 通过蚁剑,利用eval与assert,登录目标网站
- 《图像处理、分析与机器视觉》(第4版)阅读笔记——第五章 图像预处理
- 自媒体推广有哪些好处?
- gis可达性分析步骤_基于三维GIS技术的公路交通数字孪生系统
- 关于在使用迅雷下载的时候,C盘一下爆满的问题
- linux 中文字体美化,美化ubuntu字体
- Springboot毕设项目医疗云胶片管理系统nem7xjava+VUE+Mybatis+Maven+Mysql+sprnig)
- 20+ Prompt工具网站汇总;我用AI工具开了一家「无人公司」;如何10分钟上线一个AI导航网站;第一部AIGC中英双语图文辞典 | ShowMeAI日报
- 计算机应用基础任务化教程135,在PowerPoint 2010中SmartArt图形的制作及技巧.doc
- 单极化天线和双极化天线的区别
- orcad capture学习笔记---1.绘制原理图封装
热门文章
- iText in Action 2nd3.1节(Introducing the concept of direct content)读书笔记
- Windeployqt 打包,缺少DLL 的原因分析,解决方法
- 软件测试获取动态验证码并填充selenium python
- PowerBasic版上海期货交易接口技术文档
- 反编译9.png图片还原
- JavaScript 击鼓传花的游戏 使用数据结构---队列来实现击鼓传花
- 非因解读 | 利用DSP技术绘制非小细胞肺癌(NSCLC)肿瘤微环境图谱
- COMSOL基于方程建模
- 纷菲幻剑录 之 十年一剑
- Visual Novel Maker v1.0.1074 视觉小说游戏制作软件