From 678fdd03bf08d851ba5bfd07fb93852c4b5e80f1 Mon Sep 17 00:00:00 2001 From: Ethan Pippin Date: Thu, 30 Dec 2021 14:25:52 -0700 Subject: [PATCH] add autoplay setting --- .../Overlays/VLCPlayerCompactOverlayView.swift | 16 +++++++++++++++- .../Overlays/VLCPlayerOverlayView.swift | 4 +++- .../VideoPlayer/VLCPlayerViewController.swift | 8 ++++++-- .../BaseItemDto+VideoPlayerViewModel.swift | 13 ++++++++++++- .../SwiftfinStore/SwiftfinStoreDefaults.swift | 2 ++ Shared/ViewModels/VideoPlayerViewModel.swift | 17 ++++++++++++++++- 6 files changed, 54 insertions(+), 6 deletions(-) diff --git a/JellyfinPlayer/Views/VideoPlayer/Overlays/VLCPlayerCompactOverlayView.swift b/JellyfinPlayer/Views/VideoPlayer/Overlays/VLCPlayerCompactOverlayView.swift index f0fe74a0..ca73a0f7 100644 --- a/JellyfinPlayer/Views/VideoPlayer/Overlays/VLCPlayerCompactOverlayView.swift +++ b/JellyfinPlayer/Views/VideoPlayer/Overlays/VLCPlayerCompactOverlayView.swift @@ -117,6 +117,18 @@ struct VLCPlayerCompactOverlayView: View, VideoPlayerOverlay { .foregroundColor(viewModel.selectedSubtitleStreamIndex == -1 ? .gray : .white) } + if viewModel.shouldShowAutoPlayNextItem { + Button { + viewModel.autoPlayNextItem.toggle() + } label: { + if viewModel.autoPlayNextItem { + Image(systemName: "play.circle.fill") + } else { + Image(systemName: "play.circle") + } + } + } + // MARK: Settings Menu Menu { @@ -342,7 +354,9 @@ struct VLCPlayerCompactOverlayView_Previews: PreviewProvider { sliderPercentage: 0.432, selectedAudioStreamIndex: -1, selectedSubtitleStreamIndex: -1, - showAdjacentItems: true)) + showAdjacentItems: true, + shouldShowAutoPlayNextItem: true, + autoPlayNextItem: true)) } .previewInterfaceOrientation(.landscapeLeft) } diff --git a/JellyfinPlayer/Views/VideoPlayer/Overlays/VLCPlayerOverlayView.swift b/JellyfinPlayer/Views/VideoPlayer/Overlays/VLCPlayerOverlayView.swift index dd494e50..00971f26 100644 --- a/JellyfinPlayer/Views/VideoPlayer/Overlays/VLCPlayerOverlayView.swift +++ b/JellyfinPlayer/Views/VideoPlayer/Overlays/VLCPlayerOverlayView.swift @@ -240,7 +240,9 @@ struct VLCPlayerOverlayView_Previews: PreviewProvider { sliderPercentage: 0.0, selectedAudioStreamIndex: -1, selectedSubtitleStreamIndex: -1, - showAdjacentItems: true)) + showAdjacentItems: true, + shouldShowAutoPlayNextItem: true, + autoPlayNextItem: true)) } .previewInterfaceOrientation(.landscapeLeft) } diff --git a/JellyfinPlayer/Views/VideoPlayer/VLCPlayerViewController.swift b/JellyfinPlayer/Views/VideoPlayer/VLCPlayerViewController.swift index 4f2cada4..b16d908e 100644 --- a/JellyfinPlayer/Views/VideoPlayer/VLCPlayerViewController.swift +++ b/JellyfinPlayer/Views/VideoPlayer/VLCPlayerViewController.swift @@ -382,10 +382,14 @@ extension VLCPlayerViewController: VLCMediaPlayerDelegate { // MARK: mediaPlayerStateChanged func mediaPlayerStateChanged(_ aNotification: Notification!) { - self.viewModel.playerState = vlcMediaPlayer.state + viewModel.playerState = vlcMediaPlayer.state if vlcMediaPlayer.state == VLCMediaPlayerState.ended { - didSelectClose() + if viewModel.autoPlayNextItem && viewModel.nextItemVideoPlayerViewModel != nil { + didSelectNextItem() + } else { + didSelectClose() + } } } diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift index 7adbffb0..ff60582b 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift @@ -8,6 +8,7 @@ */ import Combine +import Defaults import JellyfinAPI import UIKit @@ -88,6 +89,14 @@ extension BaseItemDto { } } + + // MARK: VidoPlayerViewModel Creation + + // TODO: show adjacent items + + let shouldShowAutoPlayNextItem = Defaults[.shouldShowAutoPlayNextItem] + let autoPlayNextItem = Defaults[.autoPlayNextItem] + let videoPlayerViewModel = VideoPlayerViewModel(item: self, title: self.name!, subtitle: subtitle, @@ -105,7 +114,9 @@ extension BaseItemDto { sliderPercentage: (self.userData?.playedPercentage ?? 0) / 100, selectedAudioStreamIndex: defaultAudioStream?.index ?? -1, selectedSubtitleStreamIndex: defaultSubtitleStream?.index ?? -1, - showAdjacentItems: true) + showAdjacentItems: true, + shouldShowAutoPlayNextItem: shouldShowAutoPlayNextItem, + autoPlayNextItem: autoPlayNextItem) return videoPlayerViewModel }) diff --git a/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift b/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift index d6c70b5e..118fa85f 100644 --- a/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift +++ b/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift @@ -33,4 +33,6 @@ extension Defaults.Keys { static let videoPlayerJumpForward = Key("videoPlayerJumpForward", default: .fifteen, suite: SwiftfinStore.Defaults.suite) static let videoPlayerJumpBackward = Key("videoPlayerJumpBackward", default: .fifteen, suite: SwiftfinStore.Defaults.suite) static let nativeVideoPlayer = Key("nativeVideoPlayer", default: false, suite: SwiftfinStore.Defaults.suite) + static let shouldShowAutoPlayNextItem = Key("shouldShowAutoPlayNextItem", default: true, suite: SwiftfinStore.Defaults.suite) + static let autoPlayNextItem = Key("autoPlayNextItem", default: true, suite: SwiftfinStore.Defaults.suite) } diff --git a/Shared/ViewModels/VideoPlayerViewModel.swift b/Shared/ViewModels/VideoPlayerViewModel.swift index 45a1956d..a1eeab45 100644 --- a/Shared/ViewModels/VideoPlayerViewModel.swift +++ b/Shared/ViewModels/VideoPlayerViewModel.swift @@ -6,6 +6,7 @@ // import Combine +import Defaults import Foundation import JellyfinAPI import UIKit @@ -54,6 +55,16 @@ final class VideoPlayerViewModel: ViewModel { } } @Published var showAdjacentItems: Bool + @Published var shouldShowAutoPlayNextItem: Bool { + willSet { + Defaults[.shouldShowAutoPlayNextItem] = newValue + } + } + @Published var autoPlayNextItem: Bool { + willSet { + Defaults[.autoPlayNextItem] = newValue + } + } @Published var previousItemVideoPlayerViewModel: VideoPlayerViewModel? @Published var nextItemVideoPlayerViewModel: VideoPlayerViewModel? @@ -105,7 +116,9 @@ final class VideoPlayerViewModel: ViewModel { sliderPercentage: Double, selectedAudioStreamIndex: Int, selectedSubtitleStreamIndex: Int, - showAdjacentItems: Bool) { + showAdjacentItems: Bool, + shouldShowAutoPlayNextItem: Bool, + autoPlayNextItem: Bool) { self.item = item self.title = title self.subtitle = subtitle @@ -124,6 +137,8 @@ final class VideoPlayerViewModel: ViewModel { self.selectedAudioStreamIndex = selectedAudioStreamIndex self.selectedSubtitleStreamIndex = selectedSubtitleStreamIndex self.showAdjacentItems = showAdjacentItems + self.shouldShowAutoPlayNextItem = shouldShowAutoPlayNextItem + self.autoPlayNextItem = autoPlayNextItem super.init()