jellyflood/Shared/Objects/MediaPlayerManager/NowPlayable/NowPlayableCommand.swift

116 lines
3.3 KiB
Swift

//
// Swiftfin is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
//
// Copyright (c) 2025 Jellyfin & Jellyfin Contributors
//
import Foundation
import MediaPlayer
enum NowPlayableCommand: CaseIterable {
// Play/Pause
case pause
case play
case stop
case togglePausePlay
// Track
case nextTrack
case previousTrack
case changeRepeatMode
case changeShuffleMode
// Seeking/Rate
case changePlaybackRate
case seekBackward
case seekForward
case skipBackward
case skipForward
case changePlaybackPosition
// Like/Dislike
case rating
case like
case dislike
// Bookmark
case bookmark
// Languages
case enableLanguageOption
case disableLanguageOption
var remoteCommand: MPRemoteCommand {
let remoteCommandCenter = MPRemoteCommandCenter.shared()
switch self {
case .pause:
return remoteCommandCenter.pauseCommand
case .play:
return remoteCommandCenter.playCommand
case .stop:
return remoteCommandCenter.stopCommand
case .togglePausePlay:
return remoteCommandCenter.togglePlayPauseCommand
case .nextTrack:
return remoteCommandCenter.nextTrackCommand
case .previousTrack:
return remoteCommandCenter.previousTrackCommand
case .changeRepeatMode:
return remoteCommandCenter.changeRepeatModeCommand
case .changeShuffleMode:
return remoteCommandCenter.changeShuffleModeCommand
case .changePlaybackRate:
return remoteCommandCenter.changePlaybackRateCommand
case .seekBackward:
return remoteCommandCenter.seekBackwardCommand
case .seekForward:
return remoteCommandCenter.seekForwardCommand
case .skipBackward:
return remoteCommandCenter.skipBackwardCommand
case .skipForward:
return remoteCommandCenter.skipForwardCommand
case .changePlaybackPosition:
return remoteCommandCenter.changePlaybackPositionCommand
case .rating:
return remoteCommandCenter.ratingCommand
case .like:
return remoteCommandCenter.likeCommand
case .dislike:
return remoteCommandCenter.dislikeCommand
case .bookmark:
return remoteCommandCenter.bookmarkCommand
case .enableLanguageOption:
return remoteCommandCenter.enableLanguageOptionCommand
case .disableLanguageOption:
return remoteCommandCenter.disableLanguageOptionCommand
}
}
func removeHandler() {
remoteCommand.removeTarget(nil)
}
func addHandler(_ handler: @escaping (NowPlayableCommand, MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus) {
remoteCommand.removeTarget(nil)
switch self {
case .skipBackward:
MPRemoteCommandCenter.shared().skipBackwardCommand.preferredIntervals = [15.0]
case .skipForward:
MPRemoteCommandCenter.shared().skipForwardCommand.preferredIntervals = [15.0]
default: ()
}
remoteCommand.addTarget { handler(self, $0) }
}
func isEnabled(_ isEnabled: Bool) {
remoteCommand.isEnabled = isEnabled
}
}