Merge branch 'ios-candidate' of https://github.com/Ranchero-Software/NetNewsWire into ios-candidate

This commit is contained in:
Maurice Parker 2020-02-01 16:41:24 -08:00
commit 206da20387
3 changed files with 49 additions and 4 deletions

View File

@ -7,6 +7,7 @@
// //
import Foundation import Foundation
import CoreServices
import Articles import Articles
import Account import Account
import RSCore import RSCore
@ -60,6 +61,8 @@ final class FaviconDownloader {
loadHomePageToFaviconURLCache() loadHomePageToFaviconURLCache()
loadHomePageURLsWithNoFaviconURLCache() loadHomePageURLsWithNoFaviconURLCache()
FaviconURLFinder.ignoredTypes = [kUTTypeScalableVectorGraphics as String]
NotificationCenter.default.addObserver(self, selector: #selector(didLoadFavicon(_:)), name: .DidLoadFavicon, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(didLoadFavicon(_:)), name: .DidLoadFavicon, object: nil)
} }
@ -208,7 +211,7 @@ private extension FaviconDownloader {
return return
} }
FaviconURLFinder.findFaviconURLs(homePageURL) { (faviconURLs) in FaviconURLFinder.findFaviconURLs(with: homePageURL) { (faviconURLs) in
var defaultFaviconURL: String? = nil var defaultFaviconURL: String? = nil
if let scheme = url.scheme, let host = url.host { if let scheme = url.scheme, let host = url.host {

View File

@ -7,21 +7,63 @@
// //
import Foundation import Foundation
import CoreServices
import RSParser import RSParser
// The favicon URLs may be specified in the head section of the home page. // The favicon URLs may be specified in the head section of the home page.
struct FaviconURLFinder { struct FaviconURLFinder {
static func findFaviconURLs(_ homePageURL: String, _ completion: @escaping ([String]?) -> Void) { private static var ignoredMimeTypes = [String]()
private static var ignoredExtensions = [String]()
/// Uniform types to ignore when finding favicon URLs.
static var ignoredTypes: [String]? {
didSet {
guard let ignoredTypes = ignoredTypes else {
return
}
for type in ignoredTypes {
if let mimeTypes = UTTypeCopyAllTagsWithClass(type as CFString, kUTTagClassMIMEType)?.takeRetainedValue() {
ignoredMimeTypes.append(contentsOf: mimeTypes as! [String])
}
if let extensions = UTTypeCopyAllTagsWithClass(type as CFString, kUTTagClassFilenameExtension)?.takeRetainedValue() {
ignoredExtensions.append(contentsOf: extensions as! [String])
}
}
}
}
/// Finds favicon URLs in a web page.
/// - Parameters:
/// - homePageURL: The page to search.
/// - completion: A closure called when the links have been found.
/// - urls: An array of favicon URLs as strings.
static func findFaviconURLs(with homePageURL: String, _ completion: @escaping (_ urls:[String]?) -> Void) {
guard let _ = URL(string: homePageURL) else { guard let _ = URL(string: homePageURL) else {
completion(nil) completion(nil)
return return
} }
// If the favicon has an explicit type, check that for an ignored type; otherwise, check the file extension.
HTMLMetadataDownloader.downloadMetadata(for: homePageURL) { (htmlMetadata) in HTMLMetadataDownloader.downloadMetadata(for: homePageURL) { (htmlMetadata) in
completion(htmlMetadata?.faviconLinks) let faviconURLs = htmlMetadata?.favicons.filter({ (favicon) -> Bool in
if let type = favicon.type {
if ignoredMimeTypes.contains(type) {
return false
}
} else {
if let url = URL(string: favicon.urlString), ignoredExtensions.contains(url.pathExtension) {
return false
}
}
return true
}).map { $0.urlString }
completion(faviconURLs)
} }
} }
} }

@ -1 +1 @@
Subproject commit 50072e62800b98c3f9f9cd5b1aae6d5b12c3a58c Subproject commit 80952dabda6b49e8fa72d8f4cd703fe09fb56564