167 lines
3.9 KiB
Swift
167 lines
3.9 KiB
Swift
import Foundation
|
|
import SwiftData
|
|
|
|
@Model
|
|
class Account: Identifiable {
|
|
@Attribute(.unique) var id: UUID
|
|
var name: String
|
|
var accessKeyId: String
|
|
var accessKeySecret: String
|
|
var region: String
|
|
var endpoint: String?
|
|
var isActive: Bool
|
|
var createdAt: Date
|
|
var updatedAt: Date
|
|
|
|
init(
|
|
id: UUID = UUID(),
|
|
name: String,
|
|
accessKeyId: String,
|
|
accessKeySecret: String,
|
|
region: String,
|
|
endpoint: String? = nil,
|
|
isActive: Bool = false,
|
|
createdAt: Date = Date(),
|
|
updatedAt: Date = Date()
|
|
) {
|
|
self.id = id
|
|
self.name = name
|
|
self.accessKeyId = accessKeyId
|
|
self.accessKeySecret = accessKeySecret
|
|
self.region = region
|
|
self.endpoint = endpoint
|
|
self.isActive = isActive
|
|
self.createdAt = createdAt
|
|
self.updatedAt = updatedAt
|
|
}
|
|
}
|
|
|
|
@Model
|
|
class OperationLog {
|
|
@Attribute(.unique) var id: UUID
|
|
var action: String
|
|
var targetType: String
|
|
var targetIds: String
|
|
var details: String?
|
|
var createdAt: Date
|
|
|
|
init(
|
|
id: UUID = UUID(),
|
|
action: String,
|
|
targetType: String,
|
|
targetIds: String,
|
|
details: String? = nil,
|
|
createdAt: Date = Date()
|
|
) {
|
|
self.id = id
|
|
self.action = action
|
|
self.targetType = targetType
|
|
self.targetIds = targetIds
|
|
self.details = details
|
|
self.createdAt = createdAt
|
|
}
|
|
}
|
|
|
|
@Model
|
|
class DownloadTask {
|
|
@Attribute(.unique) var id: UUID
|
|
var videoId: String
|
|
var title: String
|
|
var definition: String
|
|
var sourceURL: String
|
|
var localPath: String?
|
|
var statusRaw: String
|
|
var progress: Double
|
|
var errorMessage: String?
|
|
var createdAt: Date
|
|
|
|
var status: DownloadStatus {
|
|
get { DownloadStatus(rawValue: statusRaw) ?? .pending }
|
|
set { statusRaw = newValue.rawValue }
|
|
}
|
|
|
|
init(
|
|
id: UUID = UUID(),
|
|
videoId: String,
|
|
title: String,
|
|
definition: String,
|
|
sourceURL: String,
|
|
localPath: String? = nil,
|
|
status: DownloadStatus = .pending,
|
|
progress: Double = 0,
|
|
errorMessage: String? = nil,
|
|
createdAt: Date = Date()
|
|
) {
|
|
self.id = id
|
|
self.videoId = videoId
|
|
self.title = title
|
|
self.definition = definition
|
|
self.sourceURL = sourceURL
|
|
self.localPath = localPath
|
|
self.statusRaw = status.rawValue
|
|
self.progress = progress
|
|
self.errorMessage = errorMessage
|
|
self.createdAt = createdAt
|
|
}
|
|
}
|
|
|
|
enum DownloadStatus: String, Codable {
|
|
case pending, downloading, completed, failed
|
|
}
|
|
|
|
enum FileConflictStrategy: String, CaseIterable, Identifiable {
|
|
case skip
|
|
case overwrite
|
|
case rename
|
|
|
|
var id: String { rawValue }
|
|
|
|
var label: String {
|
|
switch self {
|
|
case .skip: return "跳过已存在文件"
|
|
case .overwrite: return "覆盖已有文件"
|
|
case .rename: return "自动重命名(加序号)"
|
|
}
|
|
}
|
|
}
|
|
|
|
struct VideoItem: Identifiable, Codable, Equatable {
|
|
var id: String { videoId }
|
|
var videoId: String
|
|
var title: String
|
|
var description: String?
|
|
var duration: Double?
|
|
var size: Int64?
|
|
var coverURL: String?
|
|
var status: String?
|
|
var cateId: Int?
|
|
var cateName: String?
|
|
var tags: String?
|
|
var creationTime: String?
|
|
var modificationTime: String?
|
|
}
|
|
|
|
struct PlayInfo: Codable, Equatable {
|
|
var playURL: String
|
|
var definition: String
|
|
var duration: String?
|
|
var size: Int64?
|
|
var format: String?
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case playURL = "PlayURL"
|
|
case definition = "Definition"
|
|
case duration = "Duration"
|
|
case size = "Size"
|
|
case format = "Format"
|
|
}
|
|
}
|
|
|
|
struct CategoryItem: Identifiable, Codable, Equatable {
|
|
var id: Int { cateId }
|
|
var cateId: Int
|
|
var cateName: String
|
|
var level: Int?
|
|
var parentId: Int?
|
|
}
|