From 4fb5f77718d3e2f4ec3adba6abd8a5c429984ece Mon Sep 17 00:00:00 2001 From: kingbri Date: Tue, 26 Nov 2024 22:09:03 -0500 Subject: [PATCH] Debrid: Add context menu option to download to debrid This is a manual button so users can download an item to their preferred debrid service. If the item is cached in the debrid, it will download instantly and display the result to the user. Otherwise, the caching alert is shown. Signed-off-by: kingbri --- Ferrite/API/RealDebridWrapper.swift | 6 +- .../SearchResult/SearchResultButtonView.swift | 77 +++++++++++++------ 2 files changed, 59 insertions(+), 24 deletions(-) diff --git a/Ferrite/API/RealDebridWrapper.swift b/Ferrite/API/RealDebridWrapper.swift index b7b2880..6cd3d62 100644 --- a/Ferrite/API/RealDebridWrapper.swift +++ b/Ferrite/API/RealDebridWrapper.swift @@ -13,7 +13,11 @@ class RealDebrid: PollingDebridSource, ObservableObject { let website = "https://real-debrid.com" let description: String? = "RealDebrid is a debrid service that is used for downloads and media playback. " + "You must pay to access this service. \n\n" + - "This service does not inform if a magnet link in a user's cloud library is a batch before downloading." + "It is not recommended to use this service since media cache checks are not possible via the API. " + + "Ferrite's instant availability solely looks at a user's magnet library. \n\n" + + "If you must use this service, it is recommended to download search results manually using the context menu. \n\n" + + "This service does not inform if a magnet link is a batch before downloading." + let cachedStatus: [String] = ["downloaded"] var authTask: Task? diff --git a/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift b/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift index d523bee..18f0f62 100644 --- a/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift +++ b/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift @@ -37,29 +37,7 @@ struct SearchResultButtonView: View { case .full: if debridManager.selectDebridResult(magnet: result.magnet) { debridManager.currentDebridTask = Task { - await debridManager.fetchDebridDownload(magnet: result.magnet) - - // Bump to batch - if debridManager.requiresUnrestrict { - navModel.selectedHistoryInfo = historyEntry - navModel.currentChoiceSheet = .batch - - return - } - - if !debridManager.downloadUrl.isEmpty { - historyEntry.url = debridManager.downloadUrl - PersistenceController.shared.createHistory(historyEntry, performSave: true) - - pluginManager.runDefaultAction( - urlString: debridManager.downloadUrl, - navModel: navModel - ) - - if navModel.currentChoiceSheet != .action { - debridManager.downloadUrl = "" - } - } + await downloadToDebrid() } } case .partial: @@ -121,6 +99,28 @@ struct SearchResultButtonView: View { } } } + + Button { + if debridManager.currentDebridTask == nil { + if !debridManager.selectDebridResult(magnet: result.magnet) { + debridManager.selectedDebridItem = DebridIA( + magnet: result.magnet, + expiryTimeStamp: Date().timeIntervalSince1970 + 200, + files: [] + ) + } + + debridManager.currentDebridTask = Task { + await downloadToDebrid() + + // Re-populate the IA cache + await debridManager.populateDebridIA([result.magnet]) + } + } + } label: { + Text("Download to Debrid") + Image(systemName: "arrow.down.circle") + } } .alert("Caching file", isPresented: $debridManager.showDeleteAlert) { Button("Yes", role: .destructive) { @@ -166,4 +166,35 @@ struct SearchResultButtonView: View { } } } + + // Common function to download + func downloadToDebrid() async { + var historyEntry = HistoryEntryJson( + name: result.title, + source: result.source + ) + + await debridManager.fetchDebridDownload(magnet: result.magnet) + navModel.selectedTitle = result.title ?? "" + + if debridManager.requiresUnrestrict { + navModel.currentChoiceSheet = .batch + + return + } + + if !debridManager.downloadUrl.isEmpty { + historyEntry.url = debridManager.downloadUrl + PersistenceController.shared.createHistory(historyEntry, performSave: true) + + pluginManager.runDefaultAction( + urlString: debridManager.downloadUrl, + navModel: navModel + ) + + if navModel.currentChoiceSheet != .action { + debridManager.downloadUrl = "" + } + } + } }