Lyrics in Einzeldateien: Import <-> Export

Hallo,

ich möchte hier meinen Ansatz vorstellen, um die Lyrics, soweit sie im Tag UNSYNCEDLYRICS enthalten sind, in einzelne Dateien zu exportieren - und wieder "passgenau" importieren zu können.

In diesem und im englisch-sprachigen Forum ist dazu viel geschrieben worden:

/t/11243/1

/t/9323/1

/t/8610/1

/t/11957/1

/t/3548/1

/t/13607/1

/t/11427/1

/t/12359/1

Dabei wurde das Problem deutlich, dass die Lyrics mehrerer Dateien offenbar stets in eine gemeinsame Datei exportiert werden. Mehrere Beiträge zeigen Lösungen auf, diese Datei nachträglich aufzugliedern.

Mein Ansatz hat einige Vorteile und manche Nachteile. Ein Vorteil ist, dass er mit den Bordmitteln von MP3TAG die Einzeldateien erzeugt. Der Nachteil ist, dass die Dateien dazu temporär in Einzelverzeichnisse verschoben werden müssen - eine Berechtigung zum Schreiben ist also vonnöten... und die Dateien sollten nicht gleichzeitig im Netzwerk wiedergegeben werden.

Wie funktioniert's? Aufgrund der Beschränkungen des Lyrics-Exports muss (!) der Ablauf des Exportierens in drei Teilschritten umgesetzt werden:

Name der Aktionengruppe: Lyrics austauschen # 1 Start Aufgliederung

Aktion #1:
Aktionstyp: Tag-Felder formatieren
Feld: X-FILE
Formatstring: $if($eql($len(%X-FILE%),0),%_folderpath%,%X-FILE%)

Aktion #2:
Aktionstyp: Tag-Felder formatieren
Feld: _FILENAME
Formatstring: %X-FILE%\media$validate(%artist% - %title%,)\%_filename%

sodann folgt der eigentliche Export:

Name der Aktionengruppe: Lyrics austauschen # 2a Lyrics exportieren (artist - title.txt)

Aktionstyp: Export
Exportdatei auswählen: Lyricsdaten
Dateiname der Exportdatei: %_folderpath%$validate(%artist% - %title%,).txt

[ ] Daten anhängen

[x] Eine Datei pro Verzeichnis

Wichtig: Die verwiesene Exportanweisung "Lyricsdaten" enthält diese Anweisung:

$filename(%_folderpath%$validate(%artist% - %title%,).txt,utf-8)$loop(%_path%)%unsyncedlyrics%
$loopend()

Der dritte Schritt schiebt die Dateien wieder ins Ursprungsverzeichnis und löscht das Hilfstag X-FILE:

Name der Aktionengruppe: Lyrics austauschen # 3 Finish Originalstruktur

Aktion #1:
Aktionstyp: Tag-Felder formatieren
Feld: _FILENAME
Formatstring: %x-file%%_filename%

Aktion #2:
Aktionstyp: Tag-Felder entfernen
Folgende Tag-Felder entfernen (getrennt durch Semikolon ; ): X-FILE

Interessant ist die Beobachtung, dass Schritt 2 einzeln umgesetzt werden muss! Sowohl die Verschmelzung mit Schritt 1 als auch die Verschmelzung mit Schritt 3 haben bei mir das Schreiben der Einzeldatei verhindert. Eine einzelne Gesamtaktion hat ebenfalls nicht geklappt.

Mein EDV-Bauchgefühl sagt mir hierzu, dass offenbar ein Schleifenparameter nicht zurückgesetzt wird... aber das ist nur mein Bauchgefühl. Dreischrittig wie hier vorgestellt klappt es jedoch.

Der IMPORT aus gleicher Stelle klappt auf diese Weise:

Name der Aktionengruppe: Lyrics austauschen # 4a Lyrics importieren (artist - title.txt)

Aktionstyp: Text-Datei importieren
Feld: UNSYNCEDLYRICS
Dateiname: %_folderpath%media$validate(%artist% - %title%,)$validate(%artist% - %title%,).txt

