[gelöst] cover aus mp3-tag

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
letzter3
Beiträge: 443
Registriert: 16.07.2011 22:07:31

[gelöst] cover aus mp3-tag

Beitrag von letzter3 » 15.12.2016 22:33:36

Hallo zusammen,

auf einem Stick (in meinem Fall) befinden sich diverse mp3-Dateien von unterschiedlichen Künstlern.
DIese sind meiner stationären Musiksammlung entnommen.
Fast alle haben das Front-Cover im tag hinterlegt, aber in unterschiedlichsten Auflösungen, und zwar häufig die höchstmögliche, die ich gefunden habe.
Die verwendeten Bildformate sind jpg und png.
Nun weigert sich mein Autoradio bei vielen Titeln beharrlich, das Cover anzuzeigen.
Ich vermute, dass dies an der Auflösung liegt, da ich so ein Problem vor Jahren schon mal mit einem klassichen MP3-Player hatte.
Gibt es ein grafisches Programm, welches in einem Rutsch alle mp3's untersucht und das Bild verkleinert (ggf. auch mit Zwischenschritten wie extrahieren, verkleinern, tag neu schreiben)?
Mein sonst verwendetes easytag kann das m.E. nicht.
Wenn nicht, wie kann eine Lösung auf der konsole aussehen?

Danke schonmal für's lesen.

p.s.
Diskussionen über mp3 gegenüber anderen Formaten oder live sind nicht erwünscht.

pps.
Das ist ein wirklich existenzielles (!) Problem. 8) :lol:

ppps.
Nein, ich betreibe mein Autoradio nicht als öffentlichen HotSpot, obwohl es das kann (nur um der Frage gleich von Beginn an entgegenzutreten). Ich möchte also nicht meinen Autoschlüssel abgeben, weil ich nicht in der Lage bin, das Problem selber zu lösen und in der Zwischenzeit trotzdem fahre.
:mrgreen:
Zuletzt geändert von letzter3 am 19.12.2016 22:47:15, insgesamt 1-mal geändert.

Benutzeravatar
smutbert
Moderator
Beiträge: 8315
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: cover aus mp3-tag

Beitrag von smutbert » 15.12.2016 23:07:58

Als ich noch mp3 verwendet habe, war auf der Kommandozeile Debianeyed3 mein Lieblingstool. Da hätte ich mir die Befehle für die einzelnen Schritte ungefähr (!) so vorgestellt (Bild skalieren mit convert aus Debianimagemagick):

Code: Alles auswählen

eyeD3 --write-images="verzeichnis" "file.mp3"
eyeD3 --remove-images "file.mp3"
convert "verzeichnis/cover.jpg" -resize 64x64 "verzeichnis/cover_neu.jpg"
eyeD3 --add-image=verzeichnis/cover_neu.jpg:FRONT_COVER "file.mp3"
Ich weiß nur nicht wie eyeD3 die Bilder beim Extrahieren im ersten Schritt benennt - möglicherweise ist das auch von mp3-Datei zu mp3-Datei unterschiedlich. Da müsstest du dir also noch irgendetwas einfallen lassen, damit du das in eine Schleife packen kannst.

Wenn du sicher bist, dass es pro mp3-Datei nur ein Cover gibt, könnte das so funktionieren - nur ganz grob

Code: Alles auswählen

IFS=$'\n'
TEMPDIR="$(mktemp -d)"

for FILE in $(find . -name '*.mp3'); do
    eyeD3 --write-images="${TEMPDIR}" "${FILE}"
    eyeD3 --remove-images "${FILE}"
    # wenn in manchen mp3s mehr als eine Bilddatei existiert, dann muesste
    # man sich hier noch etwas statt dem einfachen * einfallen lassen
    convert "${TEMPDIR}/*" -resize 64x64 "${TEMPDIR}/cover_neu.jpg"
    eyeD3 --add-image="${TEMPDIR}/cover_neu.jpg":FRONT_COVER "${FILE}"
    rm "${TEMPDIR}/*"
done
Blöd ist vielleicht auch, dass in meinem Beispiel die Originalcover gelöscht werden, auch wenn irgendetwas beim Verkleinern oder beim Schreiben des Tags schief geht.

Wenn du einmal herzeigst unter welchem Namen --write-images die vorhandenen Cover schreibt, dann ließe sich das ganze sicher noch verbessern und vor allem sicherer machen, wenn es in der obigen Form überhaupt funktioniert.
Zuletzt geändert von smutbert am 17.12.2016 22:28:30, insgesamt 2-mal geändert.

letzter3
Beiträge: 443
Registriert: 16.07.2011 22:07:31

Re: cover aus mp3-tag

Beitrag von letzter3 » 15.12.2016 23:42:39

uihh, bin begeistert.
Rückmeldung kommt morgen....

Benutzeravatar
Lofter
Beiträge: 20
Registriert: 01.09.2016 13:23:09
Wohnort: Berlin

Re: cover aus mp3-tag

Beitrag von Lofter » 17.12.2016 01:31:19

Na da bin ich ja mal gespannt. Aber guter Tipp
"Run!"

letzter3
Beiträge: 443
Registriert: 16.07.2011 22:07:31

Re: cover aus mp3-tag

Beitrag von letzter3 » 17.12.2016 14:46:55

smutbert hat geschrieben:Wenn du einmal herzeigst unter welchem Namen --write-images die vorhandenen Cover schreibt, dann ließe sich das ganze sicher noch verbessern und vor allem sicherer machen, wenn es in der obigen Form überhaupt funktioniert.
Na aber gerne doch:

Code: Alles auswählen

[letzter@wuerfel Test]$ eyeD3 --write-images=/home/letzter/Musik/Test 1.mp3
1.mp3   [ 9.66 MB ]
-------------------------------------------------------------------------------
Time: 04:11     MPEG1, Layer III        [ 320 kb/s @ 48000 Hz - Joint stereo ]
-------------------------------------------------------------------------------
ID3 v2.3:
title: Hideaway
artist: Kiesza
album: Hideaway - Single
recording date: 2014
track: 1                genre: Electronic (id 52)
FRONT_COVER Image: [Size: 51814 bytes] [Type: image/jpeg]
Description: kiesza.jpg

Writing /home/letzter/Musik/Test/FRONT_COVER.jpeg...
-------------------------------------------------------------------------------
[letzter@wuerfel Test]$ eyeD3 --write-images=/home/letzter/Musik/Test 2.mp3
2.mp3   [ 7.50 MB ]
-------------------------------------------------------------------------------
Time: 03:16     MPEG1, Layer III        [ 320 kb/s @ 44100 Hz - Joint stereo ]
-------------------------------------------------------------------------------
ID3 v2.3:
title: Long & Lost
artist: Florence & The Machine
album: How Big, How Blue, How Beautiful
recording date: 2015
track: 7/16             genre: Pop (id 13)
FRONT_COVER Image: [Size: 30059 bytes] [Type: image/jpeg]
Description: 

Writing /home/letzter/Musik/Test/FRONT_COVER1.jpeg...
-------------------------------------------------------------------------------
[letzter@wuerfel Test]$ 

letzter3
Beiträge: 443
Registriert: 16.07.2011 22:07:31

Re: cover aus mp3-tag

Beitrag von letzter3 » 17.12.2016 14:49:23

smutbert hat geschrieben: Wenn du sicher bist, dass es pro mp3-Datei nur ein Cover gibt, könnte das so funktionieren - nur ganz grob
Ja, es sollte jeweils nur 1 Cover/Datei vorhanden sein.
smutbert hat geschrieben:Blöd ist vielleicht auch, dass in meinem Beispiel die Originalcover gelöscht werden, auch wenn irgendetwas beim Verkleinern oder beim Schreiben des Tags schief geht.
Das wäre nicht so wild, sind ja nur Kopien.

letzter3
Beiträge: 443
Registriert: 16.07.2011 22:07:31

Re: cover aus mp3-tag

Beitrag von letzter3 » 17.12.2016 15:02:23

Das script läuft leider nicht durch...
Fehlermeldung zum usage gekürzt.

Code: Alles auswählen

Kettcar - 01 - Deiche.mp3       [ 5.50 MB ]
-------------------------------------------------------------------------------
Time: 03:17     MPEG1, Layer III        [ ~233 kb/s @ 44100 Hz - Joint stereo ]
-------------------------------------------------------------------------------
ID3 v2.3:
title: Deiche
artist: Kettcar
album: von Spatzen und Tauben, Dächern und Händen
recording date: 2005
track: 1
-------------------------------------------------------------------------------
usage: eyeD3 [-h] [--version] [-l LEVEL[:LOGGER]] [--exclude PATTERN] [-L]
             [-P NAME] [-C FILE] [--backup] [-Q] [--fs-encoding ENCODING]
          .....
             [--preserve-file-times]
             [PATH [PATH ...]]
eyeD3: error: unrecognized arguments: --remove-images
convert: unable to open image `/tmp/tmp.pW8MPzbRQl/*': Datei oder Verzeichnis nicht gefunden @ error/blob.c/OpenBlob/2705.
convert: no decode delegate for this image format `' @ error/constitute.c/ReadImage/504.
convert: no images defined `/tmp/tmp.pW8MPzbRQl/cover_neu.jpg' @ error/convert.c/ConvertImageCommand/3257.
usage: eyeD3 [-h] [--version] [-l LEVEL[:LOGGER]] [--exclude PATTERN] [-L]
             [-P NAME] [-C FILE] [--backup] [-Q] [--fs-encoding ENCODING]
          .....
             [--preserve-file-times]
             [PATH [PATH ...]]
eyeD3: error: argument --add-image: file does not exist
rm: das Entfernen von „/tmp/tmp.pW8MPzbRQl/*“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden
[letzter@wuerfel Test]$ 

Benutzeravatar
smutbert
Moderator
Beiträge: 8315
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: cover aus mp3-tag

Beitrag von smutbert » 17.12.2016 22:47:59

Also bei mir funktioniert das Skript mit ein paar gerade erstellten Test-mp3s problemlos - ein Fehler ist mir allerdings trotzdem unterlaufen und zwar ein '*' zu viel, der äußert sich aber soweit ich das sehe nur in einer harmlosen Fehlermeldung - ich habs gerade im obigen Beitrag korrigiert. Außerdem habe ich ein paar Anführungszeichen hinzugefügt.

Das woran es bei dir in erster Linie scheitert ist das Speichern des Originalcovers. Der Rest sind nur Folgefehler.

Hast du in allen mp3s Cover gespeichert oder muss das Skript auch mit Dateien ohne eingebettes Bild umgehen können?
Kannst du dir "Kettcar - 01 - Deiche.mp3" näher ansehen oder zeigen was bei

Code: Alles auswählen

eyeD3 --write-images=. "Kettcar - 01 - Deiche.mp3"
herauskommt?

letzter3
Beiträge: 443
Registriert: 16.07.2011 22:07:31

Re: cover aus mp3-tag

Beitrag von letzter3 » 18.12.2016 14:41:58

Anscheinend muss das script auch mit Dateien ohne (Front)cover umgehen können.
In dem betreffenden ist tatsächlich kein image enthalten, händisch kontrolliert. Ich bin entsetzt, da ich dachte, meine Sammlung einigermaßen gepflegt zu haben.
Eine Auflistung der files ohne cover wäre hilfreich.

Code: Alles auswählen

[letzter@wuerfel ~]$ cd Musik/Test
[letzter@wuerfel Test]$ eyeD3 --write-images=. "Kettcar - 01 - Deiche.mp3"
Kettcar - 01 - Deiche.mp3       [ 5.50 MB ]
-------------------------------------------------------------------------------
Time: 03:17     MPEG1, Layer III        [ ~233 kb/s @ 44100 Hz - Joint stereo ]
-------------------------------------------------------------------------------
ID3 v2.3:
title: Deiche
artist: Kettcar
album: von Spatzen und Tauben, Dächern und Händen
recording date: 2005
track: 1
-------------------------------------------------------------------------------
[letzter@wuerfel Test]$ 

Benutzeravatar
smutbert
Moderator
Beiträge: 8315
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: cover aus mp3-tag

Beitrag von smutbert » 18.12.2016 23:27:25

Jetzt habe ich doch ein Problem beim Entfernen der eingebetteten Bilder entdeckt, mir ist aber nicht klar, warum das bei meinen ersten Tests nicht aufgetreten ist.
Das mit den Dateien ohne Cover lässt sich jedenfalls leicht lösen - ich meld mich wieder, wenn ich das Problem durchschaue.

edit:
Mensch, bin ich manchmal blind - ich habe irgendwie eine fehlerhafte Version meiner Versuche kopiert und im Beitrag eingefügt. Ich hoffe mit der Version klappt es:

Code: Alles auswählen

#!/bin/bash

IFS=$'\n'
TEMPDIR="$(mktemp -d)"

for FILE in $(find . -name '*.mp3'); do
    eyeD3 --write-images="${TEMPDIR}" "${FILE}" &> /dev/null \
    || echo "Fehler beim Extrahieren (${FILE})"
    eyeD3 --remove-images "${FILE}" &> /dev/null \
    || echo "Fehler beim Entfernen (${FILE})"
    convert "${TEMPDIR}/$(ls ${TEMPDIR} | head -n 1)" -resize 64x64 "${TEMPDIR}/cover_neu.jpg" &> /dev/null \
    && eyeD3 --add-image="${TEMPDIR}/cover_neu.jpg":FRONT_COVER "${FILE}" &> /dev/null \
    || echo "Fehler beim Einbetten (${FILE})"
    (cd "${TEMPDIR}" && rm *) &> /dev/null \
    || echo "Fehler beim Entfernen der tmp-Dateien von ${FILE}"
done

rmdir "${TEMPDIR}" \
|| echo "Merkwuerdigerweise ist ${TEMPDIR} nicht leer - irgendetwas ist schief gelaufen"
aber Vorsicht das Skript bricht bei keinem Fehler ab, auch wenn nun zumindest kurze Fehlermeldungen ausgegeben werden sollten, die verraten bei welcher Datei es Fehler gegeben hat.
Zuletzt geändert von smutbert am 31.12.2016 21:38:26, insgesamt 1-mal geändert.

letzter3
Beiträge: 443
Registriert: 16.07.2011 22:07:31

Re: cover aus mp3-tag

Beitrag von letzter3 » 19.12.2016 22:46:02

smutbert hat geschrieben: Ich hoffe mit der Version klappt es:
JEIN.
Also erstmal danke!
Leider habe ich dein script so übernommen und habe nun netterweise überall 64x64 große (kleine) Bildchen.
Aber kein Problem, ist ja nur ne Kopie und ich kann das alles mit 500x500 wiederholen. :-)

Ich hätte aber vermutet, das
smutbert hat geschrieben:

Code: Alles auswählen

...
    eyeD3 --write-images="${TEMPDIR}" "${FILE}" &> /dev/null \
    || echo "Fehler beim Extrahieren (${FILE})"
...
dieser Fehler ausgeworfen wird.

Stattdessen (als Beispiel, ist bei allen betreffenden files so):

Code: Alles auswählen

Fehler beim Einbetten (./06 - Mike Oldfield - To France.mp3)
Fehler beim Entfernen der tmp-Dateien von ./06 - Mike Oldfield - To France.mp3
Tut aber der Funktionalität keinen Abbruch und ich betrachte das Thema als gelöst.
Nochmal vielen Dank.

Benutzeravatar
smutbert
Moderator
Beiträge: 8315
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: [gelöst] cover aus mp3-tag

Beitrag von smutbert » 19.12.2016 23:02:54

Das ganze Skript ist ein bisschen chaotisch, was auch daran liegt, dass ich die Aufgabe für einfacher gehalten habe, als sie es tatsächlich ist.
Willst du es noch öfter verwenden (dann könnte ich ja überlegen wie man das besser und robuster macht, wenn mir einmal langweilig ist)?

letzter3
Beiträge: 443
Registriert: 16.07.2011 22:07:31

Re: [gelöst] cover aus mp3-tag

Beitrag von letzter3 » 19.12.2016 23:06:05

Ich werde es sicherlich der Einfachheit halber öfter verwenden, wenn ich neue Daten auf den Stick für's Auto spiele, aber mir reicht die jetzige Version völlig aus.
Ob ich nun bei einem Fehler eine "falsche" oder richtige Fehlermeldung bekomme, ist mir egal.

Benutzeravatar
smutbert
Moderator
Beiträge: 8315
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: [gelöst] cover aus mp3-tag

Beitrag von smutbert » 29.12.2016 21:21:08

Hat etwas gedauert, aber bei meinen Tests gibt es nun keine grundlosen Fehlermeldungen mehr

Code: Alles auswählen

#!/bin/bash

SAVEIFS=${IFS}
IFS="
"

TEMPDIR=$(mktemp -d)
TEMPFILE=$(mktemp -u -p ${TEMPDIR} --suffix=_new_cover.jpg)
COUNT=0
COUNTERR=0
COVERSIZE="500x500"

for FILE in $(find . -name '*.mp3'); do
	COUNT=$(expr ${COUNT} + 1)
	eyeD3 --write-images=${TEMPDIR} "${FILE}" &> /dev/null
	if [ ! "$(ls -A ${TEMPDIR})" ] ; then
		echo "Aus ${FILE} konnte kein Cover extrahiert werden!"
		COUNTERR=$(expr ${COUNTERR} + 1)
		continue
	fi
	if ! eyeD3 --remove-images "${FILE}" &> /dev/null ; then
		echo "Fehler beim Entfernen des Covers, ueberspringe ${FILE}!"
		rm ${TEMPDIR}/*
		COUNTERR=$(expr ${COUNTERR} + 1)
		continue
	fi
	if ! convert "${TEMPDIR}/$(ls -t ${TEMPDIR} | head -n 1)" -resize ${COVERSIZE} ${TEMPFILE} &> /dev/null ; then
		echo "Fehler beim Skalieren des Covers, ${FILE} wird kein Cover haben!"
		rm ${TEMPDIR}/*
		COUNTERR=$(expr ${COUNTERR} + 1)
		continue
	fi
	if ! eyeD3 --add-image=${TEMPFILE}:FRONT_COVER "${FILE}" &> /dev/null ; then
		echo "Fehler beim Schreiben des neuen Covers in ${FILE}!"
		COUNTERR=$(expr ${COUNTERR} + 1)
	fi
	rm ${TEMPDIR}/*
done
rmdir ${TEMPDIR}

TIMERUN=${SECONDS}
echo -n "${COUNTERR} Fehler in ${COUNT} Dateien waehrend "
printf '%dh:%dm:%ds' $((${TIMERUN}/3600)) $((${TIMERUN}%3600/60)) $((${TIMERUN}%60))
echo "."

IFS=${SAVEIFS}
edit:
Gerade ist mir aufgefallen, dass mir bei der vorigen Version ein Fehler unterlaufen ist und zwar hatte ich statt "--remove-images" "--remove-all-images" geschrieben. Dh. die vorige Version hat die Originalcover gar nicht aus den mp3-Dateien gelöscht sondern nur zusätzlich das skalierte Cover hineingeschrieben - den Fehler hab ich nun auch in der alten Version korrigiert, aber ich denke die neue sollte rundherum zuverlässiger funktionieren und im Zweifelsfall sinnvolle Fehlermeldungen ausgeben.

Antworten