Pesquisa de site

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.

Artigos relacionados: