mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-07 17:30:12 +00:00
Load frames for video preview from network
This commit is contained in:
parent
10b5ea4cb4
commit
0bf61a2794
@ -238,12 +238,12 @@ private func seekCallback(userData: UnsafeMutableRawPointer?, offset: Int64, whe
|
|||||||
if streamable {
|
if streamable {
|
||||||
if context.tempFilePath == nil {
|
if context.tempFilePath == nil {
|
||||||
let fetchRange: Range<Int> = context.readingOffset ..< Int(Int32.max)
|
let fetchRange: Range<Int> = 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 {
|
} else if !context.requestedCompleteFetch && context.fetchAutomatically {
|
||||||
context.requestedCompleteFetch = true
|
context.requestedCompleteFetch = true
|
||||||
if context.tempFilePath == nil {
|
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 streamable {
|
||||||
if self.tempFilePath == nil {
|
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 {
|
} else if !self.requestedCompleteFetch && self.fetchAutomatically {
|
||||||
self.requestedCompleteFetch = true
|
self.requestedCompleteFetch = true
|
||||||
if self.tempFilePath == nil {
|
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 streamable {
|
||||||
if self.tempFilePath == nil {
|
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
|
self.requestedCompleteFetch = true
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,9 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa
|
|||||||
let readCount = min(resourceSize - context.readingOffset, Int(bufferSize))
|
let readCount = min(resourceSize - context.readingOffset, Int(bufferSize))
|
||||||
let requestRange: Range<Int> = context.readingOffset ..< (context.readingOffset + readCount)
|
let requestRange: Range<Int> = context.readingOffset ..< (context.readingOffset + readCount)
|
||||||
|
|
||||||
|
context.currentNumberOfReads += 1
|
||||||
|
context.currentReadBytes += readCount
|
||||||
|
|
||||||
let semaphore = DispatchSemaphore(value: 0)
|
let semaphore = DispatchSemaphore(value: 0)
|
||||||
data = context.mediaBox.resourceData(context.fileReference.media.resource, size: context.size, in: requestRange, mode: .partial)
|
data = context.mediaBox.resourceData(context.fileReference.media.resource, size: context.size, in: requestRange, mode: .partial)
|
||||||
let requiredDataIsNotLocallyAvailable = context.requiredDataIsNotLocallyAvailable
|
let requiredDataIsNotLocallyAvailable = context.requiredDataIsNotLocallyAvailable
|
||||||
@ -29,10 +32,15 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa
|
|||||||
semaphore.signal()
|
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()
|
semaphore.wait()
|
||||||
|
|
||||||
disposable.dispose()
|
disposable.dispose()
|
||||||
cancelDisposable.dispose()
|
cancelDisposable.dispose()
|
||||||
|
fetchDisposable?.dispose()
|
||||||
|
|
||||||
if let fetchedData = fetchedData {
|
if let fetchedData = fetchedData {
|
||||||
fetchedData.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) -> Void in
|
fetchedData.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) -> Void in
|
||||||
@ -91,6 +99,8 @@ private final class UniversalSoftwareVideoSourceImpl {
|
|||||||
|
|
||||||
fileprivate var cancelRead: Signal<Bool, NoError>
|
fileprivate var cancelRead: Signal<Bool, NoError>
|
||||||
fileprivate var requiredDataIsNotLocallyAvailable: (() -> Void)?
|
fileprivate var requiredDataIsNotLocallyAvailable: (() -> Void)?
|
||||||
|
fileprivate var currentNumberOfReads: Int = 0
|
||||||
|
fileprivate var currentReadBytes: Int = 0
|
||||||
|
|
||||||
init?(mediaBox: MediaBox, fileReference: FileMediaReference, state: ValuePromise<UniversalSoftwareVideoSourceState>, cancelInitialization: Signal<Bool, NoError>) {
|
init?(mediaBox: MediaBox, fileReference: FileMediaReference, state: ValuePromise<UniversalSoftwareVideoSourceState>, cancelInitialization: Signal<Bool, NoError>) {
|
||||||
guard let size = fileReference.media.size else {
|
guard let size = fileReference.media.size else {
|
||||||
@ -229,10 +239,13 @@ private final class UniversalSoftwareVideoSourceImpl {
|
|||||||
|
|
||||||
func readImage() -> (UIImage?, CGFloat, CGFloat, Bool) {
|
func readImage() -> (UIImage?, CGFloat, CGFloat, Bool) {
|
||||||
if let videoStream = self.videoStream {
|
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()
|
let (decodableFrame, loop) = self.readDecodableFrame()
|
||||||
if let decodableFrame = decodableFrame {
|
if let decodableFrame = decodableFrame {
|
||||||
if let renderedFrame = videoStream.decoder.render(frame: 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)
|
return (renderedFrame, CGFloat(videoStream.rotationAngle), CGFloat(videoStream.aspect), loop)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -519,21 +519,21 @@ final class TelegramCloudMediaResourceFetchInfo: MediaResourceFetchInfo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func fetchedMediaResource(postbox: Postbox, reference: MediaResourceReference, range: (Range<Int>, MediaBoxFetchPriority)? = nil, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
public func fetchedMediaResource(mediaBox: MediaBox, reference: MediaResourceReference, range: (Range<Int>, MediaBoxFetchPriority)? = nil, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
||||||
return fetchedMediaResource(postbox: postbox, reference: reference, ranges: range.flatMap({ [$0] }), statsCategory: statsCategory, reportResultStatus: reportResultStatus, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground)
|
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<Int>, MediaBoxFetchPriority)]?, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
public func fetchedMediaResource(mediaBox: MediaBox, reference: MediaResourceReference, ranges: [(Range<Int>, MediaBoxFetchPriority)]?, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
||||||
if let ranges = ranges {
|
if let ranges = ranges {
|
||||||
let signals = ranges.map { (range, priority) -> Signal<Void, FetchResourceError> in
|
let signals = ranges.map { (range, priority) -> Signal<Void, FetchResourceError> 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)
|
return combineLatest(signals)
|
||||||
|> ignoreValues
|
|> ignoreValues
|
||||||
|> map { _ -> FetchResourceSourceType in .local }
|
|> map { _ -> FetchResourceSourceType in .local }
|
||||||
|> then(.single(.local))
|
|> then(.single(.local))
|
||||||
} else {
|
} 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -430,7 +430,7 @@ func multipartUpload(network: Network, postbox: Postbox, source: MultipartUpload
|
|||||||
case let .resource(resource):
|
case let .resource(resource):
|
||||||
dataSignal = postbox.mediaBox.resourceData(resource.resource, option: .incremental(waitUntilFetchStatus: true)) |> map { MultipartUploadData.resourceData($0) }
|
dataSignal = postbox.mediaBox.resourceData(resource.resource, option: .incremental(waitUntilFetchStatus: true)) |> map { MultipartUploadData.resourceData($0) }
|
||||||
headerSize = resource.resource.headerSize
|
headerSize = resource.resource.headerSize
|
||||||
fetchedResource = fetchedMediaResource(postbox: postbox, reference: resource)
|
fetchedResource = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resource)
|
||||||
|> map { _ in }
|
|> map { _ in }
|
||||||
case let .data(data):
|
case let .data(data):
|
||||||
dataSignal = .single(.data(data))
|
dataSignal = .single(.data(data))
|
||||||
|
|||||||
@ -336,7 +336,7 @@ final class ChatAnimationGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
case .Fetching:
|
case .Fetching:
|
||||||
self.context.account.postbox.mediaBox.cancelInteractiveResourceFetch(resource.resource)
|
self.context.account.postbox.mediaBox.cancelInteractiveResourceFetch(resource.resource)
|
||||||
case .Remote:
|
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:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@ -382,7 +382,7 @@ class ChatDocumentGalleryItemNode: ZoomableContentGalleryItemNode, WKNavigationD
|
|||||||
case .Fetching:
|
case .Fetching:
|
||||||
context.account.postbox.mediaBox.cancelInteractiveResourceFetch(fileReference.media.resource)
|
context.account.postbox.mediaBox.cancelInteractiveResourceFetch(fileReference.media.resource)
|
||||||
case .Remote:
|
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:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@ -316,7 +316,7 @@ class ChatExternalFileGalleryItemNode: GalleryItemNode {
|
|||||||
case .Fetching:
|
case .Fetching:
|
||||||
context.account.postbox.mediaBox.cancelInteractiveResourceFetch(fileReference.media.resource)
|
context.account.postbox.mediaBox.cancelInteractiveResourceFetch(fileReference.media.resource)
|
||||||
case .Remote:
|
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:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@ -221,7 +221,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
self.imageNode.setSignal(chatMessagePhoto(postbox: context.account.postbox, photoReference: imageReference), dispatchOnDisplayLink: false)
|
self.imageNode.setSignal(chatMessagePhoto(postbox: context.account.postbox, photoReference: imageReference), dispatchOnDisplayLink: false)
|
||||||
self.zoomableContent = (largestSize.dimensions, self.imageNode)
|
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)
|
self.setupStatus(resource: largestSize.resource)
|
||||||
} else {
|
} else {
|
||||||
self._ready.set(.single(Void()))
|
self._ready.set(.single(Void()))
|
||||||
@ -463,7 +463,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
case .Fetching:
|
case .Fetching:
|
||||||
self.context.account.postbox.mediaBox.cancelInteractiveResourceFetch(resource.resource)
|
self.context.account.postbox.mediaBox.cancelInteractiveResourceFetch(resource.resource)
|
||||||
case .Remote:
|
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:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@ -646,6 +646,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
imageFrame.origin.x = max(imageFrame.origin.x, leftInset + 10.0)
|
imageFrame.origin.x = max(imageFrame.origin.x, leftInset + 10.0)
|
||||||
|
|
||||||
videoFramePreviewNode.frame = imageFrame
|
videoFramePreviewNode.frame = imageFrame
|
||||||
|
videoFramePreviewNode.subnodes?.first?.frame = CGRect(origin: CGPoint(), size: imageFrame.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
return panelHeight
|
return panelHeight
|
||||||
@ -1021,6 +1022,12 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
self.fetchControl?()
|
self.fetchControl?()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setFramePreviewImageIsLoading() {
|
||||||
|
if self.videoFramePreviewNode?.image != nil {
|
||||||
|
//self.videoFramePreviewNode?.subnodes?.first?.alpha = 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func setFramePreviewImage(image: UIImage?) {
|
func setFramePreviewImage(image: UIImage?) {
|
||||||
if let image = image {
|
if let image = image {
|
||||||
let videoFramePreviewNode: ASImageNode
|
let videoFramePreviewNode: ASImageNode
|
||||||
@ -1031,10 +1038,14 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
videoFramePreviewNode = ASImageNode()
|
videoFramePreviewNode = ASImageNode()
|
||||||
videoFramePreviewNode.displaysAsynchronously = false
|
videoFramePreviewNode.displaysAsynchronously = false
|
||||||
videoFramePreviewNode.displayWithoutProcessing = true
|
videoFramePreviewNode.displayWithoutProcessing = true
|
||||||
|
let dimNode = ASDisplayNode()
|
||||||
|
dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5)
|
||||||
|
videoFramePreviewNode.addSubnode(dimNode)
|
||||||
self.videoFramePreviewNode = videoFramePreviewNode
|
self.videoFramePreviewNode = videoFramePreviewNode
|
||||||
self.addSubnode(videoFramePreviewNode)
|
self.addSubnode(videoFramePreviewNode)
|
||||||
animateIn = true
|
animateIn = true
|
||||||
}
|
}
|
||||||
|
videoFramePreviewNode.subnodes?.first?.alpha = 0.0
|
||||||
let updateLayout = videoFramePreviewNode.image?.size != image.size
|
let updateLayout = videoFramePreviewNode.image?.size != image.size
|
||||||
videoFramePreviewNode.image = image
|
videoFramePreviewNode.image = image
|
||||||
if updateLayout, let validLayout = self.validLayout {
|
if updateLayout, let validLayout = self.validLayout {
|
||||||
|
|||||||
@ -197,7 +197,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let resourceReference = resourceReference {
|
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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -309,7 +309,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode {
|
|||||||
|
|
||||||
if let updatedFile = updatedFile, updatedMedia {
|
if let updatedFile = updatedFile, updatedMedia {
|
||||||
if let resource = updatedFile.previewRepresentations.first?.resource {
|
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 {
|
} else {
|
||||||
strongSelf.fetchedThumbnailDisposable.set(nil)
|
strongSelf.fetchedThumbnailDisposable.set(nil)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -511,7 +511,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode {
|
|||||||
updatedFetchControls = FetchControls(fetch: { manual in
|
updatedFetchControls = FetchControls(fetch: { manual in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
if file.isAnimated {
|
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 {
|
} else {
|
||||||
strongSelf.fetchDisposable.set(messageMediaFileInteractiveFetched(context: context, message: message, file: file, userInitiated: manual).start())
|
strongSelf.fetchDisposable.set(messageMediaFileInteractiveFetched(context: context, message: message, file: file, userInitiated: manual).start())
|
||||||
}
|
}
|
||||||
|
|||||||
@ -272,7 +272,7 @@ private final class FetchManagerCategoryContext {
|
|||||||
parsedRanges = resultRanges
|
parsedRanges = resultRanges
|
||||||
}
|
}
|
||||||
activeContext.disposable?.dispose()
|
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<FetchResourceSourceType, FetchResourceError> in
|
|> mapToSignal { type -> Signal<FetchResourceSourceType, FetchResourceError> in
|
||||||
if let storeManager = storeManager, let mediaReference = entry.mediaReference, case .remote = type, let peerType = entry.storeToDownloadsPeerType {
|
if let storeManager = storeManager, let mediaReference = entry.mediaReference, case .remote = type, let peerType = entry.storeToDownloadsPeerType {
|
||||||
return storeDownloadedMedia(storeManager: storeManager, media: mediaReference, peerType: peerType)
|
return storeDownloadedMedia(storeManager: storeManager, media: mediaReference, peerType: peerType)
|
||||||
@ -413,7 +413,7 @@ private final class FetchManagerCategoryContext {
|
|||||||
})
|
})
|
||||||
} else if ranges.isEmpty {
|
} else if ranges.isEmpty {
|
||||||
} else {
|
} 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<FetchResourceSourceType, FetchResourceError> in
|
|> mapToSignal { type -> Signal<FetchResourceSourceType, FetchResourceError> in
|
||||||
if let storeManager = storeManager, let mediaReference = entry.mediaReference, case .remote = type, let peerType = entry.storeToDownloadsPeerType {
|
if let storeManager = storeManager, let mediaReference = entry.mediaReference, case .remote = type, let peerType = entry.storeToDownloadsPeerType {
|
||||||
return storeDownloadedMedia(storeManager: storeManager, media: mediaReference, peerType: peerType)
|
return storeDownloadedMedia(storeManager: storeManager, media: mediaReference, peerType: peerType)
|
||||||
|
|||||||
@ -6,11 +6,11 @@ import SwiftSignalKit
|
|||||||
import TelegramUIPreferences
|
import TelegramUIPreferences
|
||||||
|
|
||||||
public func freeMediaFileInteractiveFetched(account: Account, fileReference: FileMediaReference) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
public func freeMediaFileInteractiveFetched(account: Account, fileReference: FileMediaReference) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
||||||
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<FetchResourceSourceType, FetchResourceError> {
|
func freeMediaFileResourceInteractiveFetched(account: Account, fileReference: FileMediaReference, resource: MediaResource) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
||||||
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) {
|
func cancelFreeMediaFileInteractiveFetch(account: Account, file: TelegramMediaFile) {
|
||||||
|
|||||||
@ -344,8 +344,8 @@ func fetchedPartialVideoThumbnailData(postbox: Postbox, fileReference: FileMedia
|
|||||||
subscriber.putCompletion()
|
subscriber.putCompletion()
|
||||||
return EmptyDisposable
|
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 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(postbox: postbox, reference: fileReference.resourceReference(fileReference.media.resource), range: (max(0, size - tailSize) ..< size, .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 {
|
return ActionDisposable {
|
||||||
fetchedHead.dispose()
|
fetchedHead.dispose()
|
||||||
|
|||||||
@ -229,7 +229,7 @@ class GroupStickerPackCurrentItemNode: ItemListRevealOptionsItemNode {
|
|||||||
if fileUpdated {
|
if fileUpdated {
|
||||||
if let file = file {
|
if let file = file {
|
||||||
updatedImageSignal = chatMessageSticker(account: item.account, file: file, small: false)
|
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 {
|
} else {
|
||||||
updatedImageSignal = .single({ _ in return nil })
|
updatedImageSignal = .single({ _ in return nil })
|
||||||
updatedFetchSignal = .complete()
|
updatedFetchSignal = .complete()
|
||||||
|
|||||||
@ -133,7 +133,7 @@ final class InstantImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets(), emptyColor: .black))()
|
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.imageNode.setSignal(chatMessagePhoto(postbox: self.context.account.postbox, photoReference: imageReference), dispatchOnDisplayLink: false)
|
||||||
self.zoomableContent = (largestSize.dimensions, self.imageNode)
|
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 {
|
} else {
|
||||||
self._ready.set(.single(Void()))
|
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 let (context, media) = self.contextAndMedia, let fileReference = media.concrete(TelegramMediaFile.self) {
|
||||||
if isVisible {
|
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 {
|
} else {
|
||||||
self.fetchDisposable.set(nil)
|
self.fetchDisposable.set(nil)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,7 +57,7 @@ final class InstantPagePlayableVideoNode: ASDisplayNode, InstantPageNode {
|
|||||||
self.addSubnode(self.videoNode)
|
self.addSubnode(self.videoNode)
|
||||||
|
|
||||||
if let file = media.media as? TelegramMediaFile {
|
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
|
self.statusDisposable.set((context.account.postbox.mediaBox.resourceStatus(file.resource) |> deliverOnMainQueue).start(next: { [weak self] status in
|
||||||
displayLinkDispatcher.dispatch {
|
displayLinkDispatcher.dispatch {
|
||||||
|
|||||||
@ -375,7 +375,7 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode {
|
|||||||
imageSize = imageBoundingSize
|
imageSize = imageBoundingSize
|
||||||
}
|
}
|
||||||
if fileUpdated, let resourceReference = resourceReference {
|
if fileUpdated, let resourceReference = resourceReference {
|
||||||
updatedFetchSignal = fetchedMediaResource(postbox: item.account.postbox, reference: resourceReference)
|
updatedFetchSignal = fetchedMediaResource(mediaBox: item.account.postbox.mediaBox, reference: resourceReference)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
updatedImageSignal = .single({ _ in return nil })
|
updatedImageSignal = .single({ _ in return nil })
|
||||||
|
|||||||
@ -66,7 +66,7 @@ final class MultiplexedSoftwareVideoSourceManager {
|
|||||||
context.source = SoftwareVideoSource(path: data.path)
|
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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -312,7 +312,7 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent
|
|||||||
func fetchControl(_ control: UniversalVideoNodeFetchControl) {
|
func fetchControl(_ control: UniversalVideoNodeFetchControl) {
|
||||||
switch control {
|
switch control {
|
||||||
case .fetch:
|
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:
|
case .cancel:
|
||||||
self.postbox.mediaBox.cancelInteractiveResourceFetch(self.fileReference.media.resource)
|
self.postbox.mediaBox.cancelInteractiveResourceFetch(self.fileReference.media.resource)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -44,11 +44,11 @@ public func peerAvatarImageData(account: Account, peer: Peer, authorOfMessage: M
|
|||||||
})
|
})
|
||||||
var fetchedDataDisposable: Disposable?
|
var fetchedDataDisposable: Disposable?
|
||||||
if let peerReference = PeerReference(peer) {
|
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 {
|
} 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 {
|
} 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 {
|
return ActionDisposable {
|
||||||
resourceDataDisposable.dispose()
|
resourceDataDisposable.dispose()
|
||||||
|
|||||||
@ -174,7 +174,7 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
self.imageNode.setSignal(chatAvatarGalleryPhoto(account: self.context.account, representations: representations), dispatchOnDisplayLink: false)
|
self.imageNode.setSignal(chatAvatarGalleryPhoto(account: self.context.account, representations: representations), dispatchOnDisplayLink: false)
|
||||||
self.zoomableContent = (largestSize.dimensions, self.imageNode)
|
self.zoomableContent = (largestSize.dimensions, self.imageNode)
|
||||||
if let largestIndex = representations.index(where: { $0.representation == largestSize }) {
|
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)
|
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 }) {
|
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:
|
default:
|
||||||
break
|
break
|
||||||
|
|||||||
@ -39,9 +39,9 @@ func chatMessagePhotoDatas(postbox: Postbox, photoReference: ImageMediaReference
|
|||||||
if let _ = decodedThumbnailData {
|
if let _ = decodedThumbnailData {
|
||||||
fetchedThumbnail = .complete()
|
fetchedThumbnail = .complete()
|
||||||
} else {
|
} 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<MediaResourceData, NoError>]
|
let anyThumbnail: [Signal<MediaResourceData, NoError>]
|
||||||
if tryAdditionalRepresentations {
|
if tryAdditionalRepresentations {
|
||||||
@ -148,7 +148,7 @@ private func chatMessageFileDatas(account: Account, fileReference: FileMediaRefe
|
|||||||
if !fetched, let _ = decodedThumbnailData {
|
if !fetched, let _ = decodedThumbnailData {
|
||||||
fetchedThumbnail = .single(.local)
|
fetchedThumbnail = .single(.local)
|
||||||
} else if let thumbnailResource = thumbnailResource {
|
} 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 {
|
} else {
|
||||||
fetchedThumbnail = .complete()
|
fetchedThumbnail = .complete()
|
||||||
}
|
}
|
||||||
@ -211,7 +211,7 @@ private func chatMessageImageFileThumbnailDatas(account: Account, fileReference:
|
|||||||
if let decodedThumbnailData = decodedThumbnailData {
|
if let decodedThumbnailData = decodedThumbnailData {
|
||||||
if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200.0 || thumbnailRepresentation.dimensions.height > 200.0) {
|
if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200.0 || thumbnailRepresentation.dimensions.height > 200.0) {
|
||||||
return Signal { subscriber in
|
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 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: [])
|
let data: Data? = next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: [])
|
||||||
subscriber.putNext(Tuple(data ?? decodedThumbnailData, nil, false))
|
subscriber.putNext(Tuple(data ?? decodedThumbnailData, nil, false))
|
||||||
@ -226,7 +226,7 @@ private func chatMessageImageFileThumbnailDatas(account: Account, fileReference:
|
|||||||
return .single(Tuple(decodedThumbnailData, nil, false))
|
return .single(Tuple(decodedThumbnailData, nil, false))
|
||||||
}
|
}
|
||||||
} else if let thumbnailResource = thumbnailResource {
|
} else if let thumbnailResource = thumbnailResource {
|
||||||
let fetchedThumbnail: Signal<FetchResourceSourceType, FetchResourceError> = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(thumbnailResource))
|
let fetchedThumbnail: Signal<FetchResourceSourceType, FetchResourceError> = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource))
|
||||||
return Signal { subscriber in
|
return Signal { subscriber in
|
||||||
let fetchedDisposable = fetchedThumbnail.start()
|
let fetchedDisposable = fetchedThumbnail.start()
|
||||||
let thumbnailDisposable = account.postbox.mediaBox.resourceData(thumbnailResource, pathExtension: pathExtension).start(next: { next in
|
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 {
|
if let _ = fileReference.media.immediateThumbnailData {
|
||||||
fetchedThumbnail = .complete()
|
fetchedThumbnail = .complete()
|
||||||
} else if let thumbnailResource = thumbnailResource {
|
} 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 {
|
} else {
|
||||||
fetchedThumbnail = .complete()
|
fetchedThumbnail = .complete()
|
||||||
}
|
}
|
||||||
@ -330,7 +330,7 @@ private func chatMessageVideoDatas(postbox: Postbox, fileReference: FileMediaRef
|
|||||||
} else if let decodedThumbnailData = fileReference.media.immediateThumbnailData.flatMap(decodeTinyThumbnail) {
|
} else if let decodedThumbnailData = fileReference.media.immediateThumbnailData.flatMap(decodeTinyThumbnail) {
|
||||||
if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200.0 || thumbnailRepresentation.dimensions.height > 200.0) {
|
if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200.0 || thumbnailRepresentation.dimensions.height > 200.0) {
|
||||||
thumbnail = Signal { subscriber in
|
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 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: [])
|
let data: Data? = next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: [])
|
||||||
subscriber.putNext(data ?? decodedThumbnailData)
|
subscriber.putNext(data ?? decodedThumbnailData)
|
||||||
@ -346,7 +346,7 @@ private func chatMessageVideoDatas(postbox: Postbox, fileReference: FileMediaRef
|
|||||||
}
|
}
|
||||||
} else if let thumbnailResource = thumbnailResource {
|
} else if let thumbnailResource = thumbnailResource {
|
||||||
thumbnail = Signal { subscriber in
|
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
|
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: []))
|
subscriber.putNext(next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []))
|
||||||
}, error: subscriber.putError, completed: subscriber.putCompletion)
|
}, 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: [])
|
let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: [])
|
||||||
return .single(Tuple(nil, loadedData, true))
|
return .single(Tuple(nil, loadedData, true))
|
||||||
} else {
|
} 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<Data?, NoError> { subscriber in
|
let thumbnail = Signal<Data?, NoError> { subscriber in
|
||||||
let fetchedDisposable = fetchedThumbnail.start()
|
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: [])
|
let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: [])
|
||||||
return .single(Tuple(nil, loadedData, true))
|
return .single(Tuple(nil, loadedData, true))
|
||||||
} else {
|
} else {
|
||||||
let fetchedThumbnail = fetchedMediaResource(postbox: postbox, reference: representations[smallestIndex].reference, statsCategory: .image)
|
let fetchedThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: representations[smallestIndex].reference, statsCategory: .image)
|
||||||
let fetchedFullSize = fetchedMediaResource(postbox: postbox, reference: representations[largestIndex].reference, statsCategory: .image)
|
let fetchedFullSize = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: representations[largestIndex].reference, statsCategory: .image)
|
||||||
|
|
||||||
let thumbnail = Signal<Data?, NoError> { subscriber in
|
let thumbnail = Signal<Data?, NoError> { subscriber in
|
||||||
let fetchedDisposable = fetchedThumbnail.start()
|
let fetchedDisposable = fetchedThumbnail.start()
|
||||||
@ -1474,7 +1474,7 @@ func gifPaneVideoThumbnail(account: Account, videoReference: FileMediaReference)
|
|||||||
}, completed: {
|
}, completed: {
|
||||||
subscriber.putCompletion()
|
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 {
|
return ActionDisposable {
|
||||||
data.dispose()
|
data.dispose()
|
||||||
fetched.dispose()
|
fetched.dispose()
|
||||||
@ -1763,7 +1763,7 @@ func chatMessagePhotoStatus(context: AccountContext, messageId: MessageId, photo
|
|||||||
|
|
||||||
public func standaloneChatMessagePhotoInteractiveFetched(account: Account, photoReference: ImageMediaReference) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
public func standaloneChatMessagePhotoInteractiveFetched(account: Account, photoReference: ImageMediaReference) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
||||||
if let largestRepresentation = largestRepresentationForPhoto(photoReference.media) {
|
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<FetchResourceSourceType, FetchResourceError> in
|
|> mapToSignal { type -> Signal<FetchResourceSourceType, FetchResourceError> in
|
||||||
return .single(type)
|
return .single(type)
|
||||||
}
|
}
|
||||||
@ -1774,7 +1774,7 @@ public func standaloneChatMessagePhotoInteractiveFetched(account: Account, photo
|
|||||||
|
|
||||||
public func chatMessagePhotoInteractiveFetched(context: AccountContext, photoReference: ImageMediaReference, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
public func chatMessagePhotoInteractiveFetched(context: AccountContext, photoReference: ImageMediaReference, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
||||||
if let largestRepresentation = largestRepresentationForPhoto(photoReference.media) {
|
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<FetchResourceSourceType, FetchResourceError> in
|
|> mapToSignal { type -> Signal<FetchResourceSourceType, FetchResourceError> in
|
||||||
if case .remote = type, let peerType = storeToDownloadsPeerType {
|
if case .remote = type, let peerType = storeToDownloadsPeerType {
|
||||||
return storeDownloadedMedia(storeManager: context.downloadedMediaStoreManager, media: photoReference.abstract, peerType: peerType)
|
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<FetchResourceSourceType, FetchResourceError> {
|
func chatMessageWebFileInteractiveFetched(account: Account, image: TelegramMediaWebFile) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
||||||
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) {
|
func chatMessageWebFileCancelInteractiveFetch(account: Account, image: TelegramMediaWebFile) {
|
||||||
@ -1820,7 +1820,7 @@ func chatWebpageSnippetFileData(account: Account, fileReference: FileMediaRefere
|
|||||||
}, completed: {
|
}, completed: {
|
||||||
subscriber.putCompletion()
|
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
|
return disposable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1841,7 +1841,7 @@ func chatWebpageSnippetPhotoData(account: Account, photoReference: ImageMediaRef
|
|||||||
}, completed: {
|
}, completed: {
|
||||||
subscriber.putCompletion()
|
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
|
return disposable
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1943,7 +1943,7 @@ private func chatSecretMessageVideoData(account: Account, fileReference: FileMed
|
|||||||
if let smallestRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) {
|
if let smallestRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) {
|
||||||
let thumbnailResource = smallestRepresentation.resource
|
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)
|
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: [])
|
let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: [])
|
||||||
return .single(Tuple(nil, loadedData, true))
|
return .single(Tuple(nil, loadedData, true))
|
||||||
} else {
|
} else {
|
||||||
let fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: representations[smallestIndex].reference)
|
let 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 thumbnail = Signal<Data?, NoError> { subscriber in
|
let thumbnail = Signal<Data?, NoError> { subscriber in
|
||||||
let fetchedDisposable = fetchedThumbnail.start()
|
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) {
|
if let fileReference = fileReference, let smallestRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) {
|
||||||
let thumbnailResource = smallestRepresentation.resource
|
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<Data?, NoError> { subscriber in
|
let thumbnail = Signal<Data?, NoError> { subscriber in
|
||||||
let fetchedDisposable = fetchedThumbnail.start()
|
let fetchedDisposable = fetchedThumbnail.start()
|
||||||
|
|||||||
@ -45,7 +45,7 @@ private func fetchMediaData(context: AccountContext, postbox: Postbox, mediaRefe
|
|||||||
|
|
||||||
if let resource = resource {
|
if let resource = resource {
|
||||||
let fetchedData: Signal<SaveToCameraRollState, NoError> = Signal { subscriber in
|
let fetchedData: Signal<SaveToCameraRollState, NoError> = 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
|
let status = postbox.mediaBox.resourceStatus(resource).start(next: { status in
|
||||||
switch status {
|
switch status {
|
||||||
case .Local:
|
case .Local:
|
||||||
|
|||||||
@ -54,7 +54,7 @@ private enum ExternalShareResourceStatus {
|
|||||||
|
|
||||||
private func collectExternalShareResource(postbox: Postbox, resourceReference: MediaResourceReference, statsCategory: MediaResourceStatsCategory) -> Signal<ExternalShareResourceStatus, NoError> {
|
private func collectExternalShareResource(postbox: Postbox, resourceReference: MediaResourceReference, statsCategory: MediaResourceStatsCategory) -> Signal<ExternalShareResourceStatus, NoError> {
|
||||||
return Signal { subscriber in
|
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
|
let data = postbox.mediaBox.resourceData(resourceReference.resource, option: .complete(waitUntilFetchStatus: false)).start(next: { value in
|
||||||
if value.complete {
|
if value.complete {
|
||||||
subscriber.putNext(.done(value))
|
subscriber.putNext(.done(value))
|
||||||
|
|||||||
@ -751,7 +751,7 @@ final class SharedMediaPlayer {
|
|||||||
}
|
}
|
||||||
switch next {
|
switch next {
|
||||||
case let .telegramFile(file):
|
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
|
|> ignoreValues
|
||||||
|> `catch` { _ -> Signal<Never, NoError> in
|
|> `catch` { _ -> Signal<Never, NoError> in
|
||||||
return .complete()
|
return .complete()
|
||||||
|
|||||||
@ -38,7 +38,7 @@ final class SoftwareVideoLayerFrameManager {
|
|||||||
self.layerHolder = layerHolder
|
self.layerHolder = layerHolder
|
||||||
layerHolder.layer.videoGravity = .resizeAspectFill
|
layerHolder.layer.videoGravity = .resizeAspectFill
|
||||||
layerHolder.layer.masksToBounds = true
|
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 {
|
deinit {
|
||||||
|
|||||||
@ -149,7 +149,7 @@ final class StickerPackPreviewController: ViewController {
|
|||||||
for item in topItems {
|
for item in topItems {
|
||||||
if let item = item as? StickerPackItem, item.file.isAnimatedSticker {
|
if let item = item as? StickerPackItem, item.file.isAnimatedSticker {
|
||||||
let signal = Signal<Bool, NoError> { subscriber in
|
let signal = Signal<Bool, NoError> { 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 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 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
|
let hasContent = next._0 != nil || next._1 != nil
|
||||||
|
|||||||
@ -68,12 +68,12 @@ private func chatMessageStickerDatas(postbox: Postbox, file: TelegramMediaFile,
|
|||||||
return Signal { subscriber in
|
return Signal { subscriber in
|
||||||
var fetch: Disposable?
|
var fetch: Disposable?
|
||||||
if fetched {
|
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?
|
var fetchThumbnail: Disposable?
|
||||||
if !thumbnailResource.id.isEqual(to: resource.id) {
|
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)
|
let disposable = (combineLatest(thumbnailData, fullSizeData)
|
||||||
|> map { thumbnailData, fullSizeData -> Tuple3<Data?, Data?, Bool> in
|
|> map { thumbnailData, fullSizeData -> Tuple3<Data?, Data?, Bool> in
|
||||||
@ -119,12 +119,12 @@ func chatMessageAnimatedStickerDatas(postbox: Postbox, file: TelegramMediaFile,
|
|||||||
return Signal { subscriber in
|
return Signal { subscriber in
|
||||||
var fetch: Disposable?
|
var fetch: Disposable?
|
||||||
if fetched {
|
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?
|
var fetchThumbnail: Disposable?
|
||||||
if !thumbnailResource.id.isEqual(to: resource.id) {
|
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)
|
let disposable = (combineLatest(thumbnailData, fullSizeData)
|
||||||
|> map { thumbnailData, fullSizeData -> Tuple3<Data?, Data?, Bool> in
|
|> map { thumbnailData, fullSizeData -> Tuple3<Data?, Data?, Bool> in
|
||||||
@ -162,7 +162,7 @@ private func chatMessageStickerThumbnailData(postbox: Postbox, file: TelegramMed
|
|||||||
let thumbnailData = postbox.mediaBox.cachedResourceRepresentation(thumbnailResource, representation: CachedStickerAJpegRepresentation(size: nil), complete: false)
|
let thumbnailData = postbox.mediaBox.cachedResourceRepresentation(thumbnailResource, representation: CachedStickerAJpegRepresentation(size: nil), complete: false)
|
||||||
|
|
||||||
return Signal { subscriber in
|
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
|
let disposable = (thumbnailData
|
||||||
|> map { thumbnailData -> Data? in
|
|> map { thumbnailData -> Data? in
|
||||||
|
|||||||
@ -9,7 +9,7 @@ public func transformOutgoingMessageMedia(postbox: Postbox, network: Network, me
|
|||||||
switch media.media {
|
switch media.media {
|
||||||
case let file as TelegramMediaFile:
|
case let file as TelegramMediaFile:
|
||||||
let signal = Signal<MediaResourceData, NoError> { subscriber in
|
let signal = Signal<MediaResourceData, NoError> { 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
|
let data = postbox.mediaBox.resourceData(file.resource, option: .complete(waitUntilFetchStatus: true)).start(next: { next in
|
||||||
subscriber.putNext(next)
|
subscriber.putNext(next)
|
||||||
if next.complete {
|
if next.complete {
|
||||||
@ -125,7 +125,7 @@ public func transformOutgoingMessageMedia(postbox: Postbox, network: Network, me
|
|||||||
case let image as TelegramMediaImage:
|
case let image as TelegramMediaImage:
|
||||||
if let representation = largestImageRepresentation(image.representations) {
|
if let representation = largestImageRepresentation(image.representations) {
|
||||||
let signal = Signal<MediaResourceData, NoError> { subscriber in
|
let signal = Signal<MediaResourceData, NoError> { 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
|
let data = postbox.mediaBox.resourceData(representation.resource, option: .complete(waitUntilFetchStatus: true)).start(next: { next in
|
||||||
subscriber.putNext(next)
|
subscriber.putNext(next)
|
||||||
if next.complete {
|
if next.complete {
|
||||||
|
|||||||
@ -179,7 +179,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
private var fetchStatus: MediaResourceStatus?
|
private var fetchStatus: MediaResourceStatus?
|
||||||
private var fetchControls: FetchControls?
|
private var fetchControls: FetchControls?
|
||||||
|
|
||||||
private var scrubbingFrame = Promise<UIImage?>(nil)
|
private var scrubbingFrame = Promise<MediaPlayerFramePreviewResult?>(nil)
|
||||||
private var scrubbingFrames = false
|
private var scrubbingFrames = false
|
||||||
private var scrubbingFrameDisposable: Disposable?
|
private var scrubbingFrameDisposable: Disposable?
|
||||||
|
|
||||||
@ -216,14 +216,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
if !strongSelf.scrubbingFrames {
|
if !strongSelf.scrubbingFrames {
|
||||||
strongSelf.scrubbingFrames = true
|
strongSelf.scrubbingFrames = true
|
||||||
strongSelf.scrubbingFrame.set(videoFramePreview.generatedFrames
|
strongSelf.scrubbingFrame.set(videoFramePreview.generatedFrames
|
||||||
|> map { result -> UIImage? in
|
|> map(Optional.init))
|
||||||
switch result {
|
|
||||||
case .waitingForData:
|
|
||||||
return nil
|
|
||||||
case let .image(image):
|
|
||||||
return image
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
videoFramePreview.generateFrame(at: timecode)
|
videoFramePreview.generateFrame(at: timecode)
|
||||||
} else {
|
} else {
|
||||||
@ -287,11 +280,20 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.scrubbingFrameDisposable = (self.scrubbingFrame.get()
|
self.scrubbingFrameDisposable = (self.scrubbingFrame.get()
|
||||||
|> deliverOnMainQueue).start(next: { [weak self] image in
|
|> deliverOnMainQueue).start(next: { [weak self] result in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if let result = result {
|
||||||
|
switch result {
|
||||||
|
case .waitingForData:
|
||||||
|
strongSelf.footerContentNode.setFramePreviewImageIsLoading()
|
||||||
|
case let .image(image):
|
||||||
strongSelf.footerContentNode.setFramePreviewImage(image: image)
|
strongSelf.footerContentNode.setFramePreviewImage(image: image)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
strongSelf.footerContentNode.setFramePreviewImage(image: nil)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
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
|
let account = context.account
|
||||||
statusSignal = context.sharedContext.accountManager.mediaBox.resourceStatus(file.file.resource)
|
statusSignal = context.sharedContext.accountManager.mediaBox.resourceStatus(file.file.resource)
|
||||||
|> take(1)
|
|> 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)
|
signal = wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, representations: convertedRepresentations, alwaysShowThumbnailFirst: true, autoFetchFullSize: false)
|
||||||
|
|
||||||
if let largestIndex = convertedRepresentations.index(where: { $0.representation == largestSize }) {
|
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 {
|
} else {
|
||||||
fetchSignal = .complete()
|
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)
|
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))
|
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)
|
statusSignal = context.account.postbox.mediaBox.resourceStatus(imageResource)
|
||||||
} else {
|
} else {
|
||||||
displaySize = CGSize(width: 1.0, height: 1.0)
|
displaySize = CGSize(width: 1.0, height: 1.0)
|
||||||
|
|||||||
@ -73,10 +73,10 @@ private func wallpaperDatas(account: Account, accountManager: AccountManager, fi
|
|||||||
if let _ = decodedThumbnailData {
|
if let _ = decodedThumbnailData {
|
||||||
fetchedThumbnail = .complete()
|
fetchedThumbnail = .complete()
|
||||||
} else {
|
} 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<Data?, NoError>
|
let thumbnailData: Signal<Data?, NoError>
|
||||||
if let decodedThumbnailData = decodedThumbnailData {
|
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: [])
|
let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: [])
|
||||||
return .single((nil, loadedData, true))
|
return .single((nil, loadedData, true))
|
||||||
} else {
|
} else {
|
||||||
let fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: representations[smallestIndex].reference)
|
let 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<Data?, NoError> { subscriber in
|
let thumbnailData = Signal<Data?, NoError> { subscriber in
|
||||||
let fetchedDisposable = fetchedThumbnail.start()
|
let fetchedDisposable = fetchedThumbnail.start()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user