Skip to content

Commit

Permalink
mac/remote: show external covers in Now Playing Info Center
Browse files Browse the repository at this point in the history
  • Loading branch information
Akemi committed Oct 19, 2024
1 parent 8cc3160 commit 37159a8
Showing 1 changed file with 50 additions and 3 deletions.
53 changes: 50 additions & 3 deletions osdep/mac/remote_command_center.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,18 @@ class RemoteCommandCenter: EventSubscriber {
var chapter: String? { didSet { updateInfoCenter() } }
var album: String? { didSet { updateInfoCenter() } }
var artist: String? { didSet { updateInfoCenter() } }
var cover: NSImage
var path: String?
var coverPath: String?
var cover: NSImage? { didSet { updateInfoCenter() } }
var defaultCover: NSImage

let queue: DispatchQueue = DispatchQueue(label: "io.mpv.remote.queue")
var infoCenter: MPNowPlayingInfoCenter { return MPNowPlayingInfoCenter.default() }
var commandCenter: MPRemoteCommandCenter { return MPRemoteCommandCenter.shared() }

init(_ appHub: AppHub) {
self.appHub = appHub
cover = appHub.getIcon()
defaultCover = appHub.getIcon()

configs = [
commandCenter.pauseCommand: Config(key: MP_KEY_PAUSEONLY, handler: keyHandler),
Expand Down Expand Up @@ -103,6 +107,8 @@ class RemoteCommandCenter: EventSubscriber {
event?.subscribe(self, event: .init(name: "chapter-metadata/title", format: MPV_FORMAT_STRING))
event?.subscribe(self, event: .init(name: "metadata/by-key/album", format: MPV_FORMAT_STRING))
event?.subscribe(self, event: .init(name: "metadata/by-key/artist", format: MPV_FORMAT_STRING))
event?.subscribe(self, event: .init(name: "path", format: MPV_FORMAT_STRING))
event?.subscribe(self, event: .init(name: "track-list", format: MPV_FORMAT_NODE))
}

func start() {
Expand Down Expand Up @@ -144,6 +150,7 @@ class RemoteCommandCenter: EventSubscriber {
}

func updateInfoCenter() {
let cover = cover ?? defaultCover
infoCenter.playbackState = isPaused ? .paused : .playing
infoCenter.nowPlayingInfo = (infoCenter.nowPlayingInfo ?? [:]).merging([
MPNowPlayingInfoPropertyMediaType: NSNumber(value: MPNowPlayingInfoMediaType.video.rawValue),
Expand All @@ -154,10 +161,48 @@ class RemoteCommandCenter: EventSubscriber {
MPMediaItemPropertyTitle: title,
MPMediaItemPropertyArtist: artist ?? chapter ?? "",
MPMediaItemPropertyAlbumTitle: album ?? "",
MPMediaItemPropertyArtwork: MPMediaItemArtwork(boundsSize: cover.size) { _ in return self.cover }
MPMediaItemPropertyArtwork: MPMediaItemArtwork(boundsSize: cover.size) { _ in return cover }
]) { (_, new) in new }
}

func updateCover(tracks: [Any?]) {
var imageCoverPath: String?
var externalCoverPath: String?

for item in tracks {
guard let track = item as? [String: Any?] else { continue }
if (track["image"] as? Bool) == true {
// opened file is an image
if track["external"] as? Bool == false && track["albumart"] as? Bool == false && imageCoverPath == nil {
imageCoverPath = path
continue
}
// external cover
if let filename = track["external-filename"] as? String, externalCoverPath == nil {
externalCoverPath = filename
continue
}
}
}

// read cover image on separate thread
queue.async {
guard let path = imageCoverPath ?? externalCoverPath else {
self.cover = nil
self.coverPath = nil
return
}
if self.coverPath == path { return }

var image = NSImage(contentsOf: URL(fileURLWithPath: path))
if let url = URL(string: path), image == nil {
image = NSImage(contentsOf: url)
}
self.cover = image
self.coverPath = path
}
}

lazy var keyHandler: ConfigHandler = { event in
guard let config = self.configs[event.command] else {
return .commandFailed
Expand Down Expand Up @@ -196,6 +241,8 @@ class RemoteCommandCenter: EventSubscriber {
case "chapter-metadata/title": chapter = event.string
case "metadata/by-key/album": album = event.string
case "metadata/by-key/artist": artist = event.string
case "path": path = event.string
case "track-list": updateCover(tracks: event.array)
default: break
}
}
Expand Down

0 comments on commit 37159a8

Please sign in to comment.