Calibre Web 中阅读 epub 电子书时的夜间模式解决方案

作为暗色狂魔, Calibre Web 在线阅读 epub 电子书时不能使用夜间模式很让人抓狂. issue 里有一万个同样的需求, 以及有一万个实现了这个功能的 PR. 但是作者貌似并不打算开发这个功能, 因为 epub 阅读器是用的其他开源项目; 而那些 PR 说实话写的都不太好 (可能这也是作者不 merge 的理由之一吧) (甚至还看到一个 PR 代码注释里写 “Do this smarter” 的笑死我了). 那就自己动手, 丰衣足食!

考虑到软件更新迭代的问题, 我并不打算像很多 PR 那样, 直接对静态文件内容进行修改, 否则可能造成代码的冲突. 于是我把这个做成了一个类似 “补丁” 的形式, 只需要往里添加文件, 然后在合适的地方引用 js 即可.

这里是我实现的仓库地址

暗色
暗色
亮色
亮色

下载文件, 找到 calibre-web 的目录, 一般在 python 的 lib/python3.x/site-packages 下面, 把 cssjs 文件夹丢到 /cps/static 下面.

然后编辑 cps/templates/read.html 以引用 js, 可以在 body 结尾处加一行代码, 如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<!DOCTYPE html>
<html class="no-js">

      ...

      <script src="{{ url_for('static', filename='js/reading/epub.js') }}"></script>
      <!-- 这里是添加的代码 -->
      <script src="{{ url_for('static', filename='js/reading/epub_theme.js') }}"></script>
      <!-- 上面是添加的代码 -->
    </body>
</html>
  • 如果 epub 文件本身就有颜色, 那暗色模式可能不尽如人意.
  • 切换主题或者切换章节, 甚至改变阅读器大小时, 阅读器会重新加载, 但同时 css 也会重新加载, 就挺离谱的… 这应该是 epub.js 的实现问题. 不过影响不算太大, 就是在切换的时候可能有些许延迟.