Gibt es eine Möglichkeit, die MP3-Tags einer Datei aus der Shell zu lesen? So etwas wie:mp3tags MyFile.mp3 author
soll den Autoren-Tag einer mp3-Datei ausgeben.
Beste Antwort
Sie können auch ffprobe
verwenden welches Teil von ffmpeg
ist .
sudo apt-get install ffmpeg
ffprobe file.mp3
Wenn Sie keine anderen Informationen wie Tracklänge usw. wünschen, können Sie die Ausgabe mit grep:
kombinierenffprobe file.mp3 2>&1 | grep -A90 'Metadata:'
Oder um nur den Autor zu bekommen:
ffprobe -loglevel error -show_entries format_tags=artist -of default=noprint_wrappers=1:nokey=1 file.mp3
Sie können andere Tags auswählen, indem Sie sie durch ein Komma trennen, z. B. format_tags=title,album
.
Ich wollte in allen MP3-Dateien in einem Ordner nach einem Schlüsselwort suchen. Der Ordner hatte 486 Dateien, daher wurde es interessant zu wissen, welche der hier genannten Lösungen die schnellste ist. Hier ist die Schleife, die ich verwendet habe:
# 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
Hinweise:
lltag
undmp3info
Finde keinen Titel, weil die von mir verwendeten Dateien ID3v2-Tags hatten, siehe den Kommentar von @s-prasanth:How to read mp3 tags in shell?eyeD3
ist problematisch bei der programmatischen Verwendung, da Farbcodes (Fettschrift) verwendet werden.eyeD3
und auchid3v2
(aber nur für ID3 v1-Tags) geben Sie den Titel und den Künstler in derselben Zeile zurück, was die Sache noch komplizierter macht; dahergetTitleEyed
und manchmalgetTitleId3
gibt sowohl den Titel als auch den Interpreten zurück, kopieren Sie diese Funktionen also nicht und fügen Sie sie nicht ein.-
getTitleId3 funktioniert nur für ID3 v2-Tags, da
id3v2
hat unterschiedliche Formate für ID3v1- und ID3v2-Tags, z. B.Title : Artist:
vs. ID3v2:
TIT2 (Title/songname/content description):
-
Als einziges Programm dieser 5
eyeD3
gibt eine rote Warnung für zwei der Dateien aus:Invalid mode/bitrate combination for layer II No ID3 v1.x/v2.x tag found!
Es scheint, als hätten diese beiden Dateien ID3v1-Tags, da diese beiden Dateien die einzigen sind, in denen
lltag
undmp3info
kann einen Titel bekommen. Ich frage mich, ob dies ein Fehler ineyeD3
ist denn kein anderes hier erwähntes Programm hat ein Problem mit diesen Dateien …
Ergebnisse (Echtzeit):
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
Der zeitliche Gewinner ist hier id3tool
(mp3info ist schneller, funktioniert aber nicht mit ID3 v2). id3v2
ist auch recht schnell, aber die getTitleId3
Funktion müsste angepasst werden, um auch mit ID3v1-Tags zu funktionieren, was sie im schlimmsten Fall um den Faktor 2 verlangsamen könnte.