From 0ff5e700b76068dcc0f6596417dfe24f259614be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=84=8F=E5=B8=86?= <1657098617@qq.com> Date: Fri, 8 Jul 2022 02:31:29 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E6=9F=90?= =?UTF-8?q?=E4=BA=9B=20epub=20=E6=96=87=E4=BB=B6=E7=94=B1=E4=BA=8E=20opf?= =?UTF-8?q?=20=E6=A0=BC=E5=BC=8F=E4=B8=8D=E8=A7=84=E8=8C=83=E8=80=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=AD=A3=E6=96=87=E5=9B=BE=E7=89=87=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epublib/epub/PackageDocumentReader.java | 61 +++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentReader.java b/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentReader.java index 06a44ba9b..d6982e189 100644 --- a/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentReader.java +++ b/epublib/src/main/java/me/ag2s/epublib/epub/PackageDocumentReader.java @@ -72,6 +72,60 @@ public class PackageDocumentReader extends PackageDocumentBase { } } + /** + * + * 修复一些非标准epub格式由于 opf 文件内容不全而读取不到图片的问题 + * @author qianfanguojin + * @return ,修复图片路径后的一个Element列表 + */ + private static ArrayList ensureImageInfo(Resources resources, + Element manifestElement){ + ArrayList fixedElements = new ArrayList<>(); + //加入当前所有的 item 标签 + NodeList originItemElements = manifestElement + .getElementsByTagNameNS(NAMESPACE_OPF, OPFTags.item); + for (int i = 0; i < originItemElements.getLength(); i++) { + fixedElements.add((Element) originItemElements.item(i)); + } + + //如果有图片资源未定义在 originItemElements ,则加入该图片信息得到 fixedElements 中 + for (Resource resource : resources.getAll()) { + MediaType currentMediaType = resource.getMediaType(); + if ( currentMediaType == MediaTypes.JPG || currentMediaType == MediaTypes.PNG){ + String imageHref = resource.getHref(); + //确保该图片信息 resource 在原 originItemElements 列表中没有出现过 + boolean flag = false; + int i; + for (i = 0; i < originItemElements.getLength(); i++){ + Element itemElement = (Element) originItemElements.item(i); + String href = DOMUtil + .getAttribute(itemElement, NAMESPACE_OPF, OPFAttributes.href); + try { + href = URLDecoder.decode(href, Constants.CHARACTER_ENCODING); + } catch (UnsupportedEncodingException e) { + Log.e(TAG, e.getMessage()); + } + if (href.equals(imageHref)){ + break; + } + } + if (i == originItemElements.getLength()){ + flag = true; + } + if (flag){ + //由于暂时无法实例化一个Element,则选择克隆一个已存在的节点来修改以达到新增 Element 的效果,作为临时解决方案 + Element tempElement = (Element) manifestElement.getElementsByTagNameNS(NAMESPACE_OPF,OPFTags.item).item(0).cloneNode(true); + tempElement.setAttribute("id",imageHref.replace("/","")); + tempElement.setAttribute("href",imageHref); + tempElement.setAttribute("media-type", currentMediaType.getName()); + fixedElements.add(tempElement); + } + } + + + } + return fixedElements; + } /** * Reads the manifest containing the resource ids, hrefs and mediatypes. * @@ -96,10 +150,9 @@ public class PackageDocumentReader extends PackageDocumentBase { "Package document does not contain element " + OPFTags.manifest); return result; } - NodeList itemElements = manifestElement - .getElementsByTagNameNS(NAMESPACE_OPF, OPFTags.item); - for (int i = 0; i < itemElements.getLength(); i++) { - Element itemElement = (Element) itemElements.item(i); + List ensuredElements = ensureImageInfo(resources,manifestElement); + for (Element itemElement : ensuredElements) { +// Element itemElement = ; String id = DOMUtil .getAttribute(itemElement, NAMESPACE_OPF, OPFAttributes.id); String href = DOMUtil From 7611d9a7982245be2be38c473c20366fd6e7d2bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=84=8F=E5=B8=86?= <1657098617@qq.com> Date: Fri, 8 Jul 2022 15:05:12 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4Epub=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=AD=A3=E6=96=87=E8=AF=BB=E5=8F=96=E7=9A=84=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E4=B8=8D=E5=BF=85=E8=A6=81=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/model/localBook/EpubFile.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt index 34baad150..c855699cb 100644 --- a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt @@ -155,6 +155,8 @@ class EpubFile(var book: Book) { elements.add(getBody(res, startFragmentId, endFragmentId)) } } + //title标签中的内容不需要显示在正文中,去除 + elements.select("title").remove() var html = elements.outerHtml() val tag = Book.rubyTag if (book.getDelTag(tag)) { From effc48f4e8821a9de326639309e988603b296bab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=84=8F=E5=B8=86?= <1657098617@qq.com> Date: Fri, 8 Jul 2022 18:40:15 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=87=AA=E5=BB=BA?= =?UTF-8?q?WebDav=E6=9C=8D=E5=8A=A1=E4=BD=BF=E7=94=A8WebDav=E4=B9=A6?= =?UTF-8?q?=E7=B1=8D=E7=9A=84=E4=B8=80=E4=BA=9BBUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 增加 resourceType 加强判断是否是文件夹,有些自建服务 文件夹 contentType 属性为空 2. 修复自建服务对文件夹存在性判断的问题 --- app/src/main/java/io/legado/app/lib/webdav/WebDav.kt | 11 +++++++++-- .../main/java/io/legado/app/lib/webdav/WebDavFile.kt | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index 207a707c4..ced66ae09 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -137,6 +137,9 @@ open class WebDav(val path: String, val authorization: Authorization) { val contentType = element .getElementsByTag("d:getcontenttype") .firstOrNull()?.text().orEmpty() + val resourceType = element + .getElementsByTag("d:resourcetype") + .firstOrNull()?.html()?.trim().orEmpty() val size = kotlin.runCatching { element.getElementsByTag("d:getcontentlength") .firstOrNull()?.text()?.toLong() ?: 0 @@ -155,6 +158,7 @@ open class WebDav(val path: String, val authorization: Authorization) { urlName = urlName, size = size, contentType = contentType, + resourceType = resourceType, lastModify = lastModify ) list.add(webDavFile) @@ -171,11 +175,14 @@ open class WebDav(val path: String, val authorization: Authorization) { * 文件是否存在 */ suspend fun exists(): Boolean { + val url = httpUrl ?: return false + //当使用自建的WebDav服务时,在末尾有否 ”/“ 会影响请求的成功与否 + //使用坚果云的WebDav则不会,这里做一个简单的替换来解决这个问题 + val testUrl = url.removeSuffix("/") + "/" return kotlin.runCatching { return okHttpClient.newCallResponse { - url(url) + url(testUrl) addHeader(authorization.name, authorization.data) - head() }.code == 200 }.getOrDefault(false) } diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDavFile.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDavFile.kt index fea46ea0b..48120d7f0 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDavFile.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDavFile.kt @@ -11,11 +11,12 @@ class WebDavFile( val urlName: String, val size: Long, val contentType: String, + val resourceType: String, val lastModify: Long ) : WebDav(urlStr, authorization) { val isDir by lazy { - contentType == "httpd/unix-directory" + contentType == "httpd/unix-directory" || resourceType.lowercase() == "" } } \ No newline at end of file