Datei verschieben führt zu Dateiname .mp3

Hallo Community,

ich bin am Verzweifeln und sehe wahrscheinlich schon den Wald vor lauter Bäumen nicht.

Ausgangslage:
Ich nutze MP3Tag schon seit bestimmt 15 Jahren und bin mit den Basics vertraut. (Absolut geiles Programm!!)

Ich habe es begrenzt auf 1 Test MP3, welche mit den üblichen Verdächtigen voll getagged ist.

Ich verwende des weiteren einen zusätzlichen Tag "%contentgroup%", in welchem ich "Alben, Sampler, Soundtrack, Artisten" als Info hinterlege, damit ich diesen Tag für die Verzeichnisstruktur nutzen kann.

Problembeschreibung:
Test 1: Konverter Tag-Dateiname
Formatstring: P:\sortiert\%contentgroup%\%genre%\%artist%\%artist% - %title%
Ergebnis: Datei wird nach "P:\sortiert\Artisten\Pop\Abba\Abba - Andante Andante.mp3" verschoben
OK

Test 2: Aktion Tag-Feld formatieren
Feld: _FILENAME
Formatstring: P:\sortiert\%contentgroup%\%genre%\%artist%\%artist% - %title%
Ergebnis: Datei wird nach "P:\sortiert\Artisten\Pop\Abba\Abba - Andante Andante.mp3" verschoben
OK

Test 3: Aktion Tag-Feld formatieren
Feld: _FILENAME
Formatstring: $if($eql(%contentgroup%,Artisten),P:\sortiert\%contentgroup%\%genre%\%artist%\%artist% - %title%,)
Ergebnis: Datei wird nach "P:\sortiert\Artisten\Pop\Abba\.mp3" verschoben
FEHLER

Ich bin jetzt schon seit Stunden am Syntax checken und komme nicht dahinter, weshalb der Dateiname nicht mehr als "Abba - Andante Andante.mp3" geschrieben wird, sondern nur noch als ".mp3"
Wohin verschwindet in diesem Fall "%artist% - %title%"?
Im Test 2 hat derselbe Formatstring ja auch funktioniert.

Es wurde lediglich die Auswertung des tag "%contentgroup%" hinzugefügt.
Diese Auswertung ist notwendig, da ich in unsortierten Verzeichnissen arbeite, welche sowohl Einzeltitel von Artisten, als auch ganze Alben oder Sampler beinhalten.
Über eine Aktionsgruppe kann ich dann je nach Auswertung von "%contentgroup%" die Dateien in einem Rutsch zielgerichtet in die richtige Verzeichnisstruktur verschieben. (\Alben, \Sampler, ...)

Wäre für jeden sachdienlichen Hinweis dankbar.

Merci
/Willy

Was steht ganz genau für den Song "Andante Andante.mp3" im Tag CONTENTGROUP?

