experimental flag for sync subtitles with adjacent items
This commit is contained in:
parent
4f3f6d4c08
commit
7ab85e453d
|
@ -383,6 +383,7 @@
|
||||||
E1E5D5442783BB5100692DFE /* ItemDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E5D5432783BB5100692DFE /* ItemDetailsView.swift */; };
|
E1E5D5442783BB5100692DFE /* ItemDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E5D5432783BB5100692DFE /* ItemDetailsView.swift */; };
|
||||||
E1E5D5462783C28100692DFE /* CinematicItemAboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E5D5452783C28100692DFE /* CinematicItemAboutView.swift */; };
|
E1E5D5462783C28100692DFE /* CinematicItemAboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E5D5452783C28100692DFE /* CinematicItemAboutView.swift */; };
|
||||||
E1E5D5492783CDD700692DFE /* OverlaySettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E5D5472783CCF900692DFE /* OverlaySettingsView.swift */; };
|
E1E5D5492783CDD700692DFE /* OverlaySettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E5D5472783CCF900692DFE /* OverlaySettingsView.swift */; };
|
||||||
|
E1E5D54C2783E27200692DFE /* ExperimentalSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E5D54B2783E27200692DFE /* ExperimentalSettingsView.swift */; };
|
||||||
E1F0204E26CCCA74001C1C3B /* VideoPlayerJumpLength.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */; };
|
E1F0204E26CCCA74001C1C3B /* VideoPlayerJumpLength.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */; };
|
||||||
E1F0204F26CCCA74001C1C3B /* VideoPlayerJumpLength.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */; };
|
E1F0204F26CCCA74001C1C3B /* VideoPlayerJumpLength.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */; };
|
||||||
E1FA2F7427818A8800B4C270 /* SmallMenuOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FA2F7327818A8800B4C270 /* SmallMenuOverlay.swift */; };
|
E1FA2F7427818A8800B4C270 /* SmallMenuOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FA2F7327818A8800B4C270 /* SmallMenuOverlay.swift */; };
|
||||||
|
@ -666,6 +667,7 @@
|
||||||
E1E5D5432783BB5100692DFE /* ItemDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDetailsView.swift; sourceTree = "<group>"; };
|
E1E5D5432783BB5100692DFE /* ItemDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDetailsView.swift; sourceTree = "<group>"; };
|
||||||
E1E5D5452783C28100692DFE /* CinematicItemAboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CinematicItemAboutView.swift; sourceTree = "<group>"; };
|
E1E5D5452783C28100692DFE /* CinematicItemAboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CinematicItemAboutView.swift; sourceTree = "<group>"; };
|
||||||
E1E5D5472783CCF900692DFE /* OverlaySettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlaySettingsView.swift; sourceTree = "<group>"; };
|
E1E5D5472783CCF900692DFE /* OverlaySettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlaySettingsView.swift; sourceTree = "<group>"; };
|
||||||
|
E1E5D54B2783E27200692DFE /* ExperimentalSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExperimentalSettingsView.swift; sourceTree = "<group>"; };
|
||||||
E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPlayerJumpLength.swift; sourceTree = "<group>"; };
|
E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPlayerJumpLength.swift; sourceTree = "<group>"; };
|
||||||
E1FA2F7327818A8800B4C270 /* SmallMenuOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmallMenuOverlay.swift; sourceTree = "<group>"; };
|
E1FA2F7327818A8800B4C270 /* SmallMenuOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmallMenuOverlay.swift; sourceTree = "<group>"; };
|
||||||
E1FCD08726C35A0D007C8DCF /* NetworkError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkError.swift; sourceTree = "<group>"; };
|
E1FCD08726C35A0D007C8DCF /* NetworkError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkError.swift; sourceTree = "<group>"; };
|
||||||
|
@ -1295,10 +1297,9 @@
|
||||||
53DF641D263D9C0600A7CD1A /* LibraryView.swift */,
|
53DF641D263D9C0600A7CD1A /* LibraryView.swift */,
|
||||||
53892771263C8C6F0035E14B /* LoadingView.swift */,
|
53892771263C8C6F0035E14B /* LoadingView.swift */,
|
||||||
5389276F263C25230035E14B /* NextUpView.swift */,
|
5389276F263C25230035E14B /* NextUpView.swift */,
|
||||||
E1E5D5472783CCF900692DFE /* OverlaySettingsView.swift */,
|
E1E5D54A2783E26100692DFE /* SettingsView */,
|
||||||
E173DA4F26D048D600CC4EB7 /* ServerDetailView.swift */,
|
E173DA4F26D048D600CC4EB7 /* ServerDetailView.swift */,
|
||||||
E13DD3E427177D15009D4DAF /* ServerListView.swift */,
|
E13DD3E427177D15009D4DAF /* ServerListView.swift */,
|
||||||
539B2DA4263BA5B8007FF1A4 /* SettingsView.swift */,
|
|
||||||
E13DD3FB2717EAE8009D4DAF /* UserListView.swift */,
|
E13DD3FB2717EAE8009D4DAF /* UserListView.swift */,
|
||||||
E13DD3F4271793BB009D4DAF /* UserSignInView.swift */,
|
E13DD3F4271793BB009D4DAF /* UserSignInView.swift */,
|
||||||
E193D5452719418B00900D82 /* VideoPlayer */,
|
E193D5452719418B00900D82 /* VideoPlayer */,
|
||||||
|
@ -1449,6 +1450,16 @@
|
||||||
path = CinematicItemView;
|
path = CinematicItemView;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
E1E5D54A2783E26100692DFE /* SettingsView */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
E1E5D54B2783E27200692DFE /* ExperimentalSettingsView.swift */,
|
||||||
|
E1E5D5472783CCF900692DFE /* OverlaySettingsView.swift */,
|
||||||
|
539B2DA4263BA5B8007FF1A4 /* SettingsView.swift */,
|
||||||
|
);
|
||||||
|
path = SettingsView;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
E1FCD08E26C466F3007C8DCF /* Errors */ = {
|
E1FCD08E26C466F3007C8DCF /* Errors */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -2131,6 +2142,7 @@
|
||||||
C4BE0769271FC164003F4AD1 /* TVLibrariesView.swift in Sources */,
|
C4BE0769271FC164003F4AD1 /* TVLibrariesView.swift in Sources */,
|
||||||
E1267D3E271A1F46003C492E /* PreferenceUIHostingController.swift in Sources */,
|
E1267D3E271A1F46003C492E /* PreferenceUIHostingController.swift in Sources */,
|
||||||
6220D0BA26D6092100B8E046 /* FilterCoordinator.swift in Sources */,
|
6220D0BA26D6092100B8E046 /* FilterCoordinator.swift in Sources */,
|
||||||
|
E1E5D54C2783E27200692DFE /* ExperimentalSettingsView.swift in Sources */,
|
||||||
6267B3DA2671138200A7371D /* ImageExtensions.swift in Sources */,
|
6267B3DA2671138200A7371D /* ImageExtensions.swift in Sources */,
|
||||||
62EC353426766B03000E9F2D /* DeviceRotationViewModifier.swift in Sources */,
|
62EC353426766B03000E9F2D /* DeviceRotationViewModifier.swift in Sources */,
|
||||||
5389277C263CC3DB0035E14B /* BlurHashDecode.swift in Sources */,
|
5389277C263CC3DB0035E14B /* BlurHashDecode.swift in Sources */,
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
//
|
||||||
|
/*
|
||||||
|
* 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 2021 Aiden Vigue & Jellyfin Contributors
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Defaults
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct ExperimentalSettingsView: View {
|
||||||
|
|
||||||
|
@Default(.Experimental.syncSubtitleStateWithAdjacent) var syncSubtitleStateWithAdjacent
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
Form {
|
||||||
|
Section {
|
||||||
|
|
||||||
|
Toggle("Sync Subtitles with Adjacent Episodes", isOn: $syncSubtitleStateWithAdjacent)
|
||||||
|
|
||||||
|
} header: {
|
||||||
|
Text("Experimental")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -97,7 +97,17 @@ struct SettingsView: View {
|
||||||
.foregroundColor(.primary)
|
.foregroundColor(.primary)
|
||||||
Spacer()
|
Spacer()
|
||||||
Text(overlayType.label)
|
Text(overlayType.label)
|
||||||
|
Image(systemName: "chevron.right")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
settingsRouter.route(to: \.experimentalSettings)
|
||||||
|
} label: {
|
||||||
|
HStack {
|
||||||
|
Text("Experimental")
|
||||||
|
.foregroundColor(.primary)
|
||||||
|
Spacer()
|
||||||
Image(systemName: "chevron.right")
|
Image(systemName: "chevron.right")
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -18,6 +18,7 @@ final class SettingsCoordinator: NavigationCoordinatable {
|
||||||
@Root var start = makeStart
|
@Root var start = makeStart
|
||||||
@Route(.push) var serverDetail = makeServerDetail
|
@Route(.push) var serverDetail = makeServerDetail
|
||||||
@Route(.push) var overlaySettings = makeOverlaySettings
|
@Route(.push) var overlaySettings = makeOverlaySettings
|
||||||
|
@Route(.push) var experimentalSettings = makeExperimentalSettings
|
||||||
|
|
||||||
@ViewBuilder func makeServerDetail() -> some View {
|
@ViewBuilder func makeServerDetail() -> some View {
|
||||||
let viewModel = ServerDetailViewModel(server: SessionManager.main.currentLogin.server)
|
let viewModel = ServerDetailViewModel(server: SessionManager.main.currentLogin.server)
|
||||||
|
@ -27,6 +28,10 @@ final class SettingsCoordinator: NavigationCoordinatable {
|
||||||
@ViewBuilder func makeOverlaySettings() -> some View {
|
@ViewBuilder func makeOverlaySettings() -> some View {
|
||||||
OverlaySettingsView()
|
OverlaySettingsView()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ViewBuilder func makeExperimentalSettings() -> some View {
|
||||||
|
ExperimentalSettingsView()
|
||||||
|
}
|
||||||
|
|
||||||
@ViewBuilder func makeStart() -> some View {
|
@ViewBuilder func makeStart() -> some View {
|
||||||
let viewModel = SettingsViewModel(server: SessionManager.main.currentLogin.server, user: SessionManager.main.currentLogin.user)
|
let viewModel = SettingsViewModel(server: SessionManager.main.currentLogin.server, user: SessionManager.main.currentLogin.user)
|
||||||
|
|
|
@ -29,9 +29,23 @@ final class VideoPlayerViewModel: ViewModel {
|
||||||
@Published var leftLabelText: String = "--:--"
|
@Published var leftLabelText: String = "--:--"
|
||||||
@Published var rightLabelText: String = "--:--"
|
@Published var rightLabelText: String = "--:--"
|
||||||
@Published var playbackSpeed: PlaybackSpeed = .one
|
@Published var playbackSpeed: PlaybackSpeed = .one
|
||||||
@Published var subtitlesEnabled: Bool
|
@Published var subtitlesEnabled: Bool {
|
||||||
|
didSet {
|
||||||
|
if syncSubtitleStateWithAdjacent {
|
||||||
|
previousItemVideoPlayerViewModel?.matchSubtitlesEnabled(with: self)
|
||||||
|
nextItemVideoPlayerViewModel?.matchSubtitlesEnabled(with: self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@Published var selectedAudioStreamIndex: Int
|
@Published var selectedAudioStreamIndex: Int
|
||||||
@Published var selectedSubtitleStreamIndex: Int
|
@Published var selectedSubtitleStreamIndex: Int {
|
||||||
|
didSet {
|
||||||
|
if syncSubtitleStateWithAdjacent {
|
||||||
|
previousItemVideoPlayerViewModel?.matchSubtitleStream(with: self)
|
||||||
|
nextItemVideoPlayerViewModel?.matchSubtitleStream(with: self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@Published var previousItemVideoPlayerViewModel: VideoPlayerViewModel?
|
@Published var previousItemVideoPlayerViewModel: VideoPlayerViewModel?
|
||||||
@Published var nextItemVideoPlayerViewModel: VideoPlayerViewModel?
|
@Published var nextItemVideoPlayerViewModel: VideoPlayerViewModel?
|
||||||
@Published var jumpBackwardLength: VideoPlayerJumpLength {
|
@Published var jumpBackwardLength: VideoPlayerJumpLength {
|
||||||
|
@ -75,6 +89,9 @@ final class VideoPlayerViewModel: ViewModel {
|
||||||
let overlayType: OverlayType
|
let overlayType: OverlayType
|
||||||
let jumpGesturesEnabled: Bool
|
let jumpGesturesEnabled: Bool
|
||||||
|
|
||||||
|
// MARK: Experimental
|
||||||
|
let syncSubtitleStateWithAdjacent: Bool
|
||||||
|
|
||||||
// Full response kept for convenience
|
// Full response kept for convenience
|
||||||
let response: PlaybackInfoResponse
|
let response: PlaybackInfoResponse
|
||||||
|
|
||||||
|
@ -137,6 +154,8 @@ final class VideoPlayerViewModel: ViewModel {
|
||||||
self.jumpGesturesEnabled = Defaults[.jumpGesturesEnabled]
|
self.jumpGesturesEnabled = Defaults[.jumpGesturesEnabled]
|
||||||
self.shouldShowJumpButtonsInOverlayMenu = Defaults[.shouldShowJumpButtonsInOverlayMenu]
|
self.shouldShowJumpButtonsInOverlayMenu = Defaults[.shouldShowJumpButtonsInOverlayMenu]
|
||||||
|
|
||||||
|
self.syncSubtitleStateWithAdjacent = Defaults[.Experimental.syncSubtitleStateWithAdjacent]
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
self.sliderPercentage = (item.userData?.playedPercentage ?? 0) / 100
|
self.sliderPercentage = (item.userData?.playedPercentage ?? 0) / 100
|
||||||
|
|
Loading…
Reference in New Issue