media: fix gif upload regression
Uploaded gifs now upload as gifs again instead of still images.
Fixes: 904ae6c24d ("Fix gif upload as still images")
Lightning-address: kernelkind@getalby.com
Signed-off-by: kernelkind <kernelkind@gmail.com>
Reviewed-by: William Casarin <jb55@jb55.com>
Link: 20240220234818.27472-1-kernelkind@gmail.com
Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
committed by
William Casarin
parent
7f6540b0c0
commit
1214f1839d
@@ -211,21 +211,40 @@ func process_image_metadatas(cache: EventCache, ev: NostrEvent) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func canGetSourceTypeFromUrl(url: URL) -> Bool {
|
||||||
|
guard let source = CGImageSourceCreateWithURL(url as CFURL, nil) else {
|
||||||
|
print("Failed to create image source.")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return CGImageSourceGetType(source) != nil
|
||||||
|
}
|
||||||
|
|
||||||
func removeGPSDataFromImage(fromImageURL imageURL: URL) -> Bool {
|
func removeGPSDataFromImage(fromImageURL imageURL: URL) -> Bool {
|
||||||
guard let source = CGImageSourceCreateWithURL(imageURL as CFURL, nil) else {
|
guard let source = CGImageSourceCreateWithURL(imageURL as CFURL, nil) else {
|
||||||
print("Failed to create image source.")
|
print("Failed to create image source.")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
let data = NSMutableData()
|
let data = NSMutableData()
|
||||||
|
|
||||||
|
let totalCount = CGImageSourceGetCount(source)
|
||||||
|
|
||||||
|
guard totalCount > 0 else {
|
||||||
|
print("No images found.")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
guard let type = CGImageSourceGetType(source),
|
guard let type = CGImageSourceGetType(source),
|
||||||
let destination = CGImageDestinationCreateWithData(data, type, 1, nil) else {
|
let destination = CGImageDestinationCreateWithData(data, type, totalCount, nil) else {
|
||||||
print("Failed to create image destination.")
|
print("Failed to create image destination.")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
let removeGPSProperties: CFDictionary = [kCGImagePropertyGPSDictionary as String: kCFNull] as CFDictionary
|
let removeGPSProperties: CFDictionary = [kCGImagePropertyGPSDictionary as String: kCFNull] as CFDictionary
|
||||||
|
|
||||||
CGImageDestinationAddImageFromSource(destination, source, 0, removeGPSProperties)
|
for i in 0...totalCount {
|
||||||
|
CGImageDestinationAddImageFromSource(destination, source, i, removeGPSProperties)
|
||||||
|
}
|
||||||
|
|
||||||
if CGImageDestinationFinalize(destination) {
|
if CGImageDestinationFinalize(destination) {
|
||||||
do {
|
do {
|
||||||
try data.write(to: imageURL, options: .atomic)
|
try data.write(to: imageURL, options: .atomic)
|
||||||
|
|||||||
@@ -32,14 +32,24 @@ struct MediaPicker: UIViewControllerRepresentable {
|
|||||||
|
|
||||||
for result in results {
|
for result in results {
|
||||||
if result.itemProvider.hasItemConformingToTypeIdentifier(UTType.image.identifier) {
|
if result.itemProvider.hasItemConformingToTypeIdentifier(UTType.image.identifier) {
|
||||||
result.itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in
|
result.itemProvider.loadItem(forTypeIdentifier: UTType.image.identifier, options: nil) { (item, error) in
|
||||||
guard let image = image as? UIImage, error == nil else { return }
|
guard let url = item as? URL else { return }
|
||||||
let fixedImage = image.fixOrientation()
|
|
||||||
|
|
||||||
if let savedURL = self.saveImageToTemporaryFolder(image: fixedImage),
|
if canGetSourceTypeFromUrl(url: url) {
|
||||||
removeGPSDataFromImage(fromImageURL: savedURL) {
|
// Media was not taken from camera
|
||||||
self.parent.onMediaPicked(.image(savedURL))
|
if let savedURL = self.saveImageToTemporaryFolder(from: url) {
|
||||||
self.parent.image_upload_confirm = true
|
self.chooseImage(url: savedURL)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Media was taken from camera
|
||||||
|
result.itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in
|
||||||
|
guard let image = image as? UIImage, error == nil else { return }
|
||||||
|
let fixedImage = image.fixOrientation()
|
||||||
|
|
||||||
|
if let savedURL = self.saveImageToTemporaryFolder(image: fixedImage) {
|
||||||
|
self.chooseImage(url: savedURL)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if result.itemProvider.hasItemConformingToTypeIdentifier(UTType.movie.identifier) {
|
} else if result.itemProvider.hasItemConformingToTypeIdentifier(UTType.movie.identifier) {
|
||||||
@@ -53,6 +63,23 @@ struct MediaPicker: UIViewControllerRepresentable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func chooseImage(url: URL) {
|
||||||
|
if removeGPSDataFromImage(fromImageURL: url) {
|
||||||
|
self.parent.onMediaPicked(.image(url))
|
||||||
|
self.parent.image_upload_confirm = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func saveImageToTemporaryFolder(from imageUrl: URL) -> URL? {
|
||||||
|
let fileExtension = imageUrl.pathExtension
|
||||||
|
guard let imageData = try? Data(contentsOf: imageUrl) else {
|
||||||
|
print("Failed to load image data from URL.")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return saveImageToTemporaryFolder(imageData: imageData, imageType: fileExtension)
|
||||||
|
}
|
||||||
|
|
||||||
func saveImageToTemporaryFolder(image: UIImage, imageType: String = "png") -> URL? {
|
func saveImageToTemporaryFolder(image: UIImage, imageType: String = "png") -> URL? {
|
||||||
// Convert UIImage to Data
|
// Convert UIImage to Data
|
||||||
@@ -68,6 +95,10 @@ struct MediaPicker: UIViewControllerRepresentable {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return saveImageToTemporaryFolder(imageData: data, imageType: imageType)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func saveImageToTemporaryFolder(imageData: Data, imageType: String) -> URL? {
|
||||||
// Generate a temporary URL with a unique filename
|
// Generate a temporary URL with a unique filename
|
||||||
let temporaryDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
|
let temporaryDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
|
||||||
let uniqueImageName = "\(UUID().uuidString).\(imageType)"
|
let uniqueImageName = "\(UUID().uuidString).\(imageType)"
|
||||||
@@ -75,7 +106,7 @@ struct MediaPicker: UIViewControllerRepresentable {
|
|||||||
|
|
||||||
// Save the image data to the temporary URL
|
// Save the image data to the temporary URL
|
||||||
do {
|
do {
|
||||||
try data.write(to: temporaryImageURL)
|
try imageData.write(to: temporaryImageURL)
|
||||||
return temporaryImageURL
|
return temporaryImageURL
|
||||||
} catch {
|
} catch {
|
||||||
print("Error saving image data to temporary URL: \(error.localizedDescription)")
|
print("Error saving image data to temporary URL: \(error.localizedDescription)")
|
||||||
|
|||||||
Reference in New Issue
Block a user