From 5f1fffdd97936faf487f708d4186391894aef448 Mon Sep 17 00:00:00 2001 From: Miguel Palhas Date: Tue, 25 Aug 2026 06:40:38 +0100 Subject: [PATCH] feat(arr): drop unused podnapisi credentials MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Podnapisi's search and download are unauthenticated (#188), so the ARR_PODNAPISI_USERNAME/PASSWORD fields were config nothing read. §10 keeps bootstrap config an honest list. --- crates/arr-daemon/src/config.rs | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/crates/arr-daemon/src/config.rs b/crates/arr-daemon/src/config.rs index e7e9ce7..ba71794 100644 --- a/crates/arr-daemon/src/config.rs +++ b/crates/arr-daemon/src/config.rs @@ -36,8 +36,8 @@ pub const ENV_NTFY_OPERATOR_TOPIC: &str = "ARR_NTFY_OPERATOR_TOPIC"; pub const ENV_OPENSUBTITLES_API_KEY: &str = "ARR_OPENSUBTITLES_API_KEY"; pub const ENV_OPENSUBTITLES_USERNAME: &str = "ARR_OPENSUBTITLES_USERNAME"; pub const ENV_OPENSUBTITLES_PASSWORD: &str = "ARR_OPENSUBTITLES_PASSWORD"; -pub const ENV_PODNAPISI_USERNAME: &str = "ARR_PODNAPISI_USERNAME"; -pub const ENV_PODNAPISI_PASSWORD: &str = "ARR_PODNAPISI_PASSWORD"; +// Podnapisi takes no credentials (#215): its search and download are +// unauthenticated, so there is nothing here for an operator to set. pub const ENV_TRANSLATE_OPENAI_API_KEY: &str = "ARR_TRANSLATE_OPENAI_API_KEY"; pub const ENV_TRANSLATE_OPENAI_BASE_URL: &str = "ARR_TRANSLATE_OPENAI_BASE_URL"; pub const ENV_TRANSLATE_OPENAI_MODEL: &str = "ARR_TRANSLATE_OPENAI_MODEL"; @@ -178,8 +178,6 @@ pub struct EnvOverrides { pub opensubtitles_api_key: Option, pub opensubtitles_username: Option, pub opensubtitles_password: Option, - pub podnapisi_username: Option, - pub podnapisi_password: Option, pub translate_openai_api_key: Option, pub translate_openai_base_url: Option, pub translate_openai_model: Option, @@ -215,8 +213,6 @@ impl EnvOverrides { opensubtitles_api_key: std::env::var(ENV_OPENSUBTITLES_API_KEY).ok(), opensubtitles_username: std::env::var(ENV_OPENSUBTITLES_USERNAME).ok(), opensubtitles_password: std::env::var(ENV_OPENSUBTITLES_PASSWORD).ok(), - podnapisi_username: std::env::var(ENV_PODNAPISI_USERNAME).ok(), - podnapisi_password: std::env::var(ENV_PODNAPISI_PASSWORD).ok(), translate_openai_api_key: std::env::var(ENV_TRANSLATE_OPENAI_API_KEY).ok(), translate_openai_base_url: std::env::var(ENV_TRANSLATE_OPENAI_BASE_URL).ok(), translate_openai_model: std::env::var(ENV_TRANSLATE_OPENAI_MODEL).ok(), @@ -265,8 +261,6 @@ pub struct Config { pub opensubtitles_api_key: Option, pub opensubtitles_username: Option, pub opensubtitles_password: Option, - pub podnapisi_username: Option, - pub podnapisi_password: Option, pub translate_openai_api_key: Option, /// §15. No default: an OpenAI-compatible endpoint has no universal /// address the way `DeepL` or Google Translate do. @@ -299,8 +293,6 @@ struct SubtitleBootstrap { opensubtitles_api_key: Option, opensubtitles_username: Option, opensubtitles_password: Option, - podnapisi_username: Option, - podnapisi_password: Option, translate_openai_api_key: Option, translate_openai_base_url: Option, translate_openai_model: String, @@ -318,8 +310,6 @@ fn resolve_subtitle_bootstrap(env: &EnvOverrides, file: &ConfigFile) -> Subtitle opensubtitles_api_key: env.opensubtitles_api_key.clone(), opensubtitles_username: env.opensubtitles_username.clone(), opensubtitles_password: env.opensubtitles_password.clone(), - podnapisi_username: env.podnapisi_username.clone(), - podnapisi_password: env.podnapisi_password.clone(), translate_openai_api_key: env.translate_openai_api_key.clone(), translate_openai_base_url: env .translate_openai_base_url @@ -443,8 +433,6 @@ impl Config { opensubtitles_api_key: subtitles.opensubtitles_api_key, opensubtitles_username: subtitles.opensubtitles_username, opensubtitles_password: subtitles.opensubtitles_password, - podnapisi_username: subtitles.podnapisi_username, - podnapisi_password: subtitles.podnapisi_password, translate_openai_api_key: subtitles.translate_openai_api_key, translate_openai_base_url: subtitles.translate_openai_base_url, translate_openai_model: subtitles.translate_openai_model, @@ -502,7 +490,6 @@ mod tests { assert_eq!(config.tmdb_api_key, None); assert_eq!(config.jellyfin_api_key, None); assert_eq!(config.opensubtitles_api_key, None); - assert_eq!(config.podnapisi_username, None); assert_eq!(config.translate_command_template, None); assert_eq!( config.translate_openai_model, @@ -578,16 +565,15 @@ prowlarr_url = "http://prowlarr.internal:9696" assert_eq!(config.jellyfin_api_key.as_deref(), Some("secret-3")); } - /// §15: `OpenSubtitles`, Podnapisi and every translator's credentials are - /// secrets, so this mirrors [`secrets_come_only_from_env`] for them. + /// §15: `OpenSubtitles` and every translator's credentials are secrets, + /// so this mirrors [`secrets_come_only_from_env`] for them. Podnapisi has + /// no entry: it takes no credentials at all (#215). #[test] fn subtitle_secrets_come_only_from_env() { let env = EnvOverrides { opensubtitles_api_key: Some("os-key".into()), opensubtitles_username: Some("os-user".into()), opensubtitles_password: Some("os-pass".into()), - podnapisi_username: Some("pod-user".into()), - podnapisi_password: Some("pod-pass".into()), translate_openai_api_key: Some("oa-key".into()), translate_deepl_api_key: Some("dl-key".into()), translate_google_api_key: Some("gg-key".into()), @@ -597,8 +583,6 @@ prowlarr_url = "http://prowlarr.internal:9696" assert_eq!(config.opensubtitles_api_key.as_deref(), Some("os-key")); assert_eq!(config.opensubtitles_username.as_deref(), Some("os-user")); assert_eq!(config.opensubtitles_password.as_deref(), Some("os-pass")); - assert_eq!(config.podnapisi_username.as_deref(), Some("pod-user")); - assert_eq!(config.podnapisi_password.as_deref(), Some("pod-pass")); assert_eq!(config.translate_openai_api_key.as_deref(), Some("oa-key")); assert_eq!(config.translate_deepl_api_key.as_deref(), Some("dl-key")); assert_eq!(config.translate_google_api_key.as_deref(), Some("gg-key"));