1313extern void MRMediaRemoteGetNowPlayingApplicationDisplayID (dispatch_queue_t queue, void (^callback)(_Nullable CFStringRef displayID)) __attribute__((weak_import));
1414extern void MRMediaRemoteGetNowPlayingApplicationDisplayName (int unknown, dispatch_queue_t queue, void (^callback)(_Nullable CFStringRef name)) __attribute__((weak_import));
1515
16- static const char * getMediaByMediaRemote (FFMediaResult* result)
16+ static const char * getMediaByMediaRemote (FFMediaResult* result, bool saveCover )
1717{
1818 #define FF_TEST_FN_EXISTANCE (fn ) if (!fn) return " MediaRemote function " #fn " is not available"
1919 FF_TEST_FN_EXISTANCE (MRMediaRemoteGetNowPlayingInfo);
3131 ffCfDictGetString (info, CFSTR (" kMRMediaRemoteNowPlayingInfoTitle" ), &result->song );
3232 ffCfDictGetString (info, CFSTR (" kMRMediaRemoteNowPlayingInfoArtist" ), &result->artist );
3333 ffCfDictGetString (info, CFSTR (" kMRMediaRemoteNowPlayingInfoAlbum" ), &result->album );
34- NSData * artworkData = (__bridge NSData *) CFDictionaryGetValue (info, CFSTR ( " kMRMediaRemoteNowPlayingInfoArtworkData " ));
35- if (artworkData )
34+
35+ if (saveCover )
3636 {
37- CFStringRef mime = (CFStringRef) CFDictionaryGetValue (info, CFSTR (" kMRMediaRemoteNowPlayingInfoArtworkMIMEType" ));
37+ NSData * artworkData = (__bridge NSData *) CFDictionaryGetValue (info, CFSTR (" kMRMediaRemoteNowPlayingInfoArtworkData" ));
38+ if (artworkData)
39+ {
40+ CFStringRef mime = (CFStringRef) CFDictionaryGetValue (info, CFSTR (" kMRMediaRemoteNowPlayingInfoArtworkMIMEType" ));
3841#pragma clang diagnostic push
3942#pragma clang diagnostic ignored "-Wdeprecated-declarations"
40- FF_CFTYPE_AUTO_RELEASE CFStringRef uti = UTTypeCreatePreferredIdentifierForTag (kUTTagClassMIMEType , mime, NULL );
41- FF_CFTYPE_AUTO_RELEASE CFStringRef ext = UTTypeCopyPreferredTagWithClass (uti, kUTTagClassFilenameExtension );
43+ FF_CFTYPE_AUTO_RELEASE CFStringRef uti = UTTypeCreatePreferredIdentifierForTag (kUTTagClassMIMEType , mime, NULL );
44+ FF_CFTYPE_AUTO_RELEASE CFStringRef ext = UTTypeCopyPreferredTagWithClass (uti, kUTTagClassFilenameExtension );
4245#pragma clang diagnostic pop
43- NSString *tmpDir = NSTemporaryDirectory ();
44- NSString *uuid = [[NSUUID UUID ] UUIDString ];
45- NSString *path = [tmpDir stringByAppendingPathComponent: [NSString stringWithFormat: @" ff_%@ .%@ " , uuid, ext ? (__bridge NSString *) ext : @" img" ]];
46- if ([artworkData writeToFile: path atomically: NO ])
47- ffStrbufSetS (&result->cover , path.UTF8String );
46+ NSString *tmpDir = NSTemporaryDirectory ();
47+ NSString *uuid = [[NSUUID UUID ] UUIDString ];
48+ NSString *path = [tmpDir stringByAppendingPathComponent: [NSString stringWithFormat: @" ff_%@ .%@ " , uuid, ext ? (__bridge NSString *) ext : @" img" ]];
49+ if ([artworkData writeToFile: path atomically: NO ])
50+ ffStrbufSetS (&result->cover , path.UTF8String );
51+ }
4852 }
4953 }
5054 else
8791}
8892
8993__attribute__ ((visibility(" default" ), used))
90- int ffPrintMediaByMediaRemote(void )
94+ int ffPrintMediaByMediaRemote(bool saveCover )
9195{
9296 FFMediaResult media = {
9397 .status = ffStrbufCreate (),
@@ -98,7 +102,7 @@ int ffPrintMediaByMediaRemote(void)
98102 .player = ffStrbufCreate (),
99103 .cover = ffStrbufCreate (),
100104 };
101- if (getMediaByMediaRemote (&media) != NULL )
105+ if (getMediaByMediaRemote (&media, saveCover ) != NULL )
102106 return 1 ;
103107 ffStrbufPutTo (&media.status , stdout);
104108 ffStrbufPutTo (&media.song , stdout);
@@ -117,10 +121,10 @@ int ffPrintMediaByMediaRemote(void)
117121 return 0 ;
118122}
119123
120- static const char * getMediaByAuthorizedProcess (FFMediaResult* result)
124+ static const char * getMediaByAuthorizedProcess (FFMediaResult* result, bool saveCover )
121125{
122126 // #1737
123- FF_STRBUF_AUTO_DESTROY script = ffStrbufCreateF (" import ctypes;ctypes.CDLL('%s ').ffPrintMediaByMediaRemote()" , instance.state .platform .exePath .chars );
127+ FF_STRBUF_AUTO_DESTROY script = ffStrbufCreateF (" import ctypes;ctypes.CDLL('%s ').ffPrintMediaByMediaRemote(%s )" , instance.state .platform .exePath .chars , saveCover ? " True " : " False " );
124128 FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate ();
125129
126130 const char * error = ffProcessAppendStdOut (&buffer, (char * const []) {
@@ -141,13 +145,13 @@ int ffPrintMediaByMediaRemote(void)
141145 return NULL ;
142146}
143147
144- void ffDetectMediaImpl (FFMediaResult* media)
148+ void ffDetectMediaImpl (FFMediaResult* media, bool saveCover )
145149{
146150 const char * error;
147151 if (@available (macOS 15.4 , *))
148- error = getMediaByAuthorizedProcess (media);
152+ error = getMediaByAuthorizedProcess (media, saveCover );
149153 else
150- error = getMediaByMediaRemote (media);
154+ error = getMediaByMediaRemote (media, saveCover );
151155 if (error)
152156 ffStrbufAppendS (&media->error , error);
153157 else if (media->player .length == 0 && media->playerId .length > 0 )
0 commit comments