1
0
mirror of https://github.com/yattee/yattee.git synced 2024-12-12 21:30:32 +05:30
yattee/Model/ThumbnailsModel.swift

64 lines
1.7 KiB
Swift
Raw Normal View History

2022-06-26 17:55:54 +05:30
import Defaults
2021-10-25 03:56:25 +05:30
import Foundation
final class ThumbnailsModel: ObservableObject {
static var shared = ThumbnailsModel()
2021-10-25 03:56:25 +05:30
@Published var unloadable = Set<URL>()
private var retryCounts = [URL: Int]()
private let maxRetries = 3
private let retryDelay: TimeInterval = 1.0
2021-10-25 03:56:25 +05:30
func insertUnloadable(_ url: URL) {
let retries = (retryCounts[url] ?? 0) + 1
if retries >= maxRetries {
DispatchQueue.main.async {
self.unloadable.insert(url)
self.retryCounts.removeValue(forKey: url)
}
} else {
DispatchQueue.main.async {
self.retryCounts[url] = retries
}
DispatchQueue.global().asyncAfter(deadline: .now() + retryDelay) {
DispatchQueue.main.async {
self.retryCounts[url] = retries
}
}
2022-12-17 03:07:30 +05:30
}
2021-10-25 03:56:25 +05:30
}
func isUnloadable(_ url: URL!) -> Bool {
guard !url.isNil else {
return true
}
return unloadable.contains(url)
}
func best(_ video: Video) -> (url: URL?, quality: Thumbnail.Quality?) {
2022-06-26 17:55:54 +05:30
for quality in availableQualitites {
2021-11-06 02:23:43 +05:30
let url = video.thumbnailURL(quality: quality)
if !isUnloadable(url) {
return (url, quality)
2021-11-06 02:23:43 +05:30
}
2021-10-25 03:56:25 +05:30
}
return (nil, nil)
2021-10-25 03:56:25 +05:30
}
2022-06-26 17:55:54 +05:30
private var availableQualitites: [Thumbnail.Quality] {
switch Defaults[.thumbnailsQuality] {
case .highest:
return [.maxres, .high, .medium, .default]
case .high:
return [.high, .medium, .default]
2022-06-26 17:55:54 +05:30
case .medium:
return [.medium, .default]
case .low:
return [.default]
}
}
2021-10-25 03:56:25 +05:30
}