成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我如何使用 Groovy 分析我的音樂目錄

開發(fā)
在本文中,我將演示 groovy.File 類如何擴(kuò)展和精簡 java.File 并簡化其使用。

最近,我一直在研究 Groovy 是如何簡化略微繁瑣的 Java 的。在這篇文章中,我開始了一個簡短的系列,通過創(chuàng)建一個分析我的音樂目錄的工具來演示 Groovy 腳本。

在本文中,我將演示 groovy.File? 類如何擴(kuò)展和精簡 java.File? 并簡化其使用。這為查看音樂文件夾的內(nèi)容提供了一個框架,以確保預(yù)期的內(nèi)容(例如,cover.jpg? 文件)就位。我使用 JAudiotagger 庫 來分析音樂文件的標(biāo)簽。

安裝 Java 和 Groovy

Groovy 基于 Java,需要安裝 Java。 Java 和 Groovy 的最新和穩(wěn)定的版本可能都在你的 Linux 發(fā)行版的倉庫中。 Groovy 也可以直接從 Apache Foundation 網(wǎng)站? 安裝。對于 Linux 用戶來說,一個不錯的選擇是 SDKMan,它可用于獲取 Java、Groovy 和許多其他相關(guān)工具的多個版本。對于本文,我使用以下 SDK 版本:

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

音樂元數(shù)據(jù)

最近,我重整了我的音樂消費(fèi)方式。我決定使用優(yōu)秀的開源 Cantata? 音樂播放器,它是開源 MPD 音樂播放器? 的一個前端。我所有的電腦的音樂都存儲在 /var/lib/mpd/music? 目錄下。在該音樂目錄下有藝術(shù)家子目錄,在每個藝術(shù)家子目錄下有專輯子目錄,包含音樂文件、cover.jpg,偶爾還有 PDF 格式的內(nèi)頁說明。

我絕大部分的音樂文件都是 FLAC 格式的,有一些是 MP3 格式,可能還有一小部分是 OGG 格式。我選擇 JAudiotagger 庫的一個原因是它可以透明地處理不同的標(biāo)簽格式。當(dāng)然,JAudiotagger 是開源的!

那么查看音頻標(biāo)簽有什么意義呢?以我的經(jīng)驗,音頻標(biāo)簽的管理極差。(提到音頻標(biāo)簽,)我的腦海中浮現(xiàn)出“粗心”這個詞。這是標(biāo)簽本身真正存在的問題,也可能是出于我自己的學(xué)究傾向。無論如何,這是一個可以通過使用 Groovy 和 JAudiotagger 解決的重要問題。不過,它不僅適用于音樂收藏。許多其他現(xiàn)實(shí)世界的問題也適用,如需要下沉到文件系統(tǒng)中的目錄樹來處理在那里找到的內(nèi)容。

使用 Groovy 腳本

這是此任務(wù)所需的基本代碼。我在腳本中加入了注釋,這些注釋反映了我通常留給自己的(相對簡寫的)“注釋提醒”:

// 定義音樂庫目錄
def musicLibraryDirName = '/var/lib/mpd/music'
// 輸出 CSV 文件標(biāo)題行
println "artistDir|albumDir|contentFile"
// 迭代音樂庫目錄中的每個目錄
// 這一層應(yīng)該是藝術(shù)家目錄
new File(musicLibraryDirName).eachDir { artistDir ->
// 迭代藝術(shù)家目錄中的每個目錄
// 這一層應(yīng)該是專輯目錄
artistDir.eachDir { albumDir ->
// 迭代專輯目錄中的每個目錄
// 這里應(yīng)該是內(nèi)容
// 或相關(guān)內(nèi)容(如 `cover.jpg`,PDF 格式的內(nèi)頁說明)
albumDir.eachFile { contentFile ->
println "$artistDir.name|$albumDir.name|$contentFile.name"
}
}
}

如上所述,我使用 groovy.File 在目錄樹中移動。具體來說:

第 7 行創(chuàng)建一個新的 groovy.File? 對象并在其上調(diào)用 groovy.File.eachDir()?,第 7 行的 {? 和第 18 行的結(jié)尾的 }? 之間的代碼是傳給 eachDir()? 的 groovy.Colsue 參數(shù)。

這意味著 eachDir()? 為目錄中找到的每個子目錄執(zhí)行該代碼。這類似于 Java lambda(也稱為“匿名函數(shù)”)。 Groovy 閉包不會像 lambda 那樣限制對調(diào)用環(huán)境的訪問(在最新版本的 Groovy 中,如果你愿意,也可以使用 Java lambda)。如上所述,音樂庫目錄中的子目錄應(yīng)該是藝術(shù)家目錄(例如,“Iron Butterfly” 或 “Giacomo Puccini”),因此 artistDir? 是 eachDir() 傳遞給閉包的參數(shù)。

