Files
Aliyun-VOD-Media-Library-Ma…/apps/macos/VODManager/Sources/VODManager/Models/Models.swift
T

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?
}