Redian新闻
>
我如何使用 Groovy 分析我的音乐目录 | Linux 中国

我如何使用 Groovy 分析我的音乐目录 | Linux 中国

科技
 
导读:为了简化 Java 的繁琐,我制作了一个 Groovy 工具来分析我的音乐目录。             
本文字数:4007,阅读时长大约:5分钟

为了简化 Java 的繁琐,我制作了一个 Groovy 工具来分析我的音乐目录。

最近,我一直在研究 Groovy 是如何简化略微繁琐的 Java 的。在这篇文章中,我开始了一个简短的系列,通过创建一个分析我的音乐目录的工具来演示 Groovy 脚本。

在本文中,我将演示 groovy.File 类如何扩展和精简 java.File 并简化其使用。这为查看音乐文件夹的内容提供了一个框架,以确保预期的内容(例如,cover.jpg 文件)就位。我使用 JAudiotagger 库🔗 www.jthink.net 来分析音乐文件的标签。

安装 Java 和 Groovy

Groovy 基于 Java,需要安装 Java。Java 和 Groovy 的最新和稳定的版本可能都在你的 Linux 发行版的仓库中。Groovy 也可以直接从 Apache Foundation 网站🔗 groovy.apache.org 安装。对于 Linux 用户来说,一个不错的选择是 SDKMan🔗 opensource.com,它可用于获取 Java、Groovy 和许多其他相关工具的多个版本。对于本文,我使用以下 SDK 版本:

◈ Java:版本 11.0.12-open 的 OpenJDK 11
◈ Groovy:版本 3.0.8

音乐元数据

最近,我重整了我的音乐消费方式。我决定使用优秀的开源 Cantata🔗 opensource.com 音乐播放器,它是开源 MPD 音乐播放器🔗 www.musicpd.org 的一个前端。我所有的电脑的音乐都存储在 /var/lib/mpd/music 目录下。在该音乐目录下有艺术家子目录,在每个艺术家子目录下有专辑子目录,包含音乐文件、cover.jpg,偶尔还有 PDF 格式的内页说明。

我绝大部分的音乐文件都是 FLAC 格式的,有一些是 MP3 格式,可能还有一小部分是 OGG 格式。我选择 JAudiotagger 库的一个原因是它可以透明地处理不同的标签格式。当然,JAudiotagger 是开源的!

那么查看音频标签有什么意义呢?以我的经验,音频标签的管理极差。(提到音频标签,)我的脑海中浮现出“粗心”这个词。这是标签本身真正存在的问题,也可能是出于我自己的学究倾向。无论如何,这是一个可以通过使用 Groovy 和 JAudiotagger 解决的重要问题。不过,它不仅适用于音乐收藏。许多其他现实世界的问题也适用,如需要下沉到文件系统中的目录树来处理在那里找到的内容。

使用 Groovy 脚本

这是此任务所需的基本代码。我在脚本中加入了注释,这些注释反映了我通常留给自己的(相对简写的)“注释提醒”:

  1. 1 // 定义音乐库目录
  2. 2 def musicLibraryDirName = '/var/lib/mpd/music'
  3. 3 // 输出 CSV 文件标题行
  4. 4 println "artistDir|albumDir|contentFile"
  5. 5 // 迭代音乐库目录中的每个目录
  6. 6 // 这一层应该是艺术家目录
  7. 7 new File(musicLibraryDirName).eachDir { artistDir ->
  8. 8 // 迭代艺术家目录中的每个目录
  9. 9 // 这一层应该是专辑目录
  10. 10 artistDir.eachDir { albumDir ->
  11. 11 // 迭代专辑目录中的每个目录
  12. 12 // 这里应该是内容
  13. 13 // 或相关内容(如 `cover.jpg`,PDF 格式的内页说明)
  14. 14 albumDir.eachFile { contentFile ->
  15. 15 println "$artistDir.name|$albumDir.name|$contentFile.name"
  16. 16 }
  17. 17 }
  18. 18 }

如上所述,我使用 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() 传递给闭包的参数。

第 10 行对每个 artistDir 调用 eachDir(),第 10 行的 { 和第 17 行的 } 之间的代码形成另一个处理 albumDir 的闭包。

第 14 行,在每个 albumDir 上调用 eachFile(),第 14 行的 { 和第 16 行的 } 之间的代码形成了处理专辑内容的第三级闭包。

在本文的范围内,我对每个文件唯一需要做的就是开始构建信息表,我将其创建为一个以竖线分隔的 CSV 文件,它可以导入 LibreOffice🔗 opensource.com 或 OfficeOnly🔗 opensource.com 或任何其他电子表格。现在,代码输出前三列:艺术家目录名、专辑目录名和内容文件名(同样,第 2 行输出 CSV 标题行)。

