Skip to content

Commit

Permalink
Merge pull request #1163 from nithya2511/fix-add-using-url
Browse files Browse the repository at this point in the history
Fix download from URL for Google Drive and Dropbox
  • Loading branch information
GianniCarlo authored Aug 3, 2024
2 parents a92cc84 + 825846d commit 5ddb3a7
Showing 1 changed file with 51 additions and 4 deletions.
55 changes: 51 additions & 4 deletions BookPlayer/Library/ItemList Screen/ItemListViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -925,11 +925,13 @@ class ItemListViewModel: ViewModelProtocol {
BPActionItem(
title: "download_title".localized,
inputHandler: { [weak self] url in
if let bookUrl = URL(string: url) {
self?.handleDownload(bookUrl)
} else {
do {
if let bookUrl = try self?.getDownloadURL(for: url) {
self?.handleDownload(bookUrl)
}
} catch {
self?.sendEvent(.showAlert(
content: BPAlertContent.errorAlert(message: String.localizedStringWithFormat("invalid_url_title".localized, url))
content: BPAlertContent.errorAlert(message: error.localizedDescription)
))
}
}
Expand Down Expand Up @@ -1311,6 +1313,51 @@ extension ItemListViewModel {
)
))
}

func getDownloadURL(for givenString : String) throws -> URL {
guard
let givenUrl = URL(string: givenString),
let hostname = givenUrl.host
else {
throw String.localizedStringWithFormat("invalid_url_title".localized, givenString)
}
switch hostname {
case "drive.google.com" :
return getGoogleDriveURL(for: givenUrl)
case "dropbox.com", "www.dropbox.com":
return try getDropboxURL(for: givenUrl)
default:
return givenUrl
}
}

func getGoogleDriveURL(for url: URL) -> URL {
let pathComponents = url.pathComponents
guard
let index = pathComponents.firstIndex(of: "d"),
index + 1 < pathComponents.count ,
let newUrl = URL(string: "https://drive.google.com/uc?export=download&id=" + pathComponents[index + 1])
else {
return url
}
return newUrl;
}

func getDropboxURL (for url : URL) throws -> URL {
guard
var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false)
else {
throw String.localizedStringWithFormat("invalid_url_title".localized, url.absoluteString)
}
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 ?? url
}
}

extension ItemListViewModel: AlertPresenter {
Expand Down

0 comments on commit 5ddb3a7

Please sign in to comment.