群晖部署-Calibreweb

06-01 1524阅读

最近家里搞了台群晖,准备部署个Calibreweb看看电子书,看了好多部署的教程老是不太成功,要么报错要么有问题的,很难搞。下面将部署流程分享一下,给大家参考,少走点弯路

镜像的选择

我们使用johngong/calibre-web,我们用这个镜像来构建应用,这个镜像已经添加了一些原始镜像没有的功能,可以更快的上手。我们直接拉取johngong/calibre-web镜像即可

配置

映射卷

我们需要映射镜像的卷

群晖部署-Calibreweb

群晖部署-Calibreweb

参数说明
本地文件夹1:/librarycalibre-web与calibre-server书库默认位置
本地文件夹2:/configcalibre-web与calibre-server配置位置文件
本地文件夹3:/autoaddbookscalibre自动添加图书文件夹位置
本地文件夹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:8083calibre-web web访问端口
本地端口2:8080calibre-server web访问端口

环境变量

环境变量默认即可 大家可以根据需要进行调整

参数说明
UID=1000uid设置,默认为1000
GID=1000gid设置,默认为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_CNcalibre-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)设定从本地主机和本地网络加载封面,默认开启

配置完成就可以正常启动了

群晖部署-Calibreweb

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码