Ben Zotto
Ben Zotto

Reputation: 70998

iTunes AppleScript: query all playlists that contain a certain track

Working on a complex AppleScript for iTunes. One task is to accumulate a list of all playlists which contain a given track. I have this track object from somewhere else (a selection or whatever).

Currently, I've got a snippet something like this:

on containingPlaylists(theTrack)
    tell application "iTunes"
        set librarySource to the source named "Library"
        set candidateLists to every user playlist in librarySource
        set candidateId to (get id of theTrack)
        set matchLists to {}
        repeat with candidateList in candidateLists
                set matchTracks to (file tracks in candidateList whose id = candidateId)
                if (count of matchTracks) > 0 then
                        copy candidateList to end of matchLists
                end if
        end repeat
        return matchLists
    end tell
end containingPlaylists

This works but requires one Apple Event per playlist in the loop, which is expensive (perf) and throws away the intermediate results. What I'd RATHER do is something all in one query:

set matchLists to every playlist in librarySource whose file tracks contain theTrack 

But this of course doesn't work (the particular error is "Handler only handles single objects." but not sure if that's insightful). I'm really just not sure if the language/app supports a query like this.

Can anyone confirm/deny/offer any insight? Thanks!

Upvotes: 0

Views: 1950

Answers (2)

jackjr300
jackjr300

Reputation: 7191

You can use this (work on iTunes 11 and 12):

tell application "iTunes"
    set theTrack to item 1 of (get selection)
    return user playlists of theTrack
end tell

Updated --

In the AppleScript dictionary:

artwork n [inh. item] : a piece of art within a track | elements : contained by tracks. So artworks of thisTrack works

track n [inh. item] : playable audio source | elements : contains artworks; contained by playlists. So playlists of thisTrack works, you can use user playlists of thisTrack

In iTunes.h (ObjC scripting bridge):

@interface iTunesTrack : iTunesItem - (SBElementArray *) artworks; it's not possible because playlists is not in the SBElementArray's list.

But I do not know why there is a difference between the AppleScript dictionary and the iTunes.h file.

Upvotes: 3

CRGreen
CRGreen

Reputation: 3444

I too wish a whose clause like that could be used. But alas. Someone else might come up with a better plan, but I'm pretty sure this is how I would find the playlists containing the selected track (it may be the most efficient):

set persisID to persistent ID of selection
set pp to playlists
set playListsWithIt to {}
repeat with p in pp
    set tt to (tracks of p whose persistent ID is persisID)
    if tt ≠ {} then set playListsWithIt to (playListsWithIt & (id of p))
end repeat

Then I can use those IDs for the next step. This includes, of course, playlists like "Recently Added", which may or may not be what you want; you'd have to put another step in there to 'filter' out such a result.

Upvotes: 1

Related Questions