iTunes Parent für alle Playlists ermitteln (Performance)

Drive4711

Neues Mitglied
Thread Starter
Dabei seit
18.05.2014
Beiträge
9
Reaktionspunkte
0
Guten Tag,

ich versuche verzweifelt eine Möglichkeit zu finden, um den Parent von iTunes Playlists schneller zu ermitteln.
Anbei mein Skript, was aber bei einer Playlist-Anzahl > 1000 zwischen 30-60 Sekunden dauern kann.

AppleScript:
tell application "iTunes" to run
tell application "iTunes"
    set plData to {}
    set allLists to the name of every playlist
    repeat with plName in allLists
        set plParent to ""
        try
            set plParent to the name of parent of playlist plName
        end try
        copy ({plName as text, plParent as text}) to the end of the |plData|
    end repeat
end tell
get plData

Meine Hoffnung lag in etwa solch einem Befehl, was leider nicht funktioniert, bzw. ich finde einfach keine Möglichkeit direkt alle Parents zu allen Playlists zu ermitteln.
AppleScript:
set allLists to the {name, parent} of every playlist

Parent ist kein Textobjekt, das ist mir klar, sondern ein Playlist Objekt.
Aber auch so etwas klappt nicht:
AppleScript:
set allLists to the {name, name of parent} of every playlist
AppleScript:
set allLists to the {name, (name of parent)} of every playlist


Vielleicht hat ja jemand eine tolle Idee, um den Parent von allen Playlists möglichst schnell zu ermitteln.

Vielen Dank.
Leon
 
evtl. gibt es ja keine parents, siehe:
AppleScript:
tell application "iTunes"
    set pl_all to every playlist
    repeat with pl in pl_all
        try
            get properties of pl
            get name of pl
            if (exists container of pl) then
                get name of container of pl
            end if
            if (exists parent of pl) then
                get name of parent of pl
            end if
        end try
    end repeat
end tell
was soll dir parent denn ausgeben?
 
Hallo Olivetti,
erstmal vielen Dank für die Antwort.

Bin mir nicht sicher, ob wir uns missverstehen. Also mein Skript funktioniert schon. Für Playlists, die keinen Parent haben läuft der Versuch bei try endtry in einen Fehler, weil es keinen Vorgänger gibt und plParent bleibt entsprechend "".
Und für alle anderen Playlists, die einen Parent haben, kommt der entsprechende Parent Name zurück.

Beispiel:
Musik
MeinOrdner
Playlist1
Playlist2​
Zuletzt hinzugefügt

Ergebnis:
Musik -> ""
MeinOrdner-> ""
Playlist1 -> "MeinOrdner"
Playlist2 -> "MeinOrdner"
Zuletzt hinzugefügt -> ""


Meine Intension bei dem Post hier ist eher, dass der REPEAT über alle Playlists mit den vielen "Einzelabfragen" für Parent so lange dauert.
Aber natürlich auch nur dann, wenn es wirklich sehr viele Playlists (> 1000) gibt.

Deshalb wollte ich möglichst versuchen, gleich sämtliche Parents (im Beispiel "" und "MeinOrdner") für alle Playlists direkt zu ermitteln, so wie das für die Playlistnamen ja auch funktioniert.
Ein einziger Befehl holt hier ja sofort eine Liste an Playlistnamen, d.h. es ist kein REPEAT notwendig.
AppleScript:
set allLists to the name of every playlist

Oder als weiteres Beispiel, gleich eine Liste mit allen Namen und Ausprägung Special Kind:
AppleScript:
set allLists to the {name, special kind} of every playlist

Ich hätte halt so etwas auch für Parent irgendwie erhofft.

Leon
 
Bin mir nicht sicher, ob wir uns missverstehen.
deswegen ja die nachfrage. :p

nein, du kannst nur klassen mit every abfragen, die auch die property enthalten und parent ist halt nicht überall dabei.
(wobei mir das jetzt selber nicht so ganz einleuchtet, aber anders kenne ich es auch nicht)
 
