Große Bibliothek, "feat." automatisch in Feld "performer" einfügen?

Begonnen von IWSNX, 20. Dezember 2019, 20:05:22

Vorheriges Thema - Nächstes Thema

IWSNX

Hallo zusammen,

mein vorheriges Problem wurde bereits gelöst, führt nun aber zu einem "größeren" Problem.
Kurze Schilderung:

Ich habe seit Anbeginn meiner Musiksammlung, mittlerweile über 500GB, Features immer mit folgendem Schema bearbeitet.

Titelname (feat. Artist XY)


Mit der Zeit ändern sich leider auch die Präferenzen und heute finde ich dieses Muster ziemlich doof. Für mich hat eigentlich der Künstlername eines Features nichts mehr in dem Titelfeld zu suchen.
Um das zu Ändern, per Hand, würde ich allerdings Monate brauchen, ist mir dann doch zu viel Aufwand.

Mein Wunsch ist, dass die Features nun immer in das Feld "Performer" kommen oder ich mach ein neues Feld "Feature", dass ist aber erstmal eher sekundär.

Meine Frage wäre, gibt es ein Programm, Code, welches automatisch den Teil im "Titelfeld" erkennt, wenn "(feat. XY)" eingetragen wurde und das dann in das Feld "Performer" packt. Wahrscheinlich eher nicht?  :)

Bilder bisher:

2019-12-20_195235.png
2019-12-20_195421.png

Wünschenswert wäre dann folgende Änderung:


https://i.imgur.com/D5mxO7w.png

fbuser

Doch, grundsätzlich geht das. Die Lösung hängt aber davon ab, welche Variationen vorkommen können, wenn z.B. die folgenden Kombinationen möglich sind (abhängig auch von den Quellen von denen die Tags kommen, z.B. freedb, discocs, musicbrainz),

Titelname (Extended Version)(featuring Artist)
Titelname (ft. Artist)(Extended Version)
Titlename (feat Artist)
Titelname feat. Artist (Extended Version)

dann ist das ist das nicht mehr mit Titleformat-Ausdrücken möglich. Dann würdest du zumindest foo_sqlite oder mit ein bißchen Komfort auch noch foo_uie_sqlite_tree benötigen. Wenn sichergestellt ist, daß der Titel immer nur einen Klammerausdruck beinhaltet, der mit "(feat." beginnt, dann könnte man das noch mit einem Masstagger-Script erledigen. Kommen aber noch zusätzliche Leerzeichen ins Spiel z.B. wie hier "( feat.", dann wird es schon deutlich schwieriger. Für die Kombination foo_sqlite/foo_uie_sql_tree hätte ich eine Lösung, die ich auch selbst verwende. Die erfordert aber einen gewissen Konfigurations-Aufwand und ist auch nicht so ohne weiteres nachvollziehbar, wenn man keine Erfahrung mit regulären Ausdrücken hat.

Wenn du mit einer relativ einfachen Masstagger nicht hinkommst, könnte ich bei Interesse meine Lösung hier einstellen. Es würde aber etwas dauern.

IWSNX

Danke für die schnelle Antwort!

Also von den Befehlen und Möglichkeiten habe ich eher wenig, bis keine Ahnung.

Zitat von: fbuser in 20. Dezember 2019, 22:23:41Doch, grundsätzlich geht das. Die Lösung hängt aber davon ab, welche Variationen vorkommen können, wenn z.B. die folgenden Kombinationen möglich sind (abhängig auch von den Quellen von denen die Tags kommen, z.B. freedb, discocs, musicbrainz).

Heißt das, du würdest bei deiner Vorgehensweise online oder offline arbeiten?
Also würdest du bei der Neueinschreibung mit dem Zugriff auf Online-Datenbanken arbeiten oder eben offline per commands nur auf die Bibliothek zugreifen?

PS: Den Masstagger habe ich jetzt mal installiert, verstehe die Basics, aber nicht mehr.

Ich habe in meiner Bibliothek keine automatisches Tagging aus Online-Datenbanken benutzt, sondern wirklich per Hand das Meiste korrigiert.

Schema ist immer:
1 Feat. = Titel (feat. Artist A)
2 Feat. = Titel (feat. Artist A & Artist B)
3 Feat. = Titel (feat. Artist A, Artist B & Artist C)
etc.

Eine "offline"-Methode wäre mir deutlich lieber, die Dateien perfekt getaggt sind und eben nur das neue Problem besteht.

Also ich bin um jede Hilfe dankbar, dein Lösungsansatz würde mich doch sehr interessieren, auch wenn ich da am Anfang wahrscheinlich eher wenig verstehe!  ;)

fbuser

Zitat von: IWSNX in 21. Dezember 2019, 11:02:23Heißt das, du würdest bei deiner Vorgehensweise online oder offline arbeiten?
Nein, wenn du bereits alles sauber offline getaggt hast, dann solltest du nicht auf Online-Datenbanken zurückgreifen.

Ok, also nachfolgend meine Lösung, mit der Annahme, daß als Feld für den Featuring-Eintrag %featuring artist% verwendet wird. Soll dafür ein anderes Feld verwendet werden, müssen die unten rot markierten Stellen entsprechend angepaßt werden und im letzen Code-Block müssen die beiden Vorkommen des Ausdrucks "featuring artist" auch angepaßt werden(die Farbe kann innerhalb eines Code-Blocks nicht geändert werden), aber nicht der Ausdruck {featuring-artist}

Zunächst müssen foo_sqlite and foo_uie_sql_tree installiert werden, sofern dies noch nicht geschehen ist.

Dann muß das Feld %featuring artist% für foo_sqlite definiert werden:

- "Preferences -> SQLite viewer -> MediaLibrary table"
- Add...
- Name: featuring artist

Alles andere bleibt, wie es vorgegeben ist.

Der gleiche Vorgang muß auch für "Preferences -> SQLite viewer -> Playlist table" durchgeführt werden.

Der SQL Tree kann als Panel in DUI oder CUI eingebunden oder auch über "Library -> SQL tree" als DUI-Popup aufgerufen werden.

Im SQL Tree müssen insgesamt drei Queries (Context-Menu "New Query...") mit den folgenden Einstellungen (nur vom Standard abweichenden Einstellungen sind angegeben) angelegt werden:

1. Support tables

Main Tab:
  Label: Support tables
Action Tab:
  Click action: Execute SQL
Batch Tab:
DROP TABLE IF EXISTS Playlist_Updatable;
CREATE VIRTUAL TABLE Playlist_Updatable USING MetaDB_Module(no_multivalue_split,playlist);

DROP TABLE IF EXISTS RegularExpressions;
CREATE TABLE RegularExpressions
(
  name TEXT PRIMARY KEY,
  expression TEXT
);

INSERT INTO RegularExpressions
VALUES('Featuring','(?(DEFINE)'||
                     '(?<open-braces>[({\[])'||
                     '(?<close-braces>[)}\]])'||
                     '(?<no-braces>[^(){}\[\]])'||
                     '(?<content-1>(?i)f(ea)?t((\.\s*)|\s+))'||
                     '(?<content-2>(?i)featuring\s+)'||
                     '(?<content>\b(?&content-1)|(?&content-2))\b'||
                   ')'||
                  '(?:(?:\s*(?&open-braces)(?&no-braces)*)?|\s+)(?&content)(?<featuring-artist>(?&no-braces)+)(?:(?&close-braces)\s*)?');

Der angegebene Ausdruck deckt u.a. die von mir im letzten Posting genannten Variationen ab und findet gegebenfalls auch Tracks, die das Wort featuring oder die Abkürzung ft regulär enthalten.
Aber für deine Zwecke kann das INSERT-Statement für den regulären Ausdruck ohne die genannten Nebenwirkungen auch folgendermaßen vereinfacht werden:

