import Foundation import UIKit import SwiftSignalKit import Postbox import TelegramCore import Photos func saveToCameraRoll(postbox: Postbox, media: Media) -> Signal { 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 = 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 in if data.complete { return Signal { 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 in return .complete() } } else { return .complete() } }