Show classifier download progress

This commit is contained in:
Christoph Hagen
2023-10-24 14:51:08 +02:00
parent f55f4e65dd
commit d5edf360fb
7 changed files with 147 additions and 18 deletions

View File

@ -8,10 +8,27 @@ final class Database: ObservableObject {
private let imageCompressionQuality: CGFloat = 0.3
@AppStorage("classifier")
private(set) var classifierVersion = 0
private var storedLocalClassifierVersion = 0 {
didSet { localClassifierVersion = storedLocalClassifierVersion }
}
@AppStorage("serverClassifier")
private var storedServerClassifierVersion = 0 {
didSet { serverClassifierVersion = storedServerClassifierVersion }
}
@Published
private(set) var localClassifierVersion = 0
@Published
private(set) var serverClassifierVersion = 0
@Published
private(set) var classifierDownloadProgress: ClassifierProgress?
var hasNewClassifier: Bool {
serverClassifierVersion > localClassifierVersion
}
let images: ImageCache
@ -146,6 +163,9 @@ final class Database: ObservableObject {
folder: imageFolder,
server: server,
thumbnailSize: CapsApp.thumbnailImageSize)
self.localClassifierVersion = storedLocalClassifierVersion
self.serverClassifierVersion = storedServerClassifierVersion
ensureFolderExistence(gridStorageFolder)
loadCaps()
@ -329,7 +349,7 @@ final class Database: ObservableObject {
}
@discardableResult
func serverHasNewClassifier() async -> Bool {
func updateServerClassifierVersion() async -> Bool {
let data: Data
let response: URLResponse
do {
@ -351,23 +371,29 @@ final class Database: ObservableObject {
return false
}
DispatchQueue.main.async {
self.serverClassifierVersion = serverVersion
self.storedServerClassifierVersion = serverVersion
}
guard serverVersion > self.classifierVersion else {
log("No new classifier available (Local: \(classifierVersion) Server: \(serverVersion))")
return false
}
log("New classifier available (Local: \(classifierVersion) Server: \(serverVersion))")
return true
}
@discardableResult
func downloadClassifier() async -> Bool {
log("Downloading classifier")
let progress = ClassifierProgress()
DispatchQueue.main.async {
self.classifierDownloadProgress = progress
}
defer {
DispatchQueue.main.async {
self.classifierDownloadProgress = nil
}
}
let tempUrl: URL
let response: URLResponse
do {
(tempUrl, response) = try await URLSession.shared.download(from: serverClassifierUrl)
(tempUrl, response) = try await URLSession.shared.download(from: serverClassifierUrl, delegate: progress)
} catch {
log("Failed to download classifier version: \(error)")
return false
@ -386,10 +412,10 @@ final class Database: ObservableObject {
return false
}
DispatchQueue.main.async {
self.classifierVersion = self.serverClassifierVersion
self.storedLocalClassifierVersion = self.serverClassifierVersion
log("Downloaded classifier \(self.localClassifierVersion)")
self.classifier = nil
}
log("Downloaded classifier \(classifierVersion)")
return true
}
@ -987,6 +1013,44 @@ final class Database: ObservableObject {
}
}
extension Database {
final class ClassifierProgress: NSObject, ObservableObject {
@Published
var bytesLoaded: Double
@Published
var total: Double
var percentage: Double {
guard total > 0 else {
return 0.0
}
return bytesLoaded * 100 / total
}
init(bytesLoaded: Double = 0, total: Double = 0) {
self.bytesLoaded = bytesLoaded
self.total = total
}
}
}
extension Database.ClassifierProgress: URLSessionDownloadDelegate {
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
DispatchQueue.main.async {
self.bytesLoaded = Double(totalBytesWritten)
self.total = Double(totalBytesExpectedToWrite)
}
}
}
extension Database {
static var mock: Database {