From 6b7c828cc969b0e5b75a5cf0a9acc26c8429386f Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sat, 16 Sep 2023 14:07:49 -0400 Subject: [PATCH] Try to compress videos to fit within instance limits Closes #425 --- .../Sources/ComposeUI/CoreData/DraftAttachment.swift | 9 ++++++--- .../Sources/InstanceFeatures/InstanceFeatures.swift | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Packages/ComposeUI/Sources/ComposeUI/CoreData/DraftAttachment.swift b/Packages/ComposeUI/Sources/ComposeUI/CoreData/DraftAttachment.swift index 463792d8..16f2443d 100644 --- a/Packages/ComposeUI/Sources/ComposeUI/CoreData/DraftAttachment.swift +++ b/Packages/ComposeUI/Sources/ComposeUI/CoreData/DraftAttachment.swift @@ -216,7 +216,7 @@ extension DraftAttachment { options.isNetworkAccessAllowed = true PHImageManager.default().requestExportSession(forVideo: asset, options: options, exportPreset: AVAssetExportPresetHighestQuality) { exportSession, info in if let exportSession { - Self.exportVideoData(session: exportSession, completion: completion) + Self.exportVideoData(session: exportSession, features: features, completion: completion) } else if let error = info?[PHImageErrorKey] as? Error { completion(.failure(.videoExport(error))) } else { @@ -242,7 +242,7 @@ extension DraftAttachment { completion(.failure(.noVideoExportSession)) return } - Self.exportVideoData(session: session, completion: completion) + Self.exportVideoData(session: session, features: features, completion: completion) } else { let fileData: Data do { @@ -300,9 +300,12 @@ extension DraftAttachment { return (data, type) } - private static func exportVideoData(session: AVAssetExportSession, completion: @escaping (Result<(Data, UTType), ExportError>) -> Void) { + private static func exportVideoData(session: AVAssetExportSession, features: InstanceFeatures, completion: @escaping (Result<(Data, UTType), ExportError>) -> Void) { session.outputFileType = .mp4 session.outputURL = FileManager.default.temporaryDirectory.appendingPathComponent("exported_video_\(UUID())").appendingPathExtension("mp4") + if let configuration = features.mediaAttachmentsConfiguration { + session.fileLengthLimit = Int64(configuration.videoSizeLimit) + } session.exportAsynchronously { guard session.status == .completed else { completion(.failure(.videoExport(session.error!))) diff --git a/Packages/InstanceFeatures/Sources/InstanceFeatures/InstanceFeatures.swift b/Packages/InstanceFeatures/Sources/InstanceFeatures/InstanceFeatures.swift index 8f4f0c6b..263a3287 100644 --- a/Packages/InstanceFeatures/Sources/InstanceFeatures/InstanceFeatures.swift +++ b/Packages/InstanceFeatures/Sources/InstanceFeatures/InstanceFeatures.swift @@ -21,6 +21,7 @@ public class InstanceFeatures: ObservableObject { @Published public private(set) var charsReservedPerURL = 23 @Published public private(set) var maxPollOptionChars: Int? @Published public private(set) var maxPollOptionsCount: Int? + @Published public private(set) var mediaAttachmentsConfiguration: Instance.MediaAttachmentsConfiguration? public var localOnlyPosts: Bool { switch instanceType { @@ -211,6 +212,7 @@ public class InstanceFeatures: ObservableObject { maxPollOptionChars = pollsConfig.maxCharactersPerOption maxPollOptionsCount = pollsConfig.maxOptions } + mediaAttachmentsConfiguration = instance.configuration?.mediaAttachments _featuresUpdated.send() }