Skip feed entries which can't be read but continue

This commit is contained in:
2025-04-26 11:43:13 +02:00
parent 7f713330d7
commit e2c0a9b4c2

View File

@@ -7,7 +7,10 @@ use clap::{
}; };
use feed_rs::{ use feed_rs::{
parser::parse, parser::parse,
model::Feed, model::{
Entry,
Feed,
},
}; };
use reqwest::{ use reqwest::{
@@ -59,7 +62,6 @@ fn read_feed_file(path: &str) -> Result<FeedFile> {
continue; continue;
} }
let url = Url::parse(&line)?; let url = Url::parse(&line)?;
println!("{}", url);
urls.push(url); urls.push(url);
} }
@@ -70,25 +72,48 @@ fn read_feed_file(path: &str) -> Result<FeedFile> {
}) })
} }
fn make_feed_item(entry: Entry) -> Result<FeedItem> {
Ok(FeedItem {
link: entry.links
.first()
.context("Unable to retrieve link from feed entry")?
.href
.clone(),
title: entry.title
.context("Unable to retrieve title from feed entry")?
.content
.clone(),
time: match entry.published {
Some(time) => Some(time),
None => entry.updated,
},
})
}
fn main() -> Result<()> { fn main() -> Result<()> {
let cli = Cli::parse(); let cli = Cli::parse();
let mut feed_items = Vec::new();
let feed_file = read_feed_file(&cli.feeds)?; let feed_file = read_feed_file(&cli.feeds)?;
let mut items: Vec<FeedItem> = Vec::new();
for feed_url in feed_file.urls { for feed_url in feed_file.urls {
feed_items.extend(fetch_feed(feed_url)?.entries); println!("Loading feed {}", feed_url);
let feed_entries = fetch_feed(feed_url)?.entries;
for entry in feed_entries {
match make_feed_item(entry) {
Ok(item) => {
items.push(item);
},
Err(e) => {
println!("\t{}, skipping", e);
},
}
}
} }
let mut items: Vec<FeedItem> = feed_items.into_iter().map(|item| FeedItem {
link: item.links.first().unwrap().href.clone(),
title: item.title.unwrap().content.clone(),
time: match item.published {
Some(time) => Some(time),
None => item.updated,
},
}).collect();
items.sort_by(|a, b| a.time.unwrap_or(chrono::DateTime::UNIX_EPOCH).cmp(&b.time.unwrap_or(chrono::DateTime::UNIX_EPOCH)).reverse()); items.sort_by(|a, b| a.time.unwrap_or(chrono::DateTime::UNIX_EPOCH).cmp(&b.time.unwrap_or(chrono::DateTime::UNIX_EPOCH)).reverse());
let mut out = String::new(); let mut out = String::new();