refine noisy bookmark filter

This commit is contained in:
Vivian Lim 2019-10-27 05:38:52 +00:00
parent 6a4e04b58a
commit bd136ddb4f
1 changed files with 58 additions and 27 deletions

View File

@ -15,6 +15,7 @@ struct Settings {
pinboard_api_token: String
}
#[derive(Debug)]
struct Bookmark {
href: String,
time: String,
@ -49,33 +50,34 @@ impl std::convert::From<String> for TransformError {
}
}
impl std::convert::From<Bookmark> for Item {
fn from(b: Bookmark) -> Item {
impl std::convert::From<&Bookmark> for Item {
fn from(b: &Bookmark) -> Item {
let mut item = Item::default();
item.set_title(b.description);
item.set_link(b.href);
item.set_description(b.extended);
item.set_pub_date(b.time);
item.set_title(b.description.clone());
item.set_link(b.href.clone());
item.set_description(b.extended.clone());
item.set_pub_date(b.time.clone());
item
/*Item {
title: Some(b.description),
link: Some(b.href),
description: Some(b.extended),
pub_date: Some(b.time)
}*/
}
}
fn fetch_pinboard_bookmarks(settings: &Settings) -> Result<String, TransformError> {
let mut response = reqwest::get(&format!("https://api.pinboard.in/v1/posts/all?results=50&auth_token={}", settings.pinboard_api_token))?;
let channel = transform_bookmarks_to_rss(&response.text()?)?;
fn fetch_pinboard_bookmarks_rss(settings: &Settings) -> Result<String, TransformError> {
let mut response = reqwest::get(&format!("https://api.pinboard.in/v1/posts/all?auth_token={}", settings.pinboard_api_token))?;
let bookmarks = parse_bookmarks(&response.text()?)?;
let channel = transform_bookmarks_to_rss(&bookmarks)?;
Ok(channel.to_string())
}
fn transform_bookmarks_to_rss(bookmarks_xml: &String) -> Result<rss::Channel, TransformError> {
let doc = roxmltree::Document::parse(bookmarks_xml)?;
fn fetch_pinboard_bookmarks_list(settings: &Settings) -> Result<String, TransformError> {
let mut response = reqwest::get(&format!("https://api.pinboard.in/v1/posts/all?auth_token={}", settings.pinboard_api_token))?;
let bookmarks = parse_bookmarks(&response.text()?)?;
Ok(bookmarks.iter()
.map(|b| format!("{:?}", b))
.collect::<Vec<String>>().join("<br/>\n"))
}
fn parse_bookmarks(bookmarks_xml: &String) -> Result<Vec<Bookmark>, TransformError> {
let doc = roxmltree::Document::parse(bookmarks_xml)?;
let mut users = doc.root().descendants();
// only care about one user (for now? forever?)
let posts = match users.next() {
@ -83,18 +85,22 @@ fn transform_bookmarks_to_rss(bookmarks_xml: &String) -> Result<rss::Channel, Tr
Some(p) => p
};
let bookmarks: Vec<Item> = posts
Ok(posts
.descendants()
.filter_map(|p| read_bookmark_node(p))
.map(|b| Item::from(b))
.collect();
.filter_map(|b| filter_noisy_bookmarks(b))
.collect())
}
fn transform_bookmarks_to_rss(bookmarks: &Vec<Bookmark>) -> Result<rss::Channel, TransformError> {
let items: Vec<Item> = bookmarks.iter().map(|b| Item::from(b)).collect();
let mut channel = ChannelBuilder::default()
.title("Viv's Pinboard")
.description("Bookmarks from Viv's Pinboard.")
.build()?;
channel.set_items(bookmarks);
channel.set_items(items);
Ok(channel)
}
@ -109,14 +115,39 @@ fn read_bookmark_node(node: roxmltree::Node) -> Option<Bookmark>{
})
}
fn filter_noisy_bookmarks(bookmark: Bookmark) -> Option<Bookmark>{
// Filter out bookmarks caused simply by retweeting or faving.
if bookmark.description.starts_with("(429)") && bookmark.href.contains("twitter.com"){
return None;
}
if bookmark.description.eq("Twitter") && bookmark.href.contains("twitter.com"){
return None;
}
Some(bookmark)
}
#[get("/")]
fn index() -> &'static str {
"Hello world!"
}
#[get("/pinboard_items")]
fn pinboard_items(settings: State<Settings>) -> String {
match fetch_pinboard_bookmarks(&settings) {
#[get("/pinboard_items_list")]
fn pinboard_items_list(settings: State<Settings>) -> String {
match fetch_pinboard_bookmarks_list(&settings) {
Ok(rss) => rss,
Err(e) => match e {
TransformError::Xml(e) => format!("Error parsing XML: {}", e),
TransformError::Rss(e) => format!("Error creating RSS: {}", e),
TransformError::Http(e) => format!("Error during HTTP request: {}", e),
TransformError::Str(e) => format!("Error: {}", e)
}
}
}
#[get("/pinboard_items_rss")]
fn pinboard_items_rss(settings: State<Settings>) -> String {
match fetch_pinboard_bookmarks_rss(&settings) {
Ok(rss) => rss,
Err(e) => match e {
TransformError::Xml(e) => format!("Error parsing XML: {}", e),
@ -137,7 +168,7 @@ fn main() {
};
rocket::ignite()
.mount("/", routes![index, pinboard_items])
.mount("/", routes![index, pinboard_items_rss, pinboard_items_list])
.manage(settings)
.launch();
}
}