群晖部署-Calibreweb
最近家里搞了台群晖,准备部署个Calibreweb看看电子书,看了好多部署的教程老是不太成功,要么报错要么有问题的,很难搞。下面将部署流程分享一下,给大家参考,少走点弯路
镜像的选择
我们使用johngong/calibre-web,我们用这个镜像来构建应用,这个镜像已经添加了一些原始镜像没有的功能,可以更快的上手。我们直接拉取johngong/calibre-web镜像即可
配置
映射卷
我们需要映射镜像的卷
参数 | 说明 |
---|---|
本地文件夹1:/library | calibre-web与calibre-server书库默认位置 |
本地文件夹2:/config | calibre-web与calibre-server配置位置文件 |
本地文件夹3:/autoaddbooks | calibre自动添加图书文件夹位置 |
本地文件夹4:/usr/local/calibre-web/app/metadata_provider | 元数据抓取脚本位置 |
本地文件夹4:/usr/local/calibre-web/app/metadata_provider
这条配置下的本地文件夹4,需要放一个获取元数据的脚本,脚本内容如下,命名为NewDouban.py
import random import re import time import dataclasses import urllib import requests from concurrent.futures import ThreadPoolExecutor, as_completed from urllib.parse import urlparse, unquote from lxml import etree from functools import lru_cache from cps.services.Metadata import Metadata, MetaSourceInfo, MetaRecord from cps.search_metadata import meta from flask import request, Response from cps import helper # 是否自动代理封面地址 DOUBAN_PROXY_COVER = True # 如果自动计算的服务器地址不正确,可以填写自己的calibre-web地址,参考:http://nas_ip:8083/ DOUBAN_PROXY_COVER_HOST_URL = '' DOUBAN_PROXY_COVER_PATH = 'metadata/douban_cover?cover=' DOUBAN_SEARCH_URL = "https://www.douban.com/search" DOUBAN_BASE = "https://book.douban.com/" DOUBAN_COVER_DOMAIN = 'doubanio.com' DOUBAN_BOOK_CAT = "1001" DOUBAN_BOOK_CACHE_SIZE = 500 # 最大缓存数量 DOUBAN_CONCURRENCY_SIZE = 5 # 并发查询数 DOUBAN_BOOK_URL_PATTERN = re.compile(".*/subject/(\\d+)/?") DEFAULT_HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3573.0 Safari/537.36', 'Accept-Encoding': 'gzip, deflate', 'Referer': DOUBAN_BASE } PROVIDER_NAME = "New Douban Books" PROVIDER_ID = "new_douban" class NewDouban(Metadata): __name__ = PROVIDER_NAME __id__ = PROVIDER_ID def __init__(self): self.searcher = DoubanBookSearcher() self.hack_helper_cover() super().__init__() def search(self, query: str, generic_cover: str = "", locale: str = "en"): if self.active: return self.searcher.search_books(query) @staticmethod def hack_helper_cover(): """ 覆盖helper.save_cover_from_url方法实现豆瓣的封面下载 :return: """ save_cover = helper.save_cover_from_url def new_save_cover(url, book_path): if DOUBAN_COVER_DOMAIN in url: cover_url = url if DOUBAN_PROXY_COVER: component = urllib.parse.urlparse(url) query = urllib.parse.parse_qs(component.query) cover_url = urllib.parse.unquote(query.get('cover')[0]) res = requests.get(cover_url, headers=DEFAULT_HEADERS) return helper.save_cover(res, book_path) else: return save_cover(url, book_path) helper.save_cover_from_url = new_save_cover @dataclasses.dataclass class DoubanMetaRecord(MetaRecord): def __getattribute__(self, item): # cover通过本地服务代理访问 if item == 'cover' and DOUBAN_PROXY_COVER: cover_url = super().__getattribute__(item) if cover_url: try: host_url = DOUBAN_PROXY_COVER_HOST_URL if not host_url and request.host_url: host_url = request.host_url if host_url and host_url not in cover_url: self.cover = host_url + DOUBAN_PROXY_COVER_PATH + urllib.parse.quote(cover_url) except BaseException: pass return super().__getattribute__(item) class DoubanBookSearcher: def __init__(self): self.book_loader = DoubanBookLoader() self.thread_pool = ThreadPoolExecutor(max_workers=10, thread_name_prefix='douban_async') def calc_url(self, href): query = urlparse(href).query params = {item.split('=')[0]: item.split('=')[1] for item in query.split('&')} url = unquote(params['url']) if DOUBAN_BOOK_URL_PATTERN.match(url): return url def load_book_urls_new(self, query): url = DOUBAN_SEARCH_URL params = {"cat": DOUBAN_BOOK_CAT, "q": query} res = requests.get(url, params, headers=DEFAULT_HEADERS) book_urls = [] if res.status_code in [200, 201]: html = etree.HTML(res.content) alist = html.xpath('//a[@]') for link in alist: href = link.attrib['href'] parsed = self.calc_url(href) if parsed and len(book_urls)映射端口
参数 | 说明 |
---|---|
本地端口1:8083 | calibre-web web访问端口 |
本地端口2:8080 | calibre-server web访问端口 |
环境变量
环境变量默认即可 大家可以根据需要进行调整
参数 | 说明 |
---|---|
UID=1000 | uid设置,默认为1000 |
GID=1000 | gid设置,默认为1000 |
ENABLE_CALIBRE_SERVER=true | (true|false)设定开启calibre-server,默认开启 |
ENABLE_CALIBRE_SERVER_OPDS=false | (true|false)开启calibre-server的OPDS功能,默认不开启,arm可能不可用 |
CALIBRE_SERVER_USER= | calibre-server 用户名 |
CALIBRE_SERVER_PASSWORD= | calibre-server 用户密码 |
CALIBRE_SERVER_WEB_LANGUAGE=zh_CN | calibre-server web界面语言,详见calibre-server其它语言 |
CALIBRE_ASCII_FILENAME=true | (true|false)设定false时calibre支持中文目录 |
CALIBRE_WEB_LANGUAGE=zh_Hans_CN | (zh_Hans_CN|en)calibre-web初始界面语言,详见calibre-web其它语言 |
TZ=Asia/Shanghai | 系统时区设置,默认为Asia/Shanghai |
CALIBREDB_OTHER_OPTION= | 为自动添加脚本中calibredb命令添加其它参数,例如:duplicates命令[-d] |
DISABLE_GOOGLE_SEARCH=false | (true|false)设定禁用google搜索,默认不开启 |
DISABLE_SCHOLAR_SEARCH=false | (true|false)设定禁用scholar搜索,默认不开启 |
ENABLE_CHOWN_LIBRARY=true | (true|false)设定修复library文件夹拥有者,默认开启 |
CALIBRE_LOCALHOST=true | (true|false)设定从本地主机和本地网络加载封面,默认开启 |
配置完成就可以正常启动了
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。