config fix feeder

This commit is contained in:
Worph
2026-07-01 18:54:12 +02:00
parent bbfd9b4ae1
commit 8d5d181af1
2 changed files with 25 additions and 56 deletions
+15 -12
View File
@@ -7,12 +7,16 @@
//! torrent-core TMDB catalog-discovery stack. Split out of `meta-feeder-torrent`
//! so its dashboard config panel resolves to the tribler schema.
//!
//! Env (shared): `META_FEEDER_HTTP_LISTEN` (default `0.0.0.0:8080`),
//! `META_FEEDER_STATE_DIR` (default `/data/meta-feeder`), `META_CORE_URL` (D4
//! self-publish), `RUST_LOG`.
//! Env (tribler source): `TRIBLER_SIDECAR_URL`, `TRIBLER_API_KEY`,
//! `TMDB_TOKEN`/`TMDB_LANGUAGE`, plus the enrichment-plugin URLs
//! (`FILENAME_PARSER_URL`, `TMDB_PLUGIN_URL`, `META_FEEDER_CALLBACK_URL`).
//! ALL tribler config — sidecar URL, api key, tmdb token/language, meta-core
//! URL — is read from the persisted `config.json` (dashboard-written) ONLY.
//! There is NO env seed for these: a field in the dashboard config schema must
//! not have an env var (config from JSON file / web UI is the single source of
//! truth).
//!
//! Env (infra only): `META_FEEDER_HTTP_LISTEN` (default `0.0.0.0:8080`),
//! `META_FEEDER_STATE_DIR` (default `/data/meta-feeder`), `META_GATEWAY_PEER_ID`,
//! the enrichment-plugin URLs (`FILENAME_PARSER_URL`, `TMDB_PLUGIN_URL`,
//! `META_FEEDER_CALLBACK_URL`), `RUST_LOG`.
use std::net::SocketAddr;
@@ -21,7 +25,7 @@ use meta_feeder_sdk::serve_feeders;
use tracing::info;
use tracing_subscriber::EnvFilter;
use tribler_feeder::tribler::{TriblerConfigFile, TriblerPlugin};
use tribler_feeder::tribler::TriblerPlugin;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
@@ -35,11 +39,10 @@ async fn main() -> anyhow::Result<()> {
let state_dir =
std::env::var("META_FEEDER_STATE_DIR").unwrap_or_else(|_| "/data/meta-feeder".to_string());
// Env is the first-boot seed; the persisted config.json (under the
// per-source cache dir) wins once saved through the dashboard. The tribler
// source builds its enrichment driver in configure().
let mut tr = TriblerPlugin::new();
tr.set_seed_config(TriblerConfigFile::from_env());
// No env seed: the plugin reads config.json in configure() (sidecar URL,
// api key, tmdb, meta-core URL) and builds its enrichment/self-publish
// driver from config.meta_core_url there.
let tr = TriblerPlugin::new();
let plugins: Vec<Box<dyn FeederPlugin>> = vec![Box::new(tr)];
+10 -44
View File
@@ -92,39 +92,11 @@ pub struct TriblerConfigFile {
}
impl TriblerConfigFile {
/// Parse the config from the env (first-boot seed). Tribler-connection from
/// `TRIBLER_*`; the enrichment TMDB key/language from `TMDB_TOKEN`
/// (or `PROWLARR_TMDB_TOKEN`) / `TMDB_LANGUAGE` — so an operator can still seed
/// them from env, while the dashboard form overrides at runtime.
pub fn from_env() -> Self {
let mut c = Self::default();
if let Ok(u) = std::env::var("META_CORE_URL") {
if !u.trim().is_empty() {
c.meta_core_url = Some(u.trim().to_string());
}
}
if let Ok(url) = std::env::var("TRIBLER_SIDECAR_URL") {
if !url.trim().is_empty() {
c.sidecar_url = Some(url);
}
}
if let Ok(key) = std::env::var("TRIBLER_API_KEY") {
if !key.trim().is_empty() {
c.api_key = Some(key);
}
}
if let Ok(t) = std::env::var("TMDB_TOKEN").or_else(|_| std::env::var("PROWLARR_TMDB_TOKEN")) {
if !t.trim().is_empty() {
c.tmdb_api_key = Some(t);
}
}
if let Ok(l) = std::env::var("TMDB_LANGUAGE") {
if !l.trim().is_empty() {
c.tmdb_language = Some(l);
}
}
c
}
// NOTE: `TriblerConfigFile::from_env()` was deliberately removed. Tribler
// config (sidecar URL, api key, tmdb token/language, meta-core URL) is
// dashboard config — it lives ONLY in the persisted config.json, never in
// env. (Was: TRIBLER_SIDECAR_URL / TRIBLER_API_KEY / TMDB_TOKEN /
// TMDB_LANGUAGE / META_CORE_URL — all now config-schema fields.)
}
/// HTTP timeout for the *synchronous* calls (local search, remote-search
@@ -223,9 +195,6 @@ pub struct TriblerPlugin {
sidecar_url: String,
api_key: Option<String>,
cache: Option<MidhashCache>,
/// Env-derived config seed (set by `main` via [`set_seed_config`]).
/// `configure()` applies it when no persisted `config.json` exists.
seed_config: TriblerConfigFile,
/// Effective config snapshot, exposed (redacted) through the SDK config
/// plane for the dashboard's per-plugin config form.
cfg: TriblerConfigFile,
@@ -261,7 +230,6 @@ impl TriblerPlugin {
sidecar_url,
api_key: None,
cache: None,
seed_config: TriblerConfigFile::default(),
cfg: TriblerConfigFile::default(),
enricher: None,
inline_tmdb: crate::enrich::Enricher::new(),
@@ -283,11 +251,8 @@ impl TriblerPlugin {
self.api_key = Some(key);
}
/// Install the env-derived seed config (applied by `configure()` when no
/// persisted `config.json` exists). Mirrors the torznab feeder.
pub fn set_seed_config(&mut self, cfg: TriblerConfigFile) {
self.seed_config = cfg;
}
// set_seed_config was removed: there is no env seed. config.json is the only
// config source (dashboard-written); apply_config takes it in configure().
/// Apply an effective config: override sidecar URL / API key when present,
/// otherwise keep the constructor defaults. Records the effective snapshot
@@ -829,10 +794,12 @@ impl FeederPlugin for TriblerPlugin {
// plane when the operator saves through the dashboard) wins over the env
// seed. Both are optional — tribler has working defaults, so a fully
// unconfigured feeder still serves (DEFAULT_SIDECAR_URL, no auth key).
// config.json (dashboard-written) is the ONLY config source — no env
// seed. Absent → tribler's built-in defaults (DEFAULT_SIDECAR_URL, no key).
let effective = std::fs::read(cache_dir.join("config.json"))
.ok()
.and_then(|b| serde_json::from_slice::<TriblerConfigFile>(&b).ok())
.unwrap_or_else(|| self.seed_config.clone());
.unwrap_or_default();
self.apply_config(effective);
self.cache = Some(common::open_midhash_cache(cache_dir, "tribler")?);
// Build the enrichment driver: infra (META_CORE_URL + plugin URLs + peer
@@ -1448,7 +1415,6 @@ fn build_enricher(http: &reqwest::Client, cfg: &TriblerConfigFile) -> Option<Enr
.as_ref()
.map(|s| s.trim().to_string())
.filter(|s| !s.is_empty())
.or_else(|| EnrichmentConfig::from_env().map(|c| c.meta_core_url))
.unwrap_or_else(|| meta_feeder_sdk::DEFAULT_META_CORE_URL.to_string());
let mut ecfg = EnrichmentConfig::from_meta_core(meta_core_url);
if let Some(k) = cfg.tmdb_api_key.as_ref().filter(|s| !s.trim().is_empty()) {