breadarr/config.example.toml
Breadway 6059d77065 Add torrents-csv and YTS as TPB search fallbacks
apibay has been timing out and the configured 1337x mirrors are all
Cloudflare 521, so general-content search was failing closed. TPB stays
primary; on failure or empty results, movies try YTS then torrents-csv
then 1337x, and TV tries torrents-csv then 1337x. Both new sources are
JSON hash-to-magnet, same grab shape as TPB. Prepend a working 1337x
mirror (1337xx.to) to the default ring.
2026-08-16 10:20:33 +08:00

147 lines
6.1 KiB
TOML

# Copy to ~/.config/breadarr/breadarrd.toml and fill in the empty values.
# Every field has a sensible default (see breadarr-shared/src/config.rs) —
# this file lists them explicitly for reference, not because all are required.
[daemon]
log_level = "info"
listen_addr = "127.0.0.1:7879"
db_path = "~/.local/share/breadarr/breadarr.db"
# Embedding model for title matching — downloaded automatically on first
# run if not already present (~90MB, one-time).
model_dir = "~/.cache/breadarr/models/all-MiniLM-L6-v2"
# Empty (default) means no auth at all. Set this if listen_addr is ever
# changed to bind non-loopback (e.g. so a TUI on another host on the same
# tailnet can reach it) — otherwise that's unauthenticated add/delete/search
# access to anyone who can reach the port. The API is plaintext HTTP; there
# is no TLS. /health is always exempt (liveness only). /health/detail
# carries cycle info and is authenticated when this token is set.
api_token = ""
[qbit]
base_url = "http://127.0.0.1:8090"
username = ""
password = ""
category = "breadarr"
# Only needed if qBittorrent runs in a container (its own downloads mounted
# at some internal prefix) while breadarr runs natively on the same host —
# translates qBittorrent's reported paths into ones breadarr can open.
# Leave both empty if qBittorrent's reported paths are already host paths.
container_downloads_path = ""
host_downloads_path = ""
[jellyfin]
base_url = "http://127.0.0.1:8096"
api_key = ""
[notifications]
# Push notifications for things that would otherwise sit invisible until
# the TUI is next opened: releases needing manual confirmation, a run of
# import failures, the search loop halting. Empty (default) disables this
# entirely. POSTs {"title", "message"} JSON — Gotify's own message API
# accepts this directly (e.g. "http://127.0.0.1:5600/message?token=...");
# most other self-hosted webhook receivers accept the same shape.
webhook_url = ""
[tvdb]
# https://thetvdb.com/dashboard/account/apikeys — v4 key, "Fan/Personal" tier
api_key = ""
[tmdb]
# https://www.themoviedb.org/settings/api — "API Read Access Token (v4 auth)",
# not the shorter v3 "API Key"
bearer_token = ""
[library]
# Default root folder for shows added via the TUI's "Add" flow. Each show
# lands in its own "{root}/{Title} ({Year})" subfolder.
default_root_folder = "~/breadarr-library"
# Same, but for movies added via the TUI's "Add" flow — kept separate from
# default_root_folder since movies and shows live under different category
# roots on disk.
movies_root_folder = "~/breadarr-library/Movies"
[sources]
# nyaa's English-translated anime category — the daemon polls this
# automatically and grabs anything matching a monitored, missing episode.
nyaa_rss_url = "https://nyaa.si/?page=rss&c=1_2"
grab_poll_interval_secs = 300
# Kill switch for the passive RSS-feed grab loop (nyaa). Independent of
# search_enabled / upgrade_enabled.
grab_enabled = true
import_poll_interval_secs = 60
# Community JSON API mirror of The Pirate Bay — primary general-content
# search source (movies + non-anime TV).
tpb_api_url = "https://apibay.org/q.php"
# torrents.csv DHT-dump search — first fallback when TPB fails or returns
# nothing. Same hash-to-magnet grab; movies and TV.
torrents_csv_url = "https://torrents-csv.com/service/search"
# YTS v2 list_movies JSON — movie-only fallback. yts.mx does not resolve;
# yts.lt is a working host as of 2026-08-16.
yts_api_url = "https://yts.lt/api/v2/list_movies.json"
# Search-driven acquisition (movies + non-anime TV via 1337x, anime movies
# via nyaa's search mode) — unlike the nyaa RSS feed watch above, this
# actively queries a Cloudflare-fronted service with a ban history, so keep
# the budget conservative. `search_enabled = false` is the kill switch; a
# restart resets all in-memory mirror cooldown/backoff state, so this is the
# only reliable way to keep it off across restarts.
search_poll_interval_secs = 1800
search_budget_per_cycle = 5
search_enabled = true
# Upgrade-search — periodically re-checks episodes/movies that already have
# a file, in case a better release now exists (repacks/propers always
# supersede; anything else needs to beat the current file's score by at
# least upgrade_min_score_gain to avoid re-grabbing over marginal deltas).
# Much longer interval than search_poll_interval_secs since there's no
# urgency once content is already satisfied.
upgrade_enabled = true
upgrade_poll_interval_secs = 21600
upgrade_budget_per_cycle = 3
upgrade_min_score_gain = 5.0
# 1337x's main domain bans IPs at the Cloudflare WAF level after bursts of
# automated traffic; these community mirrors are round-robined (not just
# tried in a fixed fallback order), with a failing mirror demoted into a
# cooldown rather than re-probed on the very next search.
torrent_1337x_mirrors = [
"https://www.1337xx.to",
"https://13377x.info",
"https://13377x.email",
"https://1337xto.info",
"https://1337x.maskbay.info",
"https://1337x.ninjaproxy.live",
"https://1337x.proxyhive.pro",
"https://1337x.torproxy.live",
"https://1337x.unblockit.world",
"https://1337x.unblockpirate.xyz",
"https://1337x.unblockshark.info",
"https://1337x.unblocktorrent.click",
"https://1337x.unblocktorrent.info",
"https://1337x.unblocktor.xyz",
]
# Off by default — GPU/CPU AV1 encode needs a calibration pass against
# real content on the target hardware before it's safe unattended.
# Defaults match breadarr-shared/src/config.rs.
[transcode]
enabled = false
poll_interval_secs = 60
vaapi_device = "/dev/dri/renderD128"
parallelism_min = 1
# Live-action (av1_vaapi) concurrent-stream ceiling; Jellyfin viewers
# are subtracted from this each cycle.
parallelism_max = 7
# Separate CPU-bound anime (libsvtav1) ceiling.
parallelism_max_anime = 2
reference_bitrate_kbps = 5320
reference_height = 1080
av1_efficiency_factor = 0.7
exclude_hdr = true
exclude_min_height = 2000
quality_live_action = 26
# Path prefixes routed to the anime encode pipeline. Empty is a no-op.
anime_root_folders = []
quality_anime = 24
anime_svtav1_preset = 10
anime_svtav1_max_threads = 4
min_size_reduction_pct = 0.10
skip_below_ceiling_ratio = 0.5
verify_sample_secs = 20.0