diff --git a/Cargo.lock b/Cargo.lock index 8d84fc2..1d99174 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1511,6 +1511,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_regex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8136f1a4ea815d7eac4101cfd0b16dc0cb5e1fe1b8609dfd728058656b7badf" +dependencies = [ + "regex", + "serde", +] + [[package]] name = "serde_spanned" version = "1.1.1" @@ -2456,8 +2466,10 @@ dependencies = [ "env_logger", "log", "redb", + "regex", "rustypipe", "serde", + "serde_regex", "tokio", "toml", "tracing-subscriber", diff --git a/Cargo.toml b/Cargo.toml index 08c1708..dfd1704 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,8 +16,10 @@ clap = { version = "4.6", features = ["derive"] } env_logger = "0.11.10" log = "0.4.29" redb = "4.0.0" +regex = "1.12.3" rustypipe = "0.11.4" serde = { version = "1.0.228", features = ["derive"] } +serde_regex = "1.1.0" tokio = { version = "1.51.0", features = ["rt-multi-thread"] } toml = "1.1.2" tracing-subscriber = { version = "0.3.23", features = ["env-filter"] } diff --git a/example/config.toml b/example/config.toml index 0c4ed56..9dd0af3 100644 --- a/example/config.toml +++ b/example/config.toml @@ -17,6 +17,7 @@ sleep = 1 is_short = false is_upcoming = false # limit = 1 + # name_regex = ".*" # Channel item commands to apply (in order) diff --git a/src/config/channel.rs b/src/config/channel.rs index 19becf6..0dbdf09 100644 --- a/src/config/channel.rs +++ b/src/config/channel.rs @@ -1,6 +1,7 @@ mod command; use command::Command; +use regex::Regex; use serde::Deserialize; #[derive(Deserialize)] @@ -11,4 +12,6 @@ pub struct Channel { pub is_short: bool, pub is_upcoming: bool, pub limit: Option, + #[serde(with = "serde_regex")] + pub item_name_regex: Option, } diff --git a/src/main.rs b/src/main.rs index ca6f11b..a65241b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -48,6 +48,18 @@ async fn main() { debug!("items limit for channel `{c}` reached at {i}; break."); break; } + if !channel + .item_name_regex + .as_ref() + .is_some_and(|regex| regex.is_match(&item.name)) + { + debug!( + "item name `{}` for channel `{c}` does not match pattern `{}`; skip.", + &item.name, + &channel.item_name_regex.as_ref().unwrap() + ); + continue; + } match database.get(&item.id) { Ok(id) => { if id.is_some() {