mirror of
https://github.com/yattee/yattee.git
synced 2026-02-20 01:39:46 +00:00
Yattee v2 rewrite
This commit is contained in:
150
Yattee/Models/SubtitleSettings.swift
Normal file
150
Yattee/Models/SubtitleSettings.swift
Normal file
@@ -0,0 +1,150 @@
|
||||
//
|
||||
// SubtitleSettings.swift
|
||||
// Yattee
|
||||
//
|
||||
// Settings for subtitle appearance in MPV player.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
// MARK: - Subtitle Font
|
||||
|
||||
/// Font options for subtitles.
|
||||
enum SubtitleFont: String, Codable, Hashable, Sendable, CaseIterable {
|
||||
case sansSerif
|
||||
case serif
|
||||
case monospaced
|
||||
|
||||
/// Display name for the UI.
|
||||
var displayName: String {
|
||||
switch self {
|
||||
case .sansSerif:
|
||||
return String(localized: "settings.subtitles.font.sansSerif")
|
||||
case .serif:
|
||||
return String(localized: "settings.subtitles.font.serif")
|
||||
case .monospaced:
|
||||
return String(localized: "settings.subtitles.font.monospaced")
|
||||
}
|
||||
}
|
||||
|
||||
/// MPV font name for this font option.
|
||||
var mpvFontName: String {
|
||||
switch self {
|
||||
case .sansSerif:
|
||||
return "sans-serif"
|
||||
case .serif:
|
||||
return "serif"
|
||||
case .monospaced:
|
||||
return "monospace"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Subtitle Settings
|
||||
|
||||
/// Settings for subtitle appearance in MPV.
|
||||
struct SubtitleSettings: Codable, Hashable, Sendable {
|
||||
/// Font for subtitles.
|
||||
var font: SubtitleFont
|
||||
|
||||
/// Font size for subtitles (in points, 20-100).
|
||||
var fontSize: Int
|
||||
|
||||
/// Text color for subtitles.
|
||||
var textColor: CodableColor
|
||||
|
||||
/// Border (outline) color for subtitles.
|
||||
var borderColor: CodableColor
|
||||
|
||||
/// Border size (0-5).
|
||||
var borderSize: Double
|
||||
|
||||
/// Background color for subtitles (when showBackground is enabled).
|
||||
var backgroundColor: CodableColor
|
||||
|
||||
/// Whether to show a background box behind subtitles.
|
||||
var showBackground: Bool
|
||||
|
||||
/// Whether text is bold.
|
||||
var isBold: Bool
|
||||
|
||||
/// Whether text is italic.
|
||||
var isItalic: Bool
|
||||
|
||||
/// Bottom margin as percentage (0-50).
|
||||
var bottomMargin: Int
|
||||
|
||||
/// Creates subtitle settings with default values.
|
||||
init(
|
||||
font: SubtitleFont = .sansSerif,
|
||||
fontSize: Int = 60,
|
||||
textColor: CodableColor = CodableColor(red: 1, green: 1, blue: 1),
|
||||
borderColor: CodableColor = CodableColor(red: 0, green: 0, blue: 0),
|
||||
borderSize: Double = 2.5,
|
||||
backgroundColor: CodableColor = CodableColor(red: 0, green: 0, blue: 0, opacity: 0.75),
|
||||
showBackground: Bool = false,
|
||||
isBold: Bool = false,
|
||||
isItalic: Bool = false,
|
||||
bottomMargin: Int = 30
|
||||
) {
|
||||
self.font = font
|
||||
self.fontSize = fontSize
|
||||
self.textColor = textColor
|
||||
self.borderColor = borderColor
|
||||
self.borderSize = borderSize
|
||||
self.backgroundColor = backgroundColor
|
||||
self.showBackground = showBackground
|
||||
self.isBold = isBold
|
||||
self.isItalic = isItalic
|
||||
self.bottomMargin = bottomMargin
|
||||
}
|
||||
|
||||
/// Default subtitle settings.
|
||||
static let `default` = SubtitleSettings()
|
||||
|
||||
/// Converts settings to MPV options dictionary.
|
||||
/// - Returns: Dictionary of MPV option names to values.
|
||||
func mpvOptions() -> [String: String] {
|
||||
var options: [String: String] = [:]
|
||||
|
||||
// Font
|
||||
options["sub-font"] = font.mpvFontName
|
||||
options["sub-font-size"] = String(fontSize)
|
||||
|
||||
// Text color (BBGGRR format for MPV with alpha as separate component)
|
||||
options["sub-color"] = mpvColorString(textColor)
|
||||
|
||||
// Border
|
||||
options["sub-border-color"] = mpvColorString(borderColor)
|
||||
options["sub-border-size"] = String(format: "%.1f", borderSize)
|
||||
|
||||
// Background
|
||||
if showBackground {
|
||||
options["sub-back-color"] = mpvColorString(backgroundColor)
|
||||
options["sub-border-style"] = "background-box"
|
||||
} else {
|
||||
options["sub-back-color"] = "#00000000" // Transparent
|
||||
options["sub-border-style"] = "outline-and-shadow" // Default style
|
||||
}
|
||||
|
||||
// Style
|
||||
options["sub-bold"] = isBold ? "yes" : "no"
|
||||
options["sub-italic"] = isItalic ? "yes" : "no"
|
||||
|
||||
// Position
|
||||
options["sub-margin-y"] = String(bottomMargin)
|
||||
|
||||
return options
|
||||
}
|
||||
|
||||
/// Converts CodableColor to MPV color string format (#AARRGGBB).
|
||||
private func mpvColorString(_ color: CodableColor) -> String {
|
||||
let r = Int(color.red * 255)
|
||||
let g = Int(color.green * 255)
|
||||
let b = Int(color.blue * 255)
|
||||
let a = Int(color.opacity * 255)
|
||||
return String(format: "#%02X%02X%02X%02X", a, r, g, b)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user