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

警告
本文最后更新于 2022-01-14,文中内容可能已过时。

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

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

这里是我实现的仓库地址

img/dark.png
暗色
/read-epub-on-calibre-web-in-dark-mode/img/light.png
亮色

下载文件, 找到 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 的实现问题. 不过影响不算太大, 就是在切换的时候可能有些许延迟.