`
游伯度
  • 浏览: 22854 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

写一个导出酷狗音乐列表的程序

阅读更多
今天想从酷狗中导出播放列表的歌曲到U盘,发现酷狗只支持导出列表,无奈自己写一个程序来导出,顺便温习一下digester的使用,哈哈。
apache的digester已经升到3.2的版本,3以后的版本比较爽,可以直接使用annotation来定义rule。

1.酷狗播放列表长的什么样呢?
他导出的是以.kgl后缀的文件,其实就是xml格式的,哈哈,如下:
<?xml version="1.0" encoding="UTF-8"?>
<List ListName="赵传">
	<File>
		<MediaFileType>0</MediaFileType>
		<FileName>赵传 - 爱要怎么说出口.mp3</FileName>
		<FilePath>H:\01-娱乐\01-音乐\KuGou\</FilePath>
		<FileSize>6748736</FileSize>
		<Duration>281208</Duration>
		<Hash>359db1787952c1d65803c3936796402c</Hash>
		<Lyric></Lyric>
		<Bitrate>191992</Bitrate>
	</File>
	<File>
		<MediaFileType>0</MediaFileType>
		<FileName>赵传 - 我终于失去了你.mp3</FileName>
		<FilePath>H:\01-娱乐\01-音乐\KuGou\</FilePath>
		<FileSize>6833544</FileSize>
		<Duration>285152</Duration>
		<Hash>cb4c43fe3d214b48be2228040babcaed</Hash>
		<Lyric></Lyric>
		<Bitrate>191716</Bitrate>
	</File>
</list>


2.怎么定义播放列表呢?
2.1 定义播放列表实体
@ObjectCreate(pattern = "List")
public class MusicPlayList implements Serializable {

	private static final long serialVersionUID = -5345631686784548242L;

	@SetProperty(pattern = "List", attributeName = "ListName")
	private String name;

	private List<MusicFile> fileList = new ArrayList<MusicFile>();

	@SetNext
	public void addFile(MusicFile file) {
		fileList.add(file);
	}

	// Getter and Setter

}

2.2 定义关联音乐文件实体
public class MusicFile implements Serializable {

	private static final long serialVersionUID = 1428265224588267115L;

	@BeanPropertySetter(pattern="List/File/MediaFileType")
	private String mediaFileType;
	@BeanPropertySetter(pattern="List/File/FileName")
	private String fileName;
	@BeanPropertySetter(pattern="List/File/FilePath")
	private String filePath;
	@BeanPropertySetter(pattern="List/File/FileSize")
	private long fileSize;
	@BeanPropertySetter(pattern="List/File/Duration")
	private String duration;
	@BeanPropertySetter(pattern="List/File/Hash")
	private String hash;
	@BeanPropertySetter(pattern="List/File/Lyric")
	private String lyric;
	@BeanPropertySetter(pattern="List/File/Bitrate")
	private long bitrate;

	public File getFile() {
		return new File(getFilePath(), getFileName());
	}

	// Getter and Setter
}

3. 然后如何让定义的annotation生效?
		DigesterLoader digesterLoader = DigesterLoader.newLoader(new FromAnnotationsRuleModule() {
			@Override
			protected void configureRules() {
				bindRulesFrom(MusicPlayList.class);
			}
		});
		Digester digester = digesterLoader.newDigester();
		URL dataUrl = Thread.currentThread().getClass().getResource(playListFile);
		try {
			return digester.parse(dataUrl);
		}
		catch (Exception e) {
			throw new RuntimeException("Play list parse failuer.", e);
		}


4. 好了,应该可以拷贝文件了吧
是的,可以看看我们的工具类了
public class ExportTool {

	public static void exportFileFromPlayList(String playListFile, String toDir) {
		MusicPlayList playList = digesterPlayList(playListFile);
		File tofolder = new File(toDir, playList.getName());
		if (!tofolder.exists()) {
			tofolder.mkdirs();
		}
		Iterator<MusicFile> musicFilesInterator = playList.list();
		while (musicFilesInterator.hasNext()) {
			MusicFile file = musicFilesInterator.next();
			if (!file.getFile().exists()) {
				continue;
			}
			copy(file.getFile(), tofolder);
		}
	}

	private static MusicPlayList digesterPlayList(String playListFile) {
		DigesterLoader digesterLoader = DigesterLoader.newLoader(new FromAnnotationsRuleModule() {
			@Override
			protected void configureRules() {
				bindRulesFrom(MusicPlayList.class);
			}
		});
		Digester digester = digesterLoader.newDigester();
		URL dataUrl = Thread.currentThread().getClass().getResource(playListFile);
		try {
			return digester.parse(dataUrl);
		}
		catch (Exception e) {
			throw new RuntimeException("Play list parse failuer.", e);
		}
	}

	private static void copy(File from, File toFolder) {
		try {

			File toFile = new File(toFolder, from.getName());
			if (toFile.exists()) {
				return;
			}
			
			InputStream input = new FileInputStream(from);
			OutputStream output = new FileOutputStream(toFile);
			IOUtils.copy(input, output);
		}
		catch (Exception e) {
			throw new RuntimeException("Copy file from [" + from.getAbsolutePath() + "] to [" + toFolder.getAbsolutePath() + "] failure.");
		}
	}
}


5. 这个功能还不错,但是我们依赖那些工具呢?
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-io</artifactId>
			<version>1.3.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-digester3</artifactId>
			<version>3.2</version>
		</dependency>


6. 具体的代码在附件,可以参考一下哦
  • src.zip (27.4 KB)
  • 描述: 源代码
  • 下载次数: 3
分享到:
评论

相关推荐

    豆瓣电台爬虫(加星歌曲列表导出)-crx插件

    ** 也可以导出“酷我音乐列表”,此列表可导入“网易云音乐”如果使用中遇到问题,欢迎联系作者 qiwen#qiwen.name-- update 2019/4/26有朋友反映酷我/酷狗列表都已不能正常导入,测试后验证如此,因此更新以支持迅雷...

    手机铃声制作软件

    在本例中,我们提到的是一个从酷狗音乐软件中独立出来的手机铃声制作工具。酷狗音乐,作为一款知名的音乐应用,不仅提供了丰富的音乐资源,还内置了制作铃声的功能。然而,有些用户可能只对铃声制作功能感兴趣,不...

    纯粹VB编写的MP3播放器

    - 酷狗:可能表明该播放器的设计或功能受到了酷狗音乐等流行音乐应用的影响。 【压缩包子文件的文件名称列表】中的文件是VB项目的关键组成部分: - modAPI.bas:这是一个VB模块文件,很可能包含了自定义的函数和...

    Thor 1.3.4 IOS 抓包

    - 下载并安装同步助手(tongbu.com),这是一个用于管理iOS设备的应用程序,提供了文件传输、应用安装等功能。 - 通过USB连接你的iOS设备到电脑,确保同步助手能识别到你的设备。 2. **安装Thor**: - 在同步...

    消除原音工具

    这类工具在音乐制作、混音以及音频编辑过程中非常有用,可以为用户提供一个纯净的背景音乐或者仅保留人声的版本。以下是关于“消除原音工具”这一主题的详细知识点: 1. **音频处理技术**:消除原音的核心技术主要...

    音频文件剪辑器

    音频文件剪辑器,如“手机铃声制作(mp3剪切器)酷狗-2345软件教程”是一个工具,主要用于裁剪和编辑音频文件,尤其是针对MP3格式的音乐。这样的软件通常用于创建个性化手机铃声,将喜欢的歌曲片段截取出来作为来电...

    LyricsX::musical_notes:适用于macOS的Ultimate歌词应用程序

    歌词X LyricsX是iTunes,Spotify和Vox的插件,可以从Internet自动搜索和下载...歌词来源163音乐QQ音乐酷狗音乐夏米音乐TTPod 吉奇米截屏信用成分开源库特别感谢 :warning: 免责声明所有歌词均为其所有者的财产和版权。

    MP3铃声截取器

    3. **手机铃声制作(mp3剪切器)酷狗-2345软件教程(多特软件站).url**:这是一个网址链接,指向一个关于如何使用该软件的教程。用户可以通过这个链接获取更详细的步骤指导,了解如何有效地使用MP3铃声截取器,包括...

    安卓SD卡中各个文件夹功能的详尽说明

    63. `kugou`:酷狗音乐的文件夹。 64. `KuwoMusic`:酷我音乐播放器的文件夹。 65. `maiku`:麦库记事的缓存文件夹。 66. `Manle`:掌上药店的应用文件。 67. `mapbar`:图吧地图的相关文件。 68. `mbook`:...

Global site tag (gtag.js) - Google Analytics