第 10 行對每個 artistDir? 調(diào)用 eachDir()?,第 10 行的 {? 和第 17 行的 }? 之間的代碼形成另一個處理 albumDir 的閉包。

第 14 行,在每個 albumDir? 上調(diào)用 eachFile()?,第 14 行的 {? 和第 16 行的 } 之間的代碼形成了處理專輯內(nèi)容的第三級閉包。

在本文的范圍內(nèi),我對每個文件唯一需要做的就是開始構(gòu)建信息表,我將其創(chuàng)建為一個以豎線分隔的 CSV 文件,它可以導(dǎo)入 LibreOffice? 或 OfficeOnly 或任何其他電子表格。現(xiàn)在,代碼輸出前三列:藝術(shù)家目錄名、專輯目錄名和內(nèi)容文件名(同樣,第 2 行輸出 CSV 標(biāo)題行)。

在我的 Linux 筆記本電腦上運(yùn)行它會產(chǎn)生以下輸出:

$ groovy TagAnalyzer.groovy | head
artistDir|albumDir|contentFile
Habib Koite & Bamada|Afriki|02 - Ntesse.flac
Habib Koite & Bamada|Afriki|08 - NTeri.flac
Habib Koite & Bamada|Afriki|01 - Namania.flac
Habib Koite & Bamada|Afriki|07 - Barra.flac
Habib Koite & Bamada|Afriki|playlist.m3u
Habib Koite & Bamada|Afriki|04 - Fimani.flac
Habib Koite & Bamada|Afriki|10 - Massake.flac
Habib Koite & Bamada|Afriki|11 - Titati.flac
Habib Koite & Bamada|Afriki|03 Africa.flac
[...]
Richard Crandell|Spring Steel|04-Japanese Lullaby [Richard Crandell].flac
Richard Crandell|Spring Steel|Spring Steel.pdf
Richard Crandell|Spring Steel|03-Zen Dagger [Richard Crandell].flac
Richard Crandell|Spring Steel|cover.jpg
$

在性能方面:

$ time groovy TagAnalyzer.groovy | wc -l
9870
real 0m1.482s
user 0m4.392s
sys 0m0.230s
$

又好又快。它在一秒半內(nèi)處理近 10,000 個文件!對我來說足夠快。可觀的性能、緊湊且可讀的代碼,還有什么不喜歡的?

責(zé)任編輯:趙寧寧 來源: Linux中國
相關(guān)推薦

2021-07-27 09:02:50

Python下載音樂Python基礎(chǔ)

2022-09-28 16:35:50

FedoraUSBLinux

2021-01-15 05:19:08

wireshark軟件網(wǎng)絡(luò)

2023-03-21 17:06:24

樹莓派路由器

2022-02-06 09:55:37

Linux無障礙設(shè)置

2015-05-06 10:11:48

2020-10-28 14:38:41

Maven

2022-07-24 14:51:31

開源游戲RPG 游戲

2009-12-17 16:47:57

APC

2009-05-21 08:13:37

酷我音樂盒明星

2011-03-04 12:18:24

FileZilla

2014-08-04 10:48:35

職場IT職場

2009-07-02 16:16:48

酷我音樂盒在線播放

2022-05-08 13:05:22

職位產(chǎn)品經(jīng)理開源

2024-03-06 11:14:13

ViteReact微前端

2015-08-10 14:56:31

Google

2022-09-28 12:57:13

USBLinux系統(tǒng)

2017-09-05 14:34:02

數(shù)據(jù)分析數(shù)據(jù)庫python

2009-05-21 08:15:50

酷我音樂盒新版界面

2021-08-07 07:23:08

Webpack中間件模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 99在线免费视频 | 亚卅毛片| 日韩中文字幕视频 | 在线中文视频 | 成人精品区| 欧美视频在线一区 | 精品一区久久 | 久久亚洲精品国产精品紫薇 | 99视频免费看 | 亚洲国产成人精品久久久国产成人一区 | 精品国产一区二区三区久久狼黑人 | 粉嫩一区二区三区国产精品 | hitomi一区二区三区精品 | 国产91中文 | 日韩精品在线看 | 色天天综合 | 91视频大全 | 高清av一区 | 中文字幕一二三 | 第一色在线 | 国产精品一区二区三区四区 | 亚洲www啪成人一区二区 | 福利二区| 激情毛片 | 久久99精品视频 | 国产免费观看久久黄av片涩av | 亚洲激情av| 91国产精品在线 | 国产成人精品免费视频大全最热 | 香蕉超碰| 亚洲视频1区 | 欧美高清一级片 | 国产a区 | 99综合 | 免费在线一区二区 | 免费黄篇 | 伊人在线 | 黄网站在线观看 | 黄网站在线播放 | av手机在线免费观看 | 午夜影院在线观看视频 |