From 3ca0610544b180fe5a5468db97998dbfbd5dd3a9 Mon Sep 17 00:00:00 2001 From: Francesco <100066266+cranci1@users.noreply.github.com> Date: Sat, 26 Apr 2025 23:01:17 +0200 Subject: [PATCH] subtitle delay maybe --- .../CustomPlayer/CustomPlayer.swift | 67 ++++++++++++++++++- .../Helpers/SubtitleSettingsManager.swift | 1 + .../SettingsSubViews/SettingsViewPlayer.swift | 31 +++++++++ 3 files changed, 96 insertions(+), 3 deletions(-) diff --git a/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift b/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift index acaecb9..174809d 100644 --- a/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift +++ b/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift @@ -167,6 +167,7 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele private var volumeValue: Double = 0.0 private var volumeViewModel = VolumeViewModel() var volumeSliderHostingView: UIView? + private var subtitleDelay: Double = 0.0 init(module: ScrapingModule, urlString: String, @@ -1340,7 +1341,8 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele UserDefaults.standard.set(self.duration, forKey: "totalTime_\(self.fullUrl)") if self.subtitlesEnabled { - let cues = self.subtitlesLoader.cues.filter { self.currentTimeVal >= $0.startTime && self.currentTimeVal <= $0.endTime } + let adjustedTime = self.currentTimeVal - self.subtitleDelay + let cues = self.subtitlesLoader.cues.filter { adjustedTime >= $0.startTime && adjustedTime <= $0.endTime } if cues.count > 0 { self.subtitleLabels[0].text = cues[0].text.strippedHTML self.subtitleLabels[0].isHidden = false @@ -1876,7 +1878,6 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele self.switchToQuality(urlString: last) } - // reveal + animate self.qualityButton.isHidden = false self.qualityButton.menu = self.qualitySelectionMenu() self.updateMenuButtonConstraints() @@ -2014,8 +2015,41 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele ] let paddingMenu = UIMenu(title: "Bottom Padding", children: paddingActions) + let delayActions = [ + UIAction(title: "-0.5s") { [weak self] _ in + guard let self = self else { return } + self.adjustSubtitleDelay(by: -0.5) + }, + UIAction(title: "-0.2s") { [weak self] _ in + guard let self = self else { return } + self.adjustSubtitleDelay(by: -0.2) + }, + UIAction(title: "+0.2s") { [weak self] _ in + guard let self = self else { return } + self.adjustSubtitleDelay(by: 0.2) + }, + UIAction(title: "+0.5s") { [weak self] _ in + guard let self = self else { return } + self.adjustSubtitleDelay(by: 0.5) + }, + UIAction(title: "Custom...") { [weak self] _ in + guard let self = self else { return } + self.presentCustomDelayAlert() + } + ] + + let resetDelayAction = UIAction(title: "Reset Timing") { [weak self] _ in + guard let self = self else { return } + SubtitleSettingsManager.shared.update { settings in settings.subtitleDelay = 0.0 } + self.subtitleDelay = 0.0 + self.loadSubtitleSettings() + DropManager.shared.showDrop(title: "Subtitle Timing Reset", subtitle: "", duration: 0.5, icon: UIImage(systemName: "clock.arrow.circlepath")) + } + + let delayMenu = UIMenu(title: "Subtitle Timing", children: delayActions + [resetDelayAction]) + let subtitleOptionsMenu = UIMenu(title: "Subtitle Options", children: [ - subtitlesToggleAction, colorMenu, fontSizeMenu, shadowMenu, backgroundMenu, paddingMenu + subtitlesToggleAction, colorMenu, fontSizeMenu, shadowMenu, backgroundMenu, paddingMenu, delayMenu ]) menuElements = [subtitleOptionsMenu] @@ -2024,6 +2058,32 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele return UIMenu(title: "", children: menuElements) } + func adjustSubtitleDelay(by amount: Double) { + let newValue = subtitleDelay + amount + let roundedValue = Double(round(newValue * 10) / 10) + SubtitleSettingsManager.shared.update { settings in settings.subtitleDelay = roundedValue } + self.subtitleDelay = roundedValue + self.loadSubtitleSettings() + } + + func presentCustomDelayAlert() { + let alert = UIAlertController(title: "Enter Custom Delay", message: nil, preferredStyle: .alert) + alert.addTextField { textField in + textField.placeholder = "Delay in seconds" + textField.keyboardType = .decimalPad + textField.text = String(format: "%.1f", self.subtitleDelay) + } + alert.addAction(UIAlertAction(title: "Cancel", style: .cancel)) + alert.addAction(UIAlertAction(title: "Done", style: .default) { _ in + if let text = alert.textFields?.first?.text, let newDelay = Double(text) { + SubtitleSettingsManager.shared.update { settings in settings.subtitleDelay = newDelay } + self.subtitleDelay = newDelay + self.loadSubtitleSettings() + } + }) + present(alert, animated: true) + } + func presentCustomPaddingAlert() { let alert = UIAlertController(title: "Enter Custom Padding", message: nil, preferredStyle: .alert) alert.addTextField { textField in @@ -2071,6 +2131,7 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele self.subtitleShadowRadius = settings.shadowRadius self.subtitleBackgroundEnabled = settings.backgroundEnabled self.subtitleBottomPadding = settings.bottomPadding + self.subtitleDelay = settings.subtitleDelay } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { diff --git a/Sora/Utils/MediaPlayer/CustomPlayer/Helpers/SubtitleSettingsManager.swift b/Sora/Utils/MediaPlayer/CustomPlayer/Helpers/SubtitleSettingsManager.swift index cb8f82a..57e96b3 100644 --- a/Sora/Utils/MediaPlayer/CustomPlayer/Helpers/SubtitleSettingsManager.swift +++ b/Sora/Utils/MediaPlayer/CustomPlayer/Helpers/SubtitleSettingsManager.swift @@ -13,6 +13,7 @@ struct SubtitleSettings: Codable { var shadowRadius: Double = 1.0 var backgroundEnabled: Bool = true var bottomPadding: CGFloat = 20.0 + var subtitleDelay: Double = 0.0 } class SubtitleSettingsManager { diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewPlayer.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewPlayer.swift index d07110d..9591f17 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewPlayer.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewPlayer.swift @@ -117,6 +117,7 @@ struct SubtitleSettingsSection: View { @State private var shadowRadius: Double = SubtitleSettingsManager.shared.settings.shadowRadius @State private var backgroundEnabled: Bool = SubtitleSettingsManager.shared.settings.backgroundEnabled @State private var bottomPadding: CGFloat = SubtitleSettingsManager.shared.settings.bottomPadding + @State private var subtitleDelay: Double = SubtitleSettingsManager.shared.settings.subtitleDelay private let colors = ["white", "yellow", "green", "blue", "red", "purple"] private let shadowOptions = [0, 1, 3, 6] @@ -186,6 +187,36 @@ struct SubtitleSettingsSection: View { } } } + + VStack(alignment: .leading) { + Text("Subtitle Timing Adjustment: \(String(format: "%.1fs", subtitleDelay))") + .padding(.bottom, 1) + + HStack { + Text("-10s") + .font(.system(size: 12)) + .foregroundColor(.gray) + + Slider(value: $subtitleDelay, in: -10...10, step: 0.1) + .onChange(of: subtitleDelay) { newValue in + SubtitleSettingsManager.shared.update { settings in + settings.subtitleDelay = newValue + } + } + + Text("+10s") + .font(.system(size: 12)) + .foregroundColor(.gray) + } + } + + Button("Reset Subtitle Timing") { + subtitleDelay = 0.0 + SubtitleSettingsManager.shared.update { settings in + settings.subtitleDelay = 0.0 + } + } + .foregroundColor(.accentColor) } } }