Du vergleichst CONTENTGROUP ja mit der Formel $if($eql und fragst, ob "Artisten" drinsteht.
Was steht wirklich ganz genau drin, inkl. allfällig führenden oder nachfolgenden Leerschlägen?

Was Du auch probieren kannst:
Verwende rein zu Testzwecken mal den Convert Tag -> Tag und wähle dort als
FELD: _FILENAME
Format String: Dein Format string aus Test 3
$if($eql(%contentgroup%,Artisten),P:\sortiert\%contentgroup%\%genre%\%artist%\%artist% - %title%,)

Was zeigt die Vorschau (gleich unter dem Formatstring, noch bevor Du auf den Preview-Button klickst) an?

Das macht ohnehin nach meiner Meinung wenig Sinn, da eine brauchbare Alternative fehlt, wenn der Inhalt von %contentgroup% nicht "Artisten" ist. In den Fällen wird wird immer ".mp3" geschrieben werden.
Statt dessen solltest Du nach %contentgroup% IS Artisten filtern, wenn Du wirklich nur MP3s mit diesem Inhalt verarbeiten willst.
Dein jetziges Ergebnis spricht - wie von Lyricslover angeführt - dafür, dass %contentgroup% nicht vorhanden bzw. der Inhalt nicht genau "Artisten" ist.

diese Bedingung hat keine Alternative vorgesehen, wenn in CONTENTGROUP nicht Artisten steht (sondern mehr oder weniger oder Schreibweise anders). Das erzeugt dann einen leeren Dateinamen.

Hallo Leute,

danke schon mal für euer Feedback.

Im Tag CONTENTGROUP steht exakt der String "Artisten".
Und wenn ich deinen Konverter Tag-Tag Vorschlag durchteste, dann erhalte ich unter dem Formatstring das gewünschte Ergebnis angezeigt: P:\sortiert\Artisten\Pop\Abba\Abba - Andante Andante.mp3

Klicke ich auf den Vorschaubutton, erhalte ich:

P:\Willy\Olli\_Sammlung\Abba\Abba - Andante Andante.mp3
"" ->
"P:\sortiert\Artisten\Pop\Abba\Abba - Andante Andante"

Die die Variable %contentgroup% in der Pfadangabe richtig aufgelöst wird, scheint der Inhalt ja korrekt zu sein, da ansonsten die Aktion verworfen werden würde.

@poster
Natürlich habe ich in dieser Aktionsgruppe auch noch entsprechende Aktionen für die anderen möglichen Inhalte dieses Tags verfügbar.
Ist das Tag %contentgroup% leer, so wird die Aktionsgruppe nicht durchgeführt und ich sehe sehr schnell, das etwas mit den Tags nicht passt.

Und wiederum rein zu Testzwecken:
Wenn Du also den korrekten, gewünschten neuen Pfad samt Dateiname im Konverter Tag->Tag siehst (mit Dateiendung .mp3 nehme ich an), was passiert dann, wenn Du auf den "OK"-Button drückst?

Wird dann daraus
P:\sortiert\Artisten\Pop\Abba\Abba - Andante Andante.mp3
oder nur
P:\sortiert\Artisten\Pop\Abba\.mp3

Und nur um sicher zu sein:
In P:\sortiert\Artisten\Pop\Abba\ gibt es noch keinen identisch lautenden Dateinamen Abba - Andante Andante.mp3, richtig?

Das würde ja bedeuten, dass bei Dir Mp3Tag die Aktion Format Value für den Dateinamen fehlerhaft ausführt, während der Weg über den Konverter korrekt wäre.
Das ist sicherlich nicht der Fall. Daher tippe ich eher auf eine Fehler im Format String bei der Aktion.
Bei mir verhalten sich beide Wege identisch korrekt, auch mit Deinem Beispiel.

Vielleicht könnten wir das ein wenig besser beurteilen, wenn @Nightrider uns einen Screenshot von seiner Aktion mit dem fehlerhaften Resultat zeigen würde.
Vielleicht entdecken wir mit 6 :eye: eher einen Schreib-/Syntaxfehler?

Dazu ist mir gerade noch was eingefallen:
Wenn Du eine Aktionsgruppe hast und darin mehrere Format-Value-Aktionen für den Dateinamen hintereinander abarbeitest, bleibt am Ende natürlich immer nur die letzte Aktion relevant.
Beispiel:
Die Datei hat den Wert "Artisten" im Feld CONTENTGROUP.
Die 1. Aktion mit der Abfrage nach %contentgroup% für "ARTISTEN" benennt also den Dateinamen korrekt um.
Die 2. Aktion fragt, ob der Wert "Soundtrack" im Feld CONTENGROUP enthalten ist. Da dies nicht der Fall ist, erfolgt einer Umbenennung ohne Dateinamen.

Hier nun mal ein paar Screenshots meiner Umsetzung:

#1
Ausgangsbasis ist ein MP3 mit den notwendigen Tags

#2
Das Quellverzeichnis P:\Test beinhaltet die Datei Abba - Andante Andante.mp3
Das Zielverzeichnis P:\sortiert\Artisten\Pop\Abba ist leer

#3
Die Aktionsgruppe besteht aus 4 Aktionen
Jede Aktion verschiebt die markierten Dateien in die gewünschte Verzeichnisstruktur je %contentgroup%

#4
Habe ich die Aktionsgruppe ausgeführt, so ist das Quellverzeichnis leer und im Zielverzeichnis befindet sich die Datei .mp3


@LyricsLover

Konverter Tag-Tag zeigt den Dateinamen korrekt an, die Vorschau jedoch ohne .mp3
Das Zielverzeichnis ist noch leer.

Führe ich diese Aktion dann aus, so erhalte ich das gewünschte Ergebnis:

@poster
Ich kann mir nicht vorstellen, dass dies relevant sein könnte.
MP3Tag arbeitet nur mit der markierten Dateimange (_FILENAME und nicht _DIRECTORY) und die $if($eql Anweisung sorgt ja genau dafür, dass die Aktion nur dann ausgeführt wird, wenn %contentgroup% einen bestimmten Inhalt aufweist.
Ist die erste Aktion durchgeführt, so befindet sich die zu überprüfende Datei nicht mehr im Arbeitsverzeichnis von MP3Tag (P:\Test).
Und selbst wenn, dann muss die Überprüfung der %contentgroup% bei den restlichen Aktionen zum Abbruch der weiteren Ausführung führen - das wäre zumindest Aufgabe der IF Anweisung.

Aber vielleicht verstehe ich da ja im Zusammenhang mit MP3Tag etwas falsch ...

Das ist nicht richtig, da die $IF() Anweisung nicht nur einen "wahr" sondern auch einen "falsch" Teil hat, den nach dem Komma, den du zumindest bei einer Anweisung mit einem leeren String besetzt hast - und das führt genau zu dem Ergebnis das du bemängelst.
Dabei führt MP3tag genau das aus, was du geschrieben hast:
Wenn "Artisten", dann schreibe den Dateinamen mit Verzeichnis, wenn nicht, dann setze einen leeren String.
Den "Wenn nicht" Teil leer zu lassen, heißt nicht "tue nichts".

@ohrenkino

Dabei führt MP3tag genau das aus, was du geschrieben hast:
Wenn "Artisten", dann schreibe den Dateinamen mit Verzeichnis, wenn nicht, dann setze einen leeren String.

Nein - ich bemängele, das der WAHR Teil der IF Funktion nicht so ausgeführt wird, wie er definiert ist.
Aus meinem Verständnis heraus sollte die Überprüfung $eql(%contentgroup%,Artisten) des beschriebenen Beispiels WAHR ergeben und somit den WAHR Teil der IF Anweisung umgesetzt werden.

Aber anscheinend liefert $eql(%contentgroup%,Artisten) nicht WAHR, sondern FALSCH.
In diesem Sinne würde dann alles logisch passen.

Aber wieso liefert $eql(%contentgroup%,Artisten) nicht WAHR?
Der Inhalt des zu überprüfenden Feldes liefert exakt jenen String, der überpüft werden soll.

Ich habe auch schon $eql(%contentgroup%,'Artisten') versucht - aber ebenfalls nur .mp3 erhalten.

Gibt es eine irgendwie geartete Debug-Funktionalität in MP3TAG, um zu sehen, wie $eql(%contentgroup%,'Artisten') zu diesem Zeitpunkt umgesetzt wurde?

Ich klinke mich hier jetzt mal ein, die eigentliche Lösung zu dem Problem ist hier und hier beschrieben — ich versuche lediglich aus einer anderen Richtung zu erklären.

Die Booleschen Funktionen in Mp3tag liefern laut Dokumentation Wahrheitswerte im Sinne von true oder false zurück. So zum Beispiel die $eql()-Funktion:

$eql(x,y) returns true if x equals y. If x and y are strings, they’re compare case-insensitively.

Dabei werden nicht die Zeichenketten "true" oder "false" zurückgegeben, sondern ein für den Benutzer zunächst unsichtbarer Wert der durch andere Funktionen benutzt werden kann, die solche Werte als Eingabe verwenden — z.B. von $if() im ersten Parameter. Laut Dokumentation verhält sich diese Funktion wie folgt:

$if(x,y,z) if x is true, y is returned, otherwise z.

Es wird also ein Rückgabewert einer der erwähnten Booleschen Funktionen interpretiert und je nach Wert true oder false entweder y oder z zurückgeliefert. Ein Beispiel dafür wäre

$if($eql(%contentgroup%,'Artisten'),wahr,falsch)

In Deinem Beispiel von oben lässt Du den else-Teil (der zweite Parameter) jedoch leer, was dann falls der Vergleich fehlschlägt, in einem leeren Rückgabewert resultiert:

$if($eql(%contentgroup%,Artisten),P:\sortiert\%contentgroup%\%genre%\%artist%\%artist% - %title%,)

Deine Annahme war nun (das nehme ich von dem was Du geschrieben hast jetzt einfach mal so an), dass bei mehreren Vergleichen mit $if(... dann nur der ausgeführt wird, der auch erfolgreich ist. Das ist so nicht der Fall. In Deinem Beispiel von oben werden alle Aktionen "Tag-Feld formatieren" nacheinander ausgeführt und da der letzte Vergleich mit $if($eql(%contentgroup%,'Soundtrack'),...) fehlschlägt, wird auch wenn ein anderer Vergleich vorher erfolgreich war eine leere Zeichenkette geliefert.

Probier damit am besten ein bisschen aus. Du kannst im else-Teil auch wieder ein $if(...) verwenden, sodass beliebig komplexe Komposition möglich ist:

$if($eql(%contentgroup%,'Artisten'),'Artisten ist wahr',$if($eql(%contentgroup%,'Alben'),'Alben ist wahr',$if($eql(%contentgroup%,'Sampler'),'Sampler ist wahr',$if($eql(%contentgroup%,'Soundtrack'),'Soundtrack ist wahr','etwas anderes steht in Contentgroup'))))
1 Like

Hallo @Florian
Danke für deine Ausführungen.
Ich habe es nun tatsächlich geschafft, dass die Aktionsgruppe (in meinem Sinne) fehlerfrei abgearbeitet wird.

Ich habe nun den FALSCH|ELSE Teil der If Funktion durch %_filename% ergänzt.

Ich habe auch eine verschachtelte IF Anweisung mit Erfolg durchgetestet:

$if($eql(%contentgroup%,Artisten),P:\sortiert\%contentgroup%\%genre%\%artist%\%artist% - %title%,$if($eql(%contentgroup%,Alben),P:\sortiert\%contentgroup%\%genre%\%artist%\%album%\%_filename%,$if($eql(%contentgroup%,Sampler),P:\sortiert\%contentgroup%\%genre%\%album%\%_filename%,$if($eql(%contentgroup%,Soundtrack),P:\sortiert\%contentgroup%\%album%\%_filename%,%_filename_ext%))))

Von daher ein Danke an Dich und auch an @poster und @ohrenkino für den Schups in die richtige Richtung.
Auch an @LyricsLover ein Danke, dass Du Dir die Zeit zum erklären genommen hast.

Von meiner Seite her ist dieses Topic somit abgeschlossen.

Abschließend nur für mich nochmals zum Verständnis:
Für mich war $if( immer eine klassische If..Then..Else Funktion.
Da ich auch viel mit Excel mache und hier ein leerer Then Teil tatsächlich dazu führt, das eben "nichts" gemacht wird, bin ich davon ausgegangen, dass es in MP3Tag ebenso sein wird.

Wieder etwas dazu gelernt ...

Aber was mich am meisten überrascht - bitte bestätigen oder nochmals erklären - war die Erkenntnis, dass eine Aktionsgruppe auch dann komplett durchgeführt wird, auch wenn sich während der Ausführung das Verzeichnis der zu bearbeitenden Datei geändert hat.

Ich ging bisher immer davon aus, dass wenn ich eine Aktionsgruppe auf eine Datei in P:\Test ausführe, dass dann alle einzelnen Aktion P:\Test als "Arbeitsverzeichnis" verwenden und dann einfach ins Nichts laufen, wenn zum Zeitpunkt der Ausführung keine Datei mehr zur weiteren Bearbeitung vorhanden ist (da durch eine Aktion erfolgreich verschoben).

Ist es also korrekt, wenn ich sage:
In meinem Beispiel wurde die Datei P:\Test\Abba - Andante Andante.mp3 durch die erste Aktion $if($eql(%contentgroup%,Artisten),P:\sortiert\%contentgroup%\%genre%\%artist%\%_filename%,) richtigerweise nach P:\sortiert\Artisten\Pop\Abba verschoben und alle weiteren Aktionen haben diese Datei nicht mehr in P:\Test sondern in P:\sortiert\Artisten\Pop\Abba weiterverarbeitet?

Danke an alle für Eure Hilfe und noch ein schönes Wochenende :slight_smile:

/Willy

1 Like

Ja, das ist korrekt.

Persönlich würde ich aufgrund der besseren Übersichtlichkeit ebenfalls den Weg gehen, wie Du es mit dem "richtigen" ELSE/SONST-Fall und %_filename% gelöst hast (achte sicherheitshalber noch darauf, ob das wirklich reicht, oder ob da noch ein %_folderpath% vorangestellt werden muss). Damit bleiben die Aktionen übersichtlicher als mit tiefen verschachtelten $IF-Konstruktionen, die man nach ein paar Wochen oder Monaten kaum mehr entziffern kann.