Search code examples
stringsortingapplescripttext-filesitunes

Sort string by values in text file using applescript


I'm trying to build an applescript to sort tags in the Genre field of a music file in iTunes.

I'm using a semi-colon separated list for the Genre field, like this: Rock; Art Rock; Female Vocalists

The string I want to sort is named genreList in my script:

{"Art Rock", "Female Vocalists", "Rock"}

My preferred tag order is listed as sortList:

{"Rock", "Dance", "Art Rock", "New Wave", "Female Vocalists", "Male Vocalists"}

I want the items in genreList to sort according to sortList, like this:

{"Rock", "Art Rock", "Female Vocalists"}

How do I sort the first list using the second list? I've searched here and on Google, but as I am a scripting novice I'm not even sure I'm searching for the right terms.


Solution

  • Try this, select one or multiple tracks in iTunes and run the script.

    If the separator is supposed to be semicolon + space, please change the second property line.

    If the genre property does not contain the separator, nothing will be changed.

    If a genre does not match the items in the sorted list it will be appended at the end.

    property sortedGenreList : {"Rock", "Dance", "Art Rock", "New Wave", "Female Vocalists", "Male Vocalists"}
    property separator : ";"
    
    tell application "iTunes" to set selectedItems to (get selection)
    if selectedItems is {} then
        display dialog "Nothing selected" buttons {"Cancel"} default button 1
    end if
    
    set {TID, text item delimiters} to {text item delimiters, separator}
    repeat with aTrack in selectedItems
        set orderedGenreList to {}
        set nonOrderableGenres to {}
        tell application "iTunes" to set trackGenreList to text items of (get genre of aTrack)
        if (count trackGenreList) > 1 then
            repeat with aGenre in trackGenreList
                if sortedGenreList does not contain aGenre then set end of nonOrderableGenres to contents of aGenre
            end repeat
            repeat with aGenre in sortedGenreList
                if trackGenreList contains aGenre then
                    set end of orderedGenreList to contents of aGenre
                end if
            end repeat
            set orderedGenres to (orderedGenreList & nonOrderableGenres) as text
            tell application "iTunes" to set genre of aTrack to orderedGenres
        end if
    end repeat
    set text item delimiters to TID
    

    If you want to use a text file with a genre per line replace the first property line with

    set sortedGenreList to paragraphs of (read (choose file))