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.
147 lines
6.1 KiB
TOML
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
|