108 lines
2.8 KiB
Swift
108 lines
2.8 KiB
Swift
//
|
|
// ImageUploadModel.swift
|
|
// damus
|
|
//
|
|
// Created by William Casarin on 2023-03-16.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
|
|
enum PreUploadedMedia {
|
|
case uiimage(UIImage)
|
|
case processed_image(URL)
|
|
case unprocessed_image(URL)
|
|
case processed_video(URL)
|
|
case unprocessed_video(URL)
|
|
}
|
|
|
|
enum MediaUpload {
|
|
case image(URL)
|
|
case video(URL)
|
|
|
|
var genericFileName: String {
|
|
"damus_generic_filename.\(file_extension)"
|
|
}
|
|
|
|
var file_extension: String {
|
|
switch self {
|
|
case .image(let url):
|
|
return url.pathExtension
|
|
case .video(let url):
|
|
return url.pathExtension
|
|
}
|
|
}
|
|
|
|
var localURL: URL {
|
|
switch self {
|
|
case .image(let url):
|
|
return url
|
|
case .video(let url):
|
|
return url
|
|
}
|
|
}
|
|
|
|
var is_image: Bool {
|
|
if case .image = self {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
var mime_type: String {
|
|
switch self.file_extension {
|
|
case "jpg", "jpeg":
|
|
return "image/jpg"
|
|
case "png":
|
|
return "image/png"
|
|
case "gif":
|
|
return "image/gif"
|
|
case "tiff", "tif":
|
|
return "image/tiff"
|
|
case "mp4":
|
|
return "video/mp4"
|
|
case "ogg":
|
|
return "video/ogg"
|
|
case "webm":
|
|
return "video/webm"
|
|
default:
|
|
switch self {
|
|
case .image:
|
|
return "image/jpg"
|
|
case .video:
|
|
return "video/mp4"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
class ImageUploadModel: NSObject, URLSessionTaskDelegate, ObservableObject {
|
|
@Published var progress: Double? = nil
|
|
|
|
func start(media: MediaUpload, uploader: MediaUploader, keypair: Keypair? = nil) async -> ImageUploadResult {
|
|
let res = await create_upload_request(mediaToUpload: media, mediaUploader: uploader, progress: self, keypair: keypair)
|
|
|
|
switch res {
|
|
case .success(_):
|
|
DispatchQueue.main.async {
|
|
self.progress = nil
|
|
UINotificationFeedbackGenerator().notificationOccurred(.success)
|
|
}
|
|
case .failed(_):
|
|
DispatchQueue.main.async {
|
|
self.progress = nil
|
|
UINotificationFeedbackGenerator().notificationOccurred(.error)
|
|
}
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
|
|
DispatchQueue.main.async {
|
|
self.progress = Double(totalBytesSent) / Double(totalBytesExpectedToSend)
|
|
}
|
|
}
|
|
}
|