@@ -649,6 +649,51 @@ void AskForFullDiskAccess(const Napi::CallbackInfo &info) {
649
649
return deferred.Promise ();
650
650
}
651
651
652
+ // Request Apple Music Library access.
653
+ Napi::Promise AskForMusicLibraryAccess (const Napi::CallbackInfo &info) {
654
+ Napi::Env env = info.Env ();
655
+ Napi::Promise::Deferred deferred = Napi::Promise::Deferred::New (env);
656
+ Napi::ThreadSafeFunction ts_fn = Napi::ThreadSafeFunction::New (
657
+ env, Napi::Function::New (env, NoOp), " musicLibraryCallback" , 0 , 1 );
658
+
659
+ if (@available (macOS 10.16 , *)) {
660
+ std::string auth_status = MusicLibraryAuthStatus ();
661
+
662
+ if (auth_status == kNotDetermined ) {
663
+ __block Napi::ThreadSafeFunction tsfn = ts_fn;
664
+ [SKCloudServiceController
665
+ requestAuthorization: ^(SKCloudServiceAuthorizationStatus status) {
666
+ auto callback = [=](Napi::Env env, Napi::Function js_cb,
667
+ const char *granted) {
668
+ deferred.Resolve (Napi::String::New (env, granted));
669
+ };
670
+
671
+ bool granted =
672
+ status == SKCloudServiceAuthorizationStatusAuthorized;
673
+ tsfn.BlockingCall (granted ? " authorized" : " denied" , callback);
674
+ tsfn.Release ();
675
+ }];
676
+ } else if (auth_status == kDenied ) {
677
+ NSWorkspace *workspace = [[NSWorkspace alloc ] init ];
678
+ NSString *pref_string = @" x-apple.systempreferences:com.apple.preference."
679
+ @" security?Privacy_Media" ;
680
+
681
+ [workspace openURL: [NSURL URLWithString: pref_string]];
682
+
683
+ ts_fn.Release ();
684
+ deferred.Resolve (Napi::String::New (env, kDenied ));
685
+ } else {
686
+ ts_fn.Release ();
687
+ deferred.Resolve (Napi::String::New (env, auth_status));
688
+ }
689
+ } else {
690
+ ts_fn.Release ();
691
+ deferred.Resolve (Napi::String::New (env, kAuthorized ));
692
+ }
693
+
694
+ return deferred.Promise ();
695
+ }
696
+
652
697
// Request Screen Capture Access.
653
698
void AskForScreenCaptureAccess (const Napi::CallbackInfo &info) {
654
699
if (@available (macOS 10.15 , *)) {
@@ -706,6 +751,8 @@ void AskForAccessibilityAccess(const Napi::CallbackInfo &info) {
706
751
Napi::Function::New (env, AskForCameraAccess));
707
752
exports.Set (Napi::String::New (env, " askForMicrophoneAccess" ),
708
753
Napi::Function::New (env, AskForMicrophoneAccess));
754
+ exports.Set (Napi::String::New (env, " askForMusicLibraryAccess" ),
755
+ Napi::Function::New (env, AskForMusicLibraryAccess));
709
756
exports.Set (Napi::String::New (env, " askForSpeechRecognitionAccess" ),
710
757
Napi::Function::New (env, AskForSpeechRecognitionAccess));
711
758
exports.Set (Napi::String::New (env, " askForPhotosAccess" ),
0 commit comments