From 8fa46074562f06e24ce86c2872f5814b758d225c Mon Sep 17 00:00:00 2001 From: Bauke Date: Wed, 21 Sep 2022 23:37:17 +0200 Subject: [PATCH] Add --url to figure out RSS feeds from store pages. --- Cargo.lock | 27 +++++++++++++++++++++++++++ Cargo.toml | 1 + source/main.rs | 31 +++++++++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8a13570..429e118 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aho-corasick" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +dependencies = [ + "memchr", +] + [[package]] name = "atty" version = "0.2.14" @@ -446,6 +455,23 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + [[package]] name = "ring" version = "0.16.20" @@ -532,6 +558,7 @@ dependencies = [ "color-eyre", "indicatif", "opml", + "regex", "ureq", ] diff --git a/Cargo.toml b/Cargo.toml index 4d547a5..c5f4db2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ path = "source/main.rs" color-eyre = "0.6.2" indicatif = "0.17.1" opml = "1.1.4" +regex = "1.6.0" ureq = "2.5.0" [dependencies.clap] diff --git a/source/main.rs b/source/main.rs index b4b7703..e1feb10 100644 --- a/source/main.rs +++ b/source/main.rs @@ -13,6 +13,7 @@ use { clap::Parser, color_eyre::{install, Result}, indicatif::{ProgressBar, ProgressStyle}, + regex::Regex, }; /// CLI arguments struct using [`clap`]'s Derive API. @@ -34,6 +35,10 @@ pub struct Args { /// Verify potential feeds by downloading them and checking if they return XML. #[clap(short, long)] pub verify: bool, + + /// A game's store URL, can be used multiple times. + #[clap(long)] + pub url: Vec, } /// A simple feed struct. @@ -54,6 +59,9 @@ pub struct Feed { pub enum FeedOption { /// `-a, --appid ` was used. AppID, + + /// `--url ` was used. + Url, } fn main() -> Result<()> { @@ -68,20 +76,39 @@ fn main() -> Result<()> { let mut potential_feeds = vec![]; let mut feeds_to_output = vec![]; + let store_url_regex = + Regex::new(r"(?i)^https?://store.steampowered.com/app/(?P\d+)")?; + for appid in args.appid { potential_feeds.push(Feed { option: FeedOption::AppID, text: Some(format!("Steam AppID {appid}")), - url: format!("https://steamcommunity.com/games/{appid}/rss/"), + url: appid_to_rss_url(appid), }); } + for url in args.url { + let appid = store_url_regex + .captures(&url) + .and_then(|captures| captures.name("appid")) + .and_then(|appid_match| appid_match.as_str().parse::().ok()); + if let Some(appid) = appid { + potential_feeds.push(Feed { + option: FeedOption::Url, + text: Some(format!("Steam AppID {appid}")), + url: appid_to_rss_url(appid), + }); + } + } + if args.verify { let progress = ProgressBar::new(potential_feeds.len().try_into()?) .with_style(ProgressStyle::with_template("Verifying {pos}/{len} {bar}")?); for potential_feed in potential_feeds { - let potential_feed = if potential_feed.option == FeedOption::AppID { + let potential_feed = if [FeedOption::AppID, FeedOption::Url] + .contains(&potential_feed.option) + { let response = ureq_agent.get(&potential_feed.url).call()?; if response.content_type() == "text/xml" { let body = response.into_string()?;