2012-10-19 61 views
5

我學會了如何在上一個問題中創建播放列表,但現在我無法弄清楚如何添加曲目。現在,我有:如何使用Python和Scripting Bridge將曲目添加到iTunes播放列表

tracks.sort(key=lambda tup: tup[0]) 
i = 0 
for trackList in generatePlaylists(tracks,10): 
    i += 1 
    playlistname = str(i) 
    p = {'name': playlistname} 
    playlist = iTunes.classForScriptingClass_("playlist").alloc().initWithProperties_(p) 
    iTunes.sources()[0].playlists().insertObject_atIndex_(playlist, 0) 

    # Find the playlist I just made 
    for playlist in iTunes.sources()[0].playlists(): 
     if playlist.name() == playlistname: 
      newPlaylist = playlist 

    # Add the tracks to it 
    for track in trackList: 
     print track[1].name() 
     iTunes.add_to_(track[1],newPlaylist) 

我的軌道是在元組tracks,其中元組的第一個元素是一個分數,第二個是實際跟蹤對象的列表。 generatePlaylists是一個將所有庫軌道分割成10個列表的迭代器。

上述代碼無誤地運行,但在iTunes中播放列表爲空。

回答

7

首先,這裏的答案很簡單:

track.duplicateTo_(newPlaylist) 

的問題是,iTunes.add_to_發送add命令,這需要一個文件(化名)和進口它變成一個播放列表;你想發送duplicate命令,該命令接受任何對象並製作另一個對象副本。你沒有文件,你有一個軌道。 (你可以得到通過track.location()一個文件,但你不想重新導入文件,剛過複製的軌道。)

而且,在這種情況下,你需要調用該方法在賽道上,而比在應用程序上調用它並傳遞它的軌道。

如果沒有對iTunes對象模型(以及它下面的AE模型)的深入理解,上半部分很難解釋。但你並不需要理解它。在大多數情況下,通過查看iTunes腳本字典(在AppleScript編輯器中)和試用錯誤(在AppleScript編輯器或py-appscript中),您可以找出想要的內容。 (只要確保你正在使用廢料庫或備份...)在這種情況下,它可能的唯一命令是add,copy,duplicatemove,所以只需嘗試一下,看看他們做了什麼。或者,也可以選擇dougscripts並下載一大堆樣本,找到一個可以做你想做的事情。

第二部分,弄清楚如何翻譯爲ScriptingBridge ......好吧,我不能解釋它沒有進入SB的長篇大論(如果你想讀一篇,它會比我更好) 。但基本的是這樣的:就iTunes而言,duplicate是一個命令。如果你給它一個直接的對象(tell application "iTunes" to duplicate theTrack to thePlaylist)它會使用它;如果不是這樣,你就要求該主題自行復制(tell theTrack to duplicate to thePlaylist)。它和英語完全一樣。但SB堅持面向對象的模型,其中duplicate是一些對象的方法。所以,這兩種形式中只有一種會起作用。一般來說,你可以通過查看dir(iTunes)dir(track)來查看哪一個有一個看起來像你想要的命令的方法。

從上面可以看出,如果你想做任何複雜的事情,你就會面臨很多試驗和錯誤。祝你好運,並不斷問。

PS,我不知道爲什麼你的代碼默默地失敗。 add_to_方法應該轉化爲命令的明顯方式應該會引起-1708錯誤(因爲appscript iTunes.add(track, to=newPlaylist)或AppleScript add theTrack to newPlaylist都可以......)。

+0

他們應該給你一個組合答案獎金!謝謝。 'iTunes.add_to_'是一條紅色的鯡魚,我沒有想到要去別的地方看,但現在你解釋它,這是有道理的。 – abroekhof

相關問題