为AList V3添加在线epub预览支持教程

发布于 2022-12-16  614 次阅读


AList V3是一个支持多种存储的文件列表程序,使用 Gin 和 Solidjs开发。

AList的默认预览功能中,并不支持epub格式电子书的在线预览,经过我的摸索,成功基于epub.js项目,为AList添加了epub的预览支持,效果如下所示:

image.png

下面,我就介绍一下如何进行搭建。

说明

类似于pdf.js,一些不支持CORS的相关云盘无法预览,比如阿里云盘。

此外,如果未使用https,也可能会出问题,请提前为域名部署证书。

文件加载速度与网速密切相关,如果是200M以上的全本小说可能需要数分钟的时间,请耐心等待。

动图演示

效果.gif

工具准备

首先我们需要准备以下文件,js和css可以通过CDN链接的方式引入html文件或者下载到需要部署的本地服务器目录内。

部署

修改Nginx设置

在自己的AList网站根目录下,新建一个epub目录,将刚才下载的文件复制进来并修改用户和用户组为www:www

在部署Alist时,根据官方指南,我们设置了如下的反向代理,这会使得我们新添加的epub目录也被转发。

location / {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Range $http_range;
  proxy_set_header If-Range $http_if_range;
  proxy_redirect off;
  proxy_pass http://127.0.0.1:5244;
  # the max size of file to upload
  client_max_body_size 20000m;
}

因此,我们需要添加如下一行来进行排除。

location /epub/ {}

修改spreads.html文件

如果将js文件和css文件都下载在了本地服务器,请修改对应部分的引入代码为本地相对路径,例如放在同一目录下时:

  <script src="./jszip.min.js"></script>
  <script src="./epub.min.js"></script>
  <link rel="stylesheet" type="text/css" href="examples.css">

AList V3在返回预览链接时,返回的是直链地址,epub.js在解析时会尝试请求/META-INF/container.xml这个文件导致报错,因此我们需要修改读取方式为ArrayBuffer。

原代码为:

var params = URLSearchParams && new URLSearchParams(document.location.search.substring(1));
var url = params && params.get("url") && decodeURIComponent(params.get("url"));
var currentSectionIndex = (params && params.get("loc")) ? params.get("loc") : undefined;
var book = ePub(url || "https://s3.amazonaws.com/moby-dick/moby-dick.epub");

修改为:

var params = URLSearchParams && new URLSearchParams(document.location.search.substring(1));
var currentURL = window.location.href;
//请修改test.com为你自己的AList域名
var urlPrefix = "https://test.com/epub/spreads.html?url=";
var url = currentURL.substring(urlPrefix.length);
var currentSectionIndex = (params && params.get("loc")) ? params.get("loc") : undefined;
let blob = fetch(url).then((res) => res.blob());
var book = ePub(blob.then((blob) => blob.arrayBuffer()), {
        restore: true,
        reload: true,
        spreads: true
});

修改AList预览设置

在原预览设置的json文件内添加如下键值对,注意修改test.com为你自己的AList域名。

"epub": {
        "epub.js":"https://test.com/epub/spreads.html?url=$url"
    },

image.png

届ける言葉を今は育ててる
最后更新于 2023-05-05