import Foundation import AnimatedStickerNode import SwiftSignalKit import Postbox import TelegramCore import MediaResources import StickerResources import LocalMediaResources import AppBundle public final class AnimatedStickerNodeLocalFileSource: AnimatedStickerNodeSource { public var fitzModifier: EmojiFitzModifier? = nil public let name: String public init(name: String) { self.name = name } public func directDataPath() -> Signal { if let path = self.path { return .single(path) } else { return .never() } } public func cachedDataPath(width: Int, height: Int) -> Signal<(String, Bool), NoError> { return .never() } public var path: String? { if let path = getAppBundle().path(forResource: self.name, ofType: "tgs") { return path } else if let path = getAppBundle().path(forResource: self.name, ofType: "json") { return path } else { return nil } } } public final class AnimatedStickerResourceSource: AnimatedStickerNodeSource { public let account: Account public let resource: MediaResource public let fitzModifier: EmojiFitzModifier? public init(account: Account, resource: MediaResource, fitzModifier: EmojiFitzModifier? = nil) { self.account = account self.resource = resource self.fitzModifier = fitzModifier } public func cachedDataPath(width: Int, height: Int) -> Signal<(String, Bool), NoError> { return chatMessageAnimationData(mediaBox: self.account.postbox.mediaBox, resource: self.resource, fitzModifier: self.fitzModifier, width: width, height: height, synchronousLoad: false) |> filter { data in return data.size != 0 } |> map { data -> (String, Bool) in return (data.path, data.complete) } } public func directDataPath() -> Signal { return self.account.postbox.mediaBox.resourceData(self.resource) |> filter { data in return data.complete } |> map { data -> String in return data.path } } }