Watch Next behavior and settings

This commit is contained in:
Arkadiusz Fal
2022-12-18 19:39:03 +01:00
parent b90c856e21
commit 39fc23c5dc
23 changed files with 487 additions and 451 deletions

View File

@@ -531,10 +531,6 @@ final class AVPlayerBackend: PlayerBackend {
}
@objc func itemDidPlayToEndTime() {
if Defaults[.closeLastItemOnPlaybackEnd] {
model.prepareCurrentItemForHistory(finished: true)
}
eofPlaybackModeAction()
}

View File

@@ -94,37 +94,59 @@ extension PlayerBackend {
}
func eofPlaybackModeAction() {
let timer = Delay.by(5) {
let loopAction = {
model.backend.seek(to: .zero, seekType: .loopRestart) { _ in
self.model.play()
}
}
guard model.playbackMode != .loopOne else {
loopAction()
return
}
let action = {
switch model.playbackMode {
case .queue, .shuffle:
if Defaults[.closeLastItemOnPlaybackEnd] {
model.prepareCurrentItemForHistory(finished: true)
}
model.prepareCurrentItemForHistory(finished: true)
if model.queue.isEmpty {
if Defaults[.closeLastItemOnPlaybackEnd] {
#if os(tvOS)
if model.activeBackend == .appleAVPlayer {
model.avPlayerBackend.controller?.dismiss(animated: false)
}
#endif
model.resetQueue()
model.hide()
}
#if os(tvOS)
if model.activeBackend == .appleAVPlayer {
model.avPlayerBackend.controller?.dismiss(animated: false)
}
#endif
model.resetQueue()
model.hide()
} else {
model.advanceToNextItem()
}
case .loopOne:
model.backend.seek(to: .zero, seekType: .loopRestart) { _ in
self.model.play()
}
loopAction()
case .related:
guard let item = model.autoplayItem else { return }
model.resetAutoplay()
model.advanceToItem(item)
}
}
WatchNextViewModel.shared.prepareForNextItem(model.currentItem, timer: timer)
let actionAndHideWatchNext: (Bool) -> Void = { delay in
WatchNextViewModel.shared.hide()
if delay {
Delay.by(0.3) {
action()
}
} else {
action()
}
}
if Defaults[.openWatchNextOnFinishedWatching], model.presentingPlayer {
let timer = Delay.by(TimeInterval(Defaults[.openWatchNextOnFinishedWatchingDelay]) ?? 5.0) {
actionAndHideWatchNext(true)
}
WatchNextViewModel.shared.finishedWatching(model.currentItem, timer: timer)
} else {
actionAndHideWatchNext(false)
}
}
func updateControls(completionHandler: (() -> Void)? = nil) {

View File

@@ -80,6 +80,9 @@ final class PlayerModel: ObservableObject {
@Published var playerSize: CGSize = .zero { didSet {
#if !os(tvOS)
#if os(macOS)
guard videoForDisplay != nil else { return }
#endif
backend.setSize(playerSize.width, playerSize.height)
#endif
}}
@@ -162,7 +165,6 @@ final class PlayerModel: ObservableObject {
#if !os(macOS)
@Default(.closePiPAndOpenPlayerOnEnteringForeground) var closePiPAndOpenPlayerOnEnteringForeground
@Default(.closePlayerOnItemClose) private var closePlayerOnItemClose
#endif
private var currentArtwork: MPMediaItemArtwork?
@@ -324,7 +326,7 @@ final class PlayerModel: ObservableObject {
pause()
videoBeingOpened = video
WatchNextViewModel.shared.presentingOutro = false
WatchNextViewModel.shared.hide()
var changeBackendHandler: (() -> Void)?

View File

@@ -14,7 +14,7 @@ extension PlayerModel {
}
func play(_ videos: [Video], shuffling: Bool = false) {
WatchNextViewModel.shared.presentingOutro = false
WatchNextViewModel.shared.hide()
playbackMode = shuffling ? .shuffle : .queue
videos.forEach { enqueueVideo($0, loadDetails: false) }
@@ -55,7 +55,7 @@ extension PlayerModel {
comments.reset()
stream = nil
WatchNextViewModel.shared.close()
WatchNextViewModel.shared.hide()
withAnimation {
aspectRatio = VideoPlayerView.defaultAspectRatio
@@ -175,7 +175,7 @@ extension PlayerModel {
remove(newItem)
WatchNextViewModel.shared.close()
WatchNextViewModel.shared.hide()
currentItem = newItem
currentItem.playbackTime = time
@@ -221,7 +221,7 @@ extension PlayerModel {
if play {
withAnimation {
aspectRatio = VideoPlayerView.defaultAspectRatio
WatchNextViewModel.shared.close()
WatchNextViewModel.shared.hide()
currentItem = item
}
videoBeingOpened = video

View File

@@ -25,7 +25,7 @@ struct PlayerQueueItem: Hashable, Identifiable, Defaults.Serializable {
}
init(
_ video: Video? = nil,
_ video: Video? = .fixture,
videoID: Video.ID? = nil,
app: VideosApp? = nil,
instanceURL: URL? = nil,