2012-10-19 12 views
5

Ho imparato a creare una playlist in una domanda precedente, ma ora non riesco a capire come aggiungere tracce ad essa. In questo momento ho:Come aggiungere una traccia a una playlist di iTunes usando Python e Scripting Bridge

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) 

mie tracce sono in una lista di tuple tracks, dove il primo elemento della tupla è un punteggio e il secondo è l'oggetto pista vera e propria. generatePlaylists è un iteratore che divide tutte le tracce della libreria in 10 elenchi.

Il codice sopra riportato funziona senza errori, ma in iTunes le playlist sono vuote.

risposta

7

In primo luogo, ecco la risposta breve:

track.duplicateTo_(newPlaylist) 

Il problema è che iTunes.add_to_ invia il comando add, che prende un file (alias) e li importa in una playlist; si desidera inviare il comando duplicate, che accetta qualsiasi oggetto e crea un'altra copia dell'oggetto. Non hai un file, hai una traccia. (È possibile ottenere un file tramite track.location(), ma non si vuole reimportare il file, basta copiare il brano.)

Inoltre, in questo caso, è necessario chiamare il metodo sulla traccia, piuttosto piuttosto che chiamarlo sull'app e passare la traccia.

La prima metà di questo è difficile da spiegare senza una solida conoscenza del modello a oggetti di iTunes (e del modello di AE al di sotto di esso). Ma non hai davvero bisogno di capirlo. Nella maggior parte dei casi, esaminando il dizionario di scripting di iTunes (in AppleScript Editor) e facendo tentativi ed errori (in AppleScript Editor o con py-appscript) puoi capire che cosa vuoi. (Assicurati di lavorare su una libreria di scarti, o di avere un backup ...) In questo caso, gli unici comandi che potrebbero essere sono add, copy, duplicate, o move, quindi basta provarli tutti e vedere cosa fanno . Oppure, in alternativa, vai su dougscripts e scarica un mucchio di campioni e trova quello che fa ciò che vuoi.

La seconda metà di questo, capire come tradurre in ScriptingBridge ... beh, non posso spiegarlo senza andare a lungo in SB (che ha molto meglio di me, se vuoi leggerne uno) . Ma le basi sono queste: per quanto riguarda iTunes, duplicate è un comando. Se gli dai un oggetto diretto (tell application "iTunes" to duplicate theTrack to thePlaylist) lo userà; in caso contrario, stai chiedendo all'argomento di duplicare se stesso (tell theTrack to duplicate to thePlaylist). Funziona esattamente come l'inglese. Ma SB insiste su un modello orientato agli oggetti, dove duplicate è un metodo su alcuni oggetti. Quindi, solo una di queste due forme funzionerà. In generale, è possibile capire quale, semplicemente guardando dir(iTunes) e dir(track) per vedere quale ha un metodo che assomiglia al comando desiderato.

Come puoi vedere da quanto sopra, hai molte prove ed errori davanti a te se stai cercando di fare qualcosa di complicato. Buona fortuna e continua a chiedere.

PS, non ho idea del perché il codice non funzioni in modo silenzioso. Il modo ovvio con cui il metodo add_to_ dovrebbe tradursi in un comando dovrebbe generare un errore -1708 (come appscript iTunes.add(track, to=newPlaylist) o AppleScript add theTrack to newPlaylist entrambi ...).

+0

Dovrebbero darti un bonus per le risposte combo! Grazie. 'iTunes.add_to_' era un'aringa rossa, non pensavo di guardare altrove ma ora che lo spieghi, ha senso. – abroekhof

Problemi correlati