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

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

1.酷狗播放列表长的什么样呢?
他导出的是以[b].kgl[/b]后缀的文件,其实就是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. 具体的代码在附件,可以参考一下哦
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值