| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- import Foundation
- import SwiftData
- @Model
- final class CelestiaSession {
- var id: UUID
- var title: String
- var startTime: Date
- var endTime: Date?
- var localAudioPath: String?
- var isSynced: Bool
- var cloudSessionId: String?
-
- @Relationship(deleteRule: .cascade, inverse: \CelestiaTimelineEvent.session)
- var events: [CelestiaTimelineEvent]
-
- @Relationship(deleteRule: .cascade, inverse: \AudioChunk.session)
- var audioChunks: [AudioChunk]
-
- var durationMs: Int64 {
- guard let end = endTime else { return 0 }
- return Int64(end.timeIntervalSince(startTime) * 1000)
- }
-
- var durationFormatted: String {
- guard let end = endTime else { return "正在录音..." }
- let interval = end.timeIntervalSince(startTime)
- let hours = Int(interval) / 3600
- let minutes = (Int(interval) % 3600) / 60
- let seconds = Int(interval) % 60
- if hours > 0 {
- return String(format: "%d:%02d:%02d", hours, minutes, seconds)
- }
- return String(format: "%02d:%02d", minutes, seconds)
- }
-
- var photoCount: Int {
- events.filter { $0.eventType == "PHOTO" }.count
- }
-
- var noteCount: Int {
- events.filter { $0.eventType == "NOTE" || $0.eventType == "MARKER" }.count
- }
-
- init(title: String, localAudioPath: String? = nil) {
- self.id = UUID()
- self.title = title
- self.startTime = Date()
- self.endTime = nil
- self.localAudioPath = localAudioPath
- self.isSynced = false
- self.cloudSessionId = nil
- self.events = []
- self.audioChunks = []
- }
- }
|