mirror of
https://github.com/cranci1/Sora.git
synced 2026-03-11 17:45:37 +00:00
subtitle delay maybe
This commit is contained in:
parent
f0d83a7cd5
commit
3ca0610544
3 changed files with 96 additions and 3 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue