Add advanced setting "Show video context menu options to force selected backend"

This commit is contained in:
Arkadiusz Fal 2023-05-26 22:49:38 +02:00
parent e5f137a2d2
commit 562df2d9ba
4 changed files with 40 additions and 1 deletions

View File

@ -55,6 +55,7 @@ final class PlayerModel: ObservableObject {
@Published var presentingPlayer = false { didSet { handlePresentationChange() } }
@Published var activeBackend = PlayerBackendType.mpv
@Published var forceBackendOnPlay: PlayerBackendType?
var avPlayerBackend = AVPlayerBackend()
var mpvBackend = MPVBackend()
@ -416,6 +417,10 @@ final class PlayerModel: ObservableObject {
)
}
DispatchQueue.main.async {
self.forceBackendOnPlay = nil
}
if !upgrading {
DispatchQueue.global(qos: .userInitiated).asyncAfter(deadline: .now() + 0.5) {
self.updateCurrentArtwork()
@ -452,7 +457,7 @@ final class PlayerModel: ObservableObject {
return
}
if let backend = (live && forceAVPlayerForLiveStreams) ? PlayerBackendType.appleAVPlayer : qualityProfile?.backend,
if let backend = forceBackendOnPlay ?? ((live && forceAVPlayerForLiveStreams) ? PlayerBackendType.appleAVPlayer : qualityProfile?.backend),
backend != activeBackend,
backend == .appleAVPlayer || !(avPlayerBackend.startPictureInPictureOnPlay || playingInPictureInPicture)
{
@ -621,6 +626,7 @@ final class PlayerModel: ObservableObject {
func closeCurrentItem(finished: Bool = false) {
pause()
videoBeingOpened = nil
forceBackendOnPlay = nil
closing = true
controls.presentingControls = false

View File

@ -198,6 +198,7 @@ extension Defaults.Keys {
#endif
static let showMPVPlaybackStats = Key<Bool>("showMPVPlaybackStats", default: false)
static let showPlayNowInBackendContextMenu = Key<Bool>("showPlayNowInBackendContextMenu", default: false)
#if os(macOS)
static let playerDetailsPageButtonLabelStyleDefault = ButtonLabelStyle.iconAndText

View File

@ -8,6 +8,7 @@ struct AdvancedSettings: View {
@Default(.mpvEnableLogging) private var mpvEnableLogging
@Default(.showCacheStatus) private var showCacheStatus
@Default(.feedCacheSize) private var feedCacheSize
@Default(.showPlayNowInBackendContextMenu) private var showPlayNowInBackendContextMenu
@State private var filesToShare = [MPVClient.logFile]
@State private var presentingShareSheet = false
@ -56,6 +57,10 @@ struct AdvancedSettings: View {
}
@ViewBuilder var advancedSettings: some View {
Section(header: SettingsHeader(text: "Advanced")) {
showPlayNowInBackendButtonsToggle
}
Section(header: SettingsHeader(text: "MPV"), footer: mpvFooter) {
showMPVPlaybackStatsToggle
#if !os(tvOS)
@ -115,6 +120,10 @@ struct AdvancedSettings: View {
.foregroundColor(.secondary)
}
var showPlayNowInBackendButtonsToggle: some View {
Toggle("Show video context menu options to force selected backend", isOn: $showPlayNowInBackendContextMenu)
}
var showMPVPlaybackStatsToggle: some View {
Toggle("Show playback statistics", isOn: $showMPVPlaybackStats)
}

View File

@ -21,6 +21,7 @@ struct VideoContextMenuView: View {
@FetchRequest private var watchRequest: FetchedResults<Watch>
@Default(.saveHistory) private var saveHistory
@Default(.showPlayNowInBackendContextMenu) private var showPlayNowInBackendContextMenu
private var backgroundContext = PersistenceController.shared.container.newBackgroundContext()
@ -71,6 +72,14 @@ struct VideoContextMenuView: View {
#endif
}
if showPlayNowInBackendContextMenu {
Section {
ForEach(PlayerBackendType.allCases, id: \.self) { backend in
playNowInBackendButton(backend)
}
}
}
Section {
playNextButton
addToQueueButton
@ -187,6 +196,20 @@ struct VideoContextMenuView: View {
}
}
private func playNowInBackendButton(_ backend: PlayerBackendType) -> some View {
Button {
if player.musicMode {
player.toggleMusicMode()
}
player.forceBackendOnPlay = backend
player.play(video)
} label: {
Label("Play Now in \(backend.label)", systemImage: "play")
}
}
private var playNowInPictureInPictureButton: some View {
Button {
player.avPlayerBackend.startPictureInPictureOnPlay = true