April 19 2021 - 8:55 pm

Can't Believe I'm Posting About GUI Scripting

It is a fact universally acknowledged—in my house—that GUI Scripting stinks. But the flip side of that is that sometimes it can be the only way to automate something with AppleScript. Especially so if the developers of the app you are 'scripting have long been ignoring your suggestions. Again, my house.

GUI Scripting is a way to write AppleScript that works by simulating mouse clicks, selections, key presses and other "touches" of the GUI elements of an app in order to get the app to do what those clicks and presses do. For instance, you can simulate a mouseclick on a menu item in a menu and whatever happens when you usually click that menu item will happen. GUI Scripting is clunky to work with for a number of reasons, but the two most discouraging are that it's tough to know what and how and where to click and press for the Thing you want to do; and that if the developer changes an app's layout in the future the scripts could break because something isn't where it was before.

Despite all that, I've been playing with GUI Scripting lately. It's what I use to change playlist views in Playlist Manager and how Needle Drop clicks the "Clear" button in the Playing Next panel. If you've used those scripts, you've had to give permission in "Accessibility" to allow those scripts to use the "System Events" app. System Events is what enables AppleScript to target GUI elements.

Here's a little scripting project that uses some GUI Scripting to do three things that I like to do somewhat regularly in the Music app: open the selected playlist in its own window; change the playlist View to "as Songs"; reposition the playlist window to a standard place, rather than BANG right over the main browser window. (Note that I could only get it to work on the latest version of Big Sur with the latest version of Music, which bears out my thoughts above about clunkiness.)


February 23 2021 - 4:33 pm

View as Songs with Column Browser

One of the things that disappoints me about the Music app (and iTunes before) is that there is no way to set a default playlist View. Whenever a new playlist is created it will default to View as Playlist. I suppose this is fine and I don't dislike View as Playlist; it has its useful moments when a minimal look is desirable. But I prefer View as Songs because I do most of my tag editing and track sorting in that View under which much more information can be made visible.

* * *

For several years I've been pointing out the Keyboard Shortcut trick of assigning Shift-Command-S to View > as Songs and Shift-Command-P to View > as Playlist in order to quickly toggle the playlist View on the fly.

* * *

So I find myself typing Shift-Command-S followed by Command-B to turn on the Column Browser. A lot. Wonder if there's anything I can do about that...


August 19 2020 - 3:08 pm

Have a Quick Look

I was going to write this up for downloading but it's almost too simple.

Select a track in the Music app and run this script to open a Quick Look panel displaying the track's file, ready to play.

tell application "Music"


set sel to selection

if sel is {} then return

set theTrack to item 1 of sel

tell me to doQuickLook(POSIX path of ((get theTrack's location) as text))

on error


end try

end tell

on doQuickLook(loc)


do shell script "qlmanage -p " & quoted form of loc & " >& /dev/null &"

end try

end doQuickLook

February 4 2020 - 8:54 am

Track Description Tag

Apple's Music app still provides a Description tag for music tracks but the only way to see or change this tag is through the browser window while in Songs view:

While this is a, ahem, serviceable means to enter data, if you visit my house you'll have to use this script attached to a keyboard shortcut:

Here's the script to view and edit the description tag of a single selected track:

tell application "Music"

set singleSelection to item 1 of selection

set defaultDescription to (get description of singleSelection)

set ddResult to (display dialog "Description for \"" & (get name of singleSelection) & "\":" default answer defaultDescription)

-- if Cancel button pressed, script ends here


set description of singleSelection to text returned of ddResult

end try

end tell

Copy the script into Script Editor or click the little Script icon to begin the Trial by Permissions Dialogs to *automatically* open the script in Script Editor. Save it named whatever you like as a "Script" to your ~Library/Music/Scripts/ folder. Then assign it a keyboard shortcut.

January 7 2020 - 10:27 am

Track Number isn't a TV Tag (Much)

I have to admit, it's hard to keep in mind what tags from iTunes are still available for which media in the Music and TV apps.

Case in point: the track number tag. A Track Number is the index of a track in its album play order. Every school child knows that (well, every school child familiar with "album"). Strictly speaking, it is a music-related tag. But because iTunes handled music and video tracks, ALL tracks had a track number tag.

The TV app apparently does not care to have much truck with the Track Number tag; it does not appear in a track's Show Info panel. But it can appear as a column in List View. And it is still accessible by AppleScript.

I heard from a Correspondent who was concerned about his pristine TV Show track numbering largely being obscured by the TV app. I suppose you could: 1) Put the list of TV Shows in List View, 2) Show the Track Number column and 3) Command-I each track and manually enter the Track Number into the episode field.

Or, run this script on a selection of TV tracks to copy the track number to the episode number:

tell application "TV"

set mySelection to (get a reference to selection of front browser window)

if mySelection is not {} then

repeat with aTrack in mySelection


tell aTrack to set episode number to track number

end try

end repeat

end if

end tell

December 29 2019 - 9:54 pm

EQ and Volume Adjustments

It's been years since I've monkeyed with the Equalization and Volume Adjustment settings for tracks. I believe these were initially included with SoundJam and then iTunes to help compensate for the negligible audio quality of notebook speakers. Currently, I DAC out to an integrated amp set to bypass EQ and loudness; I'm trying to keep the audio path as digitally uncluttered as possible.

Anyway, plenty of other people do use the EQ and volume track settings and have good reasons for doing so and I heard from one. This Correspondent wanted to segregate, what he called, tracks with "non-standard" EQ and volume settings. By which he meant not None and not 0 detente, respectively. And by which he also meant "is there a script to do this?"

First, tracks can be sorted by Equalizer name when displayed in Songs View.

So finding the batches of tracks that have been assigned freaky EQ settings is a scroll-through-the-library away. And also no AppleScript necessary. And I can go back to watching football.

Second, AppleScript is pretty much the only way that tracks can be mustered by the volume adjustment property. A track's volume adjustment can range between -100 and 100 with 0 as the default detente. Here is a script that will find all the tracks whose volume adjustment value does not equal 0 and put them in their own brand new playlist:

tell application "Music" to duplicate (get a reference to (tracks whose volume adjustment is not 0)) to (make new playlist with properties {name:"Volume Not 0"})

I was surprised I had about 300 tracks of my own that weren't set to 0 volume. Don't know how that came to be. Must have gone berserk one day or something.

December 3 2019 - 1:22 am

That Category Tag

When iTunes was ka-blammed into the Media apps, I thought it was interesting to see how track tags were re-assigned. Obviously, tags like Season, Show and Episode ID are TV app-centric so they were removed from the Music app. Similarly, the Album and Album Artist tags do not appear for TV Shows or Movies in the TV app. And so on.

So I guess Category has always been a Music-centric tag. I knew that it was used by Podcast tracks, but I've recently noticed that some of my radio stream tracks (originally dragged from Radio Stations in iTunes) also use it. Wouldn't it be useful to put the Category tag into service as a secondary Genre tag, or what have you?

But there's no easy way to access the Category tag. It doesn't appear in a track's Info panel. I'm pretty sure it isn't written to its file's metadata. And although the Category column can still be seen in Songs View, Category tags can't be edited there either, like a cell in a table, as other tags can be.

Happily, our benefactors at Apple have kept the AppleScript category property available. Here is a script that will allow you to view and/or edit the Category tags of the selected tracks in the Music app:

June 26 2019 - 8:20 am

Targeting Two Media Apps

If you've got scripts you've written for iTunes, one of the first things you'll realise in Catalina is that instead of having one media app you have two. Sure, this seems self evident. Until you try converting your iTunes scripts to Music and/or Apple TV scripts.

Let's say you have a script that gets the name of the selected playlist. No matter what kind of playlist you selected in iTunes, this script reliably returned its name. Thus, it would work with a playlist containing strictly music tracks or one with only video tracks. But that was in iTunes. Now, music tracks are in Music and video tracks are in Apple TV.

You could write two scripts, one for Music and one for Apple TV. Or you could write a script that includes routines that can target both, doubling the size of your script.

Or you could use a simple trick to target one or the other app depending on where the script is installed. I always recommend putting your scripts in the app's "Scripts" folder. It's just a matter of getting the "path to me" which will return the file path of the script.

Then, you haul out the good ol' "using terms from". Throw it all together like this to make a script swing:

set myPath to (path to me) as text

set mediaAppName to "Music"

if (myPath contains ":Apple TV:") then

set mediaAppName to "TV"

end if

using terms from application "Music"

tell application mediaAppName

-- do your things in the app

set playlistName to (get name of view of front browser window)

end tell

end using terms from

Using the script's file path location—which will be something like Macintosh SSD:Users:username:Library:Music:Scripts:Name of Script.scpt or Macintosh SSD:Users:username:Library:Apple TV:Scripts:Name of Script.scpt—we can determine which app to target. This name is saved to the mediaAppName variable. (This trick will also work if you store scripts in the local Library folder or in the Library/Scripts/Applications/Music/ or Library/Scripts/Applications/Apple TV/ folders since they all contain the app name in the file path.)

Next, a using terms from block is hardcoded to target "Music", followed by the tell block for mediaAppName. This allows the script to compile while you're working on it in Script Editor. Since both the Music and Apple TV scripting goodness are virtually identical, you can indeed "use terms from" Music to automate either app.

Now instead of making two scripts, you can put a copy of one script in both Scripts folders. It doesn't work with aliases since the location of the Original file will be used.

You will need to wrap any tell statement targeting a particular app in the using terms from block. Also, you may want to assign the mediaAppName as a property or global in order to access it throughout the scope of more elaborate scripts.

UPDATED, July 31, 2019. Changed target "Apple TV" to just "TV", which is how the app is targeted in the latest macOS 10.15 betas. Note that the name required for TV app's "Scripts" folder's container is still "Apple TV".

December 30 2018 - 12:20 pm

Have a Happy New Year


if (get current date) > date ("January 1, 2019") then

exit repeat


delay 10

end if

end repeat

tell application "iTunes"

play (some track whose name is "Auld Lang Syne")

end tell

December 28 2018 - 10:33 am

Updated Mono-Stereo Toggling

Apple changed a few things in System Preferences under Mojave which broke this script to toggle between Mono and Stereo output.

Here is the fix. You will note that it is a simple change to the line targeting the System Preferences' Accessibility window.

tell application "System Preferences"

reveal anchor "Hearing" of pane id ""

end tell

tell application "System Events"

tell application process "System Preferences"

set frontmost to true

tell group 1 of window "Accessibility"

# pre-Mojave - replace the line above with the one below

# tell window "Accessibility"

set monoStereoCheckbox to checkbox "Play stereo audio as mono"

if (get value of monoStereoCheckbox) as boolean is true then

set ddMessage to "Switch to STEREO output?"


set ddMessage to "Switch to MONO output?"

end if

if button returned of (display dialog ddMessage buttons {"No", "Yes"} default button 2) is "Yes" then

tell monoStereoCheckbox to click

end if

end tell

end tell

end tell

if application "System Preferences" is running then

tell application "System Preferences" to quit

end if

For more details, read the original post.

Site contents © 2001 - 2024 (that's right: 2001) Doug Adams and weblished by Doug Adams. Contact support AT dougscripts DOT com. About.
All rights reserved. Privacy.
AppleScript, iTunes, iPod, iPad, and iPhone are registered trademarks of Apple Inc. This site has no direct affiliation with Apple, Inc.
The one who says "it cannot be done" should not be interrupting the one who is doing it.