Applescript para obtener el número de canción de un álbum de varios discos en iTunes?

1

Tengo un Applescript que informa el nombre de la canción que se reproduce actualmente, el álbum, el número de la canción y el número total de canciones en el álbum. Si el álbum proviene de un solo CD o si la canción proviene de un CD 1 de un álbum de varios CD, todo funciona y obtengo lo siguiente:

Song 2 of 30

Sin embargo, si el álbum proviene de un conjunto de varios CD, entonces el número de la canción es incorrecto para las canciones del CD 2, CD 3, etc. Aquí hay un ejemplo: L'Elisir d'Amore tiene dos CD y, en iTunes, se ingresa como tal (por ejemplo, CD 1 de 2 y CD 2 de 2). El script informa correctamente que hay 30 canciones (16 en el CD 1 y 14 en el CD 2). Al reproducir una canción del CD 1, todo es preciso. Al reproducir una canción del CD 2, el número de la canción comienza de nuevo en 1, por lo que la última canción aparece como

Song 14 of 30

porque es la canción número 14 en el CD 2. ¿Hay alguna forma de que el guión muestre la Canción 30 de 30 para la última canción en el CD 2 sin un poco de esfuerzo para calcular la cantidad de CD y luego contar las canciones? en el CD 1 y luego agregando al número de pista de la canción en el CD 2? Este kludge se vuelve bastante feo para álbumes que abarcan hasta 14 CD.

Aquí está el código simplificado:

tell application "iTunes"
    -- code to check that there is a current song
    set z_album to album of current track as string
    set z_num to count of (every track whose album is z_album)
    set z_song to name of current track as string
    set z_trk to track number of current track
    log z_song & " (" & z_trk & " of  " & z_num & ")"
end tell
    
pregunta RPW 19.07.2017 - 14:20

1 respuesta

0

Personalmente, no tengo mucha necesidad, si la hay, de automatizar iTunes con AppleScript. En el pasado, he encontrado que iTunes es una de las aplicaciones más difíciles de automatizar. Sin embargo, eché un vistazo a su código , el AppleScript Dictionary para iTunes, algunas búsquedas en la web que básicamente no dieron nada notable, y algunos intentos programáticos fallidos para fácilmente obtener un < em> list de discos y track count para cada disco de un album .

Asumiré que el contexto kludge en tu pregunta es porque no hay una forma directa fácil para solicitar mediante programación un album para su disc count y track count por disco para hacer math con, de una manera sencilla . Así que con eso ... aquí está mi kludge , que se probó y funciona como se desea en my Biblioteca de iTunes:

tell application "iTunes"
    try

        set theCurrentTrackProperties to (properties of current track)

        if (disc number in theCurrentTrackProperties) is not greater than 1 then

            set theSongName to (name in theCurrentTrackProperties)
            set theTrackNumber to (track number in theCurrentTrackProperties)
            set theTrackCount to (track count in theCurrentTrackProperties)

            log theSongName & " (" & theTrackNumber & " of " & theTrackCount & ")"

        else

            set theSongName to (name in theCurrentTrackProperties)
            set theTrackNumber to (track number in theCurrentTrackProperties)
            set theTrackCount to (count of (every track whose album = (album in theCurrentTrackProperties)))

            set theDiscNumber to (disc number in theCurrentTrackProperties)
            set theAlbumsTracksProperties to (properties of every track whose album = (album in theCurrentTrackProperties))

            set theAlbumsDiscNumberTrackCountInfo to ""
            repeat with i from 1 to (count of theAlbumsTracksProperties)
                tell item i in theAlbumsTracksProperties
                    set theAlbumsDiscNumberTrackCountInfo to (theAlbumsDiscNumberTrackCountInfo & disc number & space & track count & linefeed)
                end tell
            end repeat
            tell current application
                set theAlbumsDiscNumberTrackCountInfo to (do shell script "sort -n -k1 -u <<<" & quoted form of theAlbumsDiscNumberTrackCountInfo & " | sed '/^$/d'")
                set theTracksPerDiscCount to ""
                repeat with i from 1 to (theDiscNumber - 1)
                    set theTracksPerDiscCount to (theTracksPerDiscCount + (word 2 of paragraph i in theAlbumsDiscNumberTrackCountInfo))
                end repeat
                set theTrackNumber to (theTrackNumber + theTracksPerDiscCount)
            end tell

            log theSongName & " (" & theTrackNumber & " of " & theTrackCount & ")"

        end if

    on error eStr number eNum
        display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with icon caution
        return
    end try
end tell

El ejemplo del código de AppleScript, que se muestra arriba, hace lo siguiente:

  • Establece las propiedades del current track a la variable theCurrentTrackProperties .
  • Comprueba si el valor de la propiedad disc number en la variable , theCurrentTrackProperties , no es mayor que 1.
  • Si el valor de la propiedad disc number no es mayor que 1, es un procesamiento directo y registra la información deseada.
  • Si el valor de la propiedad disc number es mayor que 1, entonces la rama else realiza el kludge para hacer math , y registra la información deseada.

Lo que hace kludge :

  • Establece algunas variables iniciales adicionales .
    • Uno para el valor de la propiedad disc number de current track , theDiscNumber , se usa para determinar cuántos discos el track count es necesario para.
    • Otro para mantener las propiedades de cada track de cada disc en el album , theAlbumsTracksProperties .
      • El valor de la variable , theAlbumsTracksProperties , se procesa en un repeat loop a la cual da como resultado of se mantiene en la variable theAlbumsDiscNumberTrackCountInfo .
  • La variable theAlbumsDiscNumberTrackCountInfo , es una lista de disc number y track count de cada track en el album .
    • Esta lista se procesa para eliminar toda la información duplicada, a fin de tener una entrada singular para el track count de cada disc number en el album .
  • El comando do shell script utiliza sort y sed para procesar la lista , el valor de la variable theAlbumsDiscNumberTrackCountInfo .
    • %código%
      • sort -n -k1 -u <<< compare según el valor numérico de la cadena
      • -n start a key en POS1
      • -k1 sin -c , genera solo el primero de una ejecución igual
      • -u dirige la entrada desde la línea de comando , no un archivo
    • <<< la lista como entrada de línea de comando dirigida a theAlbumsDiscNumberTrackCountInfo
    • %código%
      • sort canaliza la salida de | sed '/^$/d' comando a |
      • sort eliminar líneas en blanco
      • Como el valor de la variable sed es una concatenación con un sed '/^$/d' al final de cada theAlbumsDiscNumberTrackCountInfo loop , se convierte en la primera línea de salida del comando linefeed y se elimina con repeat , para no tener que dar cuenta de la línea en blanco inicial más adelante el script . Si se dejó como parte del valor de la variable sort , eso se establece (re) por el return del sed comando , entonces theAlbumsDiscNumberTrackCountInfo tendría que ser do shell script para omitir la línea en blanco. Por lo tanto, tiene más sentido eliminarlo antes de que termine como parte del valor final de la variable word 2 of paragraph i .
  • Con la variable , word 2 of paragraph (i + 1) , ahora solo contiene una lista de theAlbumsDiscNumberTrackCountInfo con su correspondiente theAlbumsDiscNumberTrackCountInfo , una línea para cada disco en disk number , ahora es fácil hacer math , si track count contiene 2 discos o hasta 14 discos , o más.
  • El código de AppleScript restante, que incluye otro album loop , preforma el math necesario para sumar el album de cada repeat que precede a track count del que proviene disc number , los agrega y luego registra la información deseada.

Dicho esto, si alguien sabe una forma directa fácil para solicitar mediante programación a disc number su current track y album por disco para hacer el math con, de una manera directa para evitar un kludge , publique una respuesta.

    
respondido por el user3439894 21.07.2017 - 06:47

Lea otras preguntas en las etiquetas