mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2025-02-02 20:16:54 +01:00
Make progress on favicons.
This commit is contained in:
parent
9e3e093bcd
commit
d464fa0c38
@ -13,12 +13,13 @@ import RSWeb
|
||||
|
||||
extension Notification.Name {
|
||||
|
||||
static let FaviconDidBecomeAvailable = Notification.Name("FaviconDidBecomeAvailableNotification") // userInfo keys: homePageURL, faviconURL, image
|
||||
static let FaviconDidBecomeAvailable = Notification.Name("FaviconDidBecomeAvailableNotification") // userInfo keys, one or more of which will be present: homePageURL, faviconURL
|
||||
}
|
||||
|
||||
final class FaviconDownloader {
|
||||
|
||||
private var seekingFaviconCache: [String: SeekingFavicon]() // homePageURL: SeekingFavicon
|
||||
private var imageCache = [String: NSImage]()
|
||||
private var seekingFaviconCache = [String: SeekingFavicon]() // homePageURL: SeekingFavicon
|
||||
private var cache = ThreadSafeCache<NSImage>() // faviconURL: NSImage
|
||||
private var faviconURLCache = ThreadSafeCache<String>() // homePageURL: faviconURL
|
||||
private let folder: String
|
||||
@ -46,20 +47,57 @@ final class FaviconDownloader {
|
||||
func favicon(for feed: Feed) -> NSImage? {
|
||||
|
||||
assert(Thread.isMainThread)
|
||||
|
||||
if let faviconURL = feed.faviconURL {
|
||||
// JSON Feeds may include the faviconURL in the feed,
|
||||
// so we don’t have to hunt for it.
|
||||
return favicon(withURL: faviconURL)
|
||||
}
|
||||
|
||||
guard let homePageURL = feed.homePageURL else {
|
||||
return nil
|
||||
}
|
||||
return favicon(withHomePageURL: homePageURL)
|
||||
}
|
||||
|
||||
if let favicon = cachedInMemoryFavicon(for: feed) {
|
||||
return favicon
|
||||
func favicon(withURL faviconURL: String) -> NSImage? {
|
||||
|
||||
if let cachedImage = imageCache[faviconURL] {
|
||||
return cachedImage
|
||||
}
|
||||
|
||||
let controller = faviconController(withURL: faviconURL)
|
||||
return favicon(withController: controller)
|
||||
}
|
||||
|
||||
func faviconController(withURL faviconURL: String) -> FaviconController {
|
||||
|
||||
if let controller = faviconControllerCache[faviconURL] {
|
||||
return controller
|
||||
}
|
||||
let controller = FaviconController(faviconURL: faviconURL)
|
||||
faviconControllerCache[faviconURL] = controller
|
||||
return controller
|
||||
}
|
||||
|
||||
func favicon(withController controller: FaviconController) -> NSImage? {
|
||||
|
||||
if let image = controller.image {
|
||||
return image
|
||||
}
|
||||
|
||||
controller.readFromDisk(binaryCache) { (image) in
|
||||
|
||||
if let image = image {
|
||||
post
|
||||
}
|
||||
}
|
||||
|
||||
findFavicon(for: feed)
|
||||
}
|
||||
|
||||
func findFavicon(for feed: Feed) {
|
||||
|
||||
if let faviconMetadata = cachedFaviconMetadata
|
||||
// if let faviconMetadata = cachedFaviconMetadata
|
||||
if let faviconURL = faviconURL(for: feed) {
|
||||
|
||||
// It might be on disk.
|
||||
|
@ -7,8 +7,9 @@
|
||||
//
|
||||
|
||||
import AppKit
|
||||
import RSCore
|
||||
|
||||
final class FaviconMetadata {
|
||||
final class FaviconController {
|
||||
|
||||
enum DiskStatus {
|
||||
case unknown, notOnDisk, onDisk
|
||||
@ -17,10 +18,34 @@ final class FaviconMetadata {
|
||||
let faviconURL: String
|
||||
var lastDownloadAttemptDate: Date?
|
||||
var diskStatus = DiskStatus.unknown
|
||||
let diskCache: RSBinaryCache
|
||||
var image: NSImage?
|
||||
|
||||
init?(faviconURL: String) {
|
||||
init?(faviconURL: String, _ diskCache: RSBinaryCache) {
|
||||
|
||||
self.faviconURL = faviconURL
|
||||
self.diskCache = diskCache
|
||||
findFavicon()
|
||||
}
|
||||
}
|
||||
|
||||
private extension FaviconController {
|
||||
|
||||
func findFavicon() {
|
||||
|
||||
readFromDisk { (image) in
|
||||
self.image = image
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func readFromDisk(_ callback: (NSImage?) -> Void) {
|
||||
|
||||
if diskStatus == .notOnDisk {
|
||||
callback(nil)
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ final class ImageDownloader {
|
||||
}
|
||||
}
|
||||
|
||||
private extension ImageDownload {
|
||||
private extension ImageDownloader {
|
||||
|
||||
func shouldDownloadImage(_ url: String) -> Bool {
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user