Skip to content

Commit 349058c

Browse files
committed
migrated our script to jxa for cleaner code and proper json serialization
1 parent 9821b6a commit 349058c

4 files changed

Lines changed: 40 additions & 37 deletions

File tree

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ file(GLOB_RECURSE SOURCES "src/*.cpp")
55

66
#enable objective c support on mac os, needed for wxwidgets and compile for both intel macs and apple sillicon macs
77
if(APPLE)
8-
list(APPEND SOURCES "src/backends/darwin.mm" ${CMAKE_SOURCE_DIR}/osx/icon.icns ${CMAKE_SOURCE_DIR}/osx/MediaRemote.scptd)
8+
list(APPEND SOURCES "src/backends/darwin.mm" ${CMAKE_SOURCE_DIR}/osx/icon.icns ${CMAKE_SOURCE_DIR}/osx/MediaRemote.js)
99
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "" FORCE)
1010
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "" FORCE)
1111
project ("PlayerLink" LANGUAGES C CXX OBJCXX)
@@ -32,7 +32,7 @@ if(WIN32)
3232
elseif(APPLE)
3333
set_target_properties(PlayerLink PROPERTIES MACOSX_BUNDLE TRUE)
3434
set_source_files_properties(${CMAKE_SOURCE_DIR}/osx/icon.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
35-
set_source_files_properties(${CMAKE_SOURCE_DIR}/osx/MediaRemote.scptd PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
35+
set_source_files_properties(${CMAKE_SOURCE_DIR}/osx/MediaRemote.js PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
3636
set_target_properties(PlayerLink PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/osx/Info.plist)
3737
elseif(UNIX AND NOT APPLE)
3838
list(APPEND LIBRARIES dbus)

osx/MediaRemote.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
ObjC.import('Foundation');
2+
try {
3+
const frameworkPath = '/System/Library/PrivateFrameworks/MediaRemote.framework';
4+
const framework = $.NSBundle.bundleWithPath($(frameworkPath));
5+
framework.load
6+
7+
const MRNowPlayingRequest = $.NSClassFromString('MRNowPlayingRequest');
8+
9+
const playerPath = MRNowPlayingRequest.localNowPlayingPlayerPath;
10+
const bundleID = ObjC.unwrap(playerPath.client.bundleIdentifier);
11+
12+
const nowPlayingItem = MRNowPlayingRequest.localNowPlayingItem;
13+
const info = nowPlayingItem.nowPlayingInfo;
14+
15+
const title = info.valueForKey('kMRMediaRemoteNowPlayingInfoTitle');
16+
const album = info.valueForKey('kMRMediaRemoteNowPlayingInfoAlbum');
17+
const artist = info.valueForKey('kMRMediaRemoteNowPlayingInfoArtist');
18+
const duration = info.valueForKey('kMRMediaRemoteNowPlayingInfoDuration');
19+
const playbackStatus = info.valueForKey('kMRMediaRemoteNowPlayingInfoPlaybackRate');
20+
const elapsed = info.valueForKey('kMRMediaRemoteNowPlayingInfoElapsedTime');
21+
22+
JSON.stringify({
23+
title: ObjC.unwrap(title),
24+
album: ObjC.unwrap(album),
25+
artist: ObjC.unwrap(artist),
26+
duration: ObjC.unwrap(duration),
27+
playbackStatus: ObjC.unwrap(playbackStatus),
28+
elapsed: ObjC.unwrap(elapsed),
29+
player: ObjC.unwrap(bundleID)
30+
});
31+
} catch (error) {
32+
JSON.stringify({ player: 'none', error: error.toString() });
33+
}

osx/MediaRemote.scptd

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/backends/darwin.mm

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ void hideDockIcon(bool shouldHide) {
3939
}
4040

4141
std::shared_ptr<MediaInfo> backend::getMediaInformation() {
42-
static NSString* script = getFilePathFromBundle(@"MediaRemote", @"scptd");
43-
NSString* output = executeCommand(@"/usr/bin/osascript", @[script]);
42+
static NSString* script = getFilePathFromBundle(@"MediaRemote", @"js");
43+
NSString* output = executeCommand(@"/usr/bin/osascript", @[@"-l", @"JavaScript", script]);
4444
nlohmann::json j = nlohmann::json::parse([output UTF8String]);
4545

4646
std::string appName = j["player"].get<std::string>();
4747
if (appName == "none")
4848
return nullptr;
4949

50-
bool paused = j["playbackStatus"].get<std::string>() == "0";
50+
bool paused = j["playbackStatus"].get<int>() == 0;
5151

5252
std::string songTitle = j["title"].get<std::string>();
5353

@@ -58,10 +58,10 @@ void hideDockIcon(bool shouldHide) {
5858
int64_t elapsedTimeMs = 0;
5959
int64_t durationMs = 0;
6060
try {
61-
double durationNumber = std::stod(j["duration"].get<std::string>());
61+
double durationNumber = j["duration"].get<double>();
6262
durationMs = static_cast<int64_t>(durationNumber * 1000);
6363

64-
double elapsedTimeNumber = std::stod(j["elapsed"].get<std::string>());
64+
double elapsedTimeNumber = j["elapsed"].get<double>();
6565
elapsedTimeMs = static_cast<int64_t>(elapsedTimeNumber * 1000);
6666
} catch (...) {}
6767

0 commit comments

Comments
 (0)