Limpe arquivos indesejados em seu diretório de músicas usando Groovy
Nesta demonstração, facilito a remoção de arquivos indesejados nos diretórios dos álbuns.
Nesta série estou desenvolvendo diversos roteiros para ajudar na limpeza do meu acervo musical. No último artigo, utilizamos o framework criado para analisar o diretório e subdiretórios dos arquivos de música, verificando se cada álbum possui um arquivo cover.jpg
e gravando quaisquer outros arquivos que não sejam FLAC, MP3 ou OGG.
Descobri alguns arquivos que obviamente podem ser excluídos – vejo o estranho foo
por aí – e um monte de PDFs, PNGs e JPGs que são capas de álbuns. Com isso em mente, e pensando na tarefa de remoção de lixo, ofereço um script aprimorado que usa um mapa Groovy para registrar nomes de arquivos e contagens de suas ocorrências e imprimi-los em formato CSV.
Comece a analisar com Groovy
Se ainda não o fez, leia os três primeiros artigos desta série antes de continuar:
- Como analiso meu diretório de músicas com Groovy
- Minha biblioteca de código aberto favorita para análise de arquivos de música
- Como uso o Groovy para analisar a arte do álbum no meu diretório de músicas
Eles garantirão que você entenda a estrutura pretendida do meu diretório de músicas, a estrutura criada nesse artigo e como obter arquivos FLAC, MP3 e OGG. Neste artigo, facilito a remoção de arquivos indesejados nos diretórios de álbuns.
A estrutura e os bits de análise dos arquivos do álbum
Comece com o código. Como antes, incorporei comentários no script que refletem as "notas de comentários" (relativamente abreviadas) que normalmente deixo para mim:
1 // Define the music libary directory
2 // def musicLibraryDirName = '/var/lib/mpd/music'
3 // Define the file name accumulation map
4 def fileNameCounts = [:]
5 // Print the CSV file header
6 println "filename|count"
7 // Iterate over each directory in the music libary directory
8 // These are assumed to be artist directories
9 new File(musicLibraryDirName).eachDir { artistDir ->
10 // Iterate over each directory in the artist directory
11 // These are assumed to be album directories
12 artistDir.eachDir { albumDir ->
13 // Iterate over each file in the album directory
14 // These are assumed to be content or related
15 // (cover.jpg, PDFs with liner notes etc)
16 albumDir.eachFile { contentFile ->
17 // Analyze the file
18 if (contentFile.name ==~ /.*\.(flac|mp3|ogg)/) {
19 // nothing to do here
20 } else if (contentFile.name == 'cover.jpg') {
21 // don't need to do anything with cover.jpg
22 } else {
23 def fn = contentFile.name
24 if (contentFile.isDirectory())
25 fn += '/'
26 fileNameCounts[fn] = fileNameCounts.containsKey(fn) ? fileNameCounts[fn] + 1 : 1
27 }
28 }
29 }
30 }
31 // Print the file name counts
32 fileNameCounts.each { key, value ->
33 println "$key|$value"
34 }
Este é um conjunto bastante simples de modificações na estrutura original.
As linhas 3 a 4 definem fileNameCount
, um mapa para registrar contagens de nomes de arquivos.
As linhas 17 a 27 analisam os nomes dos arquivos. Evito quaisquer arquivos que terminem em .flac
, .mp3
ou .ogg
, bem como arquivos cover.jpg
.
As linhas 23 a 26 registram nomes de arquivos (como chaves para fileNameCounts
) e contagens (como valores). Se o arquivo for realmente um diretório, adiciono um /
para ajudar a lidar com ele no processo de remoção. Observe na linha 26 que os mapas Groovy, assim como os mapas Java, precisam ser verificados quanto à presença da chave antes de incrementar o valor, ao contrário, por exemplo, da linguagem de programação awk.
É isso!
Eu executo isso da seguinte maneira:
$ groovy TagAnalyzer4.groovy > tagAnalysis4.csv
Em seguida, carrego o CSV resultante em uma planilha do LibreOffice navegando até o menu Planilha e selecionando Inserir planilha do arquivo. Defino o caractere delimitador como &$124;
.
(Chris Hermansen, CC BY-SA 4.0)
Classifiquei isso em ordem decrescente da coluna contagem para enfatizar os infratores reincidentes. Observe também nas linhas 17-20 um monte de arquivos M3U que se referem ao nome do álbum, provavelmente criados por algum programa de extração bem-intencionado. Também vejo, mais abaixo (não mostrado), arquivos como fix
e fixtags.sh
, evidências de esforços anteriores para limpar algum problema e deixar outros detritos espalhados no processo. Eu uso o utilitário de linha de comando find
para me livrar de alguns desses arquivos, nos moldes de:
$ find . \( -name \*.m3u -o -name tags.txt -o -name foo -o -name .DS_Store \
-o -name fix -o -name fixtags.sh \) -exec rm {} \;
Suponho que poderia ter usado outro script Groovy para fazer isso também. Talvez na próxima vez.