From 8123fd8d0c69f8d2f1d1e4fb94a2d0714c307a3d Mon Sep 17 00:00:00 2001 From: kingbri Date: Mon, 10 Apr 2023 17:10:42 -0400 Subject: [PATCH] Filters: Add debrid cache status option Items can now be filtered based if they're present in the debrid cache, are a batch file, or not present at all. Signed-off-by: kingbri --- Ferrite/Models/DebridManagerModels.swift | 8 ++++---- Ferrite/ViewModels/DebridManager.swift | 2 ++ .../SearchResult/SearchFilterHeaderView.swift | 20 +++++++++++++++++++ .../SearchResult/SearchResultButtonView.swift | 3 ++- .../SearchResult/SearchResultsView.swift | 9 ++++++++- 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/Ferrite/Models/DebridManagerModels.swift b/Ferrite/Models/DebridManagerModels.swift index 60975a3..484b3ef 100644 --- a/Ferrite/Models/DebridManagerModels.swift +++ b/Ferrite/Models/DebridManagerModels.swift @@ -10,10 +10,10 @@ import Foundation // MARK: - Universal IA enum (IA = InstantAvailability) -public enum IAStatus: Codable, Hashable, Sendable { - case full - case partial - case none +public enum IAStatus: String, Codable, Hashable, Sendable, CaseIterable { + case full = "Cached" + case partial = "Batch" + case none = "Uncached" } // MARK: - Enum for debrid differentiation. 0 is nil diff --git a/Ferrite/ViewModels/DebridManager.swift b/Ferrite/ViewModels/DebridManager.swift index db6a32d..752e0c5 100644 --- a/Ferrite/ViewModels/DebridManager.swift +++ b/Ferrite/ViewModels/DebridManager.swift @@ -33,6 +33,8 @@ public class DebridManager: ObservableObject { } } + @Published var filteredIAStatus: [IAStatus] = [] + var currentDebridTask: Task? var downloadUrl: String = "" var authUrl: URL? diff --git a/Ferrite/Views/ComponentViews/SearchResult/SearchFilterHeaderView.swift b/Ferrite/Views/ComponentViews/SearchResult/SearchFilterHeaderView.swift index d4e6a37..7bb8920 100644 --- a/Ferrite/Views/ComponentViews/SearchResult/SearchFilterHeaderView.swift +++ b/Ferrite/Views/ComponentViews/SearchResult/SearchFilterHeaderView.swift @@ -45,6 +45,26 @@ struct SearchFilterHeaderView: View { FilterLabelView(name: debridManager.selectedDebridType?.toString() ?? "Debrid") } .id(debridManager.selectedDebridType) + + // MARK: - Cache status picker + + // TODO: Make this use multiple selections + if !debridManager.enabledDebrids.isEmpty { + Menu { + Picker("", selection: $debridManager.filteredIAStatus) { + Text("All").tag([] as [IAStatus]) + + ForEach(IAStatus.allCases, id: \.self) { status in + Text(status.rawValue).tag([status]) + } + } + } label: { + FilterLabelView( + name: debridManager.filteredIAStatus.first?.rawValue ?? "Cache Status" + ) + } + .id(debridManager.filteredIAStatus) + } } .padding(.horizontal, verticalSizeClass == .compact ? 65 : 18) } diff --git a/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift b/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift index 1df4702..efe438b 100644 --- a/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift +++ b/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift @@ -15,6 +15,7 @@ struct SearchResultButtonView: View { @EnvironmentObject var pluginManager: PluginManager var result: SearchResult + var debridIAStatus: IAStatus? @State private var runOnce = false @State var existingBookmark: Bookmark? = nil @@ -27,7 +28,7 @@ struct SearchResultButtonView: View { navModel.selectedTitle = result.title ?? "" navModel.resultFromCloud = false - switch debridManager.matchMagnetHash(result.magnet) { + switch debridIAStatus ?? debridManager.matchMagnetHash(result.magnet) { case .full: if debridManager.selectDebridResult(magnet: result.magnet) { debridManager.currentDebridTask = Task { diff --git a/Ferrite/Views/ComponentViews/SearchResult/SearchResultsView.swift b/Ferrite/Views/ComponentViews/SearchResult/SearchResultsView.swift index 3dbc942..09d9987 100644 --- a/Ferrite/Views/ComponentViews/SearchResult/SearchResultsView.swift +++ b/Ferrite/Views/ComponentViews/SearchResult/SearchResultsView.swift @@ -14,6 +14,7 @@ struct SearchResultsView: View { @EnvironmentObject var scrapingModel: ScrapingViewModel @EnvironmentObject var navModel: NavigationViewModel @EnvironmentObject var pluginManager: PluginManager + @EnvironmentObject var debridManager: DebridManager @AppStorage("Behavior.UsesRandomSearchText") var usesRandomSearchText: Bool = false @@ -21,7 +22,13 @@ struct SearchResultsView: View { var body: some View { ForEach(scrapingModel.searchResults, id: \.self) { result in - if pluginManager.filteredInstalledSources.isEmpty || pluginManager.filteredInstalledSources.contains(where: { result.source == $0.name }) { + let debridIAStatus = debridManager.matchMagnetHash(result.magnet) + if + (pluginManager.filteredInstalledSources.isEmpty || + pluginManager.filteredInstalledSources.contains(where: { result.source == $0.name })) && + (debridManager.filteredIAStatus.isEmpty || + debridManager.filteredIAStatus.contains(debridIAStatus)) + { SearchResultButtonView(result: result) } }