refine noisy bookmark filter
This commit is contained in:
parent
6a4e04b58a
commit
bd136ddb4f
85
src/main.rs
85
src/main.rs
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue