diff --git a/BookPlayer/Library/ItemList Screen/ItemListViewModel.swift b/BookPlayer/Library/ItemList Screen/ItemListViewModel.swift index c83e1746..7cd373fc 100644 --- a/BookPlayer/Library/ItemList Screen/ItemListViewModel.swift +++ b/BookPlayer/Library/ItemList Screen/ItemListViewModel.swift @@ -925,7 +925,7 @@ class ItemListViewModel: ViewModelProtocol { BPActionItem( title: "download_title".localized, inputHandler: { [weak self] url in - if let bookUrl = URL(string: url) { + if let bookUrl = self?.getDownloadURL(for: url) { self?.handleDownload(bookUrl) } else { self?.sendEvent(.showAlert( @@ -1311,6 +1311,43 @@ extension ItemListViewModel { ) )) } + + func getDownloadURL(for givenString : String) -> URL? { + let givenUrl = URL(string: givenString) + + if let givenUrl, let hostname = givenUrl.host { + if hostname == "drive.google.com" { + return getGoogleDriveURL(for: givenUrl) + } else if hostname == "www.dropbox.com" { + return getDropboxURL(for: givenUrl) + } + } + return nil + } + + func getGoogleDriveURL(for url: URL) -> URL? + { + let pathComponents = url.pathComponents + if let index = pathComponents.firstIndex(of: "d"), index + 1 < pathComponents.count { + return URL(string: "https://drive.google.com/uc?export=download&id=" + pathComponents[index + 1]) + } + return nil; + } + + func getDropboxURL (for url : URL) -> URL? + { + guard var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false) else { + return nil + } + var queryItems = urlComponents.queryItems ?? [] + if let index = queryItems.firstIndex(where: {$0.name == "dl"}) { + queryItems[index].value = "1" + } else { + queryItems.append(URLQueryItem(name: "dl", value: "1")) + } + urlComponents.queryItems = queryItems + return urlComponents.url + } } extension ItemListViewModel: AlertPresenter {