From e27ff728308ecb60958bd92ef074c1bebe6b0532 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 26 May 2025 00:34:24 +0200 Subject: [PATCH] Various fixes --- .../ShareItems/Sources/ShareItems.swift | 74 ++++++++++++------- .../ChatTextInputMediaRecordingButton.swift | 3 +- .../Sources/ChatTextInputPanelNode.swift | 2 +- 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/submodules/ShareItems/Sources/ShareItems.swift b/submodules/ShareItems/Sources/ShareItems.swift index d063a8e0cf..178aba7e49 100644 --- a/submodules/ShareItems/Sources/ShareItems.swift +++ b/submodules/ShareItems/Sources/ShareItems.swift @@ -121,39 +121,61 @@ private func preparedShareItem(postbox: Postbox, network: Network, to peerId: Pe } } + func getThumbnail(_ avAsset: AVURLAsset) -> Signal { + return Signal { subscriber in + let imageGenerator = AVAssetImageGenerator(asset: asset) + imageGenerator.appliesPreferredTrackTransform = true + imageGenerator.maximumSize = CGSize(width: 640, height: 640) + imageGenerator.generateCGImagesAsynchronously(forTimes: [NSValue(time: CMTime(seconds: 0, preferredTimescale: CMTimeScale(30.0)))]) { _, image, _, _, _ in + subscriber.putNext(image.flatMap { UIImage(cgImage: $0) }) + subscriber.putCompletion() + } + return ActionDisposable { + imageGenerator.cancelAllCGImageGeneration() + } + } + + } + return .single(.preparing(true)) |> then( loadValues(asset) |> mapToSignal { asset -> Signal in - let preset = adjustments?.preset ?? TGMediaVideoConversionPresetCompressedMedium - let finalDimensions = TGMediaVideoConverter.dimensions(for: asset.originalSize, adjustments: adjustments, preset: preset) - - var resourceAdjustments: VideoMediaResourceAdjustments? - if let adjustments = adjustments { - if adjustments.trimApplied() { - finalDuration = adjustments.trimEndValue - adjustments.trimStartValue + return getThumbnail(asset) + |> castError(PreparedShareItemError.self) + |> mapToSignal { thumbnail -> Signal in + let preset = adjustments?.preset ?? TGMediaVideoConversionPresetCompressedMedium + let finalDimensions = TGMediaVideoConverter.dimensions(for: asset.originalSize, adjustments: adjustments, preset: preset) + + var resourceAdjustments: VideoMediaResourceAdjustments? + if let adjustments = adjustments { + if adjustments.trimApplied() { + finalDuration = adjustments.trimEndValue - adjustments.trimStartValue + } + + if let dict = adjustments.dictionary(), let data = try? NSKeyedArchiver.archivedData(withRootObject: dict, requiringSecureCoding: false) { + let adjustmentsData = MemoryBuffer(data: data) + let digest = MemoryBuffer(data: adjustmentsData.md5Digest()) + resourceAdjustments = VideoMediaResourceAdjustments(data: adjustmentsData, digest: digest, isStory: false) + } } - if let dict = adjustments.dictionary(), let data = try? NSKeyedArchiver.archivedData(withRootObject: dict, requiringSecureCoding: false) { - let adjustmentsData = MemoryBuffer(data: data) - let digest = MemoryBuffer(data: adjustmentsData.md5Digest()) - resourceAdjustments = VideoMediaResourceAdjustments(data: adjustmentsData, digest: digest, isStory: false) + let estimatedSize = TGMediaVideoConverter.estimatedSize(for: preset, duration: finalDuration, hasAudio: true) + + let thumbnailData = thumbnail?.jpegData(compressionQuality: 0.6) + + let resource = LocalFileVideoMediaResource(randomId: Int64.random(in: Int64.min ... Int64.max), path: asset.url.path, adjustments: resourceAdjustments) + return standaloneUploadedFile(postbox: postbox, network: network, peerId: peerId, text: "", source: .resource(.standalone(resource: resource)), thumbnailData: thumbnailData, mimeType: "video/mp4", attributes: [.Video(duration: finalDuration, size: PixelDimensions(width: Int32(finalDimensions.width), height: Int32(finalDimensions.height)), flags: flags, preloadSize: nil, coverTime: 0.0, videoCodec: nil)], hintFileIsLarge: estimatedSize > 10 * 1024 * 1024) + |> mapError { _ -> PreparedShareItemError in + return .generic } - } - - let estimatedSize = TGMediaVideoConverter.estimatedSize(for: preset, duration: finalDuration, hasAudio: true) - - let resource = LocalFileVideoMediaResource(randomId: Int64.random(in: Int64.min ... Int64.max), path: asset.url.path, adjustments: resourceAdjustments) - return standaloneUploadedFile(postbox: postbox, network: network, peerId: peerId, text: "", source: .resource(.standalone(resource: resource)), mimeType: "video/mp4", attributes: [.Video(duration: finalDuration, size: PixelDimensions(width: Int32(finalDimensions.width), height: Int32(finalDimensions.height)), flags: flags, preloadSize: nil, coverTime: nil, videoCodec: nil)], hintFileIsLarge: estimatedSize > 10 * 1024 * 1024) - |> mapError { _ -> PreparedShareItemError in - return .generic - } - |> mapToSignal { event -> Signal in - switch event { - case let .progress(value): - return .single(.progress(value)) - case let .result(media): - return .single(.done(.media(media))) + |> mapToSignal { event -> Signal in + switch event { + case let .progress(value): + return .single(.progress(value)) + case let .result(media): + return .single(.done(.media(media))) + } } } } diff --git a/submodules/TelegramUI/Components/ChatTextInputMediaRecordingButton/Sources/ChatTextInputMediaRecordingButton.swift b/submodules/TelegramUI/Components/ChatTextInputMediaRecordingButton/Sources/ChatTextInputMediaRecordingButton.swift index 64e22d4b71..cfc7a2d504 100644 --- a/submodules/TelegramUI/Components/ChatTextInputMediaRecordingButton/Sources/ChatTextInputMediaRecordingButton.swift +++ b/submodules/TelegramUI/Components/ChatTextInputMediaRecordingButton/Sources/ChatTextInputMediaRecordingButton.swift @@ -580,7 +580,8 @@ public final class ChatTextInputMediaRecordingButton: TGModernConversationInputM self.previousSize = size if let view = self.animationView.view { let iconSize = view.bounds.size - view.frame = CGRect(origin: CGPoint(x: floor((size.width - iconSize.width) / 2.0), y: floor((size.height - iconSize.height) / 2.0)), size: iconSize) + view.bounds = CGRect(origin: .zero, size: iconSize) + view.center = CGPoint(x: size.width / 2.0, y: size.height / 2.0) } } } diff --git a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift index b28520a2e3..a14de8739e 100644 --- a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift @@ -2225,7 +2225,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate, Ch hideInfo = true } case .waitingForPreview: - Queue.mainQueue().after(0.3, { + Queue.mainQueue().after(0.5, { self.actionButtons.micButton.audioRecorder = nil }) }