Skip feed entries which can't be read but continue
This commit is contained in:
51
src/main.rs
51
src/main.rs
@@ -7,7 +7,10 @@ use clap::{
|
||||
};
|
||||
use feed_rs::{
|
||||
parser::parse,
|
||||
model::Feed,
|
||||
model::{
|
||||
Entry,
|
||||
Feed,
|
||||
},
|
||||
};
|
||||
|
||||
use reqwest::{
|
||||
@@ -59,7 +62,6 @@ fn read_feed_file(path: &str) -> Result<FeedFile> {
|
||||
continue;
|
||||
}
|
||||
let url = Url::parse(&line)?;
|
||||
println!("{}", 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<()> {
|
||||
let cli = Cli::parse();
|
||||
|
||||
let mut feed_items = Vec::new();
|
||||
|
||||
let feed_file = read_feed_file(&cli.feeds)?;
|
||||
|
||||
let mut items: Vec<FeedItem> = Vec::new();
|
||||
|
||||
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());
|
||||
|
||||
let mut out = String::new();
|
||||
|
Reference in New Issue
Block a user