From eb48b99ed8d80476784fc2036ce39f4a6ec91189 Mon Sep 17 00:00:00 2001 From: kingbri Date: Tue, 6 Jun 2023 19:54:13 -0400 Subject: [PATCH] Scraping: Add new source methods Some sources can be unique and require some extra parsing. Add the ability to extract a magnet link instead of assuming that every source provides a properly formatted one. Signed-off-by: kingbri --- Ferrite/Models/DebridManagerModels.swift | 24 ++++++++++++++++++---- Ferrite/ViewModels/ScrapingViewModel.swift | 3 ++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Ferrite/Models/DebridManagerModels.swift b/Ferrite/Models/DebridManagerModels.swift index 484b3ef..17bc43c 100644 --- a/Ferrite/Models/DebridManagerModels.swift +++ b/Ferrite/Models/DebridManagerModels.swift @@ -55,12 +55,12 @@ public struct Magnet: Codable, Hashable, Sendable { if let hash, link == nil { self.hash = parseHash(hash) self.link = generateLink(hash: hash, title: title, trackers: trackers) - } else if let link, hash == nil { - self.link = link - self.hash = parseHash(extractHash(link: link)) + } else if let parsedLink = parseLink(link), hash == nil { + self.link = parsedLink + self.hash = parseHash(extractHash(link: parsedLink)) } else { self.hash = parseHash(hash) - self.link = link + self.link = parseLink(link) } } @@ -107,4 +107,20 @@ public struct Magnet: Codable, Hashable, Sendable { return String(magnetHash).lowercased() } } + + func parseLink(_ link: String?) -> String? { + if let decodedLink = link?.removingPercentEncoding { + let separator = "magnet:?xt=urn:btih:" + if decodedLink.starts(with: separator) { + return decodedLink + } else if decodedLink.contains(separator) { + let splitLink = decodedLink.components(separatedBy: separator) + return splitLink.last.map { separator + $0 } ?? nil + } else { + return nil + } + } else { + return nil + } + } } diff --git a/Ferrite/ViewModels/ScrapingViewModel.swift b/Ferrite/ViewModels/ScrapingViewModel.swift index ab7d9a3..46720dd 100644 --- a/Ferrite/ViewModels/ScrapingViewModel.swift +++ b/Ferrite/ViewModels/ScrapingViewModel.swift @@ -164,7 +164,8 @@ class ScrapingViewModel: ObservableObject { case .scraping: if let htmlParser = source.htmlParser { let replacedSearchUrl = htmlParser.searchUrl.map { - $0.replacingOccurrences(of: "{query}", with: encodedQuery) + $0 + .replacingOccurrences(of: "{query}", with: encodedQuery) } let data = await handleUrls(