From 60cb5f398c54f0c64cd84fda5c20f9221147ad48 Mon Sep 17 00:00:00 2001 From: ronaldheft Date: Thu, 11 Aug 2022 14:12:45 -0400 Subject: [PATCH] Handle deleting library items --- ios/App/App/plugins/AbsAudioPlayer.swift | 2 +- ios/App/App/plugins/AbsDatabase.swift | 4 ++-- ios/App/App/plugins/AbsDownloader.swift | 2 +- ios/App/App/plugins/AbsFileSystem.swift | 18 ++++++++++++++---- ios/App/Shared/models/LocalLibrary.swift | 8 ++++++++ ios/App/Shared/util/Database.swift | 24 ++++++++++++------------ pages/localMedia/item/_id.vue | 4 ++-- 7 files changed, 40 insertions(+), 22 deletions(-) diff --git a/ios/App/App/plugins/AbsAudioPlayer.swift b/ios/App/App/plugins/AbsAudioPlayer.swift index a66d3b36..d4e74869 100644 --- a/ios/App/App/plugins/AbsAudioPlayer.swift +++ b/ios/App/App/plugins/AbsAudioPlayer.swift @@ -44,7 +44,7 @@ public class AbsAudioPlayer: CAPPlugin { let isLocalItem = libraryItemId?.starts(with: "local_") ?? false if (isLocalItem) { - let item = Database.shared.getLocalLibraryItem(localLibraryItem: libraryItemId!) + let item = Database.shared.getLocalLibraryItem(localLibraryItemId: libraryItemId!) // TODO: Logic required for podcasts here let playbackSession = item?.getPlaybackSession(episode: nil) PlayerHandler.startPlayback(session: playbackSession!, playWhenReady: playWhenReady, playbackRate: playbackRate) diff --git a/ios/App/App/plugins/AbsDatabase.swift b/ios/App/App/plugins/AbsDatabase.swift index fdc3bab6..1d3f6569 100644 --- a/ios/App/App/plugins/AbsDatabase.swift +++ b/ios/App/App/plugins/AbsDatabase.swift @@ -81,7 +81,7 @@ public class AbsDatabase: CAPPlugin { @objc func getLocalLibraryItem(_ call: CAPPluginCall) { do { - let item = Database.shared.getLocalLibraryItem(localLibraryItem: call.getString("id") ?? "") + let item = Database.shared.getLocalLibraryItem(localLibraryItemId: call.getString("id") ?? "") switch item { case .some(let foundItem): call.resolve(try foundItem.asDictionary()) @@ -97,7 +97,7 @@ public class AbsDatabase: CAPPlugin { @objc func getLocalLibraryItemByLId(_ call: CAPPluginCall) { do { - let item = Database.shared.getLocalLibraryItemByLLId(libraryItem: call.getString("libraryItemId") ?? "") + let item = Database.shared.getLocalLibraryItem(byServerLibraryItemId: call.getString("libraryItemId") ?? "") switch item { case .some(let foundItem): call.resolve(try foundItem.asDictionary()) diff --git a/ios/App/App/plugins/AbsDownloader.swift b/ios/App/App/plugins/AbsDownloader.swift index 06b6e131..bfb2bd60 100644 --- a/ios/App/App/plugins/AbsDownloader.swift +++ b/ios/App/App/plugins/AbsDownloader.swift @@ -157,7 +157,7 @@ public class AbsDownloader: CAPPlugin, URLSessionDownloadDelegate { } return LocalFile(libraryItem.id, part.filename!, part.mimeType()!, part.destinationUri!, fileSize: Int(part.destinationURL!.fileSize)) } - var localLibraryItem = Database.shared.getLocalLibraryItemByLLId(libraryItem: libraryItem.id) + var localLibraryItem = Database.shared.getLocalLibraryItem(byServerLibraryItemId: libraryItem.id) if (localLibraryItem != nil && localLibraryItem!.isPodcast) { try! localLibraryItem?.addFiles(files, item: libraryItem) } else { diff --git a/ios/App/App/plugins/AbsFileSystem.swift b/ios/App/App/plugins/AbsFileSystem.swift index 83610d75..a1a2763d 100644 --- a/ios/App/App/plugins/AbsFileSystem.swift +++ b/ios/App/App/plugins/AbsFileSystem.swift @@ -67,13 +67,23 @@ public class AbsFileSystem: CAPPlugin { } @objc func deleteItem(_ call: CAPPluginCall) { - let localLibraryItemId = call.getString("localLibraryItemId") + let localLibraryItemId = call.getString("id") let contentUrl = call.getString("contentUrl") - - // TODO: Implement + NSLog("deleteItem \(localLibraryItemId ?? "UNSET") url \(contentUrl ?? "UNSET")") - call.resolve() + var success = false + do { + if let localLibraryItemId = localLibraryItemId, let item = Database.shared.getLocalLibraryItem(localLibraryItemId: localLibraryItemId) { + try FileManager.default.removeItem(at: item.contentDirectory!) + Database.shared.removeLocalLibraryItem(localLibraryItemId: localLibraryItemId) + success = true + } + } catch { + NSLog("Failed to delete \(error)") + } + + call.resolve(["success": success]) } @objc func deleteTrackFromItem(_ call: CAPPluginCall) { diff --git a/ios/App/Shared/models/LocalLibrary.swift b/ios/App/Shared/models/LocalLibrary.swift index 542f4dab..845434c8 100644 --- a/ios/App/Shared/models/LocalLibrary.swift +++ b/ios/App/Shared/models/LocalLibrary.swift @@ -31,6 +31,14 @@ struct LocalLibraryItem: Realmable, Codable { } } + var contentDirectory: URL? { + if let path = _contentUrl { + return AbsDownloader.itemDownloadFolder(path: path) + } else { + return nil + } + } + var coverContentUrl: String? { if let path = self._coverContentUrl { return AbsDownloader.itemDownloadFolder(path: path)!.absoluteString diff --git a/ios/App/Shared/util/Database.swift b/ios/App/Shared/util/Database.swift index 849de8f8..a1b418ae 100644 --- a/ios/App/Shared/util/Database.swift +++ b/ios/App/Shared/util/Database.swift @@ -108,14 +108,14 @@ class Database { return Array(realm.objects(LocalLibraryItem.self)) } - public func getLocalLibraryItemByLLId(libraryItem: String) -> LocalLibraryItem? { + public func getLocalLibraryItem(byServerLibraryItemId: String) -> LocalLibraryItem? { let realm = try! Realm() - return realm.objects(LocalLibraryItem.self).first(where: { $0.libraryItemId == libraryItem }) + return realm.objects(LocalLibraryItem.self).first(where: { $0.libraryItemId == byServerLibraryItemId }) } - public func getLocalLibraryItem(localLibraryItem: String) -> LocalLibraryItem? { + public func getLocalLibraryItem(localLibraryItemId: String) -> LocalLibraryItem? { let realm = try! Realm() - return realm.object(ofType: LocalLibraryItem.self, forPrimaryKey: localLibraryItem) + return realm.object(ofType: LocalLibraryItem.self, forPrimaryKey: localLibraryItemId) } public func saveLocalLibraryItem(localLibraryItem: LocalLibraryItem) { @@ -123,6 +123,14 @@ class Database { try! realm.write { realm.add(localLibraryItem, update: .modified) } } + public func removeLocalLibraryItem(localLibraryItemId: String) { + let realm = try! Realm() + try! realm.write { + let item = getLocalLibraryItem(localLibraryItemId: localLibraryItemId) + realm.delete(item!) + } + } + public func getDownloadItem(downloadItemId: String) -> DownloadItem? { let realm = try! Realm() return realm.object(ofType: DownloadItem.self, forPrimaryKey: downloadItemId) @@ -158,14 +166,6 @@ class Database { return realm.objects(DeviceSettings.self).first ?? getDefaultDeviceSettings() } - public func removeLocalLibraryItem(localLibraryItemId: String) { - let realm = try! Realm() - try! realm.write { - let item = getLocalLibraryItemByLLId(libraryItem: localLibraryItemId) - realm.delete(item!) - } - } - public func saveLocalMediaProgress(_ mediaProgress: LocalMediaProgress) { let realm = try! Realm() try! realm.write { realm.add(mediaProgress, update: .modified) } diff --git a/pages/localMedia/item/_id.vue b/pages/localMedia/item/_id.vue index 53714ad4..94fcec33 100644 --- a/pages/localMedia/item/_id.vue +++ b/pages/localMedia/item/_id.vue @@ -322,13 +322,13 @@ export default { async deleteItem() { const { value } = await Dialog.confirm({ title: 'Confirm', - message: `Warning! This will delete the folder "${this.basePath}" and all contents. Are you sure?` + message: `Warning! This will delete "${this.media.metadata.title}" and all associated local files. Are you sure?` }) if (value) { var res = await AbsFileSystem.deleteItem(this.localLibraryItem) if (res && res.success) { this.$toast.success('Deleted Successfully') - this.$router.replace(`/localMedia/folders/${this.folderId}`) + this.$router.replace(this.isIos ? '/bookshelf' : `/localMedia/folders/${this.folderId}`) } else this.$toast.error('Failed to delete') } },