Wurden die Lyrics-Dateien auf der Ebene des Betriebsystems mittels einfacher *.txt-Suche in das Media-Verzeichnis "hochgehoben", können sie auch so importiert werden:

Name der Aktionengruppe: Lyrics austauschen # 4c Lyrics importieren (MEDIA artist - title.txt)

Aktionstyp: Text-Datei importieren
Feld: UNSYNCEDLYRICS
Dateiname: %_folderpath%media$validate(%artist% - %title%,).txt

Ich habe bewusst die Künstler- und Title-Tags für die Lyrics-Datei verwendet, weil so ein "Recycling" zwischen dem Album und diversen Samplern möglich ist. Dabei entfaltet die zeichengenaue Schreibweise der beiden Tags auch eine Schutzfunktion, um Varianten (mit anderen Texten) nicht automatisch einzubinden...

Soweit - so gut. Ich freue mich auf Anregungen und Verbesserungen.

peilung

Wo berücksichtigst du denn beim Export den notenwendigen Verlust der Zeilenende-Zeichen, die in der Exportdatei sonst zu neuen Datensätzen führen würden und so beim Import nur 1 Zeile in den Lyrics erzeugen würden.
Und wo würden die, falls umgewandelt, wieder zurückgewandelt?

Bisher führt Mp3tag die in einer Aktionengruppe eingebauten Export-Aktionen immer erst am Ende einer Aktionengruppe aus.

DD.20160225.1130.CET

$if($eql($len(%X-FILE%),0),%_folderpath%,%X-FILE%) --> $if(%X-FILE%,%X-FILE%,%_folderpath%) --> $if2(%X-FILE%,%_folderpath%)

... und ...
ein $validate() je komplette Formatstringzeile tut's auch.

... und ...
In der Aktionengruppe #1, Aktion #1, wird auf die Existenz des Tagfelds X-FILE geprüft.
Wann wurde zuvor X-FILE erzeugt und mit welchem Wert?
Ist ein Wert in X-FILE überhaupt sinnvoll zu diesem Zeitpunkt?

DD.20160225.1135.CET

Hallo,

eines vielleicht vorweg: Der X-FILE-Tag hat die Aufgabe, das temporäre Verschieben zu begrenzen - und den ursprünglichen Dateiort zu erinnern. Deshalb wird das X-FILE-Tag am Ende auch wieder gelöscht.

Da die Start-Aktion die markierten MP3-Dateien zwei Ebenen nach unten "drückt", würde jeder erneute Start (der Abschluss ist ja eine separate Aktion) die Dateien wiederum zwei Ebenen nach unten verschieben... (man übersieht das schnell, weil MP3TAG die Dateien "flach" strukturiert anzeigt).

Damit wäre ich bei meiner ersten Aktion. Diese prüft die Existienz des Tags X-FILE und legt ihn andernfalls an. Die Verkürzung von Dir DetlevD dazu ist genial:

Ich war davon ausgegangen, dass Tags, die keine Boolean-Werte darstellen, nicht mit IF direkt geprüft werden können. Auch eine IF-EXIST-Bedingung fand ich nicht. Deshalb bin ich auf die Länge des Inhalts ausgewichen. Ganz offensichtlich klappt es auch mit IF2 direkt.

Daraus ergibt sich auch der Zeitpunkt: Ja, das Tag muss zu Anfang der Aktion geschrieben und geprüft werden, weil nur dann der originale Dateiort bekannt ist.

Danke - das stimmt. Ich bin noch zu unerfahren, um diese Zusammenhänge gleich zu blicken. Und die Verkürzung macht es sogar noch übersichtlicher.

Hier weiß ich nicht, ob ich das Problem richtig verstanden habe. Deshalb vielleicht mit meinen Worten:

