diff --git a/Model/Import Export Settings/Exporters/PlayerSettingsGroupExporter.swift b/Model/Import Export Settings/Exporters/PlayerSettingsGroupExporter.swift index bdf3e3eb..11330500 100644 --- a/Model/Import Export Settings/Exporters/PlayerSettingsGroupExporter.swift +++ b/Model/Import Export Settings/Exporters/PlayerSettingsGroupExporter.swift @@ -7,6 +7,7 @@ final class PlayerSettingsGroupExporter: SettingsGroupExporter { "playerInstanceID": Defaults[.playerInstanceID] ?? "", "pauseOnHidingPlayer": Defaults[.pauseOnHidingPlayer], "closeVideoOnEOF": Defaults[.closeVideoOnEOF], + "exitFullscreenOnEOF": Defaults[.exitFullscreenOnEOF], "expandVideoDescription": Defaults[.expandVideoDescription], "collapsedLinesDescription": Defaults[.collapsedLinesDescription], "showChapters": Defaults[.showChapters], diff --git a/Model/Import Export Settings/Importers/PlayerSettingsGroupImporter.swift b/Model/Import Export Settings/Importers/PlayerSettingsGroupImporter.swift index 5333dc4b..2553edbb 100644 --- a/Model/Import Export Settings/Importers/PlayerSettingsGroupImporter.swift +++ b/Model/Import Export Settings/Importers/PlayerSettingsGroupImporter.swift @@ -17,6 +17,10 @@ struct PlayerSettingsGroupImporter { Defaults[.closeVideoOnEOF] = closeVideoOnEOF } + if let exitFullscreenOnEOF = json["exitFullscreenOnEOF"].bool { + Defaults[.exitFullscreenOnEOF] = exitFullscreenOnEOF + } + if let expandVideoDescription = json["expandVideoDescription"].bool { Defaults[.expandVideoDescription] = expandVideoDescription } diff --git a/Model/Player/Backends/PlayerBackend.swift b/Model/Player/Backends/PlayerBackend.swift index 18c6ca3d..96cd69cb 100644 --- a/Model/Player/Backends/PlayerBackend.swift +++ b/Model/Player/Backends/PlayerBackend.swift @@ -111,15 +111,22 @@ extension PlayerBackend { model.prepareCurrentItemForHistory(finished: true) if model.queue.isEmpty { - if Defaults[.closeVideoOnEOF] { - #if os(tvOS) + #if os(tvOS) + if Defaults[.closeVideoOnEOF] { if model.activeBackend == .appleAVPlayer { model.avPlayerBackend.controller?.dismiss(animated: false) } - #endif - model.resetQueue() - model.hide() - } + model.resetQueue() + model.hide() + } + #else + if Defaults[.closeVideoOnEOF] { + model.resetQueue() + model.hide() + } else if Defaults[.exitFullscreenOnEOF], model.playingFullScreen { + model.exitFullScreen() + } + #endif } else { model.advanceToNextItem() } diff --git a/Model/Player/PlayerModel.swift b/Model/Player/PlayerModel.swift index c4be82f7..343a012b 100644 --- a/Model/Player/PlayerModel.swift +++ b/Model/Player/PlayerModel.swift @@ -1001,6 +1001,7 @@ final class PlayerModel: ObservableObject { logger.info("entering fullscreen") toggleFullscreen(false, showControls: showControls) + self.playingFullScreen = true } func exitFullScreen(showControls: Bool = true) { @@ -1008,6 +1009,7 @@ final class PlayerModel: ObservableObject { logger.info("exiting fullscreen") toggleFullscreen(true, showControls: showControls) + self.playingFullScreen = false } func updateNowPlayingInfo() { diff --git a/Shared/Defaults.swift b/Shared/Defaults.swift index 1eb18ad1..f6e918f4 100644 --- a/Shared/Defaults.swift +++ b/Shared/Defaults.swift @@ -75,6 +75,7 @@ extension Defaults.Keys { static let expandVideoDescription = Key("expandVideoDescription", default: expandVideoDescriptionDefault) static let collapsedLinesDescription = Key("collapsedLinesDescription", default: 5) + static let exitFullscreenOnEOF = Key("exitFullscreenOnEOF", default: true) static let showChapters = Key("showChapters", default: true) static let showChapterThumbnails = Key("showChapterThumbnails", default: true) diff --git a/Shared/Settings/PlayerSettings.swift b/Shared/Settings/PlayerSettings.swift index 8df0232e..c933f270 100644 --- a/Shared/Settings/PlayerSettings.swift +++ b/Shared/Settings/PlayerSettings.swift @@ -12,6 +12,7 @@ struct PlayerSettings: View { #if !os(tvOS) @Default(.showScrollToTopInComments) private var showScrollToTopInComments @Default(.collapsedLinesDescription) private var collapsedLinesDescription + @Default(.exitFullscreenOnEOF) private var exitFullscreenOnEOF #endif @Default(.expandVideoDescription) private var expandVideoDescription @Default(.pauseOnHidingPlayer) private var pauseOnHidingPlayer @@ -86,6 +87,9 @@ struct PlayerSettings: View { } pauseOnHidingPlayerToggle closeVideoOnEOFToggle + #if !os(tvOS) + exitFullscreenOnEOFToggle + #endif #if !os(macOS) pauseOnEnteringBackgroundToogle #endif @@ -300,6 +304,13 @@ struct PlayerSettings: View { Toggle("Close video and player on end", isOn: $closeVideoOnEOF) } + #if !os(tvOS) + private var exitFullscreenOnEOFToggle: some View { + Toggle("Exit fullscreen on end", isOn: $exitFullscreenOnEOF) + .disabled(closeVideoOnEOF) + } + #endif + #if !os(macOS) private var pauseOnEnteringBackgroundToogle: some View { Toggle("Pause when entering background", isOn: $pauseOnEnteringBackground)