Un oggetto Applescript che copia in batch il tag Song nel tag Movement

3

Ho una libreria di iTunes piuttosto grande (~ 300 GB) che è principalmente musica classica. Mi piace molto il formato Work and Movement, ma purtroppo non è pratico aggiornare manualmente i miei metadati nel formato Work and Movement. Quasi tutti i tag dei brani esistenti sono nel seguente formato:

Telemann - Concerto in E minor: I. Andante
II. Allegro
III. Largo
IV. Allegro
etc.

Uno script che potrebbe automatizzare l'aggiornamento del sistema di codifica sarebbe il seguente.

  1. Su tutti i brani selezionati, copia il tag Song sul tag Movement
  2. Elimina il numero romano, il periodo e lo spazio dalla parte anteriore del tag Movimento. Oppure, nel formato in cui è incluso l'intero nome del lavoro nel tag Song, eliminalo.

Qualsiasi aiuto o suggerimento per l'implementazione di questo script sarebbe molto utile. Ho esaminato e utilizzato script di lavoro e movimento di Doug , ma non coprono il processo di abbinamento che sarebbe necessario per cancellare i numeri romani dall'inizio.

Modifica

È diventato evidente che molti dei tag non sono nel formato sopra, ma in un formato come il seguente:

Serenade for strings in C major, Op. 48 - I. Allegro
Serenade for strings in C major, Op. 48 - II. Adagio
Serenade for strings in C major, Op. 48 - III. Allegro moderato
etc.

OR nello stesso formato di cui sopra tranne che per l'uso di numeri arabi al posto dei numeri romani.

Lo script dovrebbe portare i tag "Movimento" con i seguenti output:

Allegro
Adagio
Allegro moderato

L'idea è che otterrei la prima parte di questo ("Serenade per le stringhe in Do maggiore, Op. 48") e la copio nel tag "work", che ho già implementato, quindi ottengo il testo rimanente, rimuovere i numeri di movimento e assegnarlo al tag Movimento. Qualsiasi aiuto sull'implementazione di un sistema che lo farebbe sarebbe apprezzato.

Ecco lo script nella sua forma attuale. È basato sullo script Doug's Name to Work.

tell application "iTunes"
    set sel to selection of front browser window
    if sel is {} then
        try
            display dialog "Nothing is selected…" buttons {"Quit"} with icon 0
        end try
        return
    end if

    set c to (count of sel)
    set songName to (get name of item 1 of sel)


    set userOptions to display dialog "Edit for Work name and then click OK." default answer songName --prompt for work name

    repeat with i from 1 to c --set the movement numbers
        set thisTrack to item i of sel
        try
            set work of thisTrack to text returned of userOptions
            set movement number of thisTrack to i
            set movement count of thisTrack to c
            set movement of thisTrack to my delRomNum(name of thisTrack) -- copy movement text from song name and delete roman numerals
        end try
    end repeat


end tell

on delRomNum(t) -- the perl command search and delete any roman numeral (must be a word followed by the period and a space character)
    do shell script "/usr/bin/perl -pe 's/\b[IVXLCDM]+\b. //g' <<< " & quoted form of t
end delRomNum
    
posta willem.hill 28.02.2017 - 02:47
fonte

2 risposte

2

Per eliminare i numeri romani, puoi utilizzare il delRomNum() gestore da questo script:

--- this text as an example.
set movementText to "Telemann - Concerto in E minor: I. Andante
II. Allegro
III. Largo
IV. Allegro
etc."

set movementText to my delRomNum(movementText) -- delete roman numerals


on delRomNum(t) -- the perl command search and delete any roman numeral (must be a word followed by the period and a space character)
    do shell script "/usr/bin/perl -pe 's/\b[IVXLCDM]+\b. //g' <<< " & quoted form of t
end delRomNum

Il risultato dello script è

"Telemann - Concerto in E minor: Andante
Allegro
Largo
Allegro
etc."

Aggiornamento:

Se ho capito bene:

Da ogni riga di una stringa, il comando deve eliminare i caratteri    dall'inizio della linea fino alla prima occorrenza di (a    numero romano o un numero arabo) seguito dal periodo e a    spazio, quindi usa questo gestore:

-- call it, like this --> set movement of thisTrack to my delRomNum(name of thisTrack)
on delRomNum(t)
    (***  from  the contents of the 't' variable (the end of lines must be an Unix Line Endings), so the 'tr' command change the carriage returns (Mac Line Endings) to linefeed (Unix Line Endings)
    the 'perl' command delete the first character in each line through the first occurrence of a word  which contains (a roman numeral or a number) followed by the period and a space character ***)
    do shell script "tr '\r' '\n' <<< " & (quoted form of t) & " | /usr/bin/perl -pe 's/^.*?\b[IVXLCDM0-9]+\b. //g'"
end delRomNum

Esempio: lo script passa questa stringa al gestore come parametro

Serenade for strings in C major, Op. 48 - I. Allegro
Serenade for strings in C major, Op. 48 - II. Adagio
Serenade for strings in C major, Op. 48 - III. Allegro moderato
Serenade for strings in C major, Op. 48 - 4. Allegro  Molto Appassionato
Serenade for strings in C major, Op. 48 - 5. Adagio - Allegro Molto
Serenade for strings in C major, Op. 48 - 6. Allegro moderato
VII. Adagio - Allegro Non Troppo
8. Allegro Ma Non Tanto
9. Largo
Adagio
etc.

Il gestore restituisce:

Allegro
Adagio
Allegro moderato
Allegro  Molto Appassionato
Adagio - Allegro Molto
Allegro moderato
Adagio - Allegro Non Troppo
Allegro Ma Non Tanto
Largo
Adagio
etc.
    
risposta data 28.02.2017 - 19:00
fonte
2

Bene, l'ho capito da solo. Nel caso questo sia utile a qualcun altro, questo è lo script completo.

tell application "iTunes"
    set sel to selection of front browser window
    if sel is {} then
        try
            display dialog "Nothing is selected…" buttons {"Quit"} with icon 0
        end try
        return
    end if

    set c to (count of sel)
    set songName to (get name of item 1 of sel)


    set workName to display dialog "Edit for Work name and then click OK." default answer songName --prompt for work name
    set movementLength to display dialog "Edit to everything except the movement name. Do not include the roman numeral if one is present. If an arabic numeral is present, include it." default answer songName --prompt for movement length


    repeat with i from 1 to c --set the movement numbers
        set thisTrack to item i of sel
        set songName to (get name of thisTrack)
        set work of thisTrack to text returned of workName
        set movement number of thisTrack to i
        set movement count of thisTrack to c
        set movement of thisTrack to my delRomNum(text ((length of text returned of movementLength) + 1) thru (length of songName) of songName as string) -- copy movement text from song name and delete roman numerals
    end repeat


end tell

on delRomNum(t) -- the perl command search and delete any roman numeral (must be a word followed by the period and a space character)
    do shell script "/usr/bin/perl -pe 's/\b[IVXLCDM]+\b. //g' <<< " & quoted form of t
end delRomNum
    
risposta data 01.03.2017 - 16:49
fonte

Leggi altre domande sui tag