惠普|我如何使用 Groovy 分析我的音乐目录

惠普|我如何使用 Groovy 分析我的音乐目录

【惠普|我如何使用 Groovy 分析我的音乐目录】
最近 , 我一直在研究 Groovy 是如何简化略微繁琐的 Java 的 。 在这篇文章中 , 我开始了一个简短的系列 , 通过创建一个分析我的音乐目录的工具来演示 Groovy 脚本 。
在本文中 , 我将演示 groovy.File 类如何扩展和精简 java.File 并简化其使用 。 这为查看音乐文件夹的内容提供了一个框架 , 以确保预期的内容(例如 , cover.jpg 文件)就位 。 我使用 JAudiotagger 库 来分析音乐文件的标签 。
安装 Java 和 GroovyGroovy 基于 Java , 需要安装 Java 。Java 和 Groovy 的最新和稳定的版本可能都在你的 Linux 发行版的仓库中 。Groovy 也可以直接从 Apache Foundation 网站 安装 。 对于 Linux 用户来说 , 一个不错的选择是 SDKMan , 它可用于获取 Java、Groovy 和许多其他相关工具的多个版本 。 对于本文 , 我使用以下 SDK 版本:

  • Java:版本 11.0.12-open 的 OpenJDK 11
  • Groovy:版本 3.0.8
音乐元数据最近 , 我重整了我的音乐消费方式 。 我决定使用优秀的开源 Cantata 音乐播放器 , 它是开源 MPD 音乐播放器 的一个前端 。 我所有的电脑的音乐都存储在 /var/lib/mpd/music 目录下 。 在该音乐目录下有艺术家子目录 , 在每个艺术家子目录下有专辑子目录 , 包含音乐文件、cover.jpg , 偶尔还有 PDF 格式的内页说明 。
我绝大部分的音乐文件都是 FLAC 格式的 , 有一些是 MP3 格式 , 可能还有一小部分是 OGG 格式 。 我选择 JAudiotagger 库的一个原因是它可以透明地处理不同的标签格式 。 当然 , JAudiotagger 是开源的!
那么查看音频标签有什么意义呢?以我的经验 , 音频标签的管理极差 。 (提到音频标签 , )我的脑海中浮现出“粗心”这个词 。 这是标签本身真正存在的问题 , 也可能是出于我自己的学究倾向 。 无论如何 , 这是一个可以通过使用 Groovy 和 JAudiotagger 解决的重要问题 。 不过 , 它不仅适用于音乐收藏 。 许多其他现实世界的问题也适用 , 如需要下沉到文件系统中的目录树来处理在那里找到的内容 。
使用 Groovy 脚本这是此任务所需的基本代码 。 我在脚本中加入了注释 , 这些注释反映了我通常留给自己的(相对简写的)“注释提醒”:
// 定义音乐库目录def musicLibraryDirName = '/var/lib/mpd/music'// 输出 CSV 文件标题行println \"artistDir|albumDir|contentFile\"// 迭代音乐库目录中的每个目录// 这一层应该是艺术家目录new File(musicLibraryDirName).eachDir { artistDir -> // 迭代艺术家目录中的每个目录
// 这一层应该是专辑目录
artistDir.eachDir { albumDir -> // 迭代专辑目录中的每个目录
// 这里应该是内容
// 或相关内容(如 `cover.jpg` , PDF 格式的内页说明)
albumDir.eachFile { contentFile -> println \"$artistDir.name|$albumDir.name|$contentFile.name\"



如上所述 , 我使用 groovy.File 在目录树中移动 。 具体来说:
第 7 行创建一个新的 groovy.File 对象并在其上调用 groovy.File.eachDir() , 第 7 行的 { 和第 18 行的结尾的  之间的代码是传给 eachDir() 的 groovy.Colsue 参数 。
这意味着 eachDir() 为目录中找到的每个子目录执行该代码 。 这类似于 Java lambda(也称为“匿名函数”) 。Groovy 闭包不会像 lambda 那样限制对调用环境的访问(在最新版本的 Groovy 中 , 如果你愿意 , 也可以使用 Java lambda) 。 如上所述 , 音乐库目录中的子目录应该是艺术家目录(例如 , “Iron Butterfly” 或 “Giacomo Puccini”) , 因此 artistDir 是 eachDir() 传递给闭包的参数 。