2014-12-11 60 views
0

處理複雜的AppleScript for iTunes。一個任務是累積包含給定軌道的所有播放列表的列表。我從別的地方找到了這個軌道對象(選擇或其他)。iTunes AppleScript:查詢包含特定曲目的所有播放列表

目前,我有一個片段是這樣的:

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 

這工作,但需要在循環,這是昂貴的(PERF)每個播放列表一個蘋果事件和扔掉的中間結果。我寧願做的是所有的東西在一個查詢:

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

但這當然不工作(特定的錯誤是「處理程序只能處理單個對象。」但不知道這是有見地)。我真的不確定語言/應用是否支持這樣的查詢。

任何人都可以確認/否認/提供任何見解?謝謝!

+0

您的單行查詢的邏輯錯誤:您需要使用'數據庫ID爲'來檢查兩個軌道引用的數據是否相同。雖然結構上沒問題;只是iTunes腳本模型在處理更復雜的查詢方面陳舊而粗糙,並且有點廢話。不過,我不會擔心發送幾十個AE,因爲這沒什麼;它發送成千上萬的AE費用時。如果你不需要軌道引用列表,可以使用'exist'而不是'get'來減少工作量,但是當解決對大型庫(50K +軌道?)的查詢時,iTunes的性能將會持續高漲。 – foo 2014-12-12 15:34:16

+0

@foo:謝謝。你能幫我構建一個這樣的查詢嗎? (在這種情況下,簡單地替換「track的數據庫ID」具有相同的問題。)我正在查找包含該軌道的播放列表的列表(不需要軌道引用,只是列表引用) 。我正在構建一個龐大的批處理作業,AE的開銷會很大,我很樂意儘可能地避免它。再次感謝! – 2014-12-12 18:43:07

+1

我試過了,但是iTunes每次都有胡塗;正如我所說,它解決多項目說明的能力很差。爲了最大限度地減少自動曝光負荷,您可以使用「告訴應用程序」iTunes來獲取每個軌道的{數據庫ID,容器ID},這會爲您提供所有軌道的數據ID以及包含它們的播放列表的ID。使用'NS [Counted] Set'魔法可以有效消除重複的數據庫ID,使用'NSDictionary'將它們映射到播放列表ID,然後使用另一個'NSSet'來搖出重複的ID,最後生成新的'playlist id '參考還剩下什麼。 – foo 2014-12-13 23:51:34

回答

2

你可以(在iTunes的和12工作)使用。項目]:軌道內的一件藝術品 元素:包含在軌道。所以artworks of thisTrack作品

track n [inh。項目]:可播放的音頻源| 元素:包含藝術作品;包含在播放列表中。所以playlists of thisTrack的作品,你可以使用user playlists of thisTrack

iTunes.h(ObjC腳本橋):

@interface iTunesTrack:iTunesItem - (SBElementArray *)的作品; 這是不可能的,因爲播放列表不在SBElementArray列表中。

但我不知道爲什麼AppleScript字典和iTunes.h文件之間存在差異。

+0

太棒了,謝謝!這似乎沒有出現在詞典中 - 您是否通過在界面上進行系統刺激的有用共享方式發現了這一點? (因爲它不在字典中,我也無法通過ObjC腳本橋接到它,或者不認爲我可以。是否有更好的字典文件在某處?) – 2014-12-30 01:58:27

+0

我更新了我的答案。 – jackjr300 2014-12-30 16:36:21

1

我也希望可以使用這樣的條款。可惜。其他人可能拿出一個更好的計劃,但我敢肯定這是我如何才能找到包含所選曲目播放列表(也可能是最有效的):

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 

然後我就可以使用這些ID爲下一步。當然,這包括播放列表,如「最近添加」,這可能是也可能不是你想要的;你必須在那裏再進一步來'過濾'出這樣的結果。

藝術品N [INH: -

的AppleScript字典

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

更新時間:

+1

謝謝。這看起來是相同的執行大綱 - 在播放列表的數量上往返O(n)。我會在你的語法中竊取一些我不知道的技巧。 – 2014-12-11 17:05:28

+2

注意:如果您想爲iTunes資料庫中的每個單一曲目對象設定一個唯一標識符,永遠不會改變庫的使用期限,請使用'persistent ID'。如果您想確定哪些軌道對象指向相同的曲調,請使用'數據庫ID'。如果您想要某些可用於構建新的ID參考的內容,請使用'id'。 '播放列表ID '。 – foo 2014-12-14 00:05:00

+0

此外,改變你的重複循環使用'if exists(其數據庫ID是dbID的p的軌跡),然後將playListsWithIt的結尾設置爲(p的id)'。這應該更有效率。如果你不想讓結果列表包含重複的播放列表ID,那麼在條件測試中加入'和id的p不在playListsWithIt'中。 – foo 2014-12-14 00:11:20

相關問題