Cómo agregar una pista a una lista de reproducción de iTunes usando Python y Scripting Bridge

Aprendí cómo crear una lista de reproducción en una pregunta anterior, pero ahora no puedo averiguar cómo agregarle pistas. Ahora mismo tengo:

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) 

Mis pistas están en una lista de tracks de tuplas, donde el primer elemento de la tupla es una puntuación y el segundo es el objeto de pista real. generatePlaylists es un iterador que divide todas las pistas de la biblioteca en 10 listas.

El código anterior se ejecuta sin errores, pero en iTunes las listas de reproducción están vacías.

Primero, aquí está la respuesta corta:

 track.duplicateTo_(newPlaylist) 

El problema es que iTunes.add_to_ envía el comando add , que toma un archivo (alias) y lo importa a una lista de reproducción; desea enviar el comando duplicate , que toma cualquier objeto y hace otra copia del objeto. No tienes un archivo, tienes una pista. (Puede obtener un archivo a través de track.location() , pero no desea volver a importar el archivo, solo copie la pista).

Además, en este caso, debe llamar al método en la pista, en lugar de llamarlo a la aplicación y pasarle la pista.

La primera mitad de esto es difícil de explicar sin una comprensión sólida del modelo de objetos de iTunes (y el modelo AE debajo de él). Pero realmente no necesitas entenderlo. En la mayoría de los casos, revisando el diccionario de secuencias de comandos de iTunes (en el Editor de AppleScript) y el método de prueba y error (en el Editor de AppleScript o con py-appscript), puede averiguar lo que desea. (Solo asegúrese de que está trabajando en una biblioteca de chatarra, o tenga una copia de seguridad …) En este caso, los únicos comandos que podrían ser add , copy , duplicate o move , así que inténtelos todos y vea qué hacen. . O, alternativamente, vaya a los dougscripts y descargue un montón de muestras y encuentre una que haga lo que usted quiere.

En la segunda mitad de esto, descubrir cómo traducirlo a ScriptingBridge … bueno, no puedo explicarlo sin tener una perorata larga en SB (lo que ha hecho mucho mejor que yo, si quieres leer uno). Pero lo básico es esto: en lo que respecta a iTunes, duplicate es un comando. Si le das un objeto directo ( tell application "iTunes" to duplicate theTrack to thePlaylist ) lo usará; si no, le estás pidiendo al sujeto que se duplique ( tell theTrack to duplicate to thePlaylist ). Funciona exactamente igual que el inglés. Pero SB insiste en un modelo orientado a objetos, donde duplicate es un método en algún objeto. Entonces, solo una de esas dos formas va a funcionar. En general, puede averiguar qué solo mirando dir(iTunes) y dir(track) para ver cuál tiene un método que se parece al comando que desea.

Como se puede ver en lo que antecede, tiene muchas pruebas y errores por delante si está tratando de hacer algo complicado. Buena suerte, y sigue preguntando.

PS, no tengo idea de por qué su código falla silenciosamente. La forma obvia en que el método add_to_ debería traducirse en un comando debería generar un error -1708 (como appscript iTunes.add(track, to=newPlaylist) o AppleScript add theTrack to newPlaylist ambos…).