So you are thinking what could I do with AppleScript records or scriptable application.
You may ask could I take data from system A to system B… In event-driven application like
Node-Red (it use Node.js). To make this simple we need to first make sure we have the right format as input for Node-Red.
That format is JSON String.
- So we need to convert AppleScript record to JSONString. We will use ASObjC for that.
- In Node-Red we inject message every 5s
- The flow in Node-Red will convert JSON String to JSON Object.
- To visual the change we setup a dashboard of table in Node-Red.
We play tracks from Apple Music that will feed the dashboard with data every 5s.
Ps. This is a standard script to execute a handler function it doesn’t use any arguments.
If you wonder what this is… return “[”… “]” in handler is all about.
To make a array object of JSON Objects we need it for the table in the dashboard. If we only like to get the values from some keys in JSON we do not need it.
use framework "Foundation"
use scripting additions
on run argv
set aList to {}
try
set countItems to count items of argv
repeat with i from 1 to countItems
if countItems > 0 then
copy item i of argv to end of aList
end if
end repeat
end try
-- the handler
its makeJSONString(getTrackInfo())
end run
on getTrackInfo()
tell application "Music"
if player state is playing then
set currentTrack to current track
tell currentTrack
{|Artist|:its artist, |Name|:its name, |Album|:its album, |Genre|:its genre, |Year|:its year}
end tell
else
return
end if
end tell
end getTrackInfo
on makeJSONString(theRecord)
set {theData, theError} to current application's NSJSONSerialization's dataWithJSONObject:theRecord options:0 |error|:(reference)
if theData is missing value then error (theError's localizedDescription() as text)
set theString to current application's NSString's alloc()'s initWithData:theData encoding:(current application's NSUTF8StringEncoding)
return "[" & (theString as text) & "]"
end makeJSONString