Сервис для хранения и чтения книг в формате fb2

Добрый день

Хотелось бы установить себе на сервер сервис, который бы хранил и читал книги в формате fb2, запоминал места. Пробовал Calibre-WEB, но хотя там и стоит их поддержка, но он их не определяет, а при загрузке (дает выбрать формат fb2) выдает ошибку. Пробовал BookLore (чтение электронных книг), но для них fb2 не электронная книга.

Пока все книги храню в nextcloud (виджетов для fb2 не находит в нем), при открытии он их просто скачивает сразу. Хорошо, что почти все браузеры читают этот формат - в нем и читаю, скачанные повторно, книги…

1 лайк

Ставил Kavita, но он тоже не умеет fb2

Тоже в поиске решения для хранения электронных книг

Каталог локальной коллекции и читалка, может вам подойдёт:

liberama
inpx-web

Тогда уже calibre и fbreader с opds интеграцией

Сам не использую, но могу порекомендовать полистать:

и

1 лайк

Очень понравилась. Занимается тем что по OPDS раздает флибустовский архив с зелёного стима. Вебная читалка такая себе, можно сказать нет.

Через отдельный сервис мониторится тема с раздачей архива. При обновлении - перекачивается, по завершении загрузки даётся команда в porcula-rs на переиндексацию.

1 лайк

Данный сервис у меня в закладках хранится, я там постоянно мониторю программы))… Там же и нашел Calibre.

Привет, для книг использую http://www.sopds.ru/ его докерную версию GitHub - zveronline/docker-sopds: Dockerfile to build a Simple OPDS server docker image.

Что-то ему не нравится при установке. Пробовал по ссылке этой перейти - 404

Так, подержите мое пиво.
Сервер - GitHub - bookpauk/inpx-web: Веб-сервер для поиска по inpx-коллекции
Там и OPDS и просто скачать и индексатор у него просто ураганный по скорости.
Читалка - GitHub - bookpauk/liberama: Браузерная онлайн-читалка книг
Умеет работать в паре с сервером, там есть настроечка которая их дружит друг с другом, с сервера можно открывать книги прям в читалке.
Читалка работает в браузере, но она настолько развесистая, что я не понимаю зачем нужен отдельный клиент и все это умеет в синхронизацию между устройствами!

По итогу оно у меня работает с Флибустой ссылок не даю но booktraker или любой другой любимый сервис в помощь. Еще в помощь сервис litr.cc которым можно автоматизировать закачку обновляющихся раздач.
В итоге что у меня вышло, litr.cc отслеживает раздачу Флибусты, при изменении генерирует изменения в магнет ссылке, которую у меня мониторит Download Station (этот функционал есть в любом торрент клиенте), который раз в месяц скачивает обновления, которые уже мониторятся inpx-web, он перестраивает свою базу. Когда мне нужно почитать я просто захожу к себе и выбираю что, открываю по ссылке, что на автомате синхронизируется с телефоном.

p.s. Для inpx-web и liberama нет контейнеров, но там исполняемый один файл я их просто кинул на сервер и запускаю по крону при запуске системы, всё.
А еще я редко куда заношу денег, а вот bookpauk прям донатил, за такое не жалко.

4 лайка

Для самых ленивых можно через юнит systemd стартовать inpx-web и liberama.

[Unit]
Description=inpx-web
After=network-online.target
Requires=network-online.target

[Service]
Type=simple
User=dust
Group=users
ExecStart=/<вписать путь до папки>/inpx-web/inpx-web
Restart=always
RestartSec=50

[Install]
WantedBy=multi-user.target

И ещё есть OPDS программка flibgolite, на 4PDA автор в ветке присутствует, можно пихать в докер. Единственный минус - нет веб-морды никакой, только в программах-читалках пользовать как подключаемый каталог.

SOPDS нормальное решение, на питоне и джанго, но есть нюанс с пейджинатором, он использует limit и offset в запросах, что на больших таблицах (более 500 тыс. строк) вызывает сильные задержки. Сижу, думаю как переписать, иначе тот же AlReader более 10 секунд не ждёт, падает с ошибкой.

Тоже искал ридер для FB2, нечего путного не нашёл. Установил Komga, она читает EPUB,PDF и комиксы(не использую). С помощью ChatGPT написал утилиту для (автоматизации) конвертации FB2->EPUB на python. Для этого требуется Calibre, я использую portable-версию. Из недостатков - конвертирует оч долго, 3,5 гб fb2 обрабатывала около 10 часов, всю ночь.
использвать так:
PS C:\Users\user> python.exe .\convert_fb2_to_epub.py --calibre-path="d:\\Calibre Portable\\Calibre\\ebook-convert.exe" --input-dir="d:\\Downloads\\temp\\Евгений Лисицин_Дорничев Дмитрий_Меж двух миров_Имя нам Легион\\"
Не знаю как прикрепить файл!
вставляю так.
convert_fb2_to_epub.py

import os
import subprocess
import argparse


def main():
    # Парсинг аргументов командной строки
    parser = argparse.ArgumentParser(description="Convert FB2 files to EPUB using Calibre")
    parser.add_argument(
        "--calibre-path",
        required=True,
        help="Path to ebook-convert.exe (e.g., E:\\calibre\\Calibre Portable\\Calibre\\ebook-convert.exe)",
    )
    parser.add_argument(
        "--input-dir",
        required=True,
        help="Directory containing FB2 files (e.g., E:\\torrent\\Фабер Ник)",
    )
    args = parser.parse_args()

    CALIBRE_PATH = os.path.normpath(args.calibre_path)
    INPUT_DIR = os.path.normpath(args.input_dir)

    # Проверка существования ebook-convert.exe
    if not os.path.isfile(CALIBRE_PATH):
        print(f"Ошибка: ebook-convert.exe не найден в {CALIBRE_PATH}")
        input("Нажмите Enter для выхода...")
        return

    # Проверка существования папки
    if not os.path.isdir(INPUT_DIR):
        print(f"Ошибка: Папка {INPUT_DIR} не существует")
        input("Нажмите Enter для выхода...")
        return

    # Поиск FB2-файлов во всех подпапках
    fb2_files = []
    print(f"Поиск FB2-файлов в {INPUT_DIR} и подпапках...")
    for root, _, files in os.walk(INPUT_DIR):
        print(f"Проверяю папку: {root}")
        for file in files:
            if file.lower().endswith(".fb2"):
                fb2_files.append(os.path.join(root, file))

    if not fb2_files:
        print(f"Ошибка: FB2-файлы не найдены в {INPUT_DIR} и ее подпапках")
        with open(os.path.join(INPUT_DIR, "file_list.txt"), "w", encoding="utf-8") as f:
            for root, _, files in os.walk(INPUT_DIR):
                for file in files:
                    f.write(os.path.join(root, file) + "\n")
        print(f"Список файлов сохранен в {os.path.join(INPUT_DIR, 'file_list.txt')}")
        input("Нажмите Enter для выхода...")
        return

    # Конвертация файлов
    count = 0
    skipped = 0
    for fb2_file in fb2_files:
        output_file = os.path.splitext(fb2_file)[0] + ".epub"
        log_file = os.path.splitext(fb2_file)[0] + ".log"

        # Проверка существования EPUB-файла
        if os.path.isfile(output_file):
            print(f"Пропущен: {output_file} уже существует")
            skipped += 1
            continue

        print(f"Конвертирую: {fb2_file}")

        try:
            # Вызов ebook-convert
            result = subprocess.run(
                [
                    CALIBRE_PATH,
                    fb2_file,
                    output_file,
                    "--enable-heuristics",
                    "--preserve-cover",
                    "--verbose",
                ],
                capture_output=True,
                text=True,
                encoding="utf-8",
            )

            # Сохранение лога
            with open(log_file, "w", encoding="utf-8") as f:
                f.write(result.stdout)
                f.write(result.stderr)

            if result.returncode == 0:
                print(f"Успешно конвертирован: {output_file}")
                count += 1
            else:
                print(f"Ошибка при конвертации: {fb2_file}. Подробности в {log_file}")

        except Exception as e:
            print(f"Ошибка при конвертации {fb2_file}: {str(e)}")
            with open(log_file, "w", encoding="utf-8") as f:
                f.write(str(e))

    # Итоговое сообщение
    print()
    if count > 0:
        print(f"Конвертация завершена. Обработано файлов: {count}, пропущено: {skipped}")
    else:
        print(f"Конвертация не выполнена. Пропущено файлов: {skipped}. Проверьте файлы и пути.")

    input("Нажмите Enter для выхода...")


if __name__ == "__main__":
    main()

вдруг кому пригодиться

А calibre никто не пользует? Выглядит все как-то очень грустно в этом направлении.
Я сейчас за неимением времени перешел на аудиокниги и в целом, там с этим все очень даже хорошо - Audiobookshelf просто шикарен и имеет зачатки букридера.

Раньше на телефоне использовал fbreader и к нему подключал библиотеку на гуглодиске. Сейчас пока готового рецепта нет.

да тоже использую ABS. Ридер в нём не понравился. Calibre на известном трекере используют. Мне что-то он не нравиться. тяжеленный, не красивый, и пользоваться не удобно. Проще на телефоне использовать какую-нибудь читалку. На телефоне использую Eboox, без рекламы, бесплатная, простая и удобная.

C FBReader как-то тоскливо стало, когда опубликовал SOPDS через Apache, а через него он идёт как редирект, который, вероятно, FBReader не обрабатывает и выдаёт ошибку 500. Так же у него косяки с поиском, не ищет пока сверху не появится строка поиска (не родная приложения, а которая в OPDS запросе вернулась. Всё это при работе с SOPDS, поэтому надо разбираться, но с AlReader таких проблем нет. Calibre начал смотреть, но т.к. качаю файлы зеркала Флибусты в ежемесячных архивах, которые сейчас только с FB2 занимают 536Гб, то становится не выгодно их копирование в другую базу, чем Calibre и занимается. SOPDS работает напрямую с архивами просто индексируя содержимое. Хотя как портал с сервисом чтения книг online Calibre безусловно заслуживает внимания.
Audiobookshelf прекрасен и с каждым билдом становится всё лучше.