How to set iTunes 11 in shuffle or repeat mode via applescript

后端 未结 7 1003
梦谈多话
梦谈多话 2020-12-13 16:42

According to http://dougscripts.com/ setting shuffle and repeat modes via applescript is broken in iTunes 11.

According to this stackoverflow answer shuffle is now a

相关标签:
7条回答
  • 2020-12-13 16:57

    It looks like many of these scripts are broken in the newest iTunes. Here are two the work:

    tell application "System Events" to tell UI element "iTunes" of list 1 of process "Dock"
        if not (exists) then return
        perform action "AXShowMenu"
        click menu item "Shuffle" of menu 1
    end tell
    

    That one toggles shuffle via the Dock. You can watch the Dock menu animate when you use it.

    This one toggles shuffle via the menu, invisibly:

    tell application "System Events"
        tell application process "iTunes"
            tell menu 1 of menu item "Shuffle" of menu "Controls" of menu bar 1
                if (value of attribute "AXMenuItemMarkChar" of item 1 of menu items as string) = "✓" then
                    click menu item 2
                else
                    click menu item 1
                end if
            end tell
        end tell
    end tell
    

    Both of these will work even with iTunes is in the background.

    0 讨论(0)
  • 2020-12-13 17:04

    I was optimistic when I saw the AppleScript property current playlist of the iTunes application, but it doesn't work well. It's able to get and set the current playlist's name, but it can do neither for the properties shuffle or song repeat. It errors when trying to set either property, and it always returns 'false' for shuffle and 'off' for song repeat.

    I think your only option is UI Scripting. Here's how to toggle shuffle through the menu bar:

    tell application "System Events" to perform action "AXPress" of (first menu item of process "iTunes"'s menu bar 1's menu bar item "Controls"'s menu 1's menu item "Shuffle"'s menu 1 whose name ends with "Shuffle")
    

    And here's how to set repeat:

    tell application "System Events" to tell process "iTunes"'s menu bar 1's menu bar item "Controls"'s menu 1's menu item "Repeat"'s menu 1
        perform action "AXPress" of menu item "Off"
        perform action "AXPress" of menu item "All"
        perform action "AXPress" of menu item "One"
    end tell
    
    0 讨论(0)
  • 2020-12-13 17:06

    Spent some time deconstructing all the obfuscated solutions in this post (which appear to not work anymore), here's a more readable and customizable approach that works with iTunes 12.1:

    tell application "System Events"
    
        set itunesMenuBar to process "iTunes"'s first menu bar
        set controlsMenu to itunesMenuBar's menu bar item "Controls"'s first menu
        set shuffleMenu to controlsMenu's menu item "Shuffle"'s first menu
    
        set shuffleOnMenuItem to shuffleMenu's menu item "On"
        set shuffleSongsMenuItem to shuffleMenu's menu item "Songs"
    
        tell process "iTunes"
            click shuffleOnMenuItem
            click shuffleSongsMenuItem
        end tell
    
    end tell
    

    This will turn shuffle on and set it to shuffle songs instead of albums, and it should be pretty obvious how to change it to do other things.

    0 讨论(0)
  • 2020-12-13 17:12

    I liked John Sauer's approach so much I wrote myself some getters/setters for these properties using his approach. It's works well because you do not have to activate iTunes before using them. Anyway, I thought I'd post them in case they're of help to anyone. You will get or set their values using the "types" (modeled after the menu item names) as follows:

    Repeat types are "Off", "All", or "One".

    Shuffle types are "Off", "By Songs", "By Albums", or "By Groupings"

    on getRepeatType() -- the return value is a string: Off/All/One
        tell application "System Events"
            tell process "iTunes"
                set menuItems to menu items of menu bar 1's menu bar item "Controls"'s menu 1's menu item "Repeat"'s menu 1
                set currentChoice to "unknown"
                repeat with anItem in menuItems
                    try
                        set theResult to value of attribute "AXMenuItemMarkChar" of anItem
                        if theResult is not "" then
                            set currentChoice to name of anItem
                            exit repeat
                        end if
                    end try
                end repeat
            end tell
        end tell
        return currentChoice
    end getRepeatType
    
    on setRepeatType(repeatType) -- repeatType is a string: Off/All/One
        set currentValue to my getRepeatType()
        ignoring case
            if currentValue is not repeatType then
                tell application "System Events" to tell process "iTunes"'s menu bar 1's menu bar item "Controls"'s menu 1's menu item "Repeat"'s menu 1
                    if repeatType is "all" then
                        perform action "AXPress" of menu item "All"
                    else if repeatType is "one" then
                        perform action "AXPress" of menu item "One"
                    else
                        perform action "AXPress" of menu item "Off"
                    end if
                end tell
            end if
        end ignoring
    end setRepeatType
    
    on getShuffleType() -- the return value is a string: Off/By Songs/By Albums/By Groupings
        tell application "System Events"
            tell process "iTunes"
                set menuItems to menu items of menu bar 1's menu bar item "Controls"'s menu 1's menu item "Shuffle"'s menu 1
                set onOffItemName to name of item 1 of menuItems
            end tell
        end tell
    
        -- is shuffle off
        ignoring case
            if onOffItemName contains " on " then return "Off"
        end ignoring
    
        -- shuffle is on so find how we are shuffling
        set currentChoice to "Unknown"
        tell application "System Events"
            tell process "iTunes"
                repeat with i from 2 to count of menuItems
                    set anItem to item i of menuItems
                    try
                        set theResult to value of attribute "AXMenuItemMarkChar" of anItem
                        if theResult is not "" then
                            set currentChoice to name of anItem
                            exit repeat
                        end if
                    end try
                end repeat
            end tell
        end tell
        return currentChoice
    end getShuffleType
    
    on setShuffleType(shuffleType) -- shuffleType is a string:  Off/By Songs/By Albums/By Groupings
        set currentValue to my getShuffleType()
    
        script subs
            on toggleShuffleOnOff()
                tell application "System Events" to perform action "AXPress" of (first menu item of process "iTunes"'s menu bar 1's menu bar item "Controls"'s menu 1's menu item "Shuffle"'s menu 1 whose name ends with "Shuffle")
            end toggleShuffleOnOff
    
            on pressBySongs()
                tell application "System Events" to perform action "AXPress" of (first menu item of process "iTunes"'s menu bar 1's menu bar item "Controls"'s menu 1's menu item "Shuffle"'s menu 1 whose name ends with "Songs")
            end pressBySongs
    
            on pressByAlbums()
                tell application "System Events" to perform action "AXPress" of (first menu item of process "iTunes"'s menu bar 1's menu bar item "Controls"'s menu 1's menu item "Shuffle"'s menu 1 whose name ends with "Albums")
            end pressByAlbums
    
            on pressByGroupings()
                tell application "System Events" to perform action "AXPress" of (first menu item of process "iTunes"'s menu bar 1's menu bar item "Controls"'s menu 1's menu item "Shuffle"'s menu 1 whose name ends with "Groupings")
            end pressByGroupings
        end script
    
        ignoring case
            if shuffleType contains "off" then -- we have to make sure it's off
                if currentValue does not contain "off" then subs's toggleShuffleOnOff()
            else
                -- make sure it's on
                if currentValue contains "off" then subs's toggleShuffleOnOff()
    
                -- select the shuffle menu item for the type
                if shuffleType contains "song" and currentValue does not contain "song" then
                    subs's pressBySongs()
                else if shuffleType contains "album" and currentValue does not contain "album" then
                    subs's pressByAlbums()
                else if shuffleType contains "group" and currentValue does not contain "group" then
                    subs's pressByGroupings()
                end if
            end if
        end ignoring
    end setShuffleType
    
    0 讨论(0)
  • 2020-12-13 17:12

    For the new Music app, this works. If you're using iTunes still, change "Music" to "iTunes".

    Repeat can be set to one or off or all.

    tell application "Music"
       set song repeat to off
    end
    

    Shuffle can be set to true or false.

    tell application "Music"
       set shuffle enabled to true
    end
    

    You can find more details at Dougscripts.

    0 讨论(0)
  • 2020-12-13 17:12

    For iTunes 12, this works

    tell application "System Events"  
        tell process "iTunes" to if exists then  
            click menu item "Albums" of menu "Shuffle" of menu item "Shuffle" of menu "Controls" of menu bar 1  
        end if  
    end tell
    

    Change Albums to Songs, Groupings, On and Off accordingly.

    0 讨论(0)
提交回复
热议问题