NetNewsWire/Shared/Images/FeaturedImageDownloader.swift

101 lines
2.3 KiB
Swift
Raw Normal View History

2017-11-27 04:57:45 +01:00
//
// FeaturedImageDownloader.swift
2018-08-29 07:18:24 +02:00
// NetNewsWire
2017-11-27 04:57:45 +01:00
//
// Created by Brent Simmons on 11/26/17.
// Copyright © 2017 Ranchero Software. All rights reserved.
//
import Foundation
import Articles
import RSCore
2017-11-27 04:57:45 +01:00
import RSParser
final class FeaturedImageDownloader {
private let imageDownloader: ImageDownloader
private var articleURLToFeaturedImageURLCache = [String: String]()
private var articleURLsWithNoFeaturedImage = Set<String>()
private var urlsInProgress = Set<String>()
2017-11-27 04:57:45 +01:00
init(imageDownloader: ImageDownloader) {
self.imageDownloader = imageDownloader
}
func image(for article: Article) -> RSImage? {
2017-11-27 04:57:45 +01:00
2021-10-07 22:55:57 +02:00
if let imageLink = article.imageLink {
return image(forFeaturedImageURL: imageLink)
2017-11-27 04:57:45 +01:00
}
2021-10-07 22:55:57 +02:00
if let link = article.link {
return image(forArticleURL: link)
2017-11-27 04:57:45 +01:00
}
return nil
}
func image(forArticleURL articleURL: String) -> RSImage? {
2017-11-27 04:57:45 +01:00
if articleURLsWithNoFeaturedImage.contains(articleURL) {
return nil
}
if let featuredImageURL = cachedURL(for: articleURL) {
return image(forFeaturedImageURL: featuredImageURL)
}
findFeaturedImageURL(for: articleURL)
return nil
}
func image(forFeaturedImageURL featuredImageURL: String) -> RSImage? {
if let data = imageDownloader.image(for: featuredImageURL) {
return RSImage(data: data)
}
return nil
2017-11-27 04:57:45 +01:00
}
2017-11-27 04:57:45 +01:00
}
private extension FeaturedImageDownloader {
func cachedURL(for articleURL: String) -> String? {
return articleURLToFeaturedImageURLCache[articleURL]
}
func cacheURL(for articleURL: String, _ featuredImageURL: String) {
articleURLsWithNoFeaturedImage.remove(articleURL)
articleURLToFeaturedImageURLCache[articleURL] = featuredImageURL
}
func findFeaturedImageURL(for articleURL: String) {
guard !urlsInProgress.contains(articleURL) else {
return
}
urlsInProgress.insert(articleURL)
2017-11-27 04:57:45 +01:00
HTMLMetadataDownloader.downloadMetadata(for: articleURL) { (metadata) in
self.urlsInProgress.remove(articleURL)
2017-11-27 04:57:45 +01:00
guard let metadata = metadata else {
return
}
self.pullFeaturedImageURL(from: metadata, articleURL: articleURL)
}
}
func pullFeaturedImageURL(from metadata: RSHTMLMetadata, articleURL: String) {
if let url = metadata.bestFeaturedImageURL() {
cacheURL(for: articleURL, url)
let _ = image(forFeaturedImageURL: url)
return
}
articleURLsWithNoFeaturedImage.insert(articleURL)
}
}