Add MP3 upload pipeline foundation

This commit is contained in:
diyaa
2026-05-28 17:43:00 +02:00
parent 799c07b068
commit 98edfa0faf
24 changed files with 2469 additions and 93 deletions
@@ -15,6 +15,9 @@ public struct LocalTrack: Identifiable, Codable, Hashable, Sendable {
public var durationSeconds: Double?
public var localFilePath: String
public var sha256: String?
public var uploadStatus: LocalUploadStatus
public var remoteTrackId: String?
public var lastUploadError: String?
public var fileModifiedAt: Date?
public var lastScannedAt: Date?
public var isDeleted: Bool
@@ -31,6 +34,9 @@ public struct LocalTrack: Identifiable, Codable, Hashable, Sendable {
durationSeconds: Double? = nil,
localFilePath: String = "",
sha256: String? = nil,
uploadStatus: LocalUploadStatus = .localOnly,
remoteTrackId: String? = nil,
lastUploadError: String? = nil,
fileModifiedAt: Date? = nil,
lastScannedAt: Date? = nil,
isDeleted: Bool = false,
@@ -46,6 +52,9 @@ public struct LocalTrack: Identifiable, Codable, Hashable, Sendable {
self.durationSeconds = durationSeconds
self.localFilePath = localFilePath
self.sha256 = sha256
self.uploadStatus = uploadStatus
self.remoteTrackId = remoteTrackId
self.lastUploadError = lastUploadError
self.fileModifiedAt = fileModifiedAt
self.lastScannedAt = lastScannedAt
self.isDeleted = isDeleted
@@ -68,6 +77,9 @@ public struct LocalTrack: Identifiable, Codable, Hashable, Sendable {
durationSeconds: scannedTrack.durationSeconds,
localFilePath: scannedTrack.localFilePath,
sha256: scannedTrack.sha256,
uploadStatus: .localOnly,
remoteTrackId: nil,
lastUploadError: nil,
fileModifiedAt: scannedTrack.fileModifiedAt,
lastScannedAt: observedAt,
isDeleted: false,
@@ -91,6 +103,9 @@ public struct LocalTrack: Identifiable, Codable, Hashable, Sendable {
durationSeconds: libraryTrack.durationSeconds,
localFilePath: libraryTrack.localFilePath,
sha256: libraryTrack.sha256,
uploadStatus: libraryTrack.uploadStatus ?? .localOnly,
remoteTrackId: libraryTrack.remoteTrackId,
lastUploadError: libraryTrack.lastUploadError,
fileModifiedAt: nil,
lastScannedAt: origin == .localScan ? observedAt : nil,
isDeleted: false,
@@ -116,7 +131,10 @@ public struct LocalTrack: Identifiable, Codable, Hashable, Sendable {
album: album,
durationSeconds: durationSeconds,
localFilePath: localFilePath,
sha256: sha256
sha256: sha256,
uploadStatus: uploadStatus,
remoteTrackId: remoteTrackId,
lastUploadError: lastUploadError
)
}
@@ -1,5 +1,6 @@
import Foundation
import SwiftData
import VelodyDomain
@Model
final class TrackEntity {
@@ -12,6 +13,9 @@ final class TrackEntity {
var durationSeconds: Double?
var localFilePath: String
var sha256: String?
var uploadStatusRawValue: String?
var remoteTrackID: String?
var lastUploadError: String?
var fileModifiedAt: Date?
var lastScannedAt: Date?
var isMarkedDeleted: Bool
@@ -29,6 +33,9 @@ final class TrackEntity {
durationSeconds = track.durationSeconds
localFilePath = track.localFilePath
sha256 = track.sha256
uploadStatusRawValue = track.uploadStatus.rawValue
remoteTrackID = track.remoteTrackId
lastUploadError = track.lastUploadError
fileModifiedAt = track.fileModifiedAt
lastScannedAt = track.lastScannedAt
isMarkedDeleted = track.isDeleted
@@ -47,6 +54,9 @@ final class TrackEntity {
durationSeconds: durationSeconds,
localFilePath: localFilePath,
sha256: sha256,
uploadStatus: LocalUploadStatus(rawValue: uploadStatusRawValue ?? "") ?? .localOnly,
remoteTrackId: remoteTrackID,
lastUploadError: lastUploadError,
fileModifiedAt: fileModifiedAt,
lastScannedAt: lastScannedAt,
isDeleted: isMarkedDeleted,
@@ -66,6 +76,9 @@ final class TrackEntity {
durationSeconds = track.durationSeconds
localFilePath = track.localFilePath
sha256 = track.sha256
uploadStatusRawValue = track.uploadStatus.rawValue
remoteTrackID = track.remoteTrackId
lastUploadError = track.lastUploadError
fileModifiedAt = track.fileModifiedAt
lastScannedAt = track.lastScannedAt
isMarkedDeleted = track.isDeleted