From 8c811e75baeeeb11fdd9c209cdbc0a74d88eef8b Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 30 Nov 2024 13:18:04 -0800 Subject: [PATCH] =?UTF-8?q?Skip=20downloading=20feeds=20from=20X/Twitter,?= =?UTF-8?q?=20since=20those=20sites=20will=20never=20return=20a=20feed.=20?= =?UTF-8?q?(X/Twitter=20URLs=20may=20still=20be=20in=20people=E2=80=99s=20?= =?UTF-8?q?feeds=20lists=20due=20to=20prior=20Twitter=20integration,=20tha?= =?UTF-8?q?t=20has=20since=20gone=20away=20at=20Twitter=E2=80=99s=20initia?= =?UTF-8?q?tive.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LocalAccount/LocalAccountRefresher.swift | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/Account/Sources/Account/LocalAccount/LocalAccountRefresher.swift b/Account/Sources/Account/LocalAccount/LocalAccountRefresher.swift index 467305b00..6f373e5ed 100644 --- a/Account/Sources/Account/LocalAccount/LocalAccountRefresher.swift +++ b/Account/Sources/Account/LocalAccount/LocalAccountRefresher.swift @@ -36,7 +36,9 @@ final class LocalAccountRefresher { public func refreshFeeds(_ feeds: Set, completion: (() -> Void)? = nil) { - guard !feeds.isEmpty else { + let filteredFeeds = feeds.filter { !Self.feedIsDisallowed($0) } + + guard !filteredFeeds.isEmpty else { Task { @MainActor in completion?() } @@ -44,11 +46,11 @@ final class LocalAccountRefresher { } urlToFeedDictionary.removeAll() - for feed in feeds { + for feed in filteredFeeds { urlToFeedDictionary[feed.url] = feed } - let urls = feeds.compactMap { feed in + let urls = filteredFeeds.compactMap { feed in URL(unicodeString: feed.url) } @@ -122,6 +124,36 @@ extension LocalAccountRefresher: DownloadSessionDelegate { } } + +// MARK: - Private + +private extension LocalAccountRefresher { + + /// These hosts will never return a feed. + static let badHosts = ["twitter.com", "www.twitter.com", "x.com", "www.x.com"] + + /// Return true if we won’t download that feed. + /// + /// We will never get a feed from X/Twitter, for instance. + static func feedIsDisallowed(_ feed: WebFeed) -> Bool { + + guard let url = URL(unicodeString: feed.url) else { + return true + } + guard let lowercaseHost = url.host()?.lowercased() else { + return true + } + + for badHost in badHosts { + if lowercaseHost == badHost { + return true + } + } + + return false + } +} + // MARK: - Utility private extension Data {