diff --git a/ios/App/App/plugins/AbsDownloader.swift b/ios/App/App/plugins/AbsDownloader.swift index 78ddce22..6db10669 100644 --- a/ios/App/App/plugins/AbsDownloader.swift +++ b/ios/App/App/plugins/AbsDownloader.swift @@ -33,25 +33,24 @@ public class AbsDownloader: CAPPlugin { private func startLibraryItemDownload(item: LibraryItem) { let length = item.media.tracks?.count ?? 0 if length > 0 { - let localLibraryItem = LocalLibraryItem(item: item, localUrl: documentsDirectory, server: Store.serverConfig!) - - item.media.tracks?.enumerated().forEach { position, track in - startLibraryItemTrackDownload(item: item, position: position, track: track) + let files = item.media.tracks!.enumerated().map { + position, track -> LocalFile in startLibraryItemTrackDownload(item: item, position: position, track: track) } + let localLibraryItem = LocalLibraryItem(item: item, localUrl: documentsDirectory, server: Store.serverConfig!, files: files) Database.shared.saveLocalLibraryItem(localLibraryItem: localLibraryItem) } else { NSLog("No audio tracks for the supplied library item") } } - private func startLibraryItemTrackDownload(item: LibraryItem, position: Int, track: AudioTrack) { + private func startLibraryItemTrackDownload(item: LibraryItem, position: Int, track: AudioTrack) -> LocalFile { NSLog("TRACK \(track.contentUrl!)") // If we don't name metadata, then we can't proceed guard let filename = track.metadata?.filename else { NSLog("No metadata for track, unable to download") - return + return LocalFile() } let serverUrl = urlForTrack(item: item, track: track) @@ -59,6 +58,7 @@ public class AbsDownloader: CAPPlugin { let localUrl = itemDirectory.appendingPathComponent("\(filename)") downloadTrack(serverUrl: serverUrl, localUrl: localUrl) + return LocalFile(filename: filename, localUrl: localUrl) } private func urlForTrack(item: LibraryItem, track: AudioTrack) -> URL { @@ -83,7 +83,7 @@ public class AbsDownloader: CAPPlugin { return itemDirectory } - private func downloadTrack(serverUrl: URL, localUrl: URL) -> URLSessionDownloadTask { + private func downloadTrack(serverUrl: URL, localUrl: URL) { let downloadTask = URLSession.shared.downloadTask(with: serverUrl) { urlOrNil, responseOrNil, errorOrNil in guard let fileURL = urlOrNil else { return } @@ -100,8 +100,6 @@ public class AbsDownloader: CAPPlugin { // Start the download downloadTask.resume() - - return downloadTask } } diff --git a/ios/App/Shared/models/DataClasses.swift b/ios/App/Shared/models/DataClasses.swift index cea3d912..b29b7a6f 100644 --- a/ios/App/Shared/models/DataClasses.swift +++ b/ios/App/Shared/models/DataClasses.swift @@ -37,7 +37,7 @@ struct MediaType: Codable { var metadata: Metadata var coverPath: String? var tags: [String]? - var audioFiles: [AudioTrack]? + var audioFiles: [AudioFile]? var chapters: [Chapter]? var tracks: [AudioTrack]? var size: Int64? diff --git a/ios/App/Shared/models/LocalLibrary.swift b/ios/App/Shared/models/LocalLibrary.swift index a079bebe..39f7da35 100644 --- a/ios/App/Shared/models/LocalLibrary.swift +++ b/ios/App/Shared/models/LocalLibrary.swift @@ -30,13 +30,13 @@ class LocalLibraryItem: Object { super.init() } - init(item: LibraryItem, localUrl: URL, server: ServerConnectionConfig) { + init(item: LibraryItem, localUrl: URL, server: ServerConnectionConfig, files: [LocalFile]) { super.init() self.id = item.id self.contentUrl = localUrl.absoluteString self.mediaType = item.mediaType self.media = LocalMediaType(mediaType: item.media) - // TODO: self.localFiles + self.localFiles.append(objectsIn: files) // TODO: self.coverContentURL // TODO: self.converAbsolutePath self.libraryItemId = item.id @@ -67,28 +67,24 @@ class LocalMediaType: Object { super.init() self.libraryItemId = mediaType.libraryItemId self.metadata = LocalMetadata(metadata: mediaType.metadata) + // TODO: self.coverPath self.tags.append(objectsIn: mediaType.tags ?? []) + self.audioFiles.append(objectsIn: mediaType.audioFiles!.enumerated().map() { + i, audioFile -> LocalAudioFile in LocalAudioFile(audioFile: audioFile) + }) + self.chapters.append(objectsIn: mediaType.chapters!.enumerated().map() { + i, chapter -> LocalChapter in LocalChapter(chapter: chapter) + }) + self.tracks.append(objectsIn: mediaType.tracks!.enumerated().map() { + i, track in LocalAudioTrack(track: track) + }) self.size = mediaType.size self.duration = mediaType.duration + // TODO: self.episodes self.autoDownloadEpisodes = mediaType.autoDownloadEpisodes } } -class LocalMediaItem: Object { - @Persisted var id: String - @Persisted var name: String - @Persisted var mediaType: String - @Persisted var folderId: String - @Persisted var contentUrl: String - @Persisted var simplePath: String - @Persisted var basePath: String - @Persisted var absolutePath: String - @Persisted var audioTracks: List - @Persisted var localFiles: List - @Persisted var coverContentUrl: String? = "" - @Persisted var coverAbsolutePath: String? = "" -} - class LocalMetadata: Object { @Persisted var title: String @Persisted var subtitle: String? = "" @@ -135,7 +131,7 @@ class LocalMetadata: Object { } } -class LocalPodcastEpisode: Object, Codable { +class LocalPodcastEpisode: Object { @Persisted var id: String @Persisted var index: Int @Persisted var episode: String? = "" @@ -154,6 +150,16 @@ class LocalAudioFile: Object, Codable { @Persisted var index: Int @Persisted var ino: String @Persisted var metadata: LocalFileMetadata? + + override init() { + super.init() + } + + init(audioFile: AudioFile) { + self.index = audioFile.index + self.ino = audioFile.ino + // TODO: self.metadata + } } class LocalAuthor: Object, Codable { @@ -181,7 +187,7 @@ class LocalChapter: Object, Codable { } } -class LocalAudioTrack: Object, Codable { +class LocalAudioTrack: Object { @Persisted var index: Int? = nil @Persisted var startOffset: Double? = nil @Persisted var duration: Double @@ -189,10 +195,25 @@ class LocalAudioTrack: Object, Codable { @Persisted var contentUrl: String? = "" @Persisted var mimeType: String @Persisted var metadata: LocalFileMetadata? = nil - @Persisted var isLocal: Bool + @Persisted var isLocal: Bool = true @Persisted var localFileId: String? = "" -// var audioProbeResult: AudioProbeResult? // Needed for local playback. Requires local FFMPEG? Not sure how doable this is on iOS @Persisted var serverIndex: Int? = nil + + override init() { + super.init() + } + + init(track: AudioTrack) { + self.index = track.index + self.startOffset = track.startOffset + self.duration = track.duration + self.title = track.title + self.contentUrl = track.contentUrl // TODO: Different URL + self.mimeType = track.mimeType + // TODO: self.metadata + // TODO: self.localFileId + self.serverIndex = track.serverIndex + } } class LocalFileMetadata: Object, Codable { @@ -211,6 +232,20 @@ class LocalFile: Object { @Persisted var simplePath: String @Persisted var mimeType: String? = "" @Persisted var size: Int64 + + override init() { + super.init() + } + + init(filename: String, localUrl: URL) { + self.filename = filename + self.contentUrl = localUrl.absoluteString + // TODO: self.baseUrl + self.absolutePath = localUrl.absoluteString + self.simplePath = localUrl.path + // TODO: self.mimeType + // TODO: self.size + } } class LocalMediaProgress: Object, Codable {