mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
139 lines
5.0 KiB
Swift
139 lines
5.0 KiB
Swift
import Foundation
|
|
import TelegramCore
|
|
import SwiftSignalKit
|
|
import Postbox
|
|
|
|
import LegacyComponents
|
|
|
|
func resourceFromLegacyImageUrl(_ fileRef: String) -> TelegramMediaResource? {
|
|
if fileRef.isEmpty {
|
|
return nil
|
|
}
|
|
let components = fileRef.components(separatedBy: "_")
|
|
if components.count != 4 {
|
|
return nil
|
|
}
|
|
|
|
guard let datacenterId = Int32(components[0]) else {
|
|
return nil
|
|
}
|
|
guard let volumeId = Int64(components[1]) else {
|
|
return nil
|
|
}
|
|
guard let localId = Int32(components[2]) else {
|
|
return nil
|
|
}
|
|
guard let secret = Int64(components[3]) else {
|
|
return nil
|
|
}
|
|
|
|
return CloudFileMediaResource(datacenterId: Int(datacenterId), volumeId: volumeId, localId: localId, secret: secret, size: nil, fileReference: nil)
|
|
}
|
|
|
|
func pathFromLegacyImageUrl(basePath: String, url: String) -> String {
|
|
let cache = TGCache(cachesPath: basePath + "/Caches")!
|
|
return cache.path(forCachedData: url)
|
|
}
|
|
|
|
func pathFromLegacyVideoUrl(basePath: String, url: String) -> (id: Int64, accessHash: Int64, datacenterId: Int32, path: String)? {
|
|
if !url.hasPrefix("video:") {
|
|
return nil
|
|
}
|
|
//[videoInfo addVideoWithQuality:1 url:[[NSString alloc] initWithFormat:@"video:%lld:%lld:%d:%d", videoMedia.videoId, videoMedia.accessHash, concreteResult.document.datacenterId, concreteResult.document.size] size:concreteResult.document.size];
|
|
let components = url.components(separatedBy: ":")
|
|
if components.count != 5 {
|
|
return nil
|
|
}
|
|
guard let videoId = Int64(components[1]) else {
|
|
return nil
|
|
}
|
|
guard let accessHash = Int64(components[2]) else {
|
|
return nil
|
|
}
|
|
guard let datacenterId = Int32(components[3]) else {
|
|
return nil
|
|
}
|
|
let documentsPath = basePath + "/Documents"
|
|
let videoPath = documentsPath + "/video/remote\(String(videoId, radix: 16)).mov"
|
|
return (videoId, accessHash, datacenterId, videoPath)
|
|
}
|
|
|
|
func pathFromLegacyLocalVideoUrl(basePath: String, url: String) -> String? {
|
|
let documentsPath = basePath + "/Documents"
|
|
if !url.hasPrefix("local-video:") {
|
|
return nil
|
|
}
|
|
let videoPath = documentsPath + "/video/" + String(url[url.index(url.startIndex, offsetBy: "local-video:".count)...])
|
|
return videoPath
|
|
}
|
|
|
|
func pathFromLegacyFile(basePath: String, fileId: Int64, isLocal: Bool, fileName: String) -> String {
|
|
let documentsPath = basePath + "/Documents"
|
|
let filePath = documentsPath + "/files/" + (isLocal ? "local" : "") + "\(String(fileId, radix: 16))/\(fileName)"
|
|
return filePath
|
|
}
|
|
|
|
enum EncryptedFileType {
|
|
case image
|
|
case video
|
|
case document(fileName: String)
|
|
case audio
|
|
}
|
|
|
|
func pathAndResourceFromEncryptedFileUrl(basePath: String, url: String, type: EncryptedFileType) -> (String, TelegramMediaResource)? {
|
|
let cache = TGCache(cachesPath: basePath + "/Caches")!
|
|
|
|
if url.hasPrefix("encryptedThumbnail:") {
|
|
let path = cache.path(forCachedData: url)!
|
|
return (path, LocalFileMediaResource(fileId: arc4random64()))
|
|
}
|
|
|
|
if !url.hasPrefix("mt-encrypted-file://?") {
|
|
return nil
|
|
}
|
|
guard let dict = TGStringUtils.argumentDictionary(inUrlString: String(url[url.index(url.startIndex, offsetBy: "mt-encrypted-file://?".count)...])) else {
|
|
return nil
|
|
}
|
|
guard let idString = dict["id"] as? String, let id = Int64(idString) else {
|
|
return nil
|
|
}
|
|
guard let datacenterIdString = dict["dc"] as? String, let datacenterId = Int32(datacenterIdString) else {
|
|
return nil
|
|
}
|
|
guard let accessHashString = dict["accessHash"] as? String, let accessHash = Int64(accessHashString) else {
|
|
return nil
|
|
}
|
|
guard let sizeString = dict["size"] as? String, let size = Int32(sizeString) else {
|
|
return nil
|
|
}
|
|
guard let decryptedSizeString = dict["decryptedSize"] as? String, let decryptedSize = Int32(decryptedSizeString) else {
|
|
return nil
|
|
}
|
|
guard let keyFingerprintString = dict["fingerprint"] as? String, let _ = Int32(keyFingerprintString) else {
|
|
return nil
|
|
}
|
|
guard let keyString = dict["key"] as? String else {
|
|
return nil
|
|
}
|
|
let keyData = dataWithHexString(keyString)
|
|
guard keyData.count == 64 else {
|
|
return nil
|
|
}
|
|
|
|
let resource = SecretFileMediaResource(fileId: id, accessHash: accessHash, containerSize: size, decryptedSize: decryptedSize, datacenterId: Int(datacenterId), key: SecretFileEncryptionKey(aesKey: keyData.subdata(in: 0 ..< 32), aesIv: keyData.subdata(in: 32 ..< 64)))
|
|
|
|
let filePath: String
|
|
switch type {
|
|
case .video:
|
|
filePath = basePath + "Documents/video/remote\(String(id, radix: 16)).mov"
|
|
case .image:
|
|
filePath = cache.path(forCachedData: url)
|
|
case let .document(fileName):
|
|
filePath = basePath + "Documents/files/\(String(id, radix: 16))/\(TGDocumentMediaAttachment.safeFileName(forFileName: fileName)!)"
|
|
case .audio:
|
|
filePath = basePath + "Documents/audio/\(String(id, radix: 16))"
|
|
}
|
|
|
|
return (filePath, resource)
|
|
}
|