Add MP3 upload pipeline foundation
This commit is contained in:
@@ -5,6 +5,14 @@ public enum DevicePlatform: String, Codable, Sendable, CaseIterable {
|
||||
case iphone = "IPHONE"
|
||||
}
|
||||
|
||||
public enum LocalUploadStatus: String, Codable, Hashable, Sendable, CaseIterable {
|
||||
case localOnly
|
||||
case preparing
|
||||
case uploading
|
||||
case uploaded
|
||||
case failed
|
||||
}
|
||||
|
||||
public struct LibraryTrack: Identifiable, Codable, Hashable, Sendable {
|
||||
public let id: String
|
||||
public var title: String
|
||||
@@ -13,6 +21,9 @@ public struct LibraryTrack: 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 init(
|
||||
id: String = UUID().uuidString,
|
||||
@@ -21,7 +32,10 @@ public struct LibraryTrack: Identifiable, Codable, Hashable, Sendable {
|
||||
album: String? = nil,
|
||||
durationSeconds: Double? = nil,
|
||||
localFilePath: String = "",
|
||||
sha256: String? = nil
|
||||
sha256: String? = nil,
|
||||
uploadStatus: LocalUploadStatus? = nil,
|
||||
remoteTrackId: String? = nil,
|
||||
lastUploadError: String? = nil
|
||||
) {
|
||||
self.id = id
|
||||
self.title = title
|
||||
@@ -30,6 +44,9 @@ public struct LibraryTrack: Identifiable, Codable, Hashable, Sendable {
|
||||
self.durationSeconds = durationSeconds
|
||||
self.localFilePath = localFilePath
|
||||
self.sha256 = sha256
|
||||
self.uploadStatus = uploadStatus
|
||||
self.remoteTrackId = remoteTrackId
|
||||
self.lastUploadError = lastUploadError
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,6 +108,116 @@ public struct DeviceHeartbeatResponse: Codable, Hashable, Sendable {
|
||||
}
|
||||
}
|
||||
|
||||
public enum UploadPrepareStatus: String, Codable, Hashable, Sendable {
|
||||
case exists
|
||||
case uploadRequired = "upload_required"
|
||||
}
|
||||
|
||||
public struct UploadPrepareRequest: Codable, Hashable, Sendable {
|
||||
public var deviceId: String
|
||||
public var sha256: String
|
||||
public var originalFilename: String
|
||||
public var sizeBytes: Int
|
||||
|
||||
public init(
|
||||
deviceId: String,
|
||||
sha256: String,
|
||||
originalFilename: String,
|
||||
sizeBytes: Int
|
||||
) {
|
||||
self.deviceId = deviceId
|
||||
self.sha256 = sha256
|
||||
self.originalFilename = originalFilename
|
||||
self.sizeBytes = sizeBytes
|
||||
}
|
||||
}
|
||||
|
||||
public struct UploadPrepareResponse: Codable, Hashable, Sendable {
|
||||
public var status: UploadPrepareStatus
|
||||
public var uploadId: String?
|
||||
public var nextOffset: Int?
|
||||
public var trackId: String?
|
||||
public var assetId: String?
|
||||
|
||||
public init(
|
||||
status: UploadPrepareStatus,
|
||||
uploadId: String? = nil,
|
||||
nextOffset: Int? = nil,
|
||||
trackId: String? = nil,
|
||||
assetId: String? = nil
|
||||
) {
|
||||
self.status = status
|
||||
self.uploadId = uploadId
|
||||
self.nextOffset = nextOffset
|
||||
self.trackId = trackId
|
||||
self.assetId = assetId
|
||||
}
|
||||
}
|
||||
|
||||
public enum UploadSessionState: String, Codable, Hashable, Sendable {
|
||||
case pending = "PENDING"
|
||||
case readyToUpload = "READY_TO_UPLOAD"
|
||||
case completed = "COMPLETED"
|
||||
case failed = "FAILED"
|
||||
}
|
||||
|
||||
public struct UploadSessionStatusResponse: Codable, Hashable, Sendable {
|
||||
public var uploadId: String
|
||||
public var status: UploadSessionState
|
||||
public var receivedBytes: String
|
||||
public var expectedSizeBytes: String
|
||||
public var nextOffset: String
|
||||
public var finalizedAt: String?
|
||||
|
||||
public init(
|
||||
uploadId: String,
|
||||
status: UploadSessionState,
|
||||
receivedBytes: String,
|
||||
expectedSizeBytes: String,
|
||||
nextOffset: String,
|
||||
finalizedAt: String? = nil
|
||||
) {
|
||||
self.uploadId = uploadId
|
||||
self.status = status
|
||||
self.receivedBytes = receivedBytes
|
||||
self.expectedSizeBytes = expectedSizeBytes
|
||||
self.nextOffset = nextOffset
|
||||
self.finalizedAt = finalizedAt
|
||||
}
|
||||
}
|
||||
|
||||
public struct UploadFinalizeRequest: Codable, Hashable, Sendable {
|
||||
public var title: String
|
||||
public var artist: String
|
||||
public var album: String?
|
||||
public var durationMs: Int?
|
||||
|
||||
public init(
|
||||
title: String,
|
||||
artist: String,
|
||||
album: String? = nil,
|
||||
durationMs: Int? = nil
|
||||
) {
|
||||
self.title = title
|
||||
self.artist = artist
|
||||
self.album = album
|
||||
self.durationMs = durationMs
|
||||
}
|
||||
}
|
||||
|
||||
public struct UploadFinalizeResponse: Codable, Hashable, Sendable {
|
||||
public var trackId: String
|
||||
public var assetId: String
|
||||
|
||||
public init(
|
||||
trackId: String,
|
||||
assetId: String
|
||||
) {
|
||||
self.trackId = trackId
|
||||
self.assetId = assetId
|
||||
}
|
||||
}
|
||||
|
||||
public struct SyncCursor: Codable, Hashable, Sendable {
|
||||
public var value: String
|
||||
|
||||
|
||||
Reference in New Issue
Block a user