From 5821625aa52f5b7abcbf9fe79fe576c51c1d1e67 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Wed, 15 Mar 2023 21:40:49 +0800 Subject: [PATCH 1/6] =?UTF-8?q?UrlUtil.getFileName=E5=85=88=E5=B0=9D?= =?UTF-8?q?=E8=AF=95=E6=88=AA=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/utils/UrlUtil.kt | 47 ++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/UrlUtil.kt b/app/src/main/java/io/legado/app/utils/UrlUtil.kt index ce8b4f0b7..a48f813d8 100644 --- a/app/src/main/java/io/legado/app/utils/UrlUtil.kt +++ b/app/src/main/java/io/legado/app/utils/UrlUtil.kt @@ -1,5 +1,7 @@ package io.legado.app.utils +import io.legado.app.model.analyzeRule.AnalyzeUrl +import io.legado.app.constant.AppLog import java.net.HttpURLConnection import java.net.URL import java.net.URLDecoder @@ -29,19 +31,33 @@ object UrlUtil { .replace("|", "%7C") } + + /* 阅读定义的url,{urlOption} */ + fun getFileName(analyzeUrl: AnalyzeUrl): String? { + return getFileName(analyzeUrl.url, analyzeUrl.headerMap) + } + /** - * 根据网络url获取文件名 + * 根据网络url获取文件信息 文件名 */ - fun getFileName(fileUrl: String): String? { + fun getFileName(fileUrl: String, headerMap: ? = null): String? { + // 如果获取到后缀可直接截取链接 + if (getSuffix(fileUrl, "") != "") return fileUrl.substringAfterLast("/") return kotlin.runCatching { var fileName: String val url = URL(fileUrl) val conn: HttpURLConnection = url.openConnection() as HttpURLConnection - // head方式 + // HEAD方式获取返回头信息 conn.requestMethod = "HEAD" + // 下载链接可能还需要书源header才能成功访问 + headerMap?.forEach { key, value -> + conn.setRequestProperty(key, value) + } conn.connect() - // 方法一 + // val contentLength = conn.getContentLengthLong() + // Content-Disposition + // 解析文件名 filename= filename*= val raw: String? = conn.getHeaderField("Content-Disposition") if (raw != null && raw.indexOf("=") > 0) { fileName = raw.split("=".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[1] @@ -50,16 +66,33 @@ object UrlUtil { fileName.toByteArray(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8 //? ) - } else { - // 方法二 截取 + } else if (conn.getHeaderField("Location") != null) { + // Location跳转到实际的下载链接 var newUrl: String = conn.url.path ?: return null newUrl = URLDecoder.decode(newUrl, "UTF-8") - fileName = newUrl.substringAfterLast("/") + if (getSuffix(newUrl, "") != "") { + fileName = newUrl.substringAfterLast("/") + } + } else { + // 其余情况 返回响应头 + val headers = conn.getHeaderFields() + val headersString = buildString { + headers.forEach( key, value -> + value.forEach { + append(key) + append(": ") + append(it) + append("\n") + } + ) + } + AppLog.putDebug("Cannot obtain URL file name:\n$headersString") } fileName }.getOrNull() } + /* 获取合法的文件后缀 */ fun getSuffix(url: String, default: String): String { val suffix = url.substringAfterLast(".").substringBeforeLast(",") //检查截取的后缀字符是否合法 [a-zA-Z0-9] From 193c0bcc9cf090f3fb060c7d4b1a277ff82237d2 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Wed, 15 Mar 2023 21:42:42 +0800 Subject: [PATCH 2/6] =?UTF-8?q?UrlUtil.getFileName=E5=85=88=E5=B0=9D?= =?UTF-8?q?=E8=AF=95=E6=88=AA=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/utils/UrlUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/utils/UrlUtil.kt b/app/src/main/java/io/legado/app/utils/UrlUtil.kt index a48f813d8..67bcba26e 100644 --- a/app/src/main/java/io/legado/app/utils/UrlUtil.kt +++ b/app/src/main/java/io/legado/app/utils/UrlUtil.kt @@ -40,7 +40,7 @@ object UrlUtil { /** * 根据网络url获取文件信息 文件名 */ - fun getFileName(fileUrl: String, headerMap: ? = null): String? { + fun getFileName(fileUrl: String, headerMap: Map? = null): String? { // 如果获取到后缀可直接截取链接 if (getSuffix(fileUrl, "") != "") return fileUrl.substringAfterLast("/") return kotlin.runCatching { From f1bf49982f24b0ee36baf642ed2d6c1672e5e7bd Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Wed, 15 Mar 2023 21:51:17 +0800 Subject: [PATCH 3/6] =?UTF-8?q?UrlUtil.getFileName=E5=85=88=E5=B0=9D?= =?UTF-8?q?=E8=AF=95=E6=88=AA=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/utils/UrlUtil.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/UrlUtil.kt b/app/src/main/java/io/legado/app/utils/UrlUtil.kt index 67bcba26e..30a676f3b 100644 --- a/app/src/main/java/io/legado/app/utils/UrlUtil.kt +++ b/app/src/main/java/io/legado/app/utils/UrlUtil.kt @@ -77,14 +77,14 @@ object UrlUtil { // 其余情况 返回响应头 val headers = conn.getHeaderFields() val headersString = buildString { - headers.forEach( key, value -> + headers.forEach { key, value -> value.forEach { append(key) append(": ") append(it) append("\n") } - ) + } } AppLog.putDebug("Cannot obtain URL file name:\n$headersString") } @@ -93,12 +93,12 @@ object UrlUtil { } /* 获取合法的文件后缀 */ - fun getSuffix(url: String, default: String): String { + fun getSuffix(url: String, default: String? = null): String { val suffix = url.substringAfterLast(".").substringBeforeLast(",") //检查截取的后缀字符是否合法 [a-zA-Z0-9] val fileSuffixRegex = Regex("^[a-z\\d]+$", RegexOption.IGNORE_CASE) return if (suffix.length > 5 || !suffix.matches(fileSuffixRegex)) { - default + default ?: throw IllegalArgumentException("Cannot find illegal suffix") } else { suffix } From 3b951915f3affe65ee7159dc8fa9cb34570fd64d Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Wed, 15 Mar 2023 22:00:13 +0800 Subject: [PATCH 4/6] =?UTF-8?q?UrlUtil.getFileName=E5=85=88=E5=B0=9D?= =?UTF-8?q?=E8=AF=95=E6=88=AA=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt | 2 +- app/src/main/java/io/legado/app/utils/UrlUtil.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index 1975b8a7f..c692458ce 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -450,7 +450,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { } // 后缀 - val suffix: String = name.substringAfterLast(".") + val suffix: String = UrlUtil.getSuffix(name) // txt epub umd pdf等文件 val isSupported: Boolean = AppPattern.bookFileRegex.matches(name) diff --git a/app/src/main/java/io/legado/app/utils/UrlUtil.kt b/app/src/main/java/io/legado/app/utils/UrlUtil.kt index 30a676f3b..0b096e055 100644 --- a/app/src/main/java/io/legado/app/utils/UrlUtil.kt +++ b/app/src/main/java/io/legado/app/utils/UrlUtil.kt @@ -44,7 +44,7 @@ object UrlUtil { // 如果获取到后缀可直接截取链接 if (getSuffix(fileUrl, "") != "") return fileUrl.substringAfterLast("/") return kotlin.runCatching { - var fileName: String + var fileName: String = "" val url = URL(fileUrl) val conn: HttpURLConnection = url.openConnection() as HttpURLConnection // HEAD方式获取返回头信息 From 61ff31d44155cf653f936b10673d7a46d8b33a8b Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Wed, 15 Mar 2023 22:08:07 +0800 Subject: [PATCH 5/6] =?UTF-8?q?[skip=20ci]=20=E8=AF=A6=E7=BB=86dd=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/utils/UrlUtil.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/UrlUtil.kt b/app/src/main/java/io/legado/app/utils/UrlUtil.kt index 0b096e055..15c01d034 100644 --- a/app/src/main/java/io/legado/app/utils/UrlUtil.kt +++ b/app/src/main/java/io/legado/app/utils/UrlUtil.kt @@ -93,12 +93,12 @@ object UrlUtil { } /* 获取合法的文件后缀 */ - fun getSuffix(url: String, default: String? = null): String { - val suffix = url.substringAfterLast(".").substringBeforeLast(",") + fun getSuffix(str: String, default: String? = null): String { + val suffix = str.substringAfterLast(".").substringBeforeLast(",") //检查截取的后缀字符是否合法 [a-zA-Z0-9] val fileSuffixRegex = Regex("^[a-z\\d]+$", RegexOption.IGNORE_CASE) return if (suffix.length > 5 || !suffix.matches(fileSuffixRegex)) { - default ?: throw IllegalArgumentException("Cannot find illegal suffix") + default ?: throw IllegalArgumentException("Cannot find illegal suffix:\n target: $str\nsuffix: $suffix") } else { suffix } From 6a3e6e72b4304ef9d4391b8a2afacb140a285eff Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Wed, 15 Mar 2023 22:17:37 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=B1=BB=E4=B9=A6?= =?UTF-8?q?=E6=BA=90=E4=B8=8B=E8=BD=BDurls=E6=94=AF=E6=8C=81=E4=BC=A0?= =?UTF-8?q?=E5=85=A5UrlOptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index c692458ce..4e5da60dd 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -21,6 +21,7 @@ import io.legado.app.help.AppWebDav import io.legado.app.help.book.* import io.legado.app.help.coroutine.Coroutine import io.legado.app.lib.webdav.ObjectNotFoundException +import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.BookCover import io.legado.app.model.ReadBook import io.legado.app.model.localBook.LocalBook @@ -241,7 +242,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { webFiles.clear() val fileName = "${book.name} 作者:${book.author}" book.downloadUrls!!.map { - val mFileName = UrlUtil.getFileName(it) ?: fileName + val mFileName = UrlUtil.getFileName(AnalyzeUrl(it, source = bookSource)) ?: fileName WebFile(it, mFileName) } }.onError {