C'è un modo per leggere i tag mp3 di un file dalla shell? Qualcosa come:mp3tags MyFile.mp3 author
dovrebbe produrre il tag autore di un file mp3.
Migliore risposta
Puoi anche usare ffprobe
che fa parte di ffmpeg
.
sudo apt-get install ffmpeg
ffprobe file.mp3
Se non desideri altre informazioni, come la lunghezza della traccia e così via, puoi combinare l'output con grep:
ffprobe file.mp3 2>&1 | grep -A90 'Metadata:'
Oppure per avere solo l'autore:
ffprobe -loglevel error -show_entries format_tags=artist -of default=noprint_wrappers=1:nokey=1 file.mp3
Puoi selezionare altri tag separandoli con una virgola, ad esempio format_tags=title,album
.
Volevo cercare una parola chiave in tutti i file mp3 in una cartella. La cartella conteneva 486 file, quindi è diventato interessante sapere quale delle soluzioni menzionate qui è la più veloce. Ecco il ciclo che ho usato:
# sudo apt-get install ffmpeg lltag eyed3 mp3info id3v2 libimage-exiftool-perl libid3-tools id3tool
keyword='fill_me_in'
getTitleFF() { ffprobe "$1" 2>&1 | sed -E -n 's/^ *title *: (.*)/1/p'; }
getTitleLL() { lltag --show-tags title "$1" | sed -nE 's/^ TITLE=(.*)/1/p'; }
getTitleEyed() { eyeD3 2>&1 "$1" | sed -n 's|x1b[[0-9;]*mtitle[^:]*: ||p'; }
getTitleInfo() { mp3info -p %t "$1"; }
getTitleId3() { id3v2 -l "$1" | sed -nE 's/^(TIT2 ([^)]*)|Title *): (.*)/2/p'; }
getTitleExif() { exiftool -title -b "$1"; }
getTitleId3i() { id3info "$1" | sed -nE 's/^=== TIT2 ([^)]*): //p'; }
getTitleTool() { id3tool "$1" | sed -n 's|^Song Title:t||p'; }
for prog in FF LL Eyed Info Id3 Exif Id3i Tool; do
echo "=== getTitle${prog} ==="
time
for file in *.mp3; do
if "getTitle${prog}" "$file" | grep -q "$keyword"; then
echo "$file"
fi
done
done
Note:
lltag
emp3info
non trovo un titolo, perché i file che stavo usando avevano tag ID3v2, vedi il commento di @s-prasanth:Come leggere i tag mp3 nella shell?eyeD3
è problematico da usare a livello di codice, perché utilizza codici colore (grassetto).eyeD3
e ancheid3v2
(ma solo per i tag ID3 v1) restituiscono il titolo e l'artista sulla stessa riga, il che complica ulteriormente le cose; quindigetTitleEyed
e talvoltagetTitleId3
restituisci sia il titolo che l'artista, quindi per favore non copiare e incollare quelle funzioni.-
getTitleId3 funzionerà solo per i tag ID3 v2, perché
id3v2
ha formati diversi per i tag ID3v1 e ID3v2, ad es.Title : Artist:
contro ID3v2:
TIT2 (Title/songname/content description):
-
Come unico programma di questi 5
eyeD3
stampa un avviso rosso per due dei file:Invalid mode/bitrate combination for layer II No ID3 v1.x/v2.x tag found!
Sembra che quei due file abbiano tag ID3v1, perché quei due file sono gli unici in cui
lltag
emp3info
può ottenere un titolo. Mi chiedo se questo è un bug ineyeD3
poiché nessun altro programma qui menzionato ha problemi con questi file...
Risultati (in tempo reale):
Program | Version | Time / s
----------+------------+-----------
exiftool | 10.25 | 49.5 ± 0.5
lltag | 0.14.5 | 41 ± 1.0
ffprobe | 3.1.3-1+b3 | 33 ± 0.5
eyeD3 | 0.6.18 | 24 ± 0.5
id3info | 3.8.3 | 4.2 ± 0.1
id3v2 | 0.1.12 | 2.9 ± 0.1
id3tool | 1.2a | 1.7 ± 0.1
mp3info | 0.8.5a | 1.4 ± 0.1
Per quanto riguarda il tempo, il vincitore qui è id3tool
(mp3info è più veloce, ma non funziona con ID3 v2). id3v2
è anche abbastanza veloce, ma getTitleId3
la funzione dovrebbe essere modificata per funzionare anche con i tag ID3v1, che nel peggiore dei casi potrebbero rallentarla di un fattore 2.