在我的 Linux 笔记本电脑上运行它会产生以下输出:

  1. $ groovy TagAnalyzer.groovy | head
  2. artistDir|albumDir|contentFile
  3. Habib Koite & Bamada|Afriki|02 - Ntesse.flac
  4. Habib Koite & Bamada|Afriki|08 - NTeri.flac
  5. Habib Koite & Bamada|Afriki|01 - Namania.flac
  6. Habib Koite & Bamada|Afriki|07 - Barra.flac
  7. Habib Koite & Bamada|Afriki|playlist.m3u
  8. Habib Koite & Bamada|Afriki|04 - Fimani.flac
  9. Habib Koite & Bamada|Afriki|10 - Massake.flac
  10. Habib Koite & Bamada|Afriki|11 - Titati.flac
  11. Habib Koite & Bamada|Afriki|03 Africa.flac
  12. [...]
  13. Richard Crandell|Spring Steel|04-Japanese Lullaby [Richard Crandell].flac
  14. Richard Crandell|Spring Steel|Spring Steel.pdf
  15. Richard Crandell|Spring Steel|03-Zen Dagger [Richard Crandell].flac
  16. Richard Crandell|Spring Steel|cover.jpg
  17. $

在性能方面:

  1. $ time groovy TagAnalyzer.groovy | wc -l
  2. 9870
  3. real 0m1.482s
  4. user 0m4.392s
  5. sys 0m0.230s
  6. $

又好又快。它在一秒半内处理近 10,000 个文件!对我来说足够快。可观的性能、紧凑且可读的代码,还有什么不喜欢的?

在我的下一篇文章中,我会打开 JAudiotagger 并查看每个文件中的标签。


via: https://opensource.com/article/22/8/groovy-script-java-music

作者:Chris Hermansen 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


LCTT 译者 :geekpi
💎💎💎💎
翻译: 1766.5 篇
|
贡献: 3237 天
2013-10-25
2022-09-05
https://linux.cn/lctt/geekpi
欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
疫情最危险的时候?你就偷着乐吧!安倍晋三遇刺身亡,反对暴力,祈祷平安在 Manjaro 和其他基于 Arch Linux 的发行版上安装 Spotify | Linux 中国如何在 Manjaro 和其他 Arch Linux 衍生品上安装 Discord 客户端 | Linux 中国哇!Torvalds 为自己的 Apple M2 Macbook 专门修改了 Fedora Linux | Linux 中国如何使用 Linux sed 命令自动进行文件编辑 | Linux 中国我如何从 Docker Desktop 切换到 Colima | Linux 中国Rosalía 登意大利版《VOGUE》封面!如何在最小安装的 CentOS、RHEL、Rocky Linux 中设置互联网 | Linux 中国如何通过 chroot 恢复 Arch Linux 安装 | Linux 中国在 Linux 中使用组合键输入隐藏的字形 | Linux 中国在 Linux 上使用 Rhythbox 听音乐 | Linux 中国图解 Rocky Linux 9 安装步骤 | Linux 中国开源朗读者:使用 Linux 的优势和劣势 | Linux 中国疫情两年后欧洲三国游 (11)- 巴塞罗那海滩和Rambla兰布拉大道如何编写 C 程序在 Linux 上创建音乐播放列表 | Linux 中国企业为何使用开源软件,又为何推动开源软件的发展 | Linux 中国如何使用原生 NTFS 驱动替代旧版 FUSE NTFS 驱动 | Linux 中国如何在 Linux 中使用媒体传输协议访问安卓设备的内部存储和 SD 卡 | Linux 中国八卦一下风火轮如何在 Linux 中更改 GRUB 主题 | Linux 中国如何在 Ubuntu Linux 上更新谷歌 Chrome | Linux 中国我如何使用开源玩 RPG 游戏 | Linux 中国关于 Linux 和 Git 的创造者 Linus Torvalds 的 20 件趣事 | Linux 中国在 Linux 中使用 Etcher 创建可启动 USB – 下载和使用指南 | Linux 中国如何使用 FreeDOS Edit | Linux 中国新中國那些可憐的作家(5)我是如何使用 Linux fmt 命令来格式化文本 | Linux 中国Linux inxi 命令的 3 种使用方法 | Linux 中国Atoms 是一个可以让你轻松管理 Linux Chroot 环境的 GUI 工具 | Linux 中国如何使用 Dockerfile 创建自定义 Docker 镜像 | Linux 中国检查 Linux 磁盘使用情况 | Linux 中国我如何使用现场 USB 设备恢复我的 Linux 系统 | Linux 中国使用 Podman Desktop 在 Fedora Linux 上管理容器 | Linux 中国Sunamu:在 Linux 桌面上显示当前播放音乐的歌词 | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。