|
|
@ -531,11 +531,9 @@ public class OWSLinkPreview: MTLModel {
|
|
|
|
private static var linkPreviewDraftCache: NSCache<NSString, OWSLinkPreviewDraft> = NSCache()
|
|
|
|
private static var linkPreviewDraftCache: NSCache<NSString, OWSLinkPreviewDraft> = NSCache()
|
|
|
|
|
|
|
|
|
|
|
|
private class func cachedLinkPreview(forPreviewUrl previewUrl: String) -> OWSLinkPreviewDraft? {
|
|
|
|
private class func cachedLinkPreview(forPreviewUrl previewUrl: String) -> OWSLinkPreviewDraft? {
|
|
|
|
var result: OWSLinkPreviewDraft?
|
|
|
|
return serialQueue.sync {
|
|
|
|
serialQueue.sync {
|
|
|
|
return linkPreviewDraftCache.object(forKey: previewUrl as NSString)
|
|
|
|
result = linkPreviewDraftCache.object(forKey: previewUrl as NSString)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private class func setCachedLinkPreview(_ linkPreviewDraft: OWSLinkPreviewDraft,
|
|
|
|
private class func setCachedLinkPreview(_ linkPreviewDraft: OWSLinkPreviewDraft,
|
|
|
@ -561,7 +559,6 @@ public class OWSLinkPreview: MTLModel {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public class func tryToBuildPreviewInfo(previewUrl: String?) -> Promise<OWSLinkPreviewDraft> {
|
|
|
|
public class func tryToBuildPreviewInfo(previewUrl: String?) -> Promise<OWSLinkPreviewDraft> {
|
|
|
|
|
|
|
|
|
|
|
|
guard OWSLinkPreview.featureEnabled else {
|
|
|
|
guard OWSLinkPreview.featureEnabled else {
|
|
|
|
return Promise(error: LinkPreviewError.featureDisabled)
|
|
|
|
return Promise(error: LinkPreviewError.featureDisabled)
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -578,14 +575,13 @@ public class OWSLinkPreview: MTLModel {
|
|
|
|
return downloadLink(url: previewUrl)
|
|
|
|
return downloadLink(url: previewUrl)
|
|
|
|
.then(on: DispatchQueue.global()) { (data) -> Promise<OWSLinkPreviewDraft> in
|
|
|
|
.then(on: DispatchQueue.global()) { (data) -> Promise<OWSLinkPreviewDraft> in
|
|
|
|
return parseLinkDataAndBuildDraft(linkData: data, linkUrlString: previewUrl)
|
|
|
|
return parseLinkDataAndBuildDraft(linkData: data, linkUrlString: previewUrl)
|
|
|
|
.then(on: DispatchQueue.global()) { (linkPreviewDraft) -> Promise<OWSLinkPreviewDraft> in
|
|
|
|
}.then(on: DispatchQueue.global()) { (linkPreviewDraft) -> Promise<OWSLinkPreviewDraft> in
|
|
|
|
guard linkPreviewDraft.isValid() else {
|
|
|
|
guard linkPreviewDraft.isValid() else {
|
|
|
|
return Promise(error: LinkPreviewError.noPreview)
|
|
|
|
throw LinkPreviewError.noPreview
|
|
|
|
}
|
|
|
|
|
|
|
|
setCachedLinkPreview(linkPreviewDraft, forPreviewUrl: previewUrl)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Promise.value(linkPreviewDraft)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
setCachedLinkPreview(linkPreviewDraft, forPreviewUrl: previewUrl)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Promise.value(linkPreviewDraft)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -761,18 +757,18 @@ public class OWSLinkPreview: MTLModel {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return downloadImage(url: imageUrl, imageMimeType: imageMimeType)
|
|
|
|
return downloadImage(url: imageUrl, imageMimeType: imageMimeType)
|
|
|
|
.then(on: DispatchQueue.global()) { (imageData: Data) -> Promise<OWSLinkPreviewDraft> in
|
|
|
|
.map(on: DispatchQueue.global()) { (imageData: Data) -> OWSLinkPreviewDraft in
|
|
|
|
// We always recompress images to Jpeg.
|
|
|
|
// We always recompress images to Jpeg.
|
|
|
|
let imageFilePath = OWSFileSystem.temporaryFilePath(withFileExtension: "jpg")
|
|
|
|
let imageFilePath = OWSFileSystem.temporaryFilePath(withFileExtension: "jpg")
|
|
|
|
do {
|
|
|
|
do {
|
|
|
|
try imageData.write(to: NSURL.fileURL(withPath: imageFilePath), options: .atomicWrite)
|
|
|
|
try imageData.write(to: NSURL.fileURL(withPath: imageFilePath), options: .atomicWrite)
|
|
|
|
} catch let error as NSError {
|
|
|
|
} catch let error as NSError {
|
|
|
|
owsFailDebug("file write failed: \(imageFilePath), \(error)")
|
|
|
|
owsFailDebug("file write failed: \(imageFilePath), \(error)")
|
|
|
|
return Promise(error: LinkPreviewError.assertionFailure)
|
|
|
|
throw LinkPreviewError.assertionFailure
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let linkPreviewDraft = OWSLinkPreviewDraft(urlString: linkUrlString, title: title, imageFilePath: imageFilePath)
|
|
|
|
let linkPreviewDraft = OWSLinkPreviewDraft(urlString: linkUrlString, title: title, imageFilePath: imageFilePath)
|
|
|
|
return Promise.value(linkPreviewDraft)
|
|
|
|
return linkPreviewDraft
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.recover(on: DispatchQueue.global()) { (_) -> Promise<OWSLinkPreviewDraft> in
|
|
|
|
.recover(on: DispatchQueue.global()) { (_) -> Promise<OWSLinkPreviewDraft> in
|
|
|
|
return Promise.value(OWSLinkPreviewDraft(urlString: linkUrlString, title: title))
|
|
|
|
return Promise.value(OWSLinkPreviewDraft(urlString: linkUrlString, title: title))
|
|
|
|