[Hilfe] feat. von artist nach title

Hallo liebe Leute, hatte vergessen hier wieder reinzugucken und hab das jetzt erst nachgeholt.
Ich kann mich nur immerwieder für eure Hilfsbereitschaft bedanken, jedoch habe ich immernoch ein paar kleine Probleme. Um jetzt nochmal auf mein Anfangsproblem zurückzukommen.

Also pone's Variante klappt super.
Mit der Variante werden die Features in den Titeltag übertragen und auch in meine gewünschte Schreibweise umgewandelt! Nur wie kann ich jetzt Features, die bereits im Titeltag stehen in mein gewünschtes Format umwandeln? (Die bleiben von der Aktion ja unverändert)

Kanye West - All Of The Lights (Ft. Elton John..) -> Kanye West - All Of The Lights feat. Elton John..

Gnor's "produced by" Vorschlag funktioniert bei mir leider überhaupt nicht :unsure:

Ich habe als Feld TITLE genommen, da sich das "prod. by" ja schließlich dort befindet
Bei der 1. Variante bekomme ich ein doppeltes "by" und eine doppelte schließende klammer am Ende und 2 bis 3 leerzeichen zwischen "prod. by" und "produzentenname"
Bei der 2. Variante erscheint "[ SYNTAX ERROR IN FORMATTING STRING ]", ein doppeltes Leerzeichen, eine doppelte schließende Klammer am Ende und die Schreibweise wird nicht verändert.

Wäre jemand nochmal so nett sich meinem Problem zu widmen?

Hallo zusammen,

ich finde die Idee genial. Ich würde es gerne verstehen. Habe mir mal die verlinkten Artikel durchgeschaut und habe noch ein paar Frage:

%title% $regexp($regexp(%artist%,(.)( | '('| '[')(featuring|Featuring|FEATURING|ft|Ft|FT|ft.|Ft.|FT.|feat|Feat|FEAT|feat.|Feat.|FEAT.) (.),(feat. $4 XXXXX $1),(')'|']') XXXXX , XXXXX )

in diesem String habe ich ein kleines Probelm.

(feat. $4 XXXXX $1),(')'|']') XXXXX , XXXXX )

Wie interpretiere ich diesen Teil?

(feat. gibt später im Titel (feat. aus.

Was bedeuten die $4 und $1 ?

Ich wollte eine schließende Klammer noch einfügen aber ich habe keine Idee wo?

Danke

Gruß

kann wirklich niemand helfen?

Danke

$1 ist der Inhalt der ersten Klammer, $4 der Inhalt der vierten Klammer im zweiten Parameter der inneren $regexp Funktion:
$regexp(%artist%,(.)( | '('| '[')(featuring|Featuring|FEATURING|ft|Ft|FT|ft.|Ft.|FT.|feat|Feat|FEAT|feat.|Feat.|FEAT.) (.),(feat. $4 XXXXX $1)

Schau zur deutschen Hilfe mit F1 in Mp3tag, geh dort zu Skriptbefehle, und folge dann dem etwas verstecktem Link bei $regexp(x,expr,repl) zu den regulären Ausdrücken, dort wird das erklärt.

Wo brauchst du noch ein schließende Klammer? Ist die nicht schon enthalten?

Im Prinzip ist die Syntax wie im ersten Post des Threads nur das ich gerne (feat. ...) in klammern schreibe.

Nach etwas Spielen mit dem Ausdruck habe ich die Klammer vor dem "feat." eingefügt. Aber der schließende Ausdruck funktioniert nicht:

%title% $regexp($regexp(%artist%,(.)( | '('| '[')(featuring|Featuring|FEATURING|ft|Ft|FT|ft.|Ft.|FT.|feat|Feat|FEAT|feat.|Feat.|FEAT.) (.),<!--coloro:#FF0000-->(feat. $4 XXXXX $1),(')'|']') XXXXX , XXXXX )

Dei rote öffnet den Ausdruck aber wo kommt die geschlossene hin.

Danke

Die schließende Klammer muss nach $4.
Hab dir ausserdem noch die ewig lange Feat... Reihe verkürzt. Das ,1 in der inneren $regexp Funktion bewirkt, das Groß- und Kleinschreibung nicht berücksichting wird, .? nach (featuring|feat|ft) bewirkt, das alle Schreibungen mit oder ohne Punkt erkannt werden.

Aktion: Tag-Felder Importieren
Quellformat: %title% $regexp($regexp(%artist%,(.)( | '('| '[')(featuring|feat|ft).? (.),'('feat. $4')' XXXXX $1,1),(')'|']') XXXXX , XXXXX )
Formatstring: %title% XXXXX %artist%

Danke. Das mit der Groß- und Kleinschreibung ist ne gute Idee. Hatte ich auch schon gelesen.

Aber das mit der Klammer funktioniert nicht.

Gruß

PS: Habe auch den zeilenumbruch aus dem String entfernt.

Was funktioniert nicht? Was erhältst du aus Ergebnis?

Könntest du bitte ein Beispiel angeben mit Ist und Soll Inhalt für Artist und Title Felder?

Vorher:
Feld Artist: Artist Feat Artist
Titel: Titel

Nachher:
Feld Artist: Artist
Titel: Titel (feat. Artist

Die schließende Klammer fehlt :slight_smile:

Dieser Formatstring funktioniert für mich:

%TITLE% $regexp($regexp(%ARTIST%,'(.*)( | \(| \[)(featuring|feat|ft)\.? (.*)','(feat. $4) XXXXX $1',1),' (\)|\]) XXXXX ',' XXXXX ')

Feld TITLE:
Title
Feld ARTIST:
Artist Feat Featartist
Ergebnis:
Title (feat. Featartist) XXXXX Artist

Aber ich glaube nicht, dass er komplett richtig ist.
Wahrscheinlich habe ich nur noch einen Fehler eingebaut, der den anderen Fehler austrickst.

Dieser Formatstring erzeugt dasselbe Ergebnis:

%TITLE% $regexp($regexp(%ARTIST%,'(.*)( | \(| \[)(featuring|feat|ft)\.? (.*)','(feat. $4) XXXXX $1',1),'(\)|\]) XXXXX ',') XXXXX ')

DD.20110504.1048.CEST

==============================================================

Und dieser Quellformatstring sieht so aus, als müsste er passend sein:

%TITLE% $regexp(%ARTIST%,'^(.+?)\s+[[(]?(?:featuring|feat|ft)\.?\s+(.+?)[])]?\s*$','(feat. $2)=====$1',1)

Feld TITLE:
Title
Feld ARTIST:
Artist Feat Featartist
Ergebnis Quellformatstring:
Title (feat. Featartist)=====Artist

Komplett als Aktion ...
Aktion:
Tag-Felder Importieren
Quellformat:

Formatstring:
%TITLE%=====%ARTIST%
Ergebnis im Tagfeld TITLE:
Title (feat. Featartist)
Ergebnis im Tagfeld ARTIST:
Artist

==============================================================

Der vorstehende Quellformatstring entdeckt folgende 'featuring' Literale:
ft
ft.
feat
feat.
featuring
featuring.

Eine Besonderheit stellt das zuletzt genannte Literal 'featuring.' dar.
Der Punkt in 'featuring.' ist sinngemäß überflüssig, könnte aber mehrfache Bedeutung haben.
Ist der Punkt ein Abkürzungspunkt oder ein Satzende?
Wenn ja, welchen Sinn hätte der Punkt an dieser Stelle?
Wäre der Punkt nur ein Schreibfehler?
Das sind Fragen, die aber nicht an dieser Stelle zu klären sind, denn das 'Säubern' von Daten sollte in einem vorherigen Schritt bereits geschehen sein.
Wenn wir sinnvolle Daten erwarten, dann brauchen wir nicht zu prüfen auf 'featuring.'.

Wer also nur die Liste sinnvoller Treffer prüfen will, der kann diesen Quellformatstring benutzen:

%TITLE% $regexp(%ARTIST%,'^(.+?)\s+[[(]?(?:ft\.?|feat\.?|featuring)\s+(.+?)[])]?\s*$','(feat. $2)=====$1',1)

==============================================================
DD.20110504.1117.CEST
Edit.
DD.20110504.1241.CEST
Edit. Den Hilfstrenner geändert zu 5 x Gleichheitszeichen ohne Leerzeichen.
DD.20110504.1806.CEST
Edit. Ergebnisdarstellung ergänzt.
DD.20110505.0432.CEST
Edit. Alternativen Quellformatstring ergänzt.
DD.20110505.1030.CEST

Gut gelöst mit nur einer $regexp Funktion. Die zweite Klammer hat mich mit runden Klammer mit Alternativen echt gefuchst. Mit der eckigen Klammer geht das besser.

Was wir noch aufgefallen ist bei der Betrachtung deines Quellformatstrings: wir haben beide vergessen den optionalen Punkt nach featuring|feat|ft mit einem <!--colorc--> zu maskieren.
Also besser:

%TITLE% $regexp(%ARTIST%,'^(.+?)\s+[[(]?(?:featuring|feat|ft)\.?\s+(.+?)[])]?\s*$','(feat. $2) === $1',1)

Ja tatsächlich, solche kleinen Fehler kommen wegen der selektiven Wahrnehmung für die größeren Dinge. Gut so, dass du es bemerkt und korrigiert hast, pone!
Das habe ich sicherheitshalber in meinem Beitrag auch korrigiert. Danke für den Hinweis.

DD.201100504.1239.CEST

Danke für eure Mühe.

Habe beide Möglichkeiten getestet.

Der neue String sieht deutlich übersichtlicher aus. MP3Tag vermedlet auch 5 Dateien umbenannt. Aber im Ergbnis sehe ich nix.

%TITLE%$regexp(%ARTIST%,'^(.+?)\s+[[(]?(?:featuring|feat|ft).?\s+(.+?)[])]?\s*$','(feat. $2)===$1',1)

%TITLE% === %ARTIST%

Der alte Strink funktioniert jetzt so wie er es soll.
%title% $regexp($regexp(%artist%,'(.)( | (| [)(featuring|feat|ft).? (.)','(feat. $4) XXXXX $1',1),' ()|]) XXXXX ',' XXXXX ')

Danke

'StGo', ... hmm... zum Ersten würde ich sagen, Abschreiben will gelernt sein, und zum Zweiten, da hast du Glück, dass es für deinen speziellen Fall funktioniert und du damit zufrieden bist.

Ich persönlich würde aber meine letzte kurze Regexp Version benutzen, denn die funktioniert für alle drei Fälle gleichermaßen gut (runde Klammer, eckige Klammer, keine Klammer).

DD.20110504.1812.CEST

Vielen Dank für dieses Wunderwerk der Technik!

Die letzte von DetlevD gezeigte Version funktioniert allerallerallerbestens!

Nochmals Danke an Euch beiden Spezial-Spezialisten. :smiley:

Der Rückwärtsschräger "entwertet" das folgende Zeichen, welches andernfalls eine besondere Bedeutung für die Syntax des Regulären Ausdrucks hätte, nämlich die Gruppierung von Häppchen - in diesem Fall wird die Klammer nun auch wirklich als Klammer genommen und nicht als Gruppierungsgrenze des dann folgenden Begriffs.

Diese Gruppierungen werden dann (von MP3tag intern) stumpf durchnummeriert und können per $1 bis $n angesprochen werden. Das siehst du mit $4 und $1.
All diese Informationen findest du auch in der Online-Hilfe zu MP3tag.

Vielen Dank für diese Anleitung DetlevD! Ich habe mein Sammlung jahrelang aufgebaut und habe nach genau so einer einfachen Möglichkeit gesucht, die Tags automatisiert abzuändern. Ich habe deinen Code testweise auf ein paar hundert Audiodateien angewendet und es hat super funktioniert. Nochmals Danke für deine tolle Arbeit!

Einziger kleiner Schönheitsfehler den ich gefunden habe taucht bei folgender Konstellation auf:
Ausgangs-Tagfeld ARTIST: Artist feat. Featartist (FeatartistGruppenName)
Ergebnis Tagfeld TITLE: Title (feat. Featartist (FeatartistGruppenName)

Hier müssten am Schluss des Titletags strenggenommen zwei Klammern stehen, also: Title (feat. Featartist (FeatartistGruppenName))

Ist aber nur ein Detail, jedoch kennst du evtl. gleich eine einfache Lösung :wink:


Nach dem erfolgreichen Um-Taggen würde ich dann noch die Dateinamen automatisiert umbenennen lassen. Dieser Schritt muss man einzeln in einem weiteren Schritt ausführen und kann nicht als Aktion angereiht werden oder?

Ausserdem erhalte ich dann bei sehr langen Dateinamen (z.B. bei vielen Feature-Artists) eine Fehlermeldung. Könnte man in diesen Fällen z.B. statt dem Dateinamen Artist - Title (feat. Featartist1, Featartist2 ...) folgendes generieren lassen: Artist - Title (feat. VA)

Na ja, das ist nicht nur ein Detail, sondern ein anderer Fall, aber doch ähnlich.
Vielleicht passt das ...

%TITLE%' '$regexp(%ARTIST%,'^(.+?)\s+[[({]?(?:ft\.?|feat\.?|featuring)\s+([^][(){}]+)[])}]?(\s+.+)?$','(feat. $2$3)=====$1',1)

Aktion: "Tag-Feld formatieren"
Feld: _FILENAME
Formatstring: ' ... wie du willst ... '

Du kannst ein Hilfs-Tagfeld einrichten und dort die Länge messen ...

TMP_FEAT <== '(feat. Featartist1, Featartist2, Featartist3, Featartist4)' TMP_FEAT <== $iflonger(%TMP_FEAT%,30,$left(%TMP_FEAT%,30),%TMP_FEAT%) ... oder ... TMP_FEAT <== $iflonger(%TMP_FEAT%,30,'(feat. VA)',%TMP_FEAT%)

... und das Ergebnis einbauen in den Ausdruck für den Dateinamen.

DD.20140822.1935.CEST

Danke vielmals! Das funktioniert einwandfrei, perfekt :slight_smile:

das geht gut. ich hatte vorher eins, dass hat immer den interpreten in den titel geschrieben. nur wenn er einen interpreten mit feat. gefunden hat, dann hat der den richtig in den titel geschrieben.

Aber 1 hätte ich noch, wenn das feat. dann in klammern (.) gesetzt würde, wäre es top.

danke

EDIT:

Sorry, das was ich suche wird in Beitrag #26 final geklärt. Sorry fürs exhumieren.