first commit

This commit is contained in:
JinJiangHuang
2026-03-01 14:04:44 +08:00
commit 61e97da938
62 changed files with 9947 additions and 0 deletions
+134
View File
@@ -0,0 +1,134 @@
import Foundation
import SwiftUI
/// ViewModel
@MainActor
class SettingsViewModel: ObservableObject {
@Published var apiUrl: String = ""
@Published var isLoadingConfig = false
@Published var configError: String?
@Published var configSuccess = false
@Published var apiHistory: [String] = []
@Published var playerEngine: PlayerEngine = .system
@Published var decodeMode: VideoDecodeMode = .auto
@Published var vlcBufferMode: VLCBufferMode = .defaultMode
@Published var playTimeStep: Int = 10
@Published var cacheSizeString: String = "0 KB"
let playTimeStepOptions: [Int] = [5, 10, 15, 30, 60]
let playerEngineOptions: [PlayerEngine] = PlayerEngine.availableEngines
let decodeModeOptions: [VideoDecodeMode] = VideoDecodeMode.allCases
let vlcBufferModeOptions: [VLCBufferMode] = VLCBufferMode.allCases
init() {
apiUrl = UserDefaults.standard.string(forKey: HawkConfig.API_URL) ?? ""
loadApiHistory()
playerEngine = PlayerEngine.fromStoredValue(
UserDefaults.standard.integer(forKey: HawkConfig.PLAY_TYPE)
)
decodeMode = VideoDecodeMode.fromStoredValue(
UserDefaults.standard.integer(forKey: HawkConfig.PLAY_DECODE_MODE)
)
vlcBufferMode = VLCBufferMode.fromStoredValue(
UserDefaults.standard.integer(forKey: HawkConfig.PLAY_VLC_BUFFER_MODE)
)
let savedStep = UserDefaults.standard.integer(forKey: HawkConfig.PLAY_TIME_STEP)
playTimeStep = savedStep > 0 ? savedStep : 10
refreshCacheSize()
}
///
func loadConfig() async {
let trimmed = apiUrl.trimmingCharacters(in: .whitespacesAndNewlines)
guard !trimmed.isEmpty else {
configError = "请输入配置地址"
return
}
isLoadingConfig = true
configError = nil
configSuccess = false
do {
try await ApiConfig.shared.loadConfig(from: trimmed)
UserDefaults.standard.set(trimmed, forKey: HawkConfig.API_URL)
addToApiHistory(trimmed)
configSuccess = true
} catch {
configError = error.localizedDescription
}
isLoadingConfig = false
}
// MARK: - API
private func loadApiHistory() {
apiHistory = UserDefaults.standard.stringArray(forKey: "api_history") ?? []
}
private func addToApiHistory(_ url: String) {
apiHistory.removeAll { $0 == url }
apiHistory.insert(url, at: 0)
if apiHistory.count > 10 {
apiHistory = Array(apiHistory.prefix(10))
}
UserDefaults.standard.set(apiHistory, forKey: "api_history")
}
func removeApiHistory(_ url: String) {
apiHistory.removeAll { $0 == url }
UserDefaults.standard.set(apiHistory, forKey: "api_history")
}
///
func clearCache() {
URLCache.shared.removeAllCachedResponses()
ImageLoader.shared.clearCache()
ImageCache.shared.clear()
refreshCacheSize()
}
///
func setPlayTimeStep(_ step: Int) {
guard step > 0 else { return }
playTimeStep = step
UserDefaults.standard.set(step, forKey: HawkConfig.PLAY_TIME_STEP)
}
///
func setPlayerEngine(_ engine: PlayerEngine) {
guard playerEngineOptions.contains(engine) else { return }
playerEngine = engine
UserDefaults.standard.set(engine.rawValue, forKey: HawkConfig.PLAY_TYPE)
}
///
func setDecodeMode(_ mode: VideoDecodeMode) {
guard decodeModeOptions.contains(mode) else { return }
decodeMode = mode
UserDefaults.standard.set(mode.rawValue, forKey: HawkConfig.PLAY_DECODE_MODE)
}
/// VLC
func setVLCBufferMode(_ mode: VLCBufferMode) {
guard vlcBufferModeOptions.contains(mode) else { return }
vlcBufferMode = mode
UserDefaults.standard.set(mode.rawValue, forKey: HawkConfig.PLAY_VLC_BUFFER_MODE)
}
private func refreshCacheSize() {
let sharedDisk = URLCache.shared.currentDiskUsage
let imageDisk = ImageLoader.shared.cacheUsage.disk
cacheSizeString = Self.formatSize(bytes: sharedDisk + imageDisk)
}
private static func formatSize(bytes: Int) -> String {
let size = max(0, bytes)
if size < 1024 * 1024 {
return String(format: "%.1f KB", Double(size) / 1024.0)
}
return String(format: "%.1f MB", Double(size) / 1024.0 / 1024.0)
}
}