AppleScript: Praca i ruch masowo w iTunes

2

Oto kolejne pytanie z iTunes AppleScript. Mam działający skrypt, w którym wybierasz utwór (kilka „utworów” z iTunes) i mówisz, co ustawić metadane pracy jak dla tego wyboru. Podajesz również, gdzie zaczyna się nazwa ruchu od nazwy utworu, i kopiuje wszystko po tej pozycji do znacznika ruchu, z wyłączeniem wszystkich cyfr rzymskich. Oczywiście także numeruje ruchy.

Oto kod do tego:

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

Mój post na temat tego skryptu możesz zobaczyć tutaj: Znajdź i zamień AppleScript dla nazw ścieżek iTunes

W każdym razie ten skrypt nie stał się wystarczająco wydajny do mojego użytku (przetwarzam wiele klasycznych utworów)! Używając powyższego skryptu, muszę wybrać każdą pracę i odpowiednio ją przyciąć do pracy, a następnie do ruchu.

Teraz chciałbym stworzyć skrypt, który może wykonać cały proces do wielu prac jednocześnie, powiedzmy, cały album.

Musiałby znaleźć każdy utwór, który zawierał I.i ustawić go jako punkt początkowy skryptu, który nakreśliłem powyżej, a także uzyskać pozycję tego I.i odpowiednio przyciąć dla znaczników Work i Movement dla tej konkretnej pracy - np. Wszystko przed I.i przestrzeń poprzedzająca byłaby ustawiona jako dzieło, a wszystko po nim - jako ruch.

Widzę, że to jest to, co muszę zrobić, ale jestem zbyt wielkim noobem AppleScript, aby go zaimplementować! Dla mnie zresztą prawdziwym wyzwaniem jest ustalenie, czy łańcuch leży w innym łańcuchu (np. Sprawdzenie, czy I.jest w nazwie utworu) i znalezienie jego pozycji w nazwie utworu. Gdybym wiedział, jak to zrobić, prawdopodobnie napisałbym resztę skryptu!

Wszelkie wskazówki / pomysły byłyby bardzo pomocne. I mam nadzieję, że mój opis ma sens. Dzięki!

Uwaga: Mimo że otrzymałem odpowiedź na klucz i mogę sam napisać resztę skryptu, dodam przykładowe wejście / wyjście.

wprowadź opis zdjęcia tutaj

willem.hill
źródło

Odpowiedzi:

3

Użyj is in, aby sprawdzić, czy „ ja ” jest w środku nazwa utworu, tak: if " I." is in someString.

Użyj offsetpolecenia, aby uzyskać pozycję wewnątrz nazwy utworu


Oto przykład

set songName to (get name of thisTrack)
if " I." is in songName then -- " I." is inside this song name
    set {theWork, theMovement} to my splitText(songName, " I.") -- split the string to get the Work and the Movement
end if


on splitText(t, theSearchString)
    set x to the offset of theSearchString in t
    set a to text 1 thru (x - 1) of t -- everything before theSearchString would be set as the work
    set b to text x thru -1 of t -- this part would be set as the movement
    return {a, b}
end splitText
jackjr300
źródło
1

Oto mój kompletny skrypt oparty na innej udzielonej odpowiedzi.

Wiem, że moja odpowiedź jest prawdopodobnie skomplikowana i nieefektywna, ale działa!

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 theSearchString to text returned of (display dialog "Enter the characters between the work name and movement name, for the first movement. Include spaces:" default answer ": I. ")
    set c to (count of sel)
    set songName to (get name of item 1 of sel)
    set movementNumber to 0
    set movementOffset to 0

    set theSearchString_no_rn to my delRomNum(theSearchString)

    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)
        if theSearchString is in songName then -- " I. " is inside this song name
            set movementOffset to the offset of theSearchString in songName
            set movementNumber to 0
        end if

        set theMovement to text (movementOffset + (length of theSearchString_no_rn)) thru -1 of songName -- this part would be set as the movement

        set theWork to text 1 thru (movementOffset - 1) of songName -- everything before theSearchString would be set as the work

        set movementNumber to movementNumber + 1
        set movement number of thisTrack to movementNumber
        set movement of thisTrack to my delRomNum(theMovement)
        set work of thisTrack to theWork

    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
willem.hill
źródło