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::{
|
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();
|
||||||
|
Reference in New Issue
Block a user