Zweites Skript: MP3 Dateien automatisch einsortieren

Hilfe zu verschiedenen Themen
Antworten
Benutzeravatar
Maui
Beiträge: 50
Registriert: 3. Dez 2021 08:08
Betriebssystem: Windows 10 Pro
DOpus Version: 13

Zweites Skript: MP3 Dateien automatisch einsortieren

Beitrag von Maui »

Hi, anbei habe ich mein zweites Skript geschrieben welches MP3 Dateien im linken Lister in eine Dateistruktur verschieben soll.

Code: Alles auswählen

A
   AHA
      AHA-Album
B
C
...
Das habe ich bereit mit Java programmiert und versuche es mal mit DO.

Code: Alles auswählen

function OnClick(clickData) {
    var cmd = clickData.func.command;
    cmd.deselect = false;

    var quelleListe = clickData.func.sourcetab.left_files; // Linker Lister
    var zielLister = clickData.func.desttab; // Rechter Lsiter

	DOpus.Output("Anzahl ausgewählter Dateien im linken Lister: " + quelleListe.count);

    if (quelleListe.count > 0) {
        for (var i = 0; i < quelleListe.count; i++) {
            var datei = quelleListe(i);
            var interpreter = datei.metadata.interpreter;
            var album = datei.metadata.album || ""; // Wenn kein Album vorhanden ist, verwenden Sie einen leeren String

            if (interpreter) {
                var erstebene = interpreter.charAt(0).toUpperCase(); // Erster Buchstabe des Interpreters für die erste Ebene
                var zweiteebene = interpreter; // Name des Interpreters für die zweite Ebene
                var dritteebene = album; // Album für die dritte Ebene oder leerer String

                // Setzen Sie den Dateipfad im Ziel-Lister
                var zieldateipfad = zielLister.path + "\\" + erstebene + "\\" + zweiteebene + "\\" + dritteebene;
                datei.move(zieldateipfad);
            }
        }
    } else {
        DOpus.Output("Keine Dateien im linken Lister ausgewählt.");
    }
}
Leider bekomme ich immer die Meldung
11.01.2024 12:06 Fehler in Zeile 8, Position 2
11.01.2024 12:06 'count' ist Null oder kein Objekt (0x800a138f)

Scheinbar enthält "quelleListe" keine Objekte ?
Selbst wenn keine Objekte entahlten sein soll würde das bedeuten das keine Dateien selektiert wurde.
Es sollte dann eigentlich keine Fehlermeldung geben und einfach das Skript beenden.

Jedenfalls ist mir nicht klar warum trotz Selektierte Objekte
clickData.func.sourcetab.left_files
Keine Objekte zurück gibt?

Über Hilfe würde ich mich sehr freuen.
Vielen Dank
Benutzeravatar
Maui
Beiträge: 50
Registriert: 3. Dez 2021 08:08
Betriebssystem: Windows 10 Pro
DOpus Version: 13

Re: Zweites Skript: MP3 Dateien automatisch einsortieren

Beitrag von Maui »

Ich habe den Code überarbeitet und soweit funktioniert die Übernahme der ausgewählten Dateien.
Leider bekomme ich es noch nicht hin die Metadaten aus der Audiodatei zu entnehmen.

In der DO Referenz habe ich zwar Informationen über Audio und Metadaten gesehen aber ich
habe keine Syntax gesehen, wie das wirklich eingesetzt wird und habe nach Gefühl den Code geschrieben.
Leider gibt es schon einen Fehler in der Zeile "var audioDaten ="

Code: Alles auswählen

function OnClick(clickData) {
    var cmd = clickData.func.command;
    cmd.deselect = false;

	var dateiListe = clickData.func.sourcetab.selected_files; // Linker Lister
    var zielLister = clickData.func.desttab; // Rechter Lister


	DOpus.Output("Anzahl der ausgewählten Elemente: " + dateiListe.count);

    if (dateiListe.count > 0) {
        for (var i = 0; i < dateiListe.count; i++) {
            var datei = dateiListe(i);

			// Metadata
			var metaDaten = DOpus.FSUtil.GetMetadata(datei);
			var audioDaten = DOPpus.Metadata.audio(metaDaten); 
			var interpreter = audioDaten.mp3artist;

			// Wenn kein Album vorhanden ist, leeren String verwenden
            var album = audioDaten.mp3album || ""; 

            if (interpreter) {
				// Erster Buchstabe des Interpreters für die erste Ebene
                var erstebene = interpreter.charAt(0).toUpperCase(); 

				// Name des Interpreters für die zweite Ebene
                var zweiteebene = interpreter; 

				// Album für die dritte Ebene oder leerer String
                var dritteebene = album; 

                // Setzen Sie den Dateipfad im Ziel-Lister
                var zieldateipfad = zielLister.path + "\\" + erstebene + "\\" + zweiteebene + "\\" + dritteebene;
                datei.move(zieldateipfad);
            }
        }
    } else {
        DOpus.Output("Keine Dateien im linken Lister ausgewählt.");
    }
}
Benutzeravatar
tbone
Supporter
Beiträge: 345
Registriert: 29. Okt 2021 00:45
Betriebssystem: Windows 10 Pro

Re: Zweites Skript: MP3 Dateien automatisch einsortieren

Beitrag von tbone »

Ich würde es mal so versuchen:

Code: Alles auswählen

var metadata = DOpus.FSUtil.GetMetadata(datei);
//test if audio metadata available in metadata
//https://docs.dopus.com/doku.php?id=reference:scripting_reference:scripting_objects:metadata
if ((metadata + "").indexOf("audio") != -1) { 
	var trackArtist = metadata.audio_text.mp3artist;
	DOpus.Output( "trackArtist: " + trackArtist );
}
Welche weiteren Audio.. usw. Properties es gibt (wie hier benutzt "mp3artist") kannst Du hier in der Referenz finden:
https://docs.dopus.com/doku.php?id=refe ... =mp3artist

Mit GetMetadata() holst Du Dir mehr oder weniger erstmal ein Metadaten-GrundObjekt, wenn es ein AudioFile ist, sind zwei weitere Unterobjekte vom Typ "AudioMeta" in diesem Objekt verfügbar, einmal mit Namen "audio" und einmal als "audio_text", letztes liefert nur Strings.

Ob überhaupt Audiodaten in "metadata" verfügbar sind, prüfe ich wie oben gezeigt über:

Code: Alles auswählen

if ((metadata + "").indexOf("audio") != -1)..
Dieser Ausdruck erzwingt ein toString() des Metadata Objekts, indem ich das Objekt mit einem Leerstring addiere. In Klammern gesetzt ergibt das dann ein reguläres String-Objekt. An diesem "Klammer-String", rufe ich dann die String-übliche indexOf() Methode auf, um den zurückgegeben Wert auszuwerten. Gibt das Teil einen String mit "audio" zurück, dann kann man gefahrlos auf ".audio_text" zugreifen, weil Audio-Metadaten vorhanden sind.

Code: Alles auswählen

(metadata + "")
Das ist leider richtig schlecht gemacht von den DO Entwicklern, ein einfaches String property ".metadata_types" wäre wesentlich eleganter, als hier das Objekt zwanghaft in einen String zu wandeln, um dann darüber die Verfügbarkeit der Unter-Metadaten Objekte festzustellen. Manchmal denke ich, die rauchen komische Sachen! o)
Antworten