0 votos

Eliminar canciones rusas de iTunes con AppleScript

Soy de Ucrania y, como saben, tenemos una gran guerra con Rusia.

Antes escuchaba muchas canciones rusas, pero ahora quiero eliminarlas todas de mi biblioteca de iTunes para no dar a los rusos la posibilidad de ganar dinero y pagar impuestos en Rusia y evitar que patrocinen la guerra. ¿Tal vez alguien tiene una idea de cómo hacer esto?

Creo que sería muy popular en Ucrania, así que no sólo me ayudarás a mí.

Gracias.

0voto

b.gray Puntos 11

Gracias a todos los que me han ayudado a encontrar una solución. Finalmente escribí el Applescript que encontrar pistas rusas y después de promting eliminarlos. El script utiliza musicbrainz API(gracias @SaaruLindestøkke).

¡¡¡PRESTA ATENCIÓN!!!

Para analizar la respuesta JSON de la API debe instalar la [JSON Helper App][1] - https://apps.apple.com/us/app/json-helper-for-applescript/id453114608?mt=12, de lo contrario script no funcionará.

global russianCities
set russianCities to {"Moscow", "Saint Petersburg", "Novosibirsk", "Yekaterinburg", "Kazan", "Nizhny Novgorod", "Chelyabinsk", "Krasnoyarsk", "Samara", "Ufa", "Rostov-on-Don", "Omsk", "Krasnodar", "Voronezh", "Perm", "Volgograd", "Saratov", "Tyumen", "Barnaul", "Izhevsk", "Makhachkala", "Khabarovsk", "Ulyanovsk", "Irkutsk", "Vladivostok", "Yaroslavl", "Kemerovo", "Tomsk", "Sevastopol", "Stavropol", "Orenburg", "Ryazan", "Penza", "Cheboksary", "Lipetsk", "Kaliningrad", "Astrakhan", "Tula", "Kirov", "Kursk", "Ulan-Ude", "Tver", "Bryansk", "Ivanovo", "Yakutsk", "Vladimir", "Belgorod", "Kaluga", "Chita", "Grozny", "Smolensk", "Saransk", "Vologda", "Kurgan", "Oryol", "Arkhangelsk", "Vladikavkaz", "Yoshkar-Ola", "Murmansk", "Kostroma", "Tambov", "Nalchik", "Blagoveshchensk", "Petrozavodsk", "Veliky Novgorod", "Syktyvkar", "Pskov", "Abakan", "Yuzhno-Sakhalinsk", "Petropavlovsk-Kamchatsky", "Maykop", "Kyzyl", "Cherkessk", "Khanty-Mansiysk", "Elista", "Magadan", "Birobidzhan", "Gorno-Altaysk"}

on isMatchArtistName(appleAPIArtist, brainsAPIArtist)
    if appleAPIArtist contains |name| of brainsAPIArtist or appleAPIArtist contains |sort-name| of brainsAPIArtist then
        return true
    end if
    try
        repeat with al in |aliases| of brainsAPIArtist
            if appleAPIArtist contains |name| of al then
                return true
            end if
        end repeat
    on error errMsg
        --log "ERROR: " & errMsg
    end try
    return false
end isMatchArtistName

on getIsRussianArtist(theArtist, strict)

    set weblink to "'https://musicbrainz.org/ws/2/artist' --data-urlencode 'limit=10' --data-urlencode 'fmt=json' --data-urlencode " & quoted form of ("query=" & theArtist)
    log weblink

    set curl_command to "curl -G -v " & weblink
    log curl_command
    set res to do shell script curl_command

    tell application "JSON Helper"
        set parsedJSON to read JSON from res
        set artists to artists of parsedJSON
        repeat with artist in artists
            set checkArtist to true
            if strict then
                set checkArtist to my isMatchArtistName(theArtist, artist)
            end if

            if checkArtist then
                try
                    set theCountry to country of artist
                    if theCountry contains "UA" then
                        return false
                    end if
                    if theCountry contains "RU" then
                        return true
                    end if
                on error errMsg
                    log "ERROR: " & errMsg
                end try
                try
                    set theArea to |name| of area of artist
                    if russianCities contains theArea then
                        return true
                    end if
                on error errMsg
                    log "ERROR: " & errMsg
                end try
            end if

        end repeat
    end tell
    return false
end getIsRussianArtist

on composePlaylistName(name, id)
    set nextName to name & "(ID:" & id & ")"
    return nextName
