Skip to content

Instantly share code, notes, and snippets.

@SKaplanOfficial
Last active February 11, 2026 10:51
Show Gist options
  • Select an option

  • Save SKaplanOfficial/f9f5bdd6455436203d0d318c078358de to your computer and use it in GitHub Desktop.

Select an option

Save SKaplanOfficial/f9f5bdd6455436203d0d318c078358de to your computer and use it in GitHub Desktop.
AppleScript and JXA scripts to get Now Playing info. Works on macOS 15.4+, including macOS 26 beta 1.
function run() {
const MediaRemote = $.NSBundle.bundleWithPath('/System/Library/PrivateFrameworks/MediaRemote.framework/');
MediaRemote.load
const MRNowPlayingRequest = $.NSClassFromString('MRNowPlayingRequest');
const appName = MRNowPlayingRequest.localNowPlayingPlayerPath.client.displayName;
const infoDict = MRNowPlayingRequest.localNowPlayingItem.nowPlayingInfo;
const title = infoDict.valueForKey('kMRMediaRemoteNowPlayingInfoTitle');
const album = infoDict.valueForKey('kMRMediaRemoteNowPlayingInfoAlbum');
const artist = infoDict.valueForKey('kMRMediaRemoteNowPlayingInfoArtist');
return `${title.js} — ${album.js} — ${artist.js} | ${appName.js}`;
}
use framework "AppKit"
on run
set MediaRemote to current application's NSBundle's bundleWithPath:"/System/Library/PrivateFrameworks/MediaRemote.framework/"
MediaRemote's load()
set MRNowPlayingRequest to current application's NSClassFromString("MRNowPlayingRequest")
set appName to MRNowPlayingRequest's localNowPlayingPlayerPath()'s client()'s displayName()
set infoDict to MRNowPlayingRequest's localNowPlayingItem()'s nowPlayingInfo()
set title to (infoDict's valueForKey:"kMRMediaRemoteNowPlayingInfoTitle") as text
set album to (infoDict's valueForKey:"kMRMediaRemoteNowPlayingInfoAlbum") as text
set artist to (infoDict's valueForKey:"kMRMediaRemoteNowPlayingInfoArtist") as text
return title & " - " & album & " - " & artist & " | " & appName
end run
@ungive
Copy link

ungive commented Jul 15, 2025

@Pen7art Check this for why elapsed time appears as not being updated: ungive/mediaremote-adapter#6

@SKaplanOfficial
Copy link
Author

@Pen7art @ungive If you just want the exact time elapsed, you can use $.MRNowPlayingRequest.localNowPlayingItem.metadata.calculatedPlaybackPosition.

@ejbills
Copy link

ejbills commented Nov 29, 2025

@SKaplanOfficial - wasn't able to reproduce the command functionality on macOS 26.1. Reading media works, however writing to the media client seems to be blocked. Can anyone else confirm?

@SKaplanOfficial
Copy link
Author

@ejbills Commands (play, pause, etc.) work for me on the 26.2 beta, tested with built-in apps, Spotify, and YouTube. I can't easily test on 26.1 at this point, but if there was a bug, it seems to be fixed.

@kreatoo
Copy link

kreatoo commented Feb 9, 2026

@SKaplanOfficial is there a way to get album artwork using this? Thanks.

@ejbills
Copy link

ejbills commented Feb 9, 2026

@kreatoo try kMRMediaRemoteNowPlayingInfoArtworkData

@ungive
Copy link

ungive commented Feb 9, 2026

@kreatoo Last time I tried I couldn't get the artwork to load with JXA/osascript, it would just be empty

@kreatoo
Copy link

kreatoo commented Feb 10, 2026

Yeah, seems so. kMRMediaRemoteNowPlayingInfoArtworkData is just returning null. Thanks for the help!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment