mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 06:35:51 +00:00
no message
This commit is contained in:
67
TelegramUI/SaveToCameraRoll.swift
Normal file
67
TelegramUI/SaveToCameraRoll.swift
Normal file
@@ -0,0 +1,67 @@
|
||||
import Foundation
|
||||
import UIKit
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import Photos
|
||||
|
||||
func saveToCameraRoll(postbox: Postbox, media: Media) -> Signal<Void, NoError> {
|
||||
var resource: MediaResource?
|
||||
var isImage = false
|
||||
if let image = media as? TelegramMediaImage {
|
||||
if let representation = largestImageRepresentation(image.representations) {
|
||||
resource = representation.resource
|
||||
isImage = true
|
||||
}
|
||||
} else if let file = media as? TelegramMediaFile {
|
||||
resource = file.resource
|
||||
}
|
||||
|
||||
if let resource = resource {
|
||||
let fetchedData: Signal<MediaResourceData, NoError> = Signal { subscriber in
|
||||
let fetched = postbox.mediaBox.fetchedResource(resource, tag: nil).start()
|
||||
let data = postbox.mediaBox.resourceData(resource, pathExtension: nil, option: .complete(waitUntilFetchStatus: true)).start(next: { next in
|
||||
subscriber.putNext(next)
|
||||
}, completed: {
|
||||
subscriber.putCompletion()
|
||||
})
|
||||
return ActionDisposable {
|
||||
fetched.dispose()
|
||||
data.dispose()
|
||||
}
|
||||
}
|
||||
return fetchedData
|
||||
|> mapToSignal { data -> Signal<Void, NoError> in
|
||||
if data.complete {
|
||||
return Signal<Void, NoError> { subscriber in
|
||||
let tempVideoPath = NSTemporaryDirectory() + "\(arc4random64()).mp4"
|
||||
PHPhotoLibrary.shared().performChanges({
|
||||
if isImage {
|
||||
if let data = try? Data(contentsOf: URL(fileURLWithPath: data.path)), let image = UIImage(data: data) {
|
||||
PHAssetChangeRequest.creationRequestForAsset(from: image)
|
||||
}
|
||||
} else {
|
||||
if let _ = try? FileManager.default.copyItem(atPath: data.path, toPath: tempVideoPath) {
|
||||
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: tempVideoPath))
|
||||
}
|
||||
}
|
||||
}, completionHandler: { _, error in
|
||||
if let error = error {
|
||||
print("\(error)")
|
||||
}
|
||||
let _ = try? FileManager.default.removeItem(atPath: tempVideoPath)
|
||||
subscriber.putNext(Void())
|
||||
subscriber.putCompletion()
|
||||
})
|
||||
|
||||
return ActionDisposable {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return .complete()
|
||||
}
|
||||
} |> take(1) |> mapToSignal { _ -> Signal<Void, NoError> in return .complete() }
|
||||
} else {
|
||||
return .complete()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user