From 03c4d3c392386e06f2673f0e0783e22d10087989 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 10 Aug 2024 03:35:20 +0200 Subject: [PATCH] feat: add option to fetch RSS feed --- cli/Cargo.toml | 2 +- cli/src/main.rs | 48 +++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/cli/Cargo.toml b/cli/Cargo.toml index e07a928..6f68f47 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -41,7 +41,7 @@ rustls-tls-native-roots = [ ] [dependencies] -rustypipe.workspace = true +rustypipe = { workspace = true, features = ["rss"] } rustypipe-downloader.workspace = true reqwest.workspace = true tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } diff --git a/cli/src/main.rs b/cli/src/main.rs index 124dee9..9458e81 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -134,6 +134,9 @@ enum Commands { /// Use YouTube Music #[clap(short, long)] music: bool, + /// Use the RSS feed of a channel + #[clap(long)] + rss: bool, /// Get comments #[clap(long)] comments: Option, @@ -654,6 +657,7 @@ async fn run() -> anyhow::Result<()> { limit, tab, music, + rss, comments, lyrics, player, @@ -669,7 +673,7 @@ async fn run() -> anyhow::Result<()> { Some(lyrics_id) => { let lyrics = rp.query().music_lyrics(lyrics_id).await?; if txt { - println!("{}\n\n{}", lyrics.body, lyrics.footer); + println!("{}\n\n{}", lyrics.body, lyrics.footer.blue()); } else { print_data(&lyrics, format, pretty); } @@ -680,18 +684,23 @@ async fn run() -> anyhow::Result<()> { let details = rp.query().music_details(&id).await?; if txt { if details.track.is_video { - println!("[MV]"); + anstream::println!("{}", "[MV]".on_green().black()); } else { - println!("[Track]"); + anstream::println!("{}", "[Track]".on_green().black()); } - print!("{} [{}]", details.track.name, details.track.id); + anstream::print!( + "{} [{}]", + details.track.name.green().bold(), + details.track.id + ); print_duration(details.track.duration); println!(); print_artists(&details.track.artists); println!(); if !details.track.is_video { - println!( - "Album: {}", + anstream::println!( + "{} {}", + "Album:".blue(), details .track .album @@ -701,7 +710,7 @@ async fn run() -> anyhow::Result<()> { ) } if let Some(view_count) = details.track.view_count { - println!("Views: {view_count}"); + anstream::println!("{} {}", "Views:".blue(), view_count); } } else { print_data(&details, format, pretty); @@ -852,6 +861,31 @@ async fn run() -> anyhow::Result<()> { } else { print_data(&artist, format, pretty); } + } else if rss { + let rss = rp.query().channel_rss(&id).await?; + + if txt { + anstream::println!( + "{}\n{} [{}]\n{} {}", + "[Channel RSS]".on_green().black(), + rss.name.green().bold(), + rss.id, + "Created on:".blue(), + rss.create_date, + ); + if let Some(v) = rss.videos.first() { + anstream::println!( + "{} {} [{}]", + "Latest video:".blue(), + v.publish_date, + v.id + ); + } + println!(); + print_entities(&rss.videos); + } else { + print_data(&rss, format, pretty); + } } else { match tab { ChannelTab::Videos | ChannelTab::Shorts | ChannelTab::Live => {