Make progress on favicons.

This commit is contained in:
Brent Simmons 2017-11-24 10:45:22 -08:00
parent 9e3e093bcd
commit d464fa0c38
3 changed files with 72 additions and 9 deletions

View File

@ -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 dont 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.

View File

@ -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
}
}
}

View File

@ -41,7 +41,7 @@ final class ImageDownloader {
}
}
private extension ImageDownload {
private extension ImageDownloader {
func shouldDownloadImage(_ url: String) -> Bool {