// // VideoActivityItemSource.swift // Tusker // // Created by Shadowfacts on 3/19/24. // Copyright © 2024 Shadowfacts. All rights reserved. // import UIKit import UniformTypeIdentifiers import AVFoundation class VideoActivityItemSource: NSObject, UIActivityItemSource { let asset: AVAsset let url: URL init(asset: AVAsset, url: URL) { self.asset = asset self.url = url } func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any { return url } func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivity.ActivityType?, suggestedSize size: CGSize) -> UIImage? { #if os(visionOS) #warning("Use async AVAssetImageGenerator.image(at:)") return nil #else let generator = AVAssetImageGenerator(asset: self.asset) generator.appliesPreferredTrackTransform = true if let image = try? generator.copyCGImage(at: .zero, actualTime: nil) { return UIImage(cgImage: image) } else { return nil } #endif } func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? { do { let data = try Data(contentsOf: url) let tempURL = FileManager.default.temporaryDirectory.appendingPathComponent(url.lastPathComponent) try data.write(to: tempURL) return tempURL } catch { return nil } } func activityViewController(_ activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: UIActivity.ActivityType?) -> String { return (UTType(filenameExtension: url.pathExtension) ?? .video).identifier } }