mirror of
https://github.com/yattee/yattee.git
synced 2026-02-19 17:29:45 +00:00
70 lines
1.9 KiB
Swift
70 lines
1.9 KiB
Swift
//
|
|
// Caption.swift
|
|
// Yattee
|
|
//
|
|
// Model representing a video caption/subtitle track.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
/// Represents a caption/subtitle track for a video.
|
|
struct Caption: Identifiable, Codable, Hashable, Sendable {
|
|
/// The display label (e.g., "English", "English (auto-generated)")
|
|
let label: String
|
|
|
|
/// The language code (e.g., "en", "de-DE", "es-419")
|
|
let languageCode: String
|
|
|
|
/// The URL to fetch the caption content
|
|
let url: URL
|
|
|
|
/// Whether this is an auto-generated caption
|
|
var isAutoGenerated: Bool {
|
|
label.contains("auto-generated")
|
|
}
|
|
|
|
/// The base language code without region (e.g., "en" from "en-US")
|
|
var baseLanguageCode: String {
|
|
if let hyphenIndex = languageCode.firstIndex(of: "-") {
|
|
return String(languageCode[..<hyphenIndex])
|
|
}
|
|
return languageCode
|
|
}
|
|
|
|
var id: String {
|
|
"\(languageCode):\(label)"
|
|
}
|
|
|
|
/// Formatted display name for the caption
|
|
var displayName: String {
|
|
// Try to get localized language name (AUTO badge shown separately in UI)
|
|
if let localizedName = Locale.current.localizedString(forLanguageCode: baseLanguageCode) {
|
|
return localizedName
|
|
}
|
|
// Strip "(auto-generated)" from label if present
|
|
return label.replacingOccurrences(of: " (auto-generated)", with: "")
|
|
}
|
|
}
|
|
|
|
// MARK: - Preview Data
|
|
|
|
extension Caption {
|
|
/// A sample English caption for SwiftUI previews.
|
|
static var preview: Caption {
|
|
Caption(
|
|
label: "English",
|
|
languageCode: "en",
|
|
url: URL(string: "https://example.com/captions/en.vtt")!
|
|
)
|
|
}
|
|
|
|
/// A sample auto-generated caption for SwiftUI previews.
|
|
static var autoGeneratedPreview: Caption {
|
|
Caption(
|
|
label: "English (auto-generated)",
|
|
languageCode: "en",
|
|
url: URL(string: "https://example.com/captions/en-auto.vtt")!
|
|
)
|
|
}
|
|
}
|