INSERT INTO RegularExpressions
VALUES('Featuring','(?(DEFINE)'||
                     '(?<open-braces>[({\[])'||
                     '(?<close-braces>[)}\]])'||
                     '(?<no-braces>[^(){}\[\]])'||
                     '(?<content>(?i)feat\.\s+)'||
                   ')'||
                  '(?:(?:\s*(?&open-braces)(?&no-braces)*)|\s+)(?&content)(?<featuring-artist>(?&no-braces)+)(?:(?&close-braces)\s*)');

2. Find titles with featuring

Main Tab:
  Label: Find titles with featuring
Query Tab:
SELECT "%album artist%" "album artist",
       '['||date||']  '||album date,
       title
FROM MediaLibrary
WHERE regexp_search((SELECT expression FROM RegularExpressions WHERE name='Featuring'),title)
  AND regexp_search((SELECT expression FROM RegularExpressions WHERE name='Featuring'),unaccent(title))
ORDER BY "%album artist%",
         date,
         album,
         discnumber,
         tracknumber
Action Tab:
  Click action: Send to target playlist
  Playlist: SQL Tree
 
3. Fix featuring for titles

Main Tab:
  Label: Fix featuring for titles
Action Tab:
  Click action: Execute SQL
Batch Tab:
WITH RegularExpression AS (
  SELECT expression
  FROM RegularExpressions
  WHERE name='Featuring'
)
UPDATE Playlist_Updatable
SET "featuring artist"=regexp_replace((SELECT expression FROM RegularExpression),
                                      '$+{featuring-artist}',
                                      title,
                                      1),
     title=regexp_replace((SELECT expression FROM RegularExpression),
                           '',
                          title)
WHERE "featuring artist" IS NULL AND
       playlist_index=active_playlist() AND
       item_is_selected;

Danach müssen einmal die Support-Tables mit Klick auf den entsprechenden Tree-Knoten angelegt werden. Dies muß auch erfolgen, wenn nachträglich noch Änderungen an den Defintionen für die MediaLibrary-Table und die Playlist-Table vorgenommen werden.

Mit Klicks auf die anderen beiden Knoten kann man dann die betroffenen Tracks suchen und fixen. Die zu fixenden Tracks müssen dafür in der Playlist selektiert werden und es werden nur Tracks gefixed, die noch keinen Eintrag in %featuring artist% haben.


IWSNX

Erstmal vielen herzlichen Dank für deine Mühe!

Ich mach jetzt nochmal schnell eine Sicherung von meiner aktuellen Musikbibliothek und dann werde ich im Laufe des Tages deine Anleitung nutzen.

Ich melde mich dann wieder! ;)



Zitat von: fbuser in 21. Dezember 2019, 15:58:18Der angegebene Ausdruck deckt u.a. die von mir im letzten Posting genannten Variationen ab und findet gegebenfalls auch Tracks, die das Wort featuring oder die Abkürzung ft regulär enthalten.
Aber für deine Zwecke kann das INSERT-Statement für den regulären Ausdruck ohne die genannten Nebenwirkungen auch folgendermaßen vereinfacht werden:

INSERT INTO RegularExpressions
VALUES('Featuring','(?(DEFINE)'||
                    '(?<open-braces>[({\[])'||
                    '(?<close-braces>[)}\]])'||
                    '(?<no-braces>[^(){}\[\]])'||
                    '(?<content>(?i)feat\.\s+)'||
                  ')'||
                  '(?:(?:\s*(?&open-braces)(?&no-braces)*)|\s+)(?&content)(?<featuring-artist>(?&no-braces)+)(?:(?&close-braces)\s*)');

Bis dahin hat alles super funkioniert, ich habe die zitierte Variante eingefügt.




Zitat von: undefined2. Find titles with featuring

Main Tab:
  Label: Find titles with featuring
Query Tab:
SELECT "%album artist%" "album artist",
      '['||date||']  '||album date,
      title
FROM MediaLibrary
WHERE regexp_search((SELECT expression FROM RegularExpressions WHERE name='Featuring'),title)
  AND regexp_search((SELECT expression FROM RegularExpressions WHERE name='Featuring'),unaccent(title))
