From 5dea55855f7d16fdab7218bb278834993f1b5e7e Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Thu, 12 Dec 2024 21:16:42 -0800 Subject: [PATCH] =?UTF-8?q?Add=20preliminary=20fix=20=E2=80=94=C2=A0but=20?= =?UTF-8?q?not=20final=20fix=20=E2=80=94=C2=A0for=20bandwidth=20use=20whil?= =?UTF-8?q?e=20downloading=20HTML=20metadata.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HTMLMetadata/HTMLMetadataDownloader.swift | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Shared/HTMLMetadata/HTMLMetadataDownloader.swift b/Shared/HTMLMetadata/HTMLMetadataDownloader.swift index 122c488d6..636233780 100644 --- a/Shared/HTMLMetadata/HTMLMetadataDownloader.swift +++ b/Shared/HTMLMetadata/HTMLMetadataDownloader.swift @@ -9,18 +9,39 @@ import Foundation import RSWeb import RSParser +import os struct HTMLMetadataDownloader { static let serialDispatchQueue = DispatchQueue(label: "HTMLMetadataDownloader") + static let currentURLsLock = OSAllocatedUnfairLock(initialState: Set()) + static func downloadMetadata(for url: String, _ completion: @escaping (RSHTMLMetadata?) -> Void) { + guard let actualURL = URL(unicodeString: url) else { completion(nil) return } + let urlDownloadIsInProgress = currentURLsLock.withLock { currentURLs in + if currentURLs.contains(actualURL) { + return true + } + currentURLs.insert(actualURL) + return false + } + if urlDownloadIsInProgress { + completion(nil) + return + } + Downloader.shared.download(actualURL) { (data, response, error) in + + _ = currentURLsLock.withLock { currentURLs in + currentURLs.remove(actualURL) + } + if let data = data, !data.isEmpty, let response = response, response.statusIsOK, error == nil { let urlToUse = response.url ?? actualURL let parserData = ParserData(url: urlToUse.absoluteString, data: data)