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)