Was ist denn parent?
Der übergeordnete Ordner?
 
siehe abschnitt "Ergebnis" in #3.
 
Oder wer kennt sich denn gut mit Multithreading in Applescript aus? Mein Skript müsste sich ja theoretisch innerhalb des REPEATs auf Multithreading (NSThread) umstellen lassen. Hat hier zufällig jemand Erfahrung?

Also dieses Skript:

AppleScript:
tell application "iTunes" to run
tell application "iTunes"
    set plData to {}
    set allLists to the name of every playlist
    repeat with plName in allLists
        set plParent to ""
        try
            set plParent to the name of parent of playlist plName
        end try
        copy ({plName as text, plParent as text}) to the end of the |plData|
    end repeat
end tell
get plData
 
Hey @little_pixel ,
danke für den Hinweis, aber das gilt nur ab MacOS 10.13 (Sierra). D.h. für alle älteren OS wird das nicht laufen. Brauche auch eine gewisse Kompatibilität :) Und das Thema Signieren spielt dann auch eine Rolle.
Schwierig.
 
Hab das spaßeshalber trotzdem mal in ASObjC umgeschrieben. Eine richtig schnelle Ausführung scheint aber offenbar nur in Objective C gegeben (500 Wiedergabelisten – in beiden Fenstern im Prinzip der gleiche Code ausgeführt). Wenn würde ich es also wahrscheinlich auch direkt in letzterem machen. Oder man muss es einfach noch intelligenter schreiben. Wobei ASObjC da ja auch nur eingeschränkte Möglichkeiten bietet. In purem AppleScript hätte ich jetzt auch keine andere Idee.

AppleScript:
use AppleScript version "2.5"
use framework "Foundation"
use scripting additions
use framework "iTunesLibrary"

property ITLibrary : a reference to current application's ITLibrary
property NSMutableArray : a reference to current application's NSMutableArray
property NSPredicate : a reference to current application's NSPredicate

set {library, err} to (ITLibrary's libraryWithAPIVersion:"1.0" |error|:(reference))
set playlistsWithParent to NSMutableArray's arrayWithCapacity:1000
set parentIDExists to NSPredicate's predicateWithFormat:"parentID != nil"

if not missing value is library then
    set allPlaylists to allPlaylists of library
  
    repeat with aPlaylist in (allPlaylists's filteredArrayUsingPredicate:parentIDExists)
        set nameOfPlaylist to |name| of aPlaylist
        set parentID to parentID of aPlaylist
      
        set playlistIsParent to NSPredicate's predicateWithFormat_(("persistentID == %@"), parentID)
        set nameOfParentPlaylist to |name| of (allPlaylists's filteredArrayUsingPredicate:playlistIsParent)'s firstObject()
      
        tell playlistsWithParent to addObject:{nameOfPlaylist, nameOfParentPlaylist}
    end repeat
end if

get playlistsWithParent as list
 
Toll, dass Du Dir die Mühe gemacht hast!

Viele Grüße
 
@kermitd Vielen Dank für die Mühe. Leider ist das keine Alternative für mich :(

Ich habe jetzt anderweitig versucht die AppleScript Kommandos einzeln per Multithreading abzusetzen.
Sprich eine Anwendung startet bis zu 10 AppleScripts parallel (ein AppleScript holt sozusagen einen Parent zu einer einzigen Playlist).
Nur leider scheint das nicht wirklich mit AppleScript kompatibel zu sein, denn es dauert abhängig von der Anzahl an Listen sogar länger, im Vergleich zu den Einzelläufen (Skripte einzeln nacheinander).
Beispielsweise für 100 Playlists dauert die Einzelverarbeitung rund 9-10 Sekunden. Per 10 Threads parallel dauert es auch 10 Sekunden. Per 2 Threads sogar 11 Sekunden. Bei 50 Threads merkt man, dass AppleScript das nicht mehr bedienen kann, weil innerhalb 1 Sekunde nicht alle Antworten kommen.
 
Zurück
Oben Unten