diff options
| author | A Farzat <a@farzat.xyz> | 2025-11-22 10:06:02 +0300 |
|---|---|---|
| committer | A Farzat <a@farzat.xyz> | 2025-11-22 10:06:02 +0300 |
| commit | 53724caedc8d3d3783bb701f615afd3eb8298ebb (patch) | |
| tree | b2d5b1f81c88d6364b528b407078bb792cc1684d | |
| parent | a4836871247da314110d1e42344e3239eadbdd3e (diff) | |
| download | simple-rss-podcast-downloader-53724caedc8d3d3783bb701f615afd3eb8298ebb.tar.gz simple-rss-podcast-downloader-53724caedc8d3d3783bb701f615afd3eb8298ebb.zip | |
Add an order argument
| -rw-r--r-- | src/lib.rs | 20 | ||||
| -rw-r--r-- | src/main.rs | 17 |
2 files changed, 25 insertions, 12 deletions
@@ -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 { |
