Automatisches Taggen durch Ordnerstruktur


#1

Meine Musiksammlung ist wie folgt, sehr ordentlich und penibel geordnet:

Synthax

festplatte:\ordner1\ordner2\ordner3\ordner4\ordner5\ordner6\ordner7\dateiname.mp3

festplatte = Laufwerk Y (generell)
ordner 1 = "music" (generell)
ordner 2 = Genre 1
ordner 3 = Genre 2 (%genre%)
ordner 4 = Buchstabe
ordner 5 = Interpret (%artist%)
ordner 6 = Album (%album%)
ordner 7 = cd xy / side xy / mc xy / lp xy (%discnumber%) (*)
dateiname = $caps3($num(%track%,2) - %title%).mp3 (generell)

  • Mir ist schleierhaft, wie aus dem Ordnernamen "side a" der DISCNUMBER-Tag "1/2" wird. (In diesem Fall** hat das Album 2 sides... Man könnte das wohl mit if-Schleifen probieren, weil jeder DISCNUMBER-Ordner folgende Synthax hat:

Z.B. bei einem Album mit 2 CD's: Jede CD liegt in einem extra Ordner. Beispiel:

...<b>cd 1\blabla_xy.mp3
...<b>cd 2\blabla_az.mp3

blabla_xy.mp3 soll dann mit DISCNUMBER-Wert 1/2 getaggt werden, blabla_az.mp3 mit dem Wert "2/2".


Z.B. bei einem Album mit 2 Vinyl-Seiten: Jede Side liegt in einem extra Ordner. Beispiel:

...<b>side a\blabla_xy.mp3
...<b>side b\blabla_az.mp3

blabla_xy.mp3 soll dann mit DISCNUMBER-Wert 1/2 getaggt werden, blabla_az.mp3 mit dem Wert "2/2".


** Beispiel

Y:\music\gothic\ambient\a\abner malaty\1987 - fragments from the semi structure (mc-rip)\side a\01 - fragments from the semi structure.mp3

Erst lege ich manuell die Ordner an, erst danach kopiere ich die gerippten Tracks in die jeweiligen Ordner rein. MP3tag soll nach dem oben beschriebenen Schema die Dateien (per Aktion) automatisch taggen.
Wie kann man das schaffen? Ist das überhaupt realisierbar?

Hoffentlich war das jetzt nicht zu dolle kompliziert... :slight_smile:


#2

Du könntest den Konverter filename - tag verwenden, um erst mal alle Textinformationen in die Tags zu bekommen:

%genre%\%genre%\%dummy%\%artist%\%year% - %album%\%discnumber\%track - %title%

Damit kriegst du 2 Einträge in Genre - wenn das zuviel ist, ersetzt du eines durch %dummy%.
Auch landet in %discnumber% erstmal ein String.
Die Vorschau sollte dir zeigen, dass alles in den richtigen Tags landet.

Aber den kannst Du anschließend per suchen/ersetzen durch einen passenden ersetzen (es ist halt blöd, wenn man eine Buchstabenfolge in Nummern umwandeln will).

Nur so für die Zukunft: ich würde an deiner Stelle zuerst die Tags füllen - die haben dann schon die richtigen Informationen und dann mit MP3tag eine gewünschte Ordnerstruktur anlegen. Ist einfacher.


#3

ohrenkino's Empfehlung beschreibt die passende Arbeitsweise, denn wenn erst einmal die Werte in den Tag-Feldern stehen, dann lassen sich alle anderen Bequemlichkeiten von Mp3tag einfach nutzen.

Einen Erweiterungsvorschläg für den Formatstring habe ich aber noch:
%genre1%\%genre2%\%dummy%\%artist%\%year% - %album%\%discnumber%\%track - %title%

Zwei getrennte Genre Tag-Felder erlauben Freiraum für spätere einfache Manipulationen.
Wenn man nur einen der beiden Genre Werte in das typische GENRE Tag-Feld übernehmen möchte, zum Beispiel den Inhalt von GENRE1="Electro Pop", so geschieht das mit einer einfachen Zuweisung GENRE<== GENRE1 (symbolisch) und wird praktisch mit einer Aktion "Tag-Felder formatieren" erledigt.
Aktion: Tag-Felder formatieren
Feld: GENRE
Formatstring: %GENRE1%
oder
Aktion: Tag-Felder formatieren
Feld: GENRE
Formatstring: %GENRE2%

Außerdem besteht die einfache Möglichkeit, aus den beiden Tag-Feldern GENRE1 und GENRE2 ein "multi-value" GENRE Tag-Feld zu erzeugen (mehrere Tag-Felder mit demselben Namen).
Aktion: Tag-Felder formatieren
Feld: GENRE
Formatstring: %GENRE1%'\\'%GENRE2%
Die Zeichenkette '\\' hat hier die Funktion als Ersatztrennzeichen ("multi-value delimiter") und wird intern in das korrekte technische Trennzeichen verwandelt, das im Eingabefeld allerdings nicht benutzt werden kann.

Beispiel:
Mit zwei Tag-Feldern ...
GENRE1=Electro Pop
... und ...
GENRE2=Middle East Oriental
... wird ein "Multi-Value" Tag-Feld erzeugt ...
(im Dialog "Erweiterte Tags" werden zwei GENRE Felder gezeigt)
GENRE=Electro Pop
GENRE=Middle East Oriental

DD.20100924.1100.CEST


#4

Mit der Skriptfunktion $ord(x) sollte die Umwandlung der CD-Nummer relativ einfach werden.
Muster:
$if($isdigit(%discnumber%),%discnumber%,$sub($ord(%discnumber%),x)

x muss noch durch den richtigen Wert ersetzt werden, je nachdem, bei welcher Zahl der Unicode-Wert von a ist (wenn x gleich 0 ist, kann man sub natürlich weglassen).

mfG
gnor


#5

Für DISCNUMBER Werte wie zum Beispiel ...
1
12
CD 1
CD 12
CD 007
Side a
Side B
Stapel 6
Stapel F

... liefert der Skriptausdruck ...
$num($if($isdigit($regexp(%DISCNUMBER%,'^(?:.+\s)?(.+)$','\U$1')),$regexp(%DISCNUMBER%,'^(?:.+\s)?(.+)$','\U$1'),$sub($ord($regexp(%DISCNUMBER%,'^(?:.+\s)?(.+)$','\U$1')),64)),1)

... die Ergebnisse ...
1
12
1
12
7
1
2
6
6

Oder als Aktionengruppe...
Anfang Aktionengruppe Test 2010#20100924.FormatDiscnumber
Aktion #1
Aktionstyp 4: Ersetzen mit regulärem Ausdruck
Feld: DISCNUMBER
Regulärer Ausdruck: ^(?:.+\s)?(.+)$
Treffer ersetzen durch: \U$1

[_] Groß-/Kleinschreibung berücksichtigen

Aktion #2
Aktionstyp 5: Tagfeld formatieren
Feld: DISCNUMBER
Formatstring: $num($if($isdigit(%DISCNUMBER%),%DISCNUMBER%,$sub($ord(%DISCNUMBER%),64)),1)
Ende Aktionengruppe Test 2010#20100924.FormatDiscnumber (2 Aktionen)

... oder so ...

Anfang Aktionengruppe Test 2010#20100924.FormatDiscnumber
Aktion #1
Aktionstyp 4: Ersetzen mit regulärem Ausdruck
Feld: DISCNUMBER
Regulärer Ausdruck: ^(?:.+\s)?(.+)$
Treffer ersetzen durch: $1

[_] Groß-/Kleinschreibung berücksichtigen

Aktion #2
Aktionstyp 5: Tagfeld formatieren
Feld: DISCNUMBER
Formatstring: $num($if($isdigit(%DISCNUMBER%),%DISCNUMBER%,$sub($ord($upper(%DISCNUMBER%)),64)),1)
Ende Aktionengruppe Test 2010#20100924.FormatDiscnumber (2 Aktionen)

DD.20100924.1346.CEST


#6

@DetlevD Danke für die Mühe, eine ausführliche Beschreibung zu machen. :slight_smile:

(Die Gesamtcdnummer fehlt jetzt noch. Wenn diese immer 2 ist kann man an den obigen String noch "/2" anhängen. Oder muss man den Slash maskieren, ich habe gerade nichts zum Ausprobieren?)

mfG gnor


#7

Möchte mich mal mit einer ähnlichen Frage hier rein hängen:

Ich würde gern in die Tags die %Discnumber% aus dem Dateipfad übernehmen, sofern sie im Dateipfad am Ende des Pfades angegeben ist (d.h. nur machmal gibt es Subfolder für die Disc).

Ergebnistyp sollte wie folgt sein:

C:/tolles album/CD1/lied07.mp3 -> Schreibe Discnumber = 1
C:/VerzeichnisA/anderes album/Disc2/lied04.mp3 -> Schreibe Discnumber = 2
C:/Verz01/Sub2/Lieblingsalbum/Song02.mp3 -> Schreibe nichts, da keine passende Info im Pfad

Sicher ist, dass wenn es Subverzeichnisse für ein Album gibt, dies im Pfad immer an letzter Position steht.

Meine bisherigen Versuche konzentrieren sich auf
Aktionen -> Tag-Feld formatieren
Feld = DISCNUMBER

Die Suche nach der Disc-Information im Pfad will mir nur einfach nicht gelingen...


#8

Ich bezweifele, dass wirklich vernünftige Ergebnisse mit einer automatisierten Funktion rauskommen.
ich würde bei so heterogenen Strukturen immer erst filtern und dann die Daten extrahieren.
Für das erste Beispiel " C:/tolles album/CD1/lied07.mp3 "
würde gelten:
Filter %_directory% HAS CD
Und dann mit dem Konverter Dateiname - Tag:
CD%discnumber%\%dummy%
die Disknummer extrahieren

Für das zweite:
C:/VerzeichnisA/anderes album/Disc2/lied04.mp3
Filter
Filter %_directory% MATCHES \\Disc
Und dann mit dem Konverter Dateiname - Tag:
Disc%discnumber%\%dummy%

usw.

Und dann würde ich schleunigst die Verzeichnisnamen und Strukturen vereinheitlichen... Aber das ist mein persönliches Problem.


#9

Weil es auch Albumnamen gibt, die am Ende eine Nummer haben, kann man zunächst den Dateibestand so filtern, dass der erste Ordner oberhalb der Datei, also %_DIRECTORY%, dem eigenen Schema gemäß richtig erkannt wird.

Filter z. B.:

"%_DIRECTORY%" MATCHES "^(CD|DISC) *0*(\d+)$"

Aus der resultierenden Listenansicht können falsche positive Treffer manuell entfernt werden (Taste [Entf] benutzen).

Für die ausgewählten Dateien kann man das Tag-Feld DISCNUMBER mit einer Aktion "Tag-Feld formatieren" beschreiben, z. B.:

Anfang Aktionengruppe Format DISCNUMBER#Set DISCNUMBER from DIRECTORY

Aktion #1
Aktionstyp 5: Tagfeld formatieren
Feld: DISCNUMBER
Formatstring: $regexp(%_directory%,'^(CD|DISC) 0(\d+)$','$2',1)

Ende Aktionengruppe Format DISCNUMBER#Set DISCNUMBER from DIRECTORY (1 Aktion)

Siehe auch:
DISCNUMBER aus Ordner (CD1) schreiben
Generating %DISCNUMBER% Tags
http://www.google.de/search?hl=de&q=si...g.de+DISCNUMBER

DD.20110102.1151.CET


#10

Naja - ich kenne auch Alben, die heißen so was wie "Vol. 1" oder "Hits 1981" oder "Part 1", so dass mit dem Kriterium "endet auf Nummer" zwar eine Menge Dateien gefunden werden, aber vermutlich längst nicht alle.
Auch wenn jemand mal DISK, Disc schreibt, aber nicht "Disco 1978" dabei haben will, liegt in dieser Varianz das wahre Problem.
Und wenn dann auch noch unterschiedliche Schachtelungstiefen eingebaut wurden, ist wohl kaum die %discnumber% das Problem, sondern die Vielfalt der Eingaben...
Deshalb würde ich immer lieber filtern und dann einen Konverter samt geeigneter Maske anschmeißen...
Viele Wege führen nach Rom.


#11

Hmm ... habe ich das nicht alles schon in meinem Beitrag berücksichtigt und erwähnt?

Die Schachtelungstiefe der Ordnerstruktur ist bei der Situation von Blutsvente ohne Bedeutung.

DD.20110102.1155.CET


#12

Herzlichen Danke Euch!
Ich denke auch, dass die Vorselektion mit dem Filter die effektivste Lösung ist. Unschärfen wird es immer geben, aber das ist egal. Für 99% aller Fälle wird sich die Situation erstmal automatisch verbessern mit dieser Vorgehensweise. Der kleine Rest muss dann halt duch den spanischen Hilfsarbeiter erledigt werden. Sorry Manuell.

Mit $regexp(%_DIRECTORY%,'^(CD|DISC) 0(\d+)$','$2') klappt es ganz hervorragend!

Kann man den Filter auch gleich in die Aktion mit einbauen oder sind das vollkommen unabhängige "Module" innerhalb MP3Tag?

Hintergrund der Frage: Diesen Thread müsste ich mir ja wieder raussuchen, wenn ich das mal wieder vorhaben sollte. Die Aktionen sind ja speicherbar, aber die Filter?


#13

Hmm ... eigentlich müsste es auch irgendwie ohne das vorherige Filtern funktionieren (vorausgesetzt der Name des Stammordners der Datei folgt dem eigenen Schema):

$if($eql($regexp(%_directory%,'^(CD|DISC) *0*(\d+)$','$2',1),%_directory%),,$regexp(%_directory%,'^(CD|DISC) *0*(\d+)$','$2',1))

... oder ...

$if($eql($regexp(%_directory%,'^(CD|DISC) *0*(\d+)$',,1),),$regexp(%_directory%,'^(CD|DISC) *0*(\d+)$','$2',1),)

Wenn man bei Alben, die aus nur einem Datenträger bestehen, die DISCNUMBER auf "1" setzen will, dann so:

$if($eql($regexp(%_directory%,'^(CD|DISC) *0*(\d+)$','$2',1),%_directory%),'1',$regexp(%_directory%,'^(CD|DISC) *0*(\d+)$','$2',1))

... oder ...

$if($eql($regexp(%_directory%,'^(CD|DISC) *0*(\d+)$',,1),),$regexp(%_directory%,'^(CD|DISC) *0*(\d+)$','$2',1),'1')

Der Filter gehört zu den interaktiven Bedienmöglichkeiten von Mp3tag, wohingegen die Aktionen sowohl interaktiv als auch automatisierbar sind.
Der Filter hat eine Historienliste, die auch gesichert wird.

Es ist wünschenswert, auch die Filterfunktion als Aktionsmodul benutzen zu können.

DD.20110102.1307.CET, DD.20150316.1014.CET


#14

Als Workaround habe ich mir derweil eine Textdatei im MP3tag-Ordner angelegt, in die ich die Zeichenketten besonderer Filter speichere sowie jeweils einen kleinen Kommentar, wozu ich die verwendet habe. Denn manchmal ist die Aneinanderreihung von Satzzeichen und anderen nicht so ganz selbsterklärend. :wink: