Support gif uploads!
Changelog-Added: Added support for gif uploads Closes: #827
This commit is contained in:
@@ -10,9 +10,22 @@ import UIKit
|
|||||||
|
|
||||||
|
|
||||||
enum MediaUpload {
|
enum MediaUpload {
|
||||||
case image(UIImage)
|
case image(URL)
|
||||||
case video(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 is_image: Bool {
|
var is_image: Bool {
|
||||||
if case .image = self {
|
if case .image = self {
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -15,13 +15,12 @@ enum ImageUploadResult {
|
|||||||
case failed(Error?)
|
case failed(Error?)
|
||||||
}
|
}
|
||||||
|
|
||||||
fileprivate func create_upload_body(mediaData: Data, boundary: String, mediaUploader: MediaUploader, mediaIsImage: Bool) -> Data {
|
fileprivate func create_upload_body(mediaData: Data, boundary: String, mediaUploader: MediaUploader, mediaToUpload: MediaUpload) -> Data {
|
||||||
let body = NSMutableData();
|
let body = NSMutableData();
|
||||||
let contentType = mediaIsImage ? "image/jpg" : "video/mp4"
|
let contentType = mediaToUpload.is_image ? "image/jpg" : "video/mp4"
|
||||||
let genericFileName = mediaIsImage ? "damus_generic_filename.jpg" : "damus_generic_filename.mp4"
|
|
||||||
body.appendString(string: "Content-Type: multipart/form-data; boundary=\(boundary)\r\n\r\n")
|
body.appendString(string: "Content-Type: multipart/form-data; boundary=\(boundary)\r\n\r\n")
|
||||||
body.appendString(string: "--\(boundary)\r\n")
|
body.appendString(string: "--\(boundary)\r\n")
|
||||||
body.appendString(string: "Content-Disposition: form-data; name=\(mediaUploader.nameParam); filename=\(genericFileName)\r\n")
|
body.appendString(string: "Content-Disposition: form-data; name=\(mediaUploader.nameParam); filename=\(mediaToUpload.genericFileName)\r\n")
|
||||||
body.appendString(string: "Content-Type: \(contentType)\r\n\r\n")
|
body.appendString(string: "Content-Type: \(contentType)\r\n\r\n")
|
||||||
body.append(mediaData as Data)
|
body.append(mediaData as Data)
|
||||||
body.appendString(string: "\r\n")
|
body.appendString(string: "\r\n")
|
||||||
@@ -42,7 +41,11 @@ func create_upload_request(mediaToUpload: MediaUpload, mediaUploader: MediaUploa
|
|||||||
|
|
||||||
switch mediaToUpload {
|
switch mediaToUpload {
|
||||||
case .image(let img):
|
case .image(let img):
|
||||||
mediaData = img.jpegData(compressionQuality: 0.8)
|
do {
|
||||||
|
mediaData = try Data(contentsOf: img)
|
||||||
|
} catch {
|
||||||
|
return .failed(error)
|
||||||
|
}
|
||||||
case .video(let url):
|
case .video(let url):
|
||||||
do {
|
do {
|
||||||
mediaData = try Data(contentsOf: url)
|
mediaData = try Data(contentsOf: url)
|
||||||
@@ -55,7 +58,7 @@ func create_upload_request(mediaToUpload: MediaUpload, mediaUploader: MediaUploa
|
|||||||
return .failed(nil)
|
return .failed(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
request.httpBody = create_upload_body(mediaData: mediaData, boundary: boundary, mediaUploader: mediaUploader, mediaIsImage: mediaToUpload.is_image)
|
request.httpBody = create_upload_body(mediaData: mediaData, boundary: boundary, mediaUploader: mediaUploader, mediaToUpload: mediaToUpload)
|
||||||
|
|
||||||
do {
|
do {
|
||||||
let (data, _) = try await URLSession.shared.data(for: request, delegate: progress)
|
let (data, _) = try await URLSession.shared.data(for: request, delegate: progress)
|
||||||
@@ -85,22 +88,18 @@ extension PostView {
|
|||||||
|
|
||||||
let sourceType: UIImagePickerController.SourceType
|
let sourceType: UIImagePickerController.SourceType
|
||||||
let damusState: DamusState
|
let damusState: DamusState
|
||||||
let onImagePicked: (UIImage) -> Void
|
let onImagePicked: (URL) -> Void
|
||||||
let onVideoPicked: (URL) -> Void
|
let onVideoPicked: (URL) -> Void
|
||||||
|
|
||||||
final class Coordinator: NSObject,
|
final class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
|
||||||
UINavigationControllerDelegate,
|
@Binding private var presentationMode: PresentationMode
|
||||||
UIImagePickerControllerDelegate {
|
|
||||||
|
|
||||||
@Binding
|
|
||||||
private var presentationMode: PresentationMode
|
|
||||||
private let sourceType: UIImagePickerController.SourceType
|
private let sourceType: UIImagePickerController.SourceType
|
||||||
private let onImagePicked: (UIImage) -> Void
|
private let onImagePicked: (URL) -> Void
|
||||||
private let onVideoPicked: (URL) -> Void
|
private let onVideoPicked: (URL) -> Void
|
||||||
|
|
||||||
init(presentationMode: Binding<PresentationMode>,
|
init(presentationMode: Binding<PresentationMode>,
|
||||||
sourceType: UIImagePickerController.SourceType,
|
sourceType: UIImagePickerController.SourceType,
|
||||||
onImagePicked: @escaping (UIImage) -> Void,
|
onImagePicked: @escaping (URL) -> Void,
|
||||||
onVideoPicked: @escaping (URL) -> Void) {
|
onVideoPicked: @escaping (URL) -> Void) {
|
||||||
_presentationMode = presentationMode
|
_presentationMode = presentationMode
|
||||||
self.sourceType = sourceType
|
self.sourceType = sourceType
|
||||||
@@ -108,36 +107,40 @@ extension PostView {
|
|||||||
self.onVideoPicked = onVideoPicked
|
self.onVideoPicked = onVideoPicked
|
||||||
}
|
}
|
||||||
|
|
||||||
func imagePickerController(_ picker: UIImagePickerController,
|
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
|
||||||
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
|
|
||||||
if let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as? URL {
|
if let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as? URL {
|
||||||
// Handle the selected video
|
// Handle the selected video
|
||||||
onVideoPicked(videoURL)
|
onVideoPicked(videoURL)
|
||||||
} else if let uiImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
|
} else if let imageURL = info[UIImagePickerController.InfoKey.imageURL] as? URL {
|
||||||
// Handle the selected image
|
// Handle the selected image
|
||||||
onImagePicked(uiImage)
|
self.onImagePicked(imageURL)
|
||||||
}
|
}
|
||||||
presentationMode.dismiss()
|
presentationMode.dismiss()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
|
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
|
||||||
presentationMode.dismiss()
|
presentationMode.dismiss()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeCoordinator() -> Coordinator {
|
func makeCoordinator() -> Coordinator {
|
||||||
return Coordinator(presentationMode: presentationMode,
|
return Coordinator(presentationMode: presentationMode,
|
||||||
sourceType: sourceType,
|
sourceType: sourceType,
|
||||||
onImagePicked: onImagePicked, onVideoPicked: onVideoPicked)
|
onImagePicked: { url in
|
||||||
|
// Handle the selected image URL
|
||||||
|
onImagePicked(url)
|
||||||
|
},
|
||||||
|
onVideoPicked: { videoURL in
|
||||||
|
// Handle the selected video URL
|
||||||
|
onVideoPicked(videoURL)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
|
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
|
||||||
let picker = UIImagePickerController()
|
let picker = UIImagePickerController()
|
||||||
picker.sourceType = sourceType
|
picker.sourceType = sourceType
|
||||||
let mediaUploader = get_media_uploader(damusState.keypair.pubkey)
|
let mediaUploader = get_media_uploader(damusState.keypair.pubkey)
|
||||||
picker.mediaTypes = ["public.image"]
|
picker.mediaTypes = ["public.image", "com.compuserve.gif"]
|
||||||
if mediaUploader.supportsVideo {
|
if mediaUploader.supportsVideo {
|
||||||
picker.mediaTypes.append("public.movie")
|
picker.mediaTypes.append("public.movie")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user