我如何使用 Groovy 分析音乐目录中的专辑封面

以下是我如何使用开源工具来分析我的音乐目录,包括专辑封面文件。
2 位读者喜欢这篇文章。
Record player with an LP spinning

Opensource.com

在本系列中,我正在开发几个脚本来帮助清理我的音乐收藏。 在上一篇文章中,我使用了为分析音乐文件的目录和子目录而创建的框架,并使用优秀的开源 JAudiotagger 库进行了分析,以分析音乐目录和子目录中的音乐文件的标签。 在本文中,我将做一个更简单的工作

  1. 使用我们在第 1 部分中创建的框架
  2. 确保每个专辑目录都有一个cover.jpg 文件
  3. 记下专辑目录中除了 FLAC、MP3 或 OGG 之外的任何其他文件。

音乐和元数据

如果您还没有阅读本系列的第 1 部分第 2 部分,请先阅读,以便您了解我的音乐目录的预期结构、该文章中创建的框架以及如何拾取 FLAC、MP3 和 OGG 文件。

还有一件事。大多数音频翻录应用程序和许多下载

  • 没有提供有用的 cover.jpg 文件
  • 即使它们确实提供了有用的 cover.jpg 文件,它们也不会将媒体文件链接到它
  • 携带各种其他用途可疑的文件(例如,playlist.m3u,它是由我过去使用的一个标记实用程序创建的)

正如我在上一篇文章中提到的,本系列的最终目标是创建一些有用的脚本,以帮助识别缺失或异常的标签,并促进创建工作计划以解决标记问题。 此特定脚本查找丢失的 cover.jpg 文件和不需要的非媒体文件,并创建一个 CSV 文件,您可以将其加载到 LibreOfficeOnlyOffice 中来查找问题。 它不会查看媒体文件本身,也不会查找艺术家子目录中遗留的无关文件(这些是留给读者的练习)。

框架和专辑文件分析

从代码开始。 与以前一样,我已将评论合并到脚本中,这些评论反映了我通常为自己留下的(相对简洁的)“评论笔记”

     1	// Define the music library directory
       
     2	def musicLibraryDirName = '/var/lib/mpd/music'
       
     3	// Print the CSV file header
       
     4	println "artist|album|cover|unwanted files"
       
     5	// Iterate over each directory in the music libary directory
     6	// These are assumed to be artist directories

     7	new File(musicLibraryDirName).eachDir { artistDir ->
       
     8	    // Iterate over each directory in the artist directory
     9	    // These are assumed to be album directories
       
    10	    artistDir.eachDir { albumDir ->
       
    11	        // Iterate over each file in the album directory
    12	        // These are assumed to be content or related
    13	        // (cover.jpg, PDFs with liner notes etc)
       
    14	        // Initialize the counter for cover.jpg
    15	        // and the list for unwanted file names
       
    16	        def coverCounter = 0
    17	        def unwantedFileNames = []
       
    18	        albumDir.eachFile { contentFile ->
       
    19	            // Analyze the file
       
    20	            if (contentFile.name ==~ /.*\.(flac|mp3|ogg)/) {
    21	                // nothing to do here
    22	            } else if (contentFile.name == 'cover.jpg') {
    23	                coverCounter++
    24	            } else {
    25	                unwantedFileNames << contentFile.name
    26	            }
       
    27	        }
    28	        println "${artistDir.name}|${albumDir.name}|$coverCounter|${unwantedFileNames.join(',')}"
    29	    }
    30	}

第 1-2 行定义了音乐文件目录的名称。

第 3-4 行打印 CSV 文件标头。

第 5-13 行来自本文第 1 部分中创建的框架,并深入到专辑子目录。

第 14-17 行设置 cover.jpg 计数器(应该只有零或一)和我们将在其中累积不需要的文件名的空列表。

第 18-27 行分析专辑目录中找到的任何文件

第 20-21 行使用 Groovy 匹配运算符 ==~ 和“slashy”正则表达式来检查文件名模式。 没有对这些文件执行任何操作(有关该信息,请参见第 2 部分)。

第 22-23 行计算 cover.jpg 的实例(应该只有零或一)。

第 24-26 行记录任何非媒体、非 cover.jpg 文件的名称,以显示专辑目录中潜在的垃圾或谁知道是什么。

第 28 行打印出艺术家姓名、专辑名称,cover.jpg 计数和不需要的文件名列表。

就是这样!

运行代码

通常,我按如下方式运行它

$ groovy TagAnalyzer3.groovy > tagAnalysis3.csv

然后我将生成的 CSV 加载到电子表格中。 例如,使用 LibreOffice Calc,转到 表格 菜单,然后选择 从文件插入表格。 出现提示时,将分隔符字符设置为 |。 在我的例子中,结果如下所示

Image of a screenshot of LibreOffice showing tagAnalysis3

(Chris Hermansen, CC BY-SA 4.0)

我已按“封面”列的递增顺序对此进行排序,以显示没有 cover.jpg 文件的专辑子目录。 请注意,有些有 cover.png 代替。 我在使用音乐播放器的经验是,至少有些音乐播放器无法很好地播放 PNG 格式的封面图像。

另请注意,其中一些具有 PDF 衬页注释、额外的图像文件、M3U 播放列表等。 在我的下一篇文章中,我将向您展示如何管理一些垃圾。

接下来要阅读的内容
Chris Hermansen portrait Temuco Chile
自 1978 年从不列颠哥伦比亚大学毕业以来,我就很少离开电脑,自 2005 年以来一直是全职 Linux 用户,从 1986 年到 2005 年一直是全职 Solaris 和 SunOS 用户,在此之前是 UNIX System V 用户。

评论已关闭。

Creative Commons License本作品已根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.