Applescript per ottenere il numero di brani del brano dall'album multi-cd in iTunes?

1

Ho un oggetto Applescript che riporta il nome del brano, l'album, il numero della canzone e il numero totale di brani dell'album in riproduzione sull'album. Se l'album proviene da un singolo CD o se il brano proviene dal CD 1 di un album multi-CD, tutto funziona e ottengo il seguente:

Song 2 of 30

Tuttavia, se l'album proviene da un set multi-CD, il numero del brano non è corretto per i brani da CD 2, CD 3, ecc. Ecco un esempio: L'Elisir d'Amore ha due CD e, in iTunes, è inserito come tale (ad esempio, CD 1 di 2 e CD 2 di 2). Lo script riporta correttamente che ci sono 30 canzoni (16 su CD 1 e 14 su CD 2). Durante la riproduzione di un brano dal CD 1, tutto è accurato. Quando si riproduce un brano dal CD 2, il numero del brano ricomincia da 1, quindi l'ultima canzone appare come

Song 14 of 30

perché è la quattordicesima canzone su CD 2. C'è un modo per far sì che la sceneggiatura riproduca la Canzone 30 di 30 per l'ultima canzone su CD 2 senza un certo sforzo di capire il numero di CD, quindi contare le canzoni nel CD 1 e poi aggiungendo al numero di traccia del brano nel CD 2? Questo kludge diventa piuttosto brutto per gli album che coprono fino a 14 CD.

Ecco il bit di codice semplificato:

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
    
posta RPW 19.07.2017 - 14:20
fonte

1 risposta

0

Personalmente non ho molto bisogno, se esiste, di automatizzare iTunes con AppleScript. In passato ho trovato iTunes come una delle applicazioni più difficili da automatizzare. Tuttavia, ho dato un'occhiata al tuo codice , il dizionario AppleScript per iTunes, alcune ricerche sul Web che sostanzialmente non davano nulla di interessante, e alcuni tentativi programmatici falliti di facilmente ottenere un < em> elenco di dischi e track count per ogni disco di album .

Presumo che il contesto kludge nella tua domanda sia perché c'è no modo diretto diretto per chiedere a livello di codice un album per il suo disc count e track count per disco per fare matematica con, in modo <1> diretto . Quindi con questo ... ecco il mio kludge , che è stato testato e funziona come desiderato nella mia libreria di 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

L'esempio code di AppleScript, mostrato sopra, effettua le seguenti operazioni:

  • Imposta le proprietà di current track sulla variabile theCurrentTrackProperties .
  • Verifica se il valore della disc number proprietà nella variabile , theCurrentTrackProperties , non è maggiore di 1.
  • Se il valore della proprietà disc number non è maggiore di 1, viene elaborato direttamente e registra le informazioni desiderate.
  • Se il valore della proprietà disc number è maggiore di 1, il else ramo preforma il kludge per eseguire matematica e registra le informazioni desiderate.

Che cosa fa kludge :

  • Imposta alcune variabili iniziali aggiuntive .
    • Uno per il valore della disc number proprietà di current track , theDiscNumber , è usato per determinare quanti dischi è necessario track count per.
    • Un altro per contenere le proprietà di ogni track di ogni disc in album , theAlbumsTracksProperties .
      • Il valore della variabile , theAlbumsTracksProperties , viene elaborato in un repeat loop a cui l' output di è tenuto nella variabile theAlbumsDiscNumberTrackCountInfo .
  • La variabile theAlbumsDiscNumberTrackCountInfo , è un elenco di disc number e track count da ogni track in album .
    • Questo elenco viene quindi elaborato per rimuovere tutte le informazioni duplicate, in modo da avere una voce singolare per track count di ogni disc number in album .
  • Il comando do shell script utilizza sort e sed per elaborare la lista , il valore della variabile theAlbumsDiscNumberTrackCountInfo .
    • %codice%
      • sort -n -k1 -u <<< confronta secondo il valore numerico della stringa
      • -n avvia un tasto su POS1
      • -k1 senza -c , mostra solo il primo di una corsa uguale
      • -u indirizza l'input dalla riga di comando , non un file
    • <<< la lista come input da riga di comando diretto a theAlbumsDiscNumberTrackCountInfo
    • %codice%
      • sort pipe l' output del | sed '/^$/d' comando a |
      • sort elimina righe vuote
      • Poiché il valore della variabile sed è una concatenazione con un sed '/^$/d' alla fine di ogni theAlbumsDiscNumberTrackCountInfo ciclo , diventa la prima riga di output dal comando linefeed e viene rimosso con repeat , in modo da non dover tenere conto della riga vuota iniziale più avanti in lo script . Se è stato lasciato come parte di valore della variabile sort , è (ri) impostato dal ritorno di sed comando , quindi theAlbumsDiscNumberTrackCountInfo dovrebbe essere do shell script per saltare la riga vuota iniziale. Quindi ha più senso rimuoverlo prima che finisca come parte del valore finale della variabile word 2 of paragraph i .
  • Con la variabile , word 2 of paragraph (i + 1) , ora contiene solo un elenco di theAlbumsDiscNumberTrackCountInfo con il corrispondente theAlbumsDiscNumberTrackCountInfo , una riga per ogni disco in disk number , ora è facile fare matematica , se track count contiene 2 dischi o fino a 14 dischi , o altro.
  • Il restante codice AppleScript , che include un altro album loop , preforma il matematico necessario per sommare il album di ciascun repeat che precede il track count di cui disc number proviene e li somma insieme, quindi registra le informazioni desiderate.

Detto questo, se qualcuno conosce un modo semplice diretto per chiedere a livello di codice un disc number per il suo current track e album per disco per fare il matematica con, in modo diretto per evitare un kludge , si prega di inviare una risposta.

    
risposta data 21.07.2017 - 06:47
fonte

Leggi altre domande sui tag