aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA Farzat <a@farzat.xyz>2025-11-22 10:06:02 +0300
committerA Farzat <a@farzat.xyz>2025-11-22 10:06:02 +0300
commit53724caedc8d3d3783bb701f615afd3eb8298ebb (patch)
treeb2d5b1f81c88d6364b528b407078bb792cc1684d
parenta4836871247da314110d1e42344e3239eadbdd3e (diff)
downloadsimple-rss-podcast-downloader-53724caedc8d3d3783bb701f615afd3eb8298ebb.tar.gz
simple-rss-podcast-downloader-53724caedc8d3d3783bb701f615afd3eb8298ebb.zip
Add an order argument
-rw-r--r--src/lib.rs20
-rw-r--r--src/main.rs17
2 files changed, 25 insertions, 12 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 74e37b2..bb9ebee 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -13,14 +13,18 @@ pub fn parse_feed(xml: &str) -> Result<Channel, rss::Error> {
}
/// Extract the audio URLs from the given channel
-pub fn get_audio_urls(channel: &Channel) -> Vec<(usize, &str)> {
- channel
- .items()
- .iter()
- .rev()
- .enumerate()
- .filter_map(|(i, item)| item.enclosure().map(|e| (i + 1, e.url())))
- .collect()
+pub fn get_audio_urls(channel: &Channel, newest_first: bool) -> Vec<(usize, &str)> {
+ let iter = channel.items().iter();
+ if newest_first {
+ iter.enumerate()
+ .filter_map(|(i, item)| item.enclosure().map(|e| (i + 1, e.url())))
+ .collect()
+ } else {
+ iter.rev()
+ .enumerate()
+ .filter_map(|(i, item)| item.enclosure().map(|e| (i + 1, e.url())))
+ .collect()
+ }
}
/// Download the given audio file to the supplied directory
diff --git a/src/main.rs b/src/main.rs
index 50c59e3..ab8e299 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,12 @@
-use clap::Parser;
+use clap::{Parser, ValueEnum};
use simple_rss_podcast_downloader::*;
+#[derive(ValueEnum, Clone, Debug)]
+enum Order {
+ Newest,
+ Oldest,
+}
+
#[derive(Parser, Debug)]
#[command(author, version, about)]
struct Cli {
@@ -8,18 +14,21 @@ struct Cli {
#[arg(default_value = ".")]
output_dir: String,
#[arg(short, long)]
- numbered: bool,
+ numbered: bool, // Whether to prefix the episode number
+ #[arg(long, value_enum, default_value_t = Order::Oldest)]
+ order: Order, // Order of download and numbering
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Cli::parse();
- println!("Feed RSS feed from: {}", args.feed_url);
+ println!("Fetching RSS feed from: {}", args.feed_url);
let xml = fetch_feed(&args.feed_url)?;
let channel = parse_feed(&xml)?;
let pad = channel.items().len().to_string().len();
- for (i, url) in get_audio_urls(&channel) {
+ let newest_first = matches!(args.order, Order::Newest);
+ for (i, url) in get_audio_urls(&channel, newest_first) {
let prefix = if args.numbered {
Some(format!("{:0width$}", i, width = pad))
} else {