From 81e2bc62cb37ac6db156f43da8f03a4c00e1b731 Mon Sep 17 00:00:00 2001 From: David Emanuel Bieregger <46626041+BierDav@users.noreply.github.com> Date: Wed, 22 Apr 2026 07:34:51 +0200 Subject: [PATCH] Enhance YouTubeMusicController and YouTubeMusicConfiguration to support multiple bundle identifiers --- .../YouTubeMusicController.swift | 23 +++++++++++++------ .../YouTubeMusicModels.swift | 16 +++++++++++-- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/boringNotch/MediaControllers/YouTube Music Controller/YouTubeMusicController.swift b/boringNotch/MediaControllers/YouTube Music Controller/YouTubeMusicController.swift index 59bd5c538..56a9e9849 100644 --- a/boringNotch/MediaControllers/YouTube Music Controller/YouTubeMusicController.swift +++ b/boringNotch/MediaControllers/YouTube Music Controller/YouTubeMusicController.swift @@ -99,7 +99,7 @@ final class YouTubeMusicController: MediaControllerProtocol { nonisolated func isActive() -> Bool { NSWorkspace.shared.runningApplications.contains { - $0.bundleIdentifier == configuration.bundleIdentifier + configuration.supports(bundleIdentifier: $0.bundleIdentifier) } } @@ -170,7 +170,7 @@ final class YouTubeMusicController: MediaControllerProtocol { private func handleAppLaunched(_ notification: Notification) async { guard let app = notification.userInfo?[NSWorkspace.applicationUserInfoKey] as? NSRunningApplication, - app.bundleIdentifier == configuration.bundleIdentifier else { + configuration.supports(bundleIdentifier: app.bundleIdentifier) else { return } @@ -179,7 +179,7 @@ final class YouTubeMusicController: MediaControllerProtocol { private func handleAppTerminated(_ notification: Notification) async { guard let app = notification.userInfo?[NSWorkspace.applicationUserInfoKey] as? NSRunningApplication, - app.bundleIdentifier == configuration.bundleIdentifier else { + configuration.supports(bundleIdentifier: app.bundleIdentifier) else { return } @@ -392,6 +392,7 @@ final class YouTubeMusicController: MediaControllerProtocol { private func updatePlaybackState(with response: PlaybackResponse) async { var newState = playbackState + newState.bundleIdentifier = activeBundleIdentifier() ?? configuration.bundleIdentifier newState.isPlaying = !response.isPaused @@ -457,16 +458,24 @@ final class YouTubeMusicController: MediaControllerProtocol { private func resetPlaybackState() { playbackState = PlaybackState( - bundleIdentifier: configuration.bundleIdentifier, + bundleIdentifier: activeBundleIdentifier() ?? configuration.bundleIdentifier, isPlaying: false ) } private func launchApp() { - guard let url = NSWorkspace.shared.urlForApplication(withBundleIdentifier: configuration.bundleIdentifier) else { - return + for bundleIdentifier in configuration.bundleIdentifiers { + if let url = NSWorkspace.shared.urlForApplication(withBundleIdentifier: bundleIdentifier) { + NSWorkspace.shared.open(url) + return + } } - NSWorkspace.shared.open(url) + } + + private func activeBundleIdentifier() -> String? { + NSWorkspace.shared.runningApplications.first { + configuration.supports(bundleIdentifier: $0.bundleIdentifier) + }?.bundleIdentifier } private func updateRepeatMode(_ mode: String) { diff --git a/boringNotch/MediaControllers/YouTube Music Controller/YouTubeMusicModels.swift b/boringNotch/MediaControllers/YouTube Music Controller/YouTubeMusicModels.swift index 7b387dc0a..79171c224 100644 --- a/boringNotch/MediaControllers/YouTube Music Controller/YouTubeMusicModels.swift +++ b/boringNotch/MediaControllers/YouTube Music Controller/YouTubeMusicModels.swift @@ -10,13 +10,25 @@ import Foundation // MARK: - Configuration struct YouTubeMusicConfiguration: Sendable { let baseURL: String - let bundleIdentifier: String + let bundleIdentifiers: [String] let reconnectDelay: ClosedRange let updateInterval: TimeInterval + + var bundleIdentifier: String { + bundleIdentifiers.first ?? "com.github.th-ch.youtube-music" + } + + func supports(bundleIdentifier: String?) -> Bool { + guard let bundleIdentifier else { return false } + return bundleIdentifiers.contains(bundleIdentifier) + } static let `default` = YouTubeMusicConfiguration( baseURL: "http://localhost:26538", - bundleIdentifier: "com.github.th-ch.youtube-music", + bundleIdentifiers: [ + "com.github.th-ch.youtube-music", + "com.sertacozercan.Kaset" + ], reconnectDelay: 1...60, updateInterval: 2.0 )