diff --git a/Model/Entities/Entities.swift b/Model/Entities/Entities.swift index 4f15970b..0e99bfb9 100644 --- a/Model/Entities/Entities.swift +++ b/Model/Entities/Entities.swift @@ -166,6 +166,10 @@ struct URLContentMetaData { var isMediaType: Bool { mime.hasPrefix("video/") || mime.hasPrefix("audio/") } + + var isTextType: Bool { + mime.hasPrefix("text/") + } } struct URLContent { diff --git a/ViewModel/BrowserViewModel.swift b/ViewModel/BrowserViewModel.swift index 7dc50418..bc815350 100644 --- a/ViewModel/BrowserViewModel.swift +++ b/ViewModel/BrowserViewModel.swift @@ -68,6 +68,7 @@ final class BrowserViewModel: NSObject, ObservableObject, } } @Published var externalURL: URL? + private var metaData: URLContentMetaData? private(set) var tabID: NSManagedObjectID? { didSet { @@ -158,15 +159,27 @@ final class BrowserViewModel: NSObject, ObservableObject, } } + /// Get the webpage in a binary format + /// - Returns: PDF of the current page (if text type) or binary data of the content + func pdfData() async -> Data? { + if metaData?.isTextType == true { + return try? await webView.pdf() + } else if let url = await webView.url { + return ZimFileService.shared.getURLContent(url: url)?.data + } + return nil + } + private func didUpdate(title: String, url: URL) { let zimFile: ZimFile? = { guard let zimFileID = UUID(uuidString: url.host ?? "") else { return nil } return try? Database.viewContext.fetch(ZimFile.fetchRequest(fileID: zimFileID)).first }() + metaData = ZimFileService.shared.getContentMetaData(url: url) // update view model if title.isEmpty { - articleTitle = ZimFileService.shared.getContentMetaData(url: url)?.zimTitle ?? "" + articleTitle = metaData?.zimTitle ?? "" } else { articleTitle = title } @@ -268,7 +281,7 @@ final class BrowserViewModel: NSObject, ObservableObject, // MARK: - WKNavigationDelegate - // swiftlint:disable:next function_body_length + // swiftlint:disable:next function_body_length cyclomatic_complexity func webView( _ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, diff --git a/Views/Buttons/ShareButton.swift b/Views/Buttons/ShareButton.swift index 632e6be7..ea579238 100644 --- a/Views/Buttons/ShareButton.swift +++ b/Views/Buttons/ShareButton.swift @@ -23,7 +23,7 @@ struct ShareButton: View { guard let browserURLName = browser.webView.url?.lastPathComponent else { return nil } - guard let pdfData = try? await browser.webView.pdf() else { + guard let pdfData = await browser.pdfData() else { return nil } return (pdfData, browserURLName)