import Defaults import Foundation final class ThumbnailsModel: ObservableObject { static var shared = ThumbnailsModel() @Published var unloadable = Set() func insertUnloadable(_ url: URL) { DispatchQueue.main.async { self.unloadable.insert(url) } } func isUnloadable(_ url: URL!) -> Bool { guard !url.isNil else { return true } return unloadable.contains(url) } func best(_ video: Video) -> URL? { for quality in availableQualitites { let url = video.thumbnailURL(quality: quality) if !isUnloadable(url) { return url } } return nil } private var availableQualitites: [Thumbnail.Quality] { switch Defaults[.thumbnailsQuality] { case .highest: return [.maxresdefault, .medium, .default] case .medium: return [.medium, .default] case .low: return [.default] } } }