Small refactor for video uploader

This commit is contained in:
William Casarin
2023-03-27 11:30:41 -04:00
parent 5e0ff1a6a0
commit 54fdcd1c84
3 changed files with 29 additions and 12 deletions

View File

@@ -9,10 +9,23 @@ import Foundation
import UIKit import UIKit
enum MediaUpload {
case image(UIImage)
case video(URL)
var is_image: Bool {
guard case .image = self else {
return true
}
return false
}
}
class ImageUploadModel: NSObject, URLSessionTaskDelegate, ObservableObject { class ImageUploadModel: NSObject, URLSessionTaskDelegate, ObservableObject {
@Published var progress: Double? = nil @Published var progress: Double? = nil
func start(media: Any, uploader: MediaUploader) async -> ImageUploadResult { func start(media: MediaUpload, uploader: MediaUploader) async -> ImageUploadResult {
let res = await create_upload_request(mediaToUpload: media, mediaUploader: uploader, progress: self) let res = await create_upload_request(mediaToUpload: media, mediaUploader: uploader, progress: self)
DispatchQueue.main.async { DispatchQueue.main.async {
self.progress = nil self.progress = nil

View File

@@ -29,7 +29,7 @@ fileprivate func create_upload_body(mediaData: Data, boundary: String, mediaUplo
return body as Data return body as Data
} }
func create_upload_request(mediaToUpload: Any, mediaUploader: MediaUploader, progress: URLSessionTaskDelegate) async -> ImageUploadResult { func create_upload_request(mediaToUpload: MediaUpload, mediaUploader: MediaUploader, progress: URLSessionTaskDelegate) async -> ImageUploadResult {
var mediaIsImage: Bool = false var mediaIsImage: Bool = false
var mediaData: Data? var mediaData: Data?
guard let url = URL(string: mediaUploader.postAPI) else { guard let url = URL(string: mediaUploader.postAPI) else {
@@ -41,14 +41,18 @@ func create_upload_request(mediaToUpload: Any, mediaUploader: MediaUploader, pro
let boundary = "Boundary-\(UUID().description)" let boundary = "Boundary-\(UUID().description)"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
if let imageToUpload = mediaToUpload as? UIImage { switch mediaToUpload {
mediaData = imageToUpload.jpegData(compressionQuality: 0.8) case .image(let img):
mediaIsImage = true mediaData = img.jpegData(compressionQuality: 0.8)
} else if let videoToUpload = mediaToUpload as? URL { case .video(let url):
mediaData = try? Data(contentsOf: videoToUpload) do {
mediaData = try Data(contentsOf: url)
} catch {
return .failed(error)
}
} }
guard let mediaData = mediaData else { guard let mediaData else {
return .failed(nil) return .failed(nil)
} }

View File

@@ -168,7 +168,7 @@ struct PostView: View {
post = combinedAttributedString post = combinedAttributedString
} }
func handle_upload(media: Any) { func handle_upload(media: MediaUpload) {
let uploader = get_media_uploader(damus_state.pubkey) let uploader = get_media_uploader(damus_state.pubkey)
Task.init { Task.init {
@@ -216,9 +216,9 @@ struct PostView: View {
.padding() .padding()
.sheet(isPresented: $attach_media) { .sheet(isPresented: $attach_media) {
ImagePicker(sourceType: .photoLibrary, damusState: damus_state) { img in ImagePicker(sourceType: .photoLibrary, damusState: damus_state) { img in
handle_upload(media: img) handle_upload(media: .image(img))
} onVideoPicked: { url in } onVideoPicked: { url in
handle_upload(media: url) handle_upload(media: .video(url))
} }
} }
.onAppear() { .onAppear() {