@@ -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)];
|
||||
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user