Bei meinen Tests mit den Web-Source-Scripten wird mehrzeiliger Text in Lycrisfeld importiert.
Das Lyricsfeld enthält somit mehrzeiligen Text, also inklusive Zeilenwechseln.
Und so wird es auch exportiert, also mehrzeilig.
Da jede Datei den Inhalt genau eines Lyrics-Tags enthält (das ist ja das Drama der Aktion...), enthält die Datei somit mehrzeiligen Text.
Wenn ich diesen Dateieinhalt - mehrzeilig - in das einzelne Lyricsfeld importiere, ist auch der Inhalt des befüllten Lyricsfeldes mehrzeilig.
In meinen Tests konnte ich nicht beobachten, dass ein Parser die Zeilenwechsel heraus"strippt", nicht beim Export und nicht beim Import.
Im übrigent enthält die Lyrics-Datei keine CSV-tauglichen Daten, weshalb ich die Eindeutigkeit über den Dateinamen herstelle, der den ARTIST- und den TITLE-Tag enthält.

Hat das jetzt die Frage beantwortet?

Wie könnte ich dieses Verhalten nachvollziehen?

Wenn ich den Schritt 2 ans Ende vom ersten Schritt stelle, dann hätte ich den Export ja am Ende einer Aktion... und dennoch wird nur eine Lyrics-Datei über alle markierten Dateien geschrieben - und der LOOP-Parameter bezüglich der Dateinamen ignoriert. Und das, obwohl die gleiche Aktion separat ordentliche Einzeldateien schreibt.

Und wenn ich den Schritt 2 vor den Beginn des letzten Schritts stelle, scheint es mir, als ob erst importiert und dann zurückverschoben und das X-FILE-Tag gelöscht wird.

Gibt's einen Switch, um MP3TAG im Debug-Modus laufen lassen zu können? Gibt es andere Hilfestellungen im Programm, um Klarheit zu bekommen?

Besten Dank für Eure Anregungen. Ich blicke gespannt auf weitere Vorschläge und Fragen.

peilung

Unter dem Vorbehalt, dass das früher beobachtete Verhalten in der Zwischenzeit nicht verändert worden ist, ... kannst du in einer Aktionengruppe mit der ersten Aktion irgendwelchen Text via Export in eine Textdatei schreiben. Mit der zweiten Aktion greifst du auf die Textdatei zu und versuchst den Inhalt in ein Tag-Feld einzulesen. Wenn ein Export erst am Ende der Aktionengruppe erfolgt, dann wird die zweite Aktion ins Leere laufen.

Damit sprichst du das eigentlich größte Problem an, das Finden und Aufdecken von Fehlern ...

  • zur Visualisierung von Inhalten Hilfs-Tagfelder anlegen und/oder via Export in Textdatei ausgeben
  • ein oder mehr Gruppen von Testdateien in separaten Ordnerstrukturen
  • nachvollziehbare Dokumentation der eigenen Entwicklungen
  • usw.

DD.20160229.1337.CET

Kurze Frage, weil ich gerade am Testen bin: Direkt im GUI von MP3TAG habe ich über die Menüleiste "Konverter > Textdatei - Tag [Alt + 4]" die Möglichkeit, den Inhalt einer Datei über mehrere markierte MP3-Dateien zu "ergießen".

Wie lautet die zugehörige Aktion, die ich in den Aktionen verwenden kann?

Die Variante "Aktionen (Quick) > Text-Datei importieren" will sich bei mir nicht so verhalten, wie es der Konverter-Befehl tut :angry:

Besten Dank für den Hinweis.

Und zur eigentlichen Frage:

Die Aktion erzeugt in der Tat einen Fehler im ersten Durchlauf:

Name der Aktionengruppe: Feld-Tausch

Aktion #1:
Aktionstyp: Export
Exportdatei auswählen: Exporttest
Dateiname der Exportdatei: C:\Users\Desktop\testfile.txt

[ ] Daten anhängen

[ ] Eine Datei pro Verzeichnis

Aktion #2:
Aktionstyp: Text-Datei importieren
Feld: ARTIST
Dateiname: C:\Users\Desktop\testfile.txt

...scheint was dran zu sein. Denn erst beim zweiten Durchlauf (wenn die Datei bereits vom ersten Durchlauf vorhanden ist) importiert er ohne Fehler.

Merkwürdig, weil eigenmächtiges Ändern der Reihenfolge in den Aktionen...

peilung