end composePlaylistName

on pickThePlaylist()
    tell application "Music"
        set AllUserPlaylists to every user playlist
        set thePlaylistNames to {}
        repeat with thePlaylist in AllUserPlaylists
            set end of thePlaylistNames to my composePlaylistName(name of thePlaylist, id of thePlaylist)
        end repeat
        set thePickedPlaylistName to choose from list thePlaylistNames with prompt "Select your playlist:"
        set currentPlaylist to first item of AllUserPlaylists

        repeat with thePlaylist in AllUserPlaylists
            if thePickedPlaylistName contains my composePlaylistName(name of thePlaylist, id of thePlaylist) then
                return tracks of thePlaylist
            end if
        end repeat
        error "Playlist was not found."
    end tell
end pickThePlaylist

on composeTrackName(artist, name, id)
    set nextName to artist & "-" & name & "(ID:" & id & ")"
    return nextName
end composeTrackName

on pickRussianTracksToDelete(theTracks)
    tell application "Music"
        set theTrackNames to {}
        repeat with theTrack in theTracks
            set end of theTrackNames to my composeTrackName(artist of theTrack, name of theTrack, id of theTrack)
        end repeat
        set thePickedPlaylistNames to choose from list theTrackNames with prompt "Select the tracks you want to delete(this is a multiple selection list, use 'Command () + Mouse Click' to select/unselect):" default items theTrackNames with multiple selections allowed
        set selectedTracks to {}

        repeat with theTrack in theTracks
            repeat with pickedName in thePickedPlaylistNames
                if pickedName contains my composeTrackName(artist of theTrack, name of theTrack, id of theTrack) then
                    set end of selectedTracks to theTrack
                end if
            end repeat
        end repeat
        return selectedTracks
    end tell
end pickRussianTracksToDelete

on promptForStrictMode()
    tell application "Music"
        set theDialogText to "Hello. I will remove russian songs from your playlist. The script is working in two modes: 
    1. Strict - only russian songs will be affected but many songs may be skipped. 
    2. No Strict - finding more russian songs, but also Ukrainian songs might be affected."
        set result to display dialog theDialogText buttons {"No Strict", "Strict"} default button "Strict"
        set isStrict to button returned of result is equal to "Strict"
        return isStrict
    end tell
end promptForStrictMode

on initProgressBar(tracksCount)
    set progress total steps to tracksCount
    set progress completed steps to 0
    set progress description to "Processing Songs..."
    set progress additional description to "Preparing to process."
end initProgressBar
on updateProgressBar(a, tracksCount)
    set progress additional description to "Processing song " & a & " of " & tracksCount
    set progress completed steps to a
end updateProgressBar
on resetProgressBar()
    set progress total steps to 0
    set progress completed steps to 0
    set progress description to ""
    set progress additional description to ""
end resetProgressBar
on findAndDeleteRussianTracks()
    set strict to my promptForStrictMode()
    set currentPlaylist to my pickThePlaylist()
    set delayTime to 0.5
    set russianTracks to {}
    settracksCount to length of currentPlaylist
    --initial set of progress bar
    my initProgressBar(tracksCount)

    repeat with a from 1 to length of currentPlaylist
        set theTrack to item a of currentPlaylist
        delay delayTime
        my updateProgressBar(a, tracksCount)
        tell application "Music"
            set isRussianArtist to my getIsRussianArtist(artist of theTrack, strict)
            if isRussianArtist is true then
                set end of russianTracks to theTrack
            end if
        end tell
    end repeat
    my resetProgressBar()
    tell application "Music"
        if (count of russianTracks) is equal to 0 then
            set theDialogText to "Russian songs were not found. Try another playlist."
            display dialog theDialogText
            return my copyRussianTrackToPlaylist()
        end if
        set selectedTracks to my pickRussianTracksToDelete(russianTracks)
        repeat with theTrack in currentPlaylist
            repeat with theDeleteTrack in selectedTracks
                try
                    if (id of theDeleteTrack) is (id of theTrack) then
                        log "delete" & id of theTrack
                        delete theTrack
                    end if
                on error errMsg
                    log "Error: " & errMsg
                end try
            end repeat
        end repeat
        set theDialogText to "HOORAY! Your Playlist was cleared from russian songs."
        display dialog theDialogText buttons {"Okay"} default button "Okay"
    end tell
end findAndDeleteRussianTracks

my findAndDeleteRussianTracks()

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X