ORDER BY "%album artist%",
        date,
        album,
        discnumber,
        tracknumber
Action Tab:
  Click action: Send to target playlist
  Playlist: SQL Tree

Muss ich eine Playlist namens "SQL tree" erstellen, wahrscheinlich ja? Habe jetzt Eine erstellt und ausgewählt, es trifft folgende Fehlermeldung auf und ich kann es in der Form nicht abspeichern.
Ich gedulde mich mal und mach erstmal nicht weiter, bis deine Antwort kommt. :)

2019-12-22_104726.png2019-12-22_105636.png


https://i.imgur.com/1ycVRGD.png

fbuser

Zitat von: IWSNX in 22. Dezember 2019, 10:23:40Muss ich eine Playlist namens "SQL tree" erstellen, wahrscheinlich ja?
Nein, du kannst jede beliebige Playlist verwenden. Wenn es die Playlist noch nicht gibt, wird diese automatisch angelegt.

Zitat von: IWSNX in 22. Dezember 2019, 10:23:40es trifft folgende Fehlermeldung auf und ich kann es in der Form nicht abspeichern.
Richtig, da stimmt zum einen die Reihenfolge in der Anleitung nicht und außerdem hast du für den Support-Tables-Knoten zu wenig eingetragen.

Diesen Teil
DROP TABLE IF EXISTS Playlist_Updatable;
CREATE VIRTUAL TABLE Playlist_Updatable USING MetaDB_Module(no_multivalue_split,playlist);

DROP TABLE IF EXISTS RegularExpressions;
CREATE TABLE RegularExpressions
(
  name TEXT PRIMARY KEY,
  expression TEXT
);
mußt du vor das INSERT-Statement auch für die vereinfachte Lösung setzen.

Nachdem du den ersten Knoten für die Support-Tables angelegt, mußt du diesen auch gleich durch Klick ausführen, bevor du die weiteren Knoten anlegst. Dann sollte alles wie beschrieben funktionieren.

IWSNX

Schonmal vielen Dank bis hierhin, jetzt müsste die Einrichtung funktioniert haben, ich weiß auch nicht warum es teilweise den Code nicht komplett eingefügt hatte, aber es scheint ja jetzt zu funktionieren.

ich verstehe gerade erst die Funktion von SQL Tree, hatte mir die Prozedur anders vorgestellt, aber so wie ich das sehe, ist das super!

Mal in absoluter Laien-Sprache:

1. Also klicke ich jetzt auf "find titles with featuring", dann öffnet sich automatisch eine Playlist, in welcher alle gefundenen Titel mit einem Feature auftauchen, super!
2. Ich markiere alle Tracks die ich fixen möchte, dann klicke ich auf "fix featuring for titles" und die Anpassung findet statt.
3. Sorry, aber der Support-Knoten ist mir nicht verständlich, trotz deiner Erklärung, den soll ich immer genau wann anklicken?

fbuser

Zitat von: IWSNX in 22. Dezember 2019, 12:27:033. Sorry, aber der Support-Knoten ist mir nicht verständlich, trotz deiner Erklärung, den soll ich immer genau wann anklicken?
Für den normalen Betrieb gar nicht. Das wäre nur dann erforderlich, wenn du z.B. analog zu dem %featuring artist%-Feld weitere Felder für die MediaLibrary-Table oder Playlist-Table regristieren möchtest und diese auch entsprechend aktualisieren möchtest oder wenn du zusätzliche Reguläre Ausdrücke für andere Aufgaben hinzufügen möchtest.

IWSNX

Nochmal tausend Dank, du hast mir Arbeit von Wochen/Monaten erspart! ;)

Ich bin jetzt soweit durch und es hat perfekt funktioniert, wenn ich nochmal Fragen haben sollte, melde ich mich nochmal, aber es sieht sehr sehr gut aus.
Ich wünsche schöne Feiertage!

Von der Oberfläche habe ich es jetzt so eingerichtet, will es minimalistisch halten, siehe oben links in der Ecke:

2019-12-22_144410.png