From e620f537058a223b7cacb3d7bb700cae79b1a294 Mon Sep 17 00:00:00 2001 From: ronaldheft Date: Sat, 9 Jul 2022 17:35:59 -0400 Subject: [PATCH] Get something saving in the database --- ios/App/App/plugins/AbsDownloader.swift | 13 ++- ios/App/Shared/models/LocalLibrary.swift | 119 ++++++++++++++++++----- 2 files changed, 103 insertions(+), 29 deletions(-) diff --git a/ios/App/App/plugins/AbsDownloader.swift b/ios/App/App/plugins/AbsDownloader.swift index 4f33b51f..78ddce22 100644 --- a/ios/App/App/plugins/AbsDownloader.swift +++ b/ios/App/App/plugins/AbsDownloader.swift @@ -10,6 +10,8 @@ import Capacitor @objc(AbsDownloader) public class AbsDownloader: CAPPlugin { + let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] + @objc func downloadLibraryItem(_ call: CAPPluginCall) { let libraryItemId = call.getString("libraryItemId") let episodeId = call.getString("episodeId") @@ -31,28 +33,32 @@ 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) } + + Database.shared.saveLocalLibraryItem(localLibraryItem: localLibraryItem) } else { NSLog("No audio tracks for the supplied library item") } } - private func startLibraryItemTrackDownload(item: LibraryItem, position: Int, track: AudioTrack) -> URLSessionDownloadTask? { + private func startLibraryItemTrackDownload(item: LibraryItem, position: Int, track: AudioTrack) { 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 nil + return } let serverUrl = urlForTrack(item: item, track: track) let itemDirectory = createLibraryItemFileDirectory(item: item) let localUrl = itemDirectory.appendingPathComponent("\(filename)") - return downloadTrack(serverUrl: serverUrl, localUrl: localUrl) + downloadTrack(serverUrl: serverUrl, localUrl: localUrl) } private func urlForTrack(item: LibraryItem, track: AudioTrack) -> URL { @@ -63,7 +69,6 @@ public class AbsDownloader: CAPPlugin { } private func createLibraryItemFileDirectory(item: LibraryItem) -> URL { - let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] let itemDirectory = documentsDirectory.appendingPathComponent("\(item.id)") NSLog("ITEM DIR \(itemDirectory)") diff --git a/ios/App/Shared/models/LocalLibrary.swift b/ios/App/Shared/models/LocalLibrary.swift index a1016226..a079bebe 100644 --- a/ios/App/Shared/models/LocalLibrary.swift +++ b/ios/App/Shared/models/LocalLibrary.swift @@ -9,25 +9,72 @@ import Foundation import RealmSwift -class LocalLibraryItem: Object, Codable { +class LocalLibraryItem: Object { @Persisted(primaryKey: true) var id: String - @Persisted var basePath: String - @Persisted var absolutePath: String + @Persisted var basePath: String = "" + @Persisted var absolutePath: String = "" @Persisted var contentUrl: String - @Persisted var isInvalid: Bool + @Persisted var isInvalid: Bool = false @Persisted var mediaType: String @Persisted var media: LocalMediaType? @Persisted var localFiles: List @Persisted var coverContentUrl: String? = nil @Persisted var coverAbsolutePath: String? = nil - @Persisted var isLocal: Bool + @Persisted var isLocal: Bool = true @Persisted var serverConnectionConfigId: String? = nil @Persisted var serverAddress: String? = nil @Persisted var serverUserId: String? = nil @Persisted var libraryItemId: String? = nil + + override init() { + super.init() + } + + init(item: LibraryItem, localUrl: URL, server: ServerConnectionConfig) { + super.init() + self.id = item.id + self.contentUrl = localUrl.absoluteString + self.mediaType = item.mediaType + self.media = LocalMediaType(mediaType: item.media) + // TODO: self.localFiles + // TODO: self.coverContentURL + // TODO: self.converAbsolutePath + self.libraryItemId = item.id + self.serverConnectionConfigId = server.id + self.serverAddress = server.address + self.serverUserId = server.userId + } } -class LocalMediaItem: Object, Codable { +class LocalMediaType: Object { + @Persisted var libraryItemId: String? = "" + @Persisted var metadata: LocalMetadata? + @Persisted var coverPath: String? = "" + @Persisted var tags: List + @Persisted var audioFiles: List + @Persisted var chapters: List + @Persisted var tracks: List + @Persisted var size: Int64? = nil + @Persisted var duration: Double? = nil + @Persisted var episodes: List + @Persisted var autoDownloadEpisodes: Bool? = nil + + override init() { + super.init() + } + + init(mediaType: MediaType) { + super.init() + self.libraryItemId = mediaType.libraryItemId + self.metadata = LocalMetadata(metadata: mediaType.metadata) + self.tags.append(objectsIn: mediaType.tags ?? []) + self.size = mediaType.size + self.duration = mediaType.duration + self.autoDownloadEpisodes = mediaType.autoDownloadEpisodes + } +} + +class LocalMediaItem: Object { @Persisted var id: String @Persisted var name: String @Persisted var mediaType: String @@ -42,21 +89,7 @@ class LocalMediaItem: Object, Codable { @Persisted var coverAbsolutePath: String? = "" } -class LocalMediaType: Object, Codable { - @Persisted var libraryItemId: String? = "" - @Persisted var metadata: LocalMetadata? - @Persisted var coverPath: String? = "" - @Persisted var tags: List - @Persisted var audioFiles: List - @Persisted var chapters: List - @Persisted var tracks: List - @Persisted var size: Int64? = nil - @Persisted var duration: Double? = nil - @Persisted var episodes: List - @Persisted var autoDownloadEpisodes: Bool? = nil -} - -class LocalMetadata: Object, Codable { +class LocalMetadata: Object { @Persisted var title: String @Persisted var subtitle: String? = "" @Persisted var authors: List @@ -65,8 +98,7 @@ class LocalMetadata: Object, Codable { @Persisted var publishedYear: String? = "" @Persisted var publishedDate: String? = "" @Persisted var publisher: String? = "" - // I think calling the below variable description conflicts with some public variables declared in some of the Pods we use, so it's desc. ¯\_(ツ)_/¯ - @Persisted final var desc: String + @Persisted var desc: String? = "" @Persisted var isbn: String? = "" @Persisted var asin: String? = "" @Persisted var language: String? = "" @@ -76,6 +108,31 @@ class LocalMetadata: Object, Codable { @Persisted var narratorName: String? = "" @Persisted var seriesName: String? = "" @Persisted var feedUrl: String? = "" + + override init() { + super.init() + } + + init(metadata: Metadata) { + super.init() + self.title = metadata.title + self.subtitle = metadata.subtitle + self.narrators.append(objectsIn: metadata.narrators ?? []) + self.genres.append(objectsIn: metadata.genres) + self.publishedYear = metadata.publishedYear + self.publishedDate = metadata.publishedDate + self.publisher = metadata.publisher + self.desc = metadata.description + self.isbn = metadata.isbn + self.asin = metadata.asin + self.language = metadata.language + self.explicit = metadata.explicit + self.authorName = metadata.authorName + self.authorNameLF = metadata.authorNameLF + self.narratorName = metadata.narratorName + self.seriesName = metadata.seriesName + self.feedUrl = metadata.feedUrl + } } class LocalPodcastEpisode: Object, Codable { @@ -85,7 +142,7 @@ class LocalPodcastEpisode: Object, Codable { @Persisted var episodeType: String? = "" @Persisted var title: String @Persisted var subtitle: String? = "" - @Persisted var escription: String? = "" + @Persisted var desc: String? = "" @Persisted var audioFile: LocalAudioFile? = nil @Persisted var audioTrack: LocalAudioTrack? = nil @Persisted var duration: Double @@ -110,6 +167,18 @@ class LocalChapter: Object, Codable { @Persisted var start: Double @Persisted var end: Double @Persisted var title: String? = nil + + override init() { + super.init() + } + + init(chapter: Chapter) { + super.init() + self.id = chapter.id + self.start = chapter.start + self.end = chapter.end + self.title = chapter.title + } } class LocalAudioTrack: Object, Codable { @@ -133,7 +202,7 @@ class LocalFileMetadata: Object, Codable { @Persisted var relPath: String } -class LocalFile: Object, Codable { +class LocalFile: Object { @Persisted var id: String @Persisted var filename: String? = "" @Persisted var contentUrl: String