From 0bf61a2794e9b5ef22a63a6648b6c317418fc424 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 16 Jul 2019 20:28:29 +0100 Subject: [PATCH] Load frames for video preview from network --- .../FFMpegMediaFrameSourceContext.swift | 10 ++--- .../UniversalSoftwareVideoSource.swift | 15 ++++++- .../TelegramCore/FetchedMediaResource.swift | 10 ++--- .../TelegramCore/MultipartUpload.swift | 2 +- .../TelegramUI/ChatAnimationGalleryItem.swift | 2 +- .../TelegramUI/ChatDocumentGalleryItem.swift | 2 +- .../ChatExternalFileGalleryItem.swift | 2 +- .../TelegramUI/ChatImageGalleryItem.swift | 4 +- .../ChatItemGalleryFooterContentNode.swift | 11 +++++ .../ChatMediaInputStickerPackItem.swift | 2 +- ...atMessageInteractiveInstantVideoNode.swift | 2 +- .../ChatMessageInteractiveMediaNode.swift | 2 +- .../TelegramUI/TelegramUI/FetchManager.swift | 4 +- .../TelegramUI/FetchMediaUtils.swift | 4 +- .../TelegramUI/FetchVideoThumbnail.swift | 4 +- .../GroupStickerPackCurrentItem.swift | 2 +- .../TelegramUI/InstantImageGalleryItem.swift | 4 +- .../InstantPagePlayableVideoNode.swift | 2 +- .../TelegramUI/ItemListStickerPackItem.swift | 2 +- ...ultiplexedSoftwareVideoSourceManager.swift | 2 +- .../TelegramUI/NativeVideoContent.swift | 2 +- .../TelegramUI/TelegramUI/PeerAvatar.swift | 6 +-- .../PeerAvatarImageGalleryItem.swift | 4 +- .../TelegramUI/PhotoResources.swift | 42 +++++++++---------- .../TelegramUI/SaveToCameraRoll.swift | 2 +- .../TelegramUI/ShareController.swift | 2 +- .../TelegramUI/SharedMediaPlayer.swift | 2 +- .../SoftwareVideoLayerFrameManager.swift | 2 +- .../StickerPackPreviewController.swift | 2 +- .../TelegramUI/StickerResources.swift | 10 ++--- .../TransformOutgoingMessageMedia.swift | 4 +- .../UniversalVideoGalleryItem.swift | 24 ++++++----- .../TelegramUI/WallpaperGalleryItem.swift | 6 +-- .../TelegramUI/WallpaperResources.swift | 8 ++-- 34 files changed, 115 insertions(+), 89 deletions(-) diff --git a/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift index 3c4187814a..e70d62a4f4 100644 --- a/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift +++ b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift @@ -238,12 +238,12 @@ private func seekCallback(userData: UnsafeMutableRawPointer?, offset: Int64, whe if streamable { if context.tempFilePath == nil { let fetchRange: Range = context.readingOffset ..< Int(Int32.max) - context.fetchedDataDisposable.set(fetchedMediaResource(postbox: postbox, reference: resourceReference, range: (fetchRange, .elevated), statsCategory: statsCategory, preferBackgroundReferenceRevalidation: streamable).start()) + context.fetchedDataDisposable.set(fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, range: (fetchRange, .elevated), statsCategory: statsCategory, preferBackgroundReferenceRevalidation: streamable).start()) } } else if !context.requestedCompleteFetch && context.fetchAutomatically { context.requestedCompleteFetch = true if context.tempFilePath == nil { - context.fetchedDataDisposable.set(fetchedMediaResource(postbox: postbox, reference: resourceReference, statsCategory: statsCategory, preferBackgroundReferenceRevalidation: streamable).start()) + context.fetchedDataDisposable.set(fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, statsCategory: statsCategory, preferBackgroundReferenceRevalidation: streamable).start()) } } } @@ -330,12 +330,12 @@ final class FFMpegMediaFrameSourceContext: NSObject { if streamable { if self.tempFilePath == nil { - self.fetchedDataDisposable.set(fetchedMediaResource(postbox: postbox, reference: resourceReference, range: (0 ..< Int(Int32.max), .elevated), statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) + self.fetchedDataDisposable.set(fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, range: (0 ..< Int(Int32.max), .elevated), statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) } } else if !self.requestedCompleteFetch && self.fetchAutomatically { self.requestedCompleteFetch = true if self.tempFilePath == nil { - self.fetchedFullDataDisposable.set(fetchedMediaResource(postbox: postbox, reference: resourceReference, statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) + self.fetchedFullDataDisposable.set(fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) } } @@ -437,7 +437,7 @@ final class FFMpegMediaFrameSourceContext: NSObject { if streamable { if self.tempFilePath == nil { - self.fetchedFullDataDisposable.set(fetchedMediaResource(postbox: postbox, reference: resourceReference, range: (0 ..< Int(Int32.max), .default), statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) + self.fetchedFullDataDisposable.set(fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, range: (0 ..< Int(Int32.max), .default), statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) } self.requestedCompleteFetch = true } diff --git a/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift b/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift index 3f0e497059..9eefce0a6b 100644 --- a/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift +++ b/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift @@ -12,6 +12,9 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa let readCount = min(resourceSize - context.readingOffset, Int(bufferSize)) let requestRange: Range = context.readingOffset ..< (context.readingOffset + readCount) + context.currentNumberOfReads += 1 + context.currentReadBytes += readCount + let semaphore = DispatchSemaphore(value: 0) data = context.mediaBox.resourceData(context.fileReference.media.resource, size: context.size, in: requestRange, mode: .partial) let requiredDataIsNotLocallyAvailable = context.requiredDataIsNotLocallyAvailable @@ -29,10 +32,15 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa semaphore.signal() } }) + var fetchDisposable: Disposable? + if context.videoStream != nil { + fetchDisposable = fetchedMediaResource(mediaBox: context.mediaBox, reference: context.fileReference.resourceReference(context.fileReference.media.resource), ranges: [(requestRange, .elevated)]).start() + } semaphore.wait() disposable.dispose() cancelDisposable.dispose() + fetchDisposable?.dispose() if let fetchedData = fetchedData { fetchedData.withUnsafeBytes { (bytes: UnsafePointer) -> Void in @@ -91,6 +99,8 @@ private final class UniversalSoftwareVideoSourceImpl { fileprivate var cancelRead: Signal fileprivate var requiredDataIsNotLocallyAvailable: (() -> Void)? + fileprivate var currentNumberOfReads: Int = 0 + fileprivate var currentReadBytes: Int = 0 init?(mediaBox: MediaBox, fileReference: FileMediaReference, state: ValuePromise, cancelInitialization: Signal) { guard let size = fileReference.media.size else { @@ -229,10 +239,13 @@ private final class UniversalSoftwareVideoSourceImpl { func readImage() -> (UIImage?, CGFloat, CGFloat, Bool) { if let videoStream = self.videoStream { - for _ in 0 ..< 10 { + self.currentNumberOfReads = 0 + self.currentReadBytes = 0 + for i in 0 ..< 10 { let (decodableFrame, loop) = self.readDecodableFrame() if let decodableFrame = decodableFrame { if let renderedFrame = videoStream.decoder.render(frame: decodableFrame) { + print("Frame rendered in \(self.currentNumberOfReads) reads, \(self.currentReadBytes) bytes, total frames read: \(i + 1)") return (renderedFrame, CGFloat(videoStream.rotationAngle), CGFloat(videoStream.aspect), loop) } } diff --git a/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift b/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift index 8f5121035e..4804fd5553 100644 --- a/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift +++ b/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift @@ -519,21 +519,21 @@ final class TelegramCloudMediaResourceFetchInfo: MediaResourceFetchInfo { } } -public func fetchedMediaResource(postbox: Postbox, reference: MediaResourceReference, range: (Range, MediaBoxFetchPriority)? = nil, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal { - return fetchedMediaResource(postbox: postbox, reference: reference, ranges: range.flatMap({ [$0] }), statsCategory: statsCategory, reportResultStatus: reportResultStatus, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground) +public func fetchedMediaResource(mediaBox: MediaBox, reference: MediaResourceReference, range: (Range, MediaBoxFetchPriority)? = nil, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal { + return fetchedMediaResource(mediaBox: mediaBox, reference: reference, ranges: range.flatMap({ [$0] }), statsCategory: statsCategory, reportResultStatus: reportResultStatus, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground) } -public func fetchedMediaResource(postbox: Postbox, reference: MediaResourceReference, ranges: [(Range, MediaBoxFetchPriority)]?, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal { +public func fetchedMediaResource(mediaBox: MediaBox, reference: MediaResourceReference, ranges: [(Range, MediaBoxFetchPriority)]?, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal { if let ranges = ranges { let signals = ranges.map { (range, priority) -> Signal in - return postbox.mediaBox.fetchedResourceData(reference.resource, in: range, priority: priority, parameters: MediaResourceFetchParameters(tag: TelegramMediaResourceFetchTag(statsCategory: statsCategory), info: TelegramCloudMediaResourceFetchInfo(reference: reference, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground))) + return mediaBox.fetchedResourceData(reference.resource, in: range, priority: priority, parameters: MediaResourceFetchParameters(tag: TelegramMediaResourceFetchTag(statsCategory: statsCategory), info: TelegramCloudMediaResourceFetchInfo(reference: reference, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground))) } return combineLatest(signals) |> ignoreValues |> map { _ -> FetchResourceSourceType in .local } |> then(.single(.local)) } else { - return postbox.mediaBox.fetchedResource(reference.resource, parameters: MediaResourceFetchParameters(tag: TelegramMediaResourceFetchTag(statsCategory: statsCategory), info: TelegramCloudMediaResourceFetchInfo(reference: reference, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground)), implNext: reportResultStatus) + return mediaBox.fetchedResource(reference.resource, parameters: MediaResourceFetchParameters(tag: TelegramMediaResourceFetchTag(statsCategory: statsCategory), info: TelegramCloudMediaResourceFetchInfo(reference: reference, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground)), implNext: reportResultStatus) } } diff --git a/submodules/TelegramCore/TelegramCore/MultipartUpload.swift b/submodules/TelegramCore/TelegramCore/MultipartUpload.swift index b2b195693f..4f006c7ab9 100644 --- a/submodules/TelegramCore/TelegramCore/MultipartUpload.swift +++ b/submodules/TelegramCore/TelegramCore/MultipartUpload.swift @@ -430,7 +430,7 @@ func multipartUpload(network: Network, postbox: Postbox, source: MultipartUpload case let .resource(resource): dataSignal = postbox.mediaBox.resourceData(resource.resource, option: .incremental(waitUntilFetchStatus: true)) |> map { MultipartUploadData.resourceData($0) } headerSize = resource.resource.headerSize - fetchedResource = fetchedMediaResource(postbox: postbox, reference: resource) + fetchedResource = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resource) |> map { _ in } case let .data(data): dataSignal = .single(.data(data)) diff --git a/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift index 578c2e6477..25432b9be3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift @@ -336,7 +336,7 @@ final class ChatAnimationGalleryItemNode: ZoomableContentGalleryItemNode { case .Fetching: self.context.account.postbox.mediaBox.cancelInteractiveResourceFetch(resource.resource) case .Remote: - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: resource, statsCategory: statsCategory ?? .generic).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: resource, statsCategory: statsCategory ?? .generic).start()) default: break } diff --git a/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift index 396970d588..9e994f6f7b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift @@ -382,7 +382,7 @@ class ChatDocumentGalleryItemNode: ZoomableContentGalleryItemNode, WKNavigationD case .Fetching: context.account.postbox.mediaBox.cancelInteractiveResourceFetch(fileReference.media.resource) case .Remote: - self.fetchDisposable.set(fetchedMediaResource(postbox: context.account.postbox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) default: break } diff --git a/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift index 31087e25ba..9e925fb975 100644 --- a/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift @@ -316,7 +316,7 @@ class ChatExternalFileGalleryItemNode: GalleryItemNode { case .Fetching: context.account.postbox.mediaBox.cancelInteractiveResourceFetch(fileReference.media.resource) case .Remote: - self.fetchDisposable.set(fetchedMediaResource(postbox: context.account.postbox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) default: break } diff --git a/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift index 49e12bb097..8b638b3172 100644 --- a/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift @@ -221,7 +221,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { self.imageNode.setSignal(chatMessagePhoto(postbox: context.account.postbox, photoReference: imageReference), dispatchOnDisplayLink: false) self.zoomableContent = (largestSize.dimensions, self.imageNode) - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: imageReference.resourceReference(largestSize.resource)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: imageReference.resourceReference(largestSize.resource)).start()) self.setupStatus(resource: largestSize.resource) } else { self._ready.set(.single(Void())) @@ -463,7 +463,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { case .Fetching: self.context.account.postbox.mediaBox.cancelInteractiveResourceFetch(resource.resource) case .Remote: - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: resource, statsCategory: statsCategory ?? .generic).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: resource, statsCategory: statsCategory ?? .generic).start()) default: break } diff --git a/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift index 82f1eb905b..c09b73d672 100644 --- a/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift @@ -646,6 +646,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll imageFrame.origin.x = max(imageFrame.origin.x, leftInset + 10.0) videoFramePreviewNode.frame = imageFrame + videoFramePreviewNode.subnodes?.first?.frame = CGRect(origin: CGPoint(), size: imageFrame.size) } return panelHeight @@ -1021,6 +1022,12 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll self.fetchControl?() } + func setFramePreviewImageIsLoading() { + if self.videoFramePreviewNode?.image != nil { + //self.videoFramePreviewNode?.subnodes?.first?.alpha = 1.0 + } + } + func setFramePreviewImage(image: UIImage?) { if let image = image { let videoFramePreviewNode: ASImageNode @@ -1031,10 +1038,14 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll videoFramePreviewNode = ASImageNode() videoFramePreviewNode.displaysAsynchronously = false videoFramePreviewNode.displayWithoutProcessing = true + let dimNode = ASDisplayNode() + dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5) + videoFramePreviewNode.addSubnode(dimNode) self.videoFramePreviewNode = videoFramePreviewNode self.addSubnode(videoFramePreviewNode) animateIn = true } + videoFramePreviewNode.subnodes?.first?.alpha = 0.0 let updateLayout = videoFramePreviewNode.image?.size != image.size videoFramePreviewNode.image = image if updateLayout, let validLayout = self.validLayout { diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift index 26aeb93446..b874f8678b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift @@ -197,7 +197,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { } } if let resourceReference = resourceReference { - self.stickerFetchedDisposable.set(fetchedMediaResource(postbox: account.postbox, reference: resourceReference).start()) + self.stickerFetchedDisposable.set(fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: resourceReference).start()) } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift index e67014873b..a14ea83239 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift @@ -309,7 +309,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { if let updatedFile = updatedFile, updatedMedia { if let resource = updatedFile.previewRepresentations.first?.resource { - strongSelf.fetchedThumbnailDisposable.set(fetchedMediaResource(postbox: item.context.account.postbox, reference: FileMediaReference.message(message: MessageReference(item.message), media: updatedFile).resourceReference(resource)).start()) + strongSelf.fetchedThumbnailDisposable.set(fetchedMediaResource(mediaBox: item.context.account.postbox.mediaBox, reference: FileMediaReference.message(message: MessageReference(item.message), media: updatedFile).resourceReference(resource)).start()) } else { strongSelf.fetchedThumbnailDisposable.set(nil) } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift index 4dfde50fa7..074ffc7141 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -511,7 +511,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode { updatedFetchControls = FetchControls(fetch: { manual in if let strongSelf = self { if file.isAnimated { - strongSelf.fetchDisposable.set(fetchedMediaResource(postbox: context.account.postbox, reference: AnyMediaReference.message(message: MessageReference(message), media: file).resourceReference(file.resource), statsCategory: statsCategoryForFileWithAttributes(file.attributes)).start()) + strongSelf.fetchDisposable.set(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: AnyMediaReference.message(message: MessageReference(message), media: file).resourceReference(file.resource), statsCategory: statsCategoryForFileWithAttributes(file.attributes)).start()) } else { strongSelf.fetchDisposable.set(messageMediaFileInteractiveFetched(context: context, message: message, file: file, userInitiated: manual).start()) } diff --git a/submodules/TelegramUI/TelegramUI/FetchManager.swift b/submodules/TelegramUI/TelegramUI/FetchManager.swift index 8ad30c60c5..e02ae126c1 100644 --- a/submodules/TelegramUI/TelegramUI/FetchManager.swift +++ b/submodules/TelegramUI/TelegramUI/FetchManager.swift @@ -272,7 +272,7 @@ private final class FetchManagerCategoryContext { parsedRanges = resultRanges } activeContext.disposable?.dispose() - activeContext.disposable = (fetchedMediaResource(postbox: self.postbox, reference: entry.resourceReference, ranges: parsedRanges, statsCategory: entry.statsCategory, reportResultStatus: true, continueInBackground: entry.userInitiated) + activeContext.disposable = (fetchedMediaResource(mediaBox: self.postbox.mediaBox, reference: entry.resourceReference, ranges: parsedRanges, statsCategory: entry.statsCategory, reportResultStatus: true, continueInBackground: entry.userInitiated) |> mapToSignal { type -> Signal in if let storeManager = storeManager, let mediaReference = entry.mediaReference, case .remote = type, let peerType = entry.storeToDownloadsPeerType { return storeDownloadedMedia(storeManager: storeManager, media: mediaReference, peerType: peerType) @@ -413,7 +413,7 @@ private final class FetchManagerCategoryContext { }) } else if ranges.isEmpty { } else { - activeContext.disposable = (fetchedMediaResource(postbox: self.postbox, reference: entry.resourceReference, ranges: parsedRanges, statsCategory: entry.statsCategory, reportResultStatus: true, continueInBackground: entry.userInitiated) + activeContext.disposable = (fetchedMediaResource(mediaBox: self.postbox.mediaBox, reference: entry.resourceReference, ranges: parsedRanges, statsCategory: entry.statsCategory, reportResultStatus: true, continueInBackground: entry.userInitiated) |> mapToSignal { type -> Signal in if let storeManager = storeManager, let mediaReference = entry.mediaReference, case .remote = type, let peerType = entry.storeToDownloadsPeerType { return storeDownloadedMedia(storeManager: storeManager, media: mediaReference, peerType: peerType) diff --git a/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift b/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift index 6062d9860f..25c0df6115 100644 --- a/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift +++ b/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift @@ -6,11 +6,11 @@ import SwiftSignalKit import TelegramUIPreferences public func freeMediaFileInteractiveFetched(account: Account, fileReference: FileMediaReference) -> Signal { - return fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(fileReference.media.resource)) + return fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource)) } func freeMediaFileResourceInteractiveFetched(account: Account, fileReference: FileMediaReference, resource: MediaResource) -> Signal { - return fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(resource)) + return fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(resource)) } func cancelFreeMediaFileInteractiveFetch(account: Account, file: TelegramMediaFile) { diff --git a/submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift b/submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift index 7b15a72e72..f485016bee 100644 --- a/submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift +++ b/submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift @@ -344,8 +344,8 @@ func fetchedPartialVideoThumbnailData(postbox: Postbox, fileReference: FileMedia subscriber.putCompletion() return EmptyDisposable } - let fetchedHead = fetchedMediaResource(postbox: postbox, reference: fileReference.resourceReference(fileReference.media.resource), range: (0 ..< min(size, headerSize), .elevated), statsCategory: .video, reportResultStatus: false, preferBackgroundReferenceRevalidation: false).start() - let fetchedTail = fetchedMediaResource(postbox: postbox, reference: fileReference.resourceReference(fileReference.media.resource), range: (max(0, size - tailSize) ..< size, .elevated), statsCategory: .video, reportResultStatus: false, preferBackgroundReferenceRevalidation: false).start() + let fetchedHead = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource), range: (0 ..< min(size, headerSize), .elevated), statsCategory: .video, reportResultStatus: false, preferBackgroundReferenceRevalidation: false).start() + let fetchedTail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource), range: (max(0, size - tailSize) ..< size, .elevated), statsCategory: .video, reportResultStatus: false, preferBackgroundReferenceRevalidation: false).start() return ActionDisposable { fetchedHead.dispose() diff --git a/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift b/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift index 2cd6ab35ba..537f326a34 100644 --- a/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift +++ b/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift @@ -229,7 +229,7 @@ class GroupStickerPackCurrentItemNode: ItemListRevealOptionsItemNode { if fileUpdated { if let file = file { updatedImageSignal = chatMessageSticker(account: item.account, file: file, small: false) - updatedFetchSignal = fetchedMediaResource(postbox: item.account.postbox, reference: stickerPackFileReference(file).resourceReference(file.resource)) + updatedFetchSignal = fetchedMediaResource(mediaBox: item.account.postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(file.resource)) } else { updatedImageSignal = .single({ _ in return nil }) updatedFetchSignal = .complete() diff --git a/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift b/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift index b44d45f0ff..bcfd2415ce 100644 --- a/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift @@ -133,7 +133,7 @@ final class InstantImageGalleryItemNode: ZoomableContentGalleryItemNode { self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets(), emptyColor: .black))() self.imageNode.setSignal(chatMessagePhoto(postbox: self.context.account.postbox, photoReference: imageReference), dispatchOnDisplayLink: false) self.zoomableContent = (largestSize.dimensions, self.imageNode) - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: imageReference.resourceReference(largestSize.resource)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: imageReference.resourceReference(largestSize.resource)).start()) } else { self._ready.set(.single(Void())) } @@ -286,7 +286,7 @@ final class InstantImageGalleryItemNode: ZoomableContentGalleryItemNode { if let (context, media) = self.contextAndMedia, let fileReference = media.concrete(TelegramMediaFile.self) { if isVisible { - self.fetchDisposable.set(fetchedMediaResource(postbox: context.account.postbox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) } else { self.fetchDisposable.set(nil) } diff --git a/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift b/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift index 4a1f95d6b8..2bcee6071d 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift @@ -57,7 +57,7 @@ final class InstantPagePlayableVideoNode: ASDisplayNode, InstantPageNode { self.addSubnode(self.videoNode) if let file = media.media as? TelegramMediaFile { - self.fetchedDisposable.set(fetchedMediaResource(postbox: context.account.postbox, reference: AnyMediaReference.webPage(webPage: WebpageReference(webPage), media: file).resourceReference(file.resource)).start()) + self.fetchedDisposable.set(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: AnyMediaReference.webPage(webPage: WebpageReference(webPage), media: file).resourceReference(file.resource)).start()) self.statusDisposable.set((context.account.postbox.mediaBox.resourceStatus(file.resource) |> deliverOnMainQueue).start(next: { [weak self] status in displayLinkDispatcher.dispatch { diff --git a/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift index b49c7c0f15..5f24644910 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift @@ -375,7 +375,7 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { imageSize = imageBoundingSize } if fileUpdated, let resourceReference = resourceReference { - updatedFetchSignal = fetchedMediaResource(postbox: item.account.postbox, reference: resourceReference) + updatedFetchSignal = fetchedMediaResource(mediaBox: item.account.postbox.mediaBox, reference: resourceReference) } } else { updatedImageSignal = .single({ _ in return nil }) diff --git a/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift b/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift index 61f789fb89..deff80076a 100644 --- a/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift +++ b/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift @@ -66,7 +66,7 @@ final class MultiplexedSoftwareVideoSourceManager { context.source = SoftwareVideoSource(path: data.path) } } - }), fetchStatusDisposable: fetchedMediaResource(postbox: self.account.postbox, reference: AnyMediaReference.standalone(media: file).resourceReference(file.resource)).start()) + }), fetchStatusDisposable: fetchedMediaResource(mediaBox: self.account.postbox.mediaBox, reference: AnyMediaReference.standalone(media: file).resourceReference(file.resource)).start()) } } } diff --git a/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift b/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift index 962bb21008..7458ad6094 100644 --- a/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift +++ b/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift @@ -312,7 +312,7 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent func fetchControl(_ control: UniversalVideoNodeFetchControl) { switch control { case .fetch: - self.fetchDisposable.set(fetchedMediaResource(postbox: self.postbox, reference: self.fileReference.resourceReference(self.fileReference.media.resource), statsCategory: statsCategoryForFileWithAttributes(self.fileReference.media.attributes)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.postbox.mediaBox, reference: self.fileReference.resourceReference(self.fileReference.media.resource), statsCategory: statsCategoryForFileWithAttributes(self.fileReference.media.attributes)).start()) case .cancel: self.postbox.mediaBox.cancelInteractiveResourceFetch(self.fileReference.media.resource) } diff --git a/submodules/TelegramUI/TelegramUI/PeerAvatar.swift b/submodules/TelegramUI/TelegramUI/PeerAvatar.swift index 27dee710bf..53f5581b2b 100644 --- a/submodules/TelegramUI/TelegramUI/PeerAvatar.swift +++ b/submodules/TelegramUI/TelegramUI/PeerAvatar.swift @@ -44,11 +44,11 @@ public func peerAvatarImageData(account: Account, peer: Peer, authorOfMessage: M }) var fetchedDataDisposable: Disposable? if let peerReference = PeerReference(peer) { - fetchedDataDisposable = fetchedMediaResource(postbox: account.postbox, reference: .avatar(peer: peerReference, resource: smallProfileImage.resource), statsCategory: .generic).start() + fetchedDataDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: .avatar(peer: peerReference, resource: smallProfileImage.resource), statsCategory: .generic).start() } else if let authorOfMessage = authorOfMessage { - fetchedDataDisposable = fetchedMediaResource(postbox: account.postbox, reference: .messageAuthorAvatar(message: authorOfMessage, resource: smallProfileImage.resource), statsCategory: .generic).start() + fetchedDataDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: .messageAuthorAvatar(message: authorOfMessage, resource: smallProfileImage.resource), statsCategory: .generic).start() } else { - fetchedDataDisposable = fetchedMediaResource(postbox: account.postbox, reference: .standalone(resource: smallProfileImage.resource), statsCategory: .generic).start() + fetchedDataDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: .standalone(resource: smallProfileImage.resource), statsCategory: .generic).start() } return ActionDisposable { resourceDataDisposable.dispose() diff --git a/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift b/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift index 4678d64f96..2b289a341d 100644 --- a/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift @@ -174,7 +174,7 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode { self.imageNode.setSignal(chatAvatarGalleryPhoto(account: self.context.account, representations: representations), dispatchOnDisplayLink: false) self.zoomableContent = (largestSize.dimensions, self.imageNode) if let largestIndex = representations.index(where: { $0.representation == largestSize }) { - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: representations[largestIndex].reference).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: representations[largestIndex].reference).start()) } self.statusDisposable.set((self.context.account.postbox.mediaBox.resourceStatus(largestSize.resource) @@ -341,7 +341,7 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode { } if let largestIndex = representations.index(where: { $0.representation == largestSize }) { - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: representations[largestIndex].reference).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: representations[largestIndex].reference).start()) } default: break diff --git a/submodules/TelegramUI/TelegramUI/PhotoResources.swift b/submodules/TelegramUI/TelegramUI/PhotoResources.swift index d297052a78..bccee7a2e8 100644 --- a/submodules/TelegramUI/TelegramUI/PhotoResources.swift +++ b/submodules/TelegramUI/TelegramUI/PhotoResources.swift @@ -39,9 +39,9 @@ func chatMessagePhotoDatas(postbox: Postbox, photoReference: ImageMediaReference if let _ = decodedThumbnailData { fetchedThumbnail = .complete() } else { - fetchedThumbnail = fetchedMediaResource(postbox: postbox, reference: photoReference.resourceReference(smallestRepresentation.resource), statsCategory: .image) + fetchedThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: photoReference.resourceReference(smallestRepresentation.resource), statsCategory: .image) } - let fetchedFullSize = fetchedMediaResource(postbox: postbox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image) + let fetchedFullSize = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image) let anyThumbnail: [Signal] if tryAdditionalRepresentations { @@ -148,7 +148,7 @@ private func chatMessageFileDatas(account: Account, fileReference: FileMediaRefe if !fetched, let _ = decodedThumbnailData { fetchedThumbnail = .single(.local) } else if let thumbnailResource = thumbnailResource { - fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(thumbnailResource), statsCategory: statsCategoryForFileWithAttributes(fileReference.media.attributes)) + fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource), statsCategory: statsCategoryForFileWithAttributes(fileReference.media.attributes)) } else { fetchedThumbnail = .complete() } @@ -211,7 +211,7 @@ private func chatMessageImageFileThumbnailDatas(account: Account, fileReference: if let decodedThumbnailData = decodedThumbnailData { if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200.0 || thumbnailRepresentation.dimensions.height > 200.0) { return Signal { subscriber in - let fetchedDisposable = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start() + let fetchedDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start() let thumbnailDisposable = account.postbox.mediaBox.resourceData(thumbnailRepresentation.resource, attemptSynchronously: false).start(next: { next in let data: Data? = next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []) subscriber.putNext(Tuple(data ?? decodedThumbnailData, nil, false)) @@ -226,7 +226,7 @@ private func chatMessageImageFileThumbnailDatas(account: Account, fileReference: return .single(Tuple(decodedThumbnailData, nil, false)) } } else if let thumbnailResource = thumbnailResource { - let fetchedThumbnail: Signal = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(thumbnailResource)) + let fetchedThumbnail: Signal = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource)) return Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() let thumbnailDisposable = account.postbox.mediaBox.resourceData(thumbnailResource, pathExtension: pathExtension).start(next: { next in @@ -262,7 +262,7 @@ private func chatMessageImageFileThumbnailDatas(account: Account, fileReference: if let _ = fileReference.media.immediateThumbnailData { fetchedThumbnail = .complete() } else if let thumbnailResource = thumbnailResource { - fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(thumbnailResource)) + fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource)) } else { fetchedThumbnail = .complete() } @@ -330,7 +330,7 @@ private func chatMessageVideoDatas(postbox: Postbox, fileReference: FileMediaRef } else if let decodedThumbnailData = fileReference.media.immediateThumbnailData.flatMap(decodeTinyThumbnail) { if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200.0 || thumbnailRepresentation.dimensions.height > 200.0) { thumbnail = Signal { subscriber in - let fetchedDisposable = fetchedMediaResource(postbox: postbox, reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start() + let fetchedDisposable = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start() let thumbnailDisposable = postbox.mediaBox.resourceData(thumbnailRepresentation.resource, attemptSynchronously: synchronousLoad).start(next: { next in let data: Data? = next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []) subscriber.putNext(data ?? decodedThumbnailData) @@ -346,7 +346,7 @@ private func chatMessageVideoDatas(postbox: Postbox, fileReference: FileMediaRef } } else if let thumbnailResource = thumbnailResource { thumbnail = Signal { subscriber in - let fetchedDisposable = fetchedMediaResource(postbox: postbox, reference: fileReference.resourceReference(thumbnailResource), statsCategory: .video).start() + let fetchedDisposable = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource), statsCategory: .video).start() let thumbnailDisposable = postbox.mediaBox.resourceData(thumbnailResource, attemptSynchronously: synchronousLoad).start(next: { next in subscriber.putNext(next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: [])) }, error: subscriber.putError, completed: subscriber.putCompletion) @@ -893,7 +893,7 @@ private func chatMessagePhotoThumbnailDatas(account: Account, photoReference: Im let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) return .single(Tuple(nil, loadedData, true)) } else { - let fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: photoReference.resourceReference(smallestRepresentation.resource), statsCategory: .image) + let fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: photoReference.resourceReference(smallestRepresentation.resource), statsCategory: .image) let thumbnail = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() @@ -1235,8 +1235,8 @@ private func avatarGalleryThumbnailDatas(postbox: Postbox, representations: [Ima let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) return .single(Tuple(nil, loadedData, true)) } else { - let fetchedThumbnail = fetchedMediaResource(postbox: postbox, reference: representations[smallestIndex].reference, statsCategory: .image) - let fetchedFullSize = fetchedMediaResource(postbox: postbox, reference: representations[largestIndex].reference, statsCategory: .image) + let fetchedThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: representations[smallestIndex].reference, statsCategory: .image) + let fetchedFullSize = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: representations[largestIndex].reference, statsCategory: .image) let thumbnail = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() @@ -1474,7 +1474,7 @@ func gifPaneVideoThumbnail(account: Account, videoReference: FileMediaReference) }, completed: { subscriber.putCompletion() }) - let fetched = fetchedMediaResource(postbox: account.postbox, reference: videoReference.resourceReference(thumbnailResource)).start() + let fetched = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: videoReference.resourceReference(thumbnailResource)).start() return ActionDisposable { data.dispose() fetched.dispose() @@ -1763,7 +1763,7 @@ func chatMessagePhotoStatus(context: AccountContext, messageId: MessageId, photo public func standaloneChatMessagePhotoInteractiveFetched(account: Account, photoReference: ImageMediaReference) -> Signal { if let largestRepresentation = largestRepresentationForPhoto(photoReference.media) { - return fetchedMediaResource(postbox: account.postbox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image, reportResultStatus: true) + return fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image, reportResultStatus: true) |> mapToSignal { type -> Signal in return .single(type) } @@ -1774,7 +1774,7 @@ public func standaloneChatMessagePhotoInteractiveFetched(account: Account, photo public func chatMessagePhotoInteractiveFetched(context: AccountContext, photoReference: ImageMediaReference, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal { if let largestRepresentation = largestRepresentationForPhoto(photoReference.media) { - return fetchedMediaResource(postbox: context.account.postbox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image, reportResultStatus: true) + return fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image, reportResultStatus: true) |> mapToSignal { type -> Signal in if case .remote = type, let peerType = storeToDownloadsPeerType { return storeDownloadedMedia(storeManager: context.downloadedMediaStoreManager, media: photoReference.abstract, peerType: peerType) @@ -1798,7 +1798,7 @@ func chatMessagePhotoCancelInteractiveFetch(account: Account, photoReference: Im } func chatMessageWebFileInteractiveFetched(account: Account, image: TelegramMediaWebFile) -> Signal { - return fetchedMediaResource(postbox: account.postbox, reference: .standalone(resource: image.resource), statsCategory: .image) + return fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: .standalone(resource: image.resource), statsCategory: .image) } func chatMessageWebFileCancelInteractiveFetch(account: Account, image: TelegramMediaWebFile) { @@ -1820,7 +1820,7 @@ func chatWebpageSnippetFileData(account: Account, fileReference: FileMediaRefere }, completed: { subscriber.putCompletion() })) - disposable.add(fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(resource)).start()) + disposable.add(fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(resource)).start()) return disposable } } @@ -1841,7 +1841,7 @@ func chatWebpageSnippetPhotoData(account: Account, photoReference: ImageMediaRef }, completed: { subscriber.putCompletion() })) - disposable.add(fetchedMediaResource(postbox: account.postbox, reference: photoReference.resourceReference(closestRepresentation.resource)).start()) + disposable.add(fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: photoReference.resourceReference(closestRepresentation.resource)).start()) return disposable } } else { @@ -1943,7 +1943,7 @@ private func chatSecretMessageVideoData(account: Account, fileReference: FileMed if let smallestRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) { let thumbnailResource = smallestRepresentation.resource - let fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(thumbnailResource)) + let fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource)) let decodedThumbnailData = fileReference.media.immediateThumbnailData.flatMap(decodeTinyThumbnail) @@ -2313,8 +2313,8 @@ private func avatarGalleryPhotoDatas(account: Account, fileReference: FileMediaR let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) return .single(Tuple(nil, loadedData, true)) } else { - let fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: representations[smallestIndex].reference) - let fetchedFullSize = fetchedMediaResource(postbox: account.postbox, reference: representations[largestIndex].reference) + let fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[smallestIndex].reference) + let fetchedFullSize = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[largestIndex].reference) let thumbnail = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() @@ -2792,7 +2792,7 @@ func playerAlbumArt(postbox: Postbox, fileReference: FileMediaReference?, albumA if let fileReference = fileReference, let smallestRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) { let thumbnailResource = smallestRepresentation.resource - let fetchedThumbnail = fetchedMediaResource(postbox: postbox, reference: fileReference.resourceReference(thumbnailResource)) + let fetchedThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource)) let thumbnail = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() diff --git a/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift b/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift index 280c0df029..f22e48de05 100644 --- a/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift +++ b/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift @@ -45,7 +45,7 @@ private func fetchMediaData(context: AccountContext, postbox: Postbox, mediaRefe if let resource = resource { let fetchedData: Signal = Signal { subscriber in - let fetched = fetchedMediaResource(postbox: postbox, reference: mediaReference.resourceReference(resource)).start() + let fetched = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: mediaReference.resourceReference(resource)).start() let status = postbox.mediaBox.resourceStatus(resource).start(next: { status in switch status { case .Local: diff --git a/submodules/TelegramUI/TelegramUI/ShareController.swift b/submodules/TelegramUI/TelegramUI/ShareController.swift index bd10529239..75a715c8e6 100644 --- a/submodules/TelegramUI/TelegramUI/ShareController.swift +++ b/submodules/TelegramUI/TelegramUI/ShareController.swift @@ -54,7 +54,7 @@ private enum ExternalShareResourceStatus { private func collectExternalShareResource(postbox: Postbox, resourceReference: MediaResourceReference, statsCategory: MediaResourceStatsCategory) -> Signal { return Signal { subscriber in - let fetched = fetchedMediaResource(postbox: postbox, reference: resourceReference, statsCategory: statsCategory).start() + let fetched = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, statsCategory: statsCategory).start() let data = postbox.mediaBox.resourceData(resourceReference.resource, option: .complete(waitUntilFetchStatus: false)).start(next: { value in if value.complete { subscriber.putNext(.done(value)) diff --git a/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift b/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift index 3455ebf698..348dce7358 100644 --- a/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift +++ b/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift @@ -751,7 +751,7 @@ final class SharedMediaPlayer { } switch next { case let .telegramFile(file): - fetchedNextSignal = fetchedMediaResource(postbox: self.account.postbox, reference: file.resourceReference(file.media.resource)) + fetchedNextSignal = fetchedMediaResource(mediaBox: self.account.postbox.mediaBox, reference: file.resourceReference(file.media.resource)) |> ignoreValues |> `catch` { _ -> Signal in return .complete() diff --git a/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift b/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift index 1867870198..7385a10619 100644 --- a/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift +++ b/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift @@ -38,7 +38,7 @@ final class SoftwareVideoLayerFrameManager { self.layerHolder = layerHolder layerHolder.layer.videoGravity = .resizeAspectFill layerHolder.layer.masksToBounds = true - self.fetchDisposable = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(resource)).start() + self.fetchDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(resource)).start() } deinit { diff --git a/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift b/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift index c8c0c3b355..113d37d7db 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift @@ -149,7 +149,7 @@ final class StickerPackPreviewController: ViewController { for item in topItems { if let item = item as? StickerPackItem, item.file.isAnimatedSticker { let signal = Signal { subscriber in - let fetched = fetchedMediaResource(postbox: account.postbox, reference: FileMediaReference.standalone(media: item.file).resourceReference(item.file.resource)).start() + let fetched = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: FileMediaReference.standalone(media: item.file).resourceReference(item.file.resource)).start() let data = account.postbox.mediaBox.resourceData(item.file.resource).start() let fetchedRepresentation = chatMessageAnimatedStickerDatas(postbox: account.postbox, file: item.file, small: false, size: CGSize(width: 160.0, height: 160.0), fetched: true, onlyFullSize: false, synchronousLoad: false).start(next: { next in let hasContent = next._0 != nil || next._1 != nil diff --git a/submodules/TelegramUI/TelegramUI/StickerResources.swift b/submodules/TelegramUI/TelegramUI/StickerResources.swift index d8a893c765..a498108ecd 100644 --- a/submodules/TelegramUI/TelegramUI/StickerResources.swift +++ b/submodules/TelegramUI/TelegramUI/StickerResources.swift @@ -68,12 +68,12 @@ private func chatMessageStickerDatas(postbox: Postbox, file: TelegramMediaFile, return Signal { subscriber in var fetch: Disposable? if fetched { - fetch = fetchedMediaResource(postbox: postbox, reference: stickerPackFileReference(file).resourceReference(resource)).start() + fetch = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(resource)).start() } var fetchThumbnail: Disposable? if !thumbnailResource.id.isEqual(to: resource.id) { - fetchThumbnail = fetchedMediaResource(postbox: postbox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() + fetchThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() } let disposable = (combineLatest(thumbnailData, fullSizeData) |> map { thumbnailData, fullSizeData -> Tuple3 in @@ -119,12 +119,12 @@ func chatMessageAnimatedStickerDatas(postbox: Postbox, file: TelegramMediaFile, return Signal { subscriber in var fetch: Disposable? if fetched { - fetch = fetchedMediaResource(postbox: postbox, reference: stickerPackFileReference(file).resourceReference(resource)).start() + fetch = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(resource)).start() } var fetchThumbnail: Disposable? if !thumbnailResource.id.isEqual(to: resource.id) { - fetchThumbnail = fetchedMediaResource(postbox: postbox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() + fetchThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() } let disposable = (combineLatest(thumbnailData, fullSizeData) |> map { thumbnailData, fullSizeData -> Tuple3 in @@ -162,7 +162,7 @@ private func chatMessageStickerThumbnailData(postbox: Postbox, file: TelegramMed let thumbnailData = postbox.mediaBox.cachedResourceRepresentation(thumbnailResource, representation: CachedStickerAJpegRepresentation(size: nil), complete: false) return Signal { subscriber in - var fetchThumbnail = fetchedMediaResource(postbox: postbox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() + var fetchThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() let disposable = (thumbnailData |> map { thumbnailData -> Data? in diff --git a/submodules/TelegramUI/TelegramUI/TransformOutgoingMessageMedia.swift b/submodules/TelegramUI/TelegramUI/TransformOutgoingMessageMedia.swift index f132e68494..9322cca278 100644 --- a/submodules/TelegramUI/TelegramUI/TransformOutgoingMessageMedia.swift +++ b/submodules/TelegramUI/TelegramUI/TransformOutgoingMessageMedia.swift @@ -9,7 +9,7 @@ public func transformOutgoingMessageMedia(postbox: Postbox, network: Network, me switch media.media { case let file as TelegramMediaFile: let signal = Signal { subscriber in - let fetch = fetchedMediaResource(postbox: postbox, reference: media.resourceReference(file.resource)).start() + let fetch = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: media.resourceReference(file.resource)).start() let data = postbox.mediaBox.resourceData(file.resource, option: .complete(waitUntilFetchStatus: true)).start(next: { next in subscriber.putNext(next) if next.complete { @@ -125,7 +125,7 @@ public func transformOutgoingMessageMedia(postbox: Postbox, network: Network, me case let image as TelegramMediaImage: if let representation = largestImageRepresentation(image.representations) { let signal = Signal { subscriber in - let fetch = fetchedMediaResource(postbox: postbox, reference: media.resourceReference(representation.resource)).start() + let fetch = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: media.resourceReference(representation.resource)).start() let data = postbox.mediaBox.resourceData(representation.resource, option: .complete(waitUntilFetchStatus: true)).start(next: { next in subscriber.putNext(next) if next.complete { diff --git a/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift b/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift index 9d545275e0..c2b1b21df1 100644 --- a/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift @@ -179,7 +179,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private var fetchStatus: MediaResourceStatus? private var fetchControls: FetchControls? - private var scrubbingFrame = Promise(nil) + private var scrubbingFrame = Promise(nil) private var scrubbingFrames = false private var scrubbingFrameDisposable: Disposable? @@ -216,14 +216,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { if !strongSelf.scrubbingFrames { strongSelf.scrubbingFrames = true strongSelf.scrubbingFrame.set(videoFramePreview.generatedFrames - |> map { result -> UIImage? in - switch result { - case .waitingForData: - return nil - case let .image(image): - return image - } - }) + |> map(Optional.init)) } videoFramePreview.generateFrame(at: timecode) } else { @@ -287,11 +280,20 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } self.scrubbingFrameDisposable = (self.scrubbingFrame.get() - |> deliverOnMainQueue).start(next: { [weak self] image in + |> deliverOnMainQueue).start(next: { [weak self] result in guard let strongSelf = self else { return } - strongSelf.footerContentNode.setFramePreviewImage(image: image) + if let result = result { + switch result { + case .waitingForData: + strongSelf.footerContentNode.setFramePreviewImageIsLoading() + case let .image(image): + strongSelf.footerContentNode.setFramePreviewImage(image: image) + } + } else { + strongSelf.footerContentNode.setFramePreviewImage(image: nil) + } }) } diff --git a/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift b/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift index 2500879f77..487551af6b 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift @@ -281,7 +281,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode { } signal = wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, fileReference: fileReference, representations: convertedRepresentations, alwaysShowThumbnailFirst: true, autoFetchFullSize: false) } - fetchSignal = fetchedMediaResource(postbox: context.account.postbox, reference: convertedRepresentations[convertedRepresentations.count - 1].reference) + fetchSignal = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: convertedRepresentations[convertedRepresentations.count - 1].reference) let account = context.account statusSignal = context.sharedContext.accountManager.mediaBox.resourceStatus(file.file.resource) |> take(1) @@ -307,7 +307,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode { signal = wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, representations: convertedRepresentations, alwaysShowThumbnailFirst: true, autoFetchFullSize: false) if let largestIndex = convertedRepresentations.index(where: { $0.representation == largestSize }) { - fetchSignal = fetchedMediaResource(postbox: context.account.postbox, reference: convertedRepresentations[largestIndex].reference) + fetchSignal = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: convertedRepresentations[largestIndex].reference) } else { fetchSignal = .complete() } @@ -402,7 +402,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode { let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: representations, immediateThumbnailData: nil, reference: nil, partialReference: nil) signal = chatMessagePhoto(postbox: context.account.postbox, photoReference: .standalone(media: tmpImage)) - fetchSignal = fetchedMediaResource(postbox: context.account.postbox, reference: .media(media: .standalone(media: tmpImage), resource: imageResource)) + fetchSignal = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: .media(media: .standalone(media: tmpImage), resource: imageResource)) statusSignal = context.account.postbox.mediaBox.resourceStatus(imageResource) } else { displaySize = CGSize(width: 1.0, height: 1.0) diff --git a/submodules/TelegramUI/TelegramUI/WallpaperResources.swift b/submodules/TelegramUI/TelegramUI/WallpaperResources.swift index 055e8fce06..678d6e03b6 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperResources.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperResources.swift @@ -73,10 +73,10 @@ private func wallpaperDatas(account: Account, accountManager: AccountManager, fi if let _ = decodedThumbnailData { fetchedThumbnail = .complete() } else { - fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: representations[smallestIndex].reference) + fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[smallestIndex].reference) } - let fetchedFullSize = fetchedMediaResource(postbox: account.postbox, reference: representations[largestIndex].reference) + let fetchedFullSize = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[largestIndex].reference) let thumbnailData: Signal if let decodedThumbnailData = decodedThumbnailData { @@ -303,8 +303,8 @@ private func patternWallpaperDatas(account: Account, accountManager: AccountMana let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) return .single((nil, loadedData, true)) } else { - let fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: representations[smallestIndex].reference) - let fetchedFullSize = fetchedMediaResource(postbox: account.postbox, reference: representations[largestIndex].reference) + let fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[smallestIndex].reference) + let fetchedFullSize = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[largestIndex].reference) let thumbnailData = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start()