# Пример конфигурации jellybit — единый справочник по всем секциям и полям.
# Реальный config.toml не коммитится (содержит секреты), заполняется деплоем.
# Секретные поля здесь оставлены пустыми. По умолчанию загрузчик ищет
# config.toml в рабочей директории; путь переопределяется опцией --config=path.
# Для локального запуска укажите существующие каталоги и db_path -> ./jellybit.db.

[general]
# Общие настройки приложения.
timezone = "UTC"                     # таймзона ОТОБРАЖЕНИЯ времени в веб-UI (IANA, напр. "Europe/Moscow"); хранение всегда в UTC. Пусто → UTC
language = "en"                      # язык локализованного вывода (title детектора + режиссёр/локаль метабаз): "ru" | "en". Пусто → en. original_title всегда на языке оригинала

[qbittorrent]
url      = "http://qbit:8989"        # адрес qBittorrent WebUI; в docker-сети — по имени сервиса
username = "admin"                   # логин WebUI
password = ""                        # секрет: пароль WebUI; обязателен, заполняет деплой
category = "jellybit"                # категория для добавляемых jellybit раздач (push, savepath)
tag      = "jellybit"                # тег для усыновления существующих раздач (pull, не двигает файлы)
savepath = "/srv/media/downloads"    # куда qBittorrent кладёт загрузки (задаём при добавлении)
path_map = {}                        # фолбэк: префикс save_path → хост-префикс, напр. {"/data" = "/srv/media"}; обычно пуст

[paths]
# Медиа-песочница на хосте. Каждый путь: абсолютный, без traversal (`..`) и
# должен существовать как доступный каталог (проверяется на старте). Целевые
# movies/series и источник downloads монтируются под единый корень (/srv/media).
downloads = "/srv/media/downloads"   # источник: где лежат загрузки qBittorrent (только читаем/линкуем)
movies    = "/srv/media/movies"      # целевой каталог фильмов для Jellyfin (раскладка хардлинками)
series    = "/srv/media/series"      # целевой каталог сериалов для Jellyfin (раскладка хардлинками)

[storage]
db_path = "/data/jellybit.db"        # путь к файлу SQLite на persistent-томе; обязателен

[llm]
type        = "openai-compat"        # провайдер распознавания; допустимо: openai-compat
# LLM на хосте (LM Studio) из bridged-контейнера — через host.docker.internal.
base_url    = "http://host.docker.internal:1234/v1"  # эндпоинт LLM; пусто = распознавание выключено
api_key     = ""                     # секрет: ключ LLM; обязателен, если задан base_url (заполняет деплой)
model       = "qwen2.5-32b-instruct" # имя модели на эндпоинте
proxy       = ""                     # опц. HTTP-прокси для удалённых эндпоинтов; пусто = без прокси
timeout     = "120s"                 # таймаут запроса к LLM; Go-duration (s/m/h)
max_retries = 3                      # попыток получить валидный ответ LLM; целое ≥ 0

[metadata.tmdb]
enabled  = false                     # включить провайдера TMDB; без матча авто-раскладку не делаем
api_key  = ""                        # секрет: ключ TMDB; обязателен, если enabled (заполняет деплой)
proxy    = ""                        # опц. HTTP-прокси; пусто = без прокси
timeout  = "10s"                     # таймаут запроса к TMDB; Go-duration (s/m/h). Локаль названий задаёт [general].language

[metadata.tvdb]
enabled = false                      # включить провайдера TVDB
api_key = ""                         # секрет: ключ TVDB; обязателен, если enabled (заполняет деплой)
proxy   = ""                         # опц. HTTP-прокси; пусто = без прокси
timeout = "10s"                      # таймаут запроса к TVDB; Go-duration (s/m/h). Локаль названий задаёт [general].language: в запрос поиска не уходит, применяется при разборе ответа

[metadata.tvmaze]
enabled = false                      # включить провайдера TVMaze; без ключа, только сериалы (тег [tvdbid-…] из externals)
proxy   = ""                         # опц. HTTP-прокси; пусто = без прокси
timeout = "10s"                      # таймаут запроса к TVMaze; Go-duration (s/m/h)

[jellyfin]
enabled = false                      # включить пересканирование медиатеки после раскладки
url     = "http://jellyfin:8096"     # адрес Jellyfin; обязателен, если enabled (в docker-сети — по имени сервиса)
api_key = ""                         # секрет: API-ключ Jellyfin (Dashboard → API Keys); обязателен, если enabled
proxy   = ""                         # опц. HTTP-прокси; пусто = без прокси
timeout = "10s"                      # таймаут запроса к Jellyfin; Go-duration (s/m/h)

[worker]
poll_interval  = "5s"                # как часто опрашивать qBittorrent; Go-duration (s/m/h)
stuck_after    = "1h"                # сколько ждать прогресса, прежде чем счесть раздачу зависшей; Go-duration
magnet_timeout = "24h"               # страховочный предел ожидания метаданных magnet (не рабочий механизм: ожившие задачи воскрешаются сверкой); Go-duration
catch_timeout  = "10m"               # страховочный предел: пойманная (catched) задача не добавилась в qBittorrent за это время → failed; Go-duration
source_missing_threshold = 3         # подряд тиков сверки без раздачи в qBittorrent, чтобы счесть источник удалённым (дебаунс)

[recognition]
auto_confidence_threshold = 0.85     # порог авто-раскладки без ревью; доля 0.0–1.0

[telegram]
enabled          = false             # включить Telegram-бота
token            = ""                # секрет: токен бота; обязателен, если enabled (заполняет деплой)
allowed_user_ids = []                # allowlist Telegram user id (целые); пусто = запрет всем (fail-closed)
web_base_url     = ""                # база для deep-link «открыть в вебе», напр. "http://jellybit:8080"; пусто = без кнопки
proxy            = ""                # опц. HTTP-прокси для api.telegram.org; пусто = без прокси

[http]
listen          = ":8080"            # адрес прослушивания HTTP-сервера; формат [host]:port
trusted_subnets = []                 # allowlist подсетей (CIDR); ПОКА НЕ ПРИМЕНЯЕТСЯ (деплой только в LAN), зарезервировано

[log]
level  = "info"                      # уровень логирования; одно из: debug, info, warn, error
format = "json"                      # формат логов; одно из: json, text
