Adding pictrs thumbnail caching for urls and embeds.

This commit is contained in:
Dessalines 2020-06-10 18:22:57 -04:00
parent bd26e4e9c1
commit 2fbd44c59d
3 changed files with 32 additions and 22 deletions

View file

@ -18,7 +18,7 @@ use crate::db::user_mention_view::*;
use crate::db::user_view::*; use crate::db::user_view::*;
use crate::db::*; use crate::db::*;
use crate::{ use crate::{
extract_usernames, fetch_iframely_and_pictshare_data, generate_random_string, naive_from_unix, extract_usernames, fetch_iframely_and_pictrs_data, generate_random_string, naive_from_unix,
naive_now, remove_slurs, send_email, slur_check, slurs_vec_to_str, naive_now, remove_slurs, send_email, slur_check, slurs_vec_to_str,
}; };

View file

@ -118,7 +118,7 @@ impl Perform for Oper<CreatePost> {
// Fetch Iframely and Pictshare cached image // Fetch Iframely and Pictshare cached image
let (iframely_title, iframely_description, iframely_html, pictshare_thumbnail) = let (iframely_title, iframely_description, iframely_html, pictshare_thumbnail) =
fetch_iframely_and_pictshare_data(data.url.to_owned()); fetch_iframely_and_pictrs_data(data.url.to_owned());
let post_form = PostForm { let post_form = PostForm {
name: data.name.to_owned(), name: data.name.to_owned(),
@ -452,7 +452,7 @@ impl Perform for Oper<EditPost> {
// Fetch Iframely and Pictshare cached image // Fetch Iframely and Pictshare cached image
let (iframely_title, iframely_description, iframely_html, pictshare_thumbnail) = let (iframely_title, iframely_description, iframely_html, pictshare_thumbnail) =
fetch_iframely_and_pictshare_data(data.url.to_owned()); fetch_iframely_and_pictrs_data(data.url.to_owned());
let post_form = PostForm { let post_form = PostForm {
name: data.name.to_owned(), name: data.name.to_owned(),

View file

@ -187,25 +187,35 @@ pub fn fetch_iframely(url: &str) -> Result<IframelyResponse, failure::Error> {
Ok(res) Ok(res)
} }
#[derive(Deserialize, Debug)] #[derive(Deserialize, Debug, Clone)]
pub struct PictshareResponse { pub struct PictrsResponse {
status: String, files: Vec<PictrsFile>,
url: String, msg: String,
} }
pub fn fetch_pictshare(image_url: &str) -> Result<PictshareResponse, failure::Error> { #[derive(Deserialize, Debug, Clone)]
pub struct PictrsFile {
file: String,
delete_token: String,
}
pub fn fetch_pictrs(image_url: &str) -> Result<PictrsResponse, failure::Error> {
is_image_content_type(image_url)?; is_image_content_type(image_url)?;
let fetch_url = format!( let fetch_url = format!(
"http://pictshare/api/geturl.php?url={}", "http://pictrs:8080/image/download?url={}",
utf8_percent_encode(image_url, NON_ALPHANUMERIC) utf8_percent_encode(image_url, NON_ALPHANUMERIC) // TODO this might not be needed
); );
let text = isahc::get(&fetch_url)?.text()?; let text = isahc::get(&fetch_url)?.text()?;
let res: PictshareResponse = serde_json::from_str(&text)?; let res: PictrsResponse = serde_json::from_str(&text)?;
if res.msg == "ok" {
Ok(res) Ok(res)
} else {
Err(format_err!("{}", &res.msg))
}
} }
fn fetch_iframely_and_pictshare_data( fn fetch_iframely_and_pictrs_data(
url: Option<String>, url: Option<String>,
) -> ( ) -> (
Option<String>, Option<String>,
@ -225,20 +235,20 @@ fn fetch_iframely_and_pictshare_data(
} }
}; };
// Fetch pictshare thumbnail // Fetch pictrs thumbnail
let pictshare_thumbnail = match iframely_thumbnail_url { let pictrs_thumbnail = match iframely_thumbnail_url {
Some(iframely_thumbnail_url) => match fetch_pictshare(&iframely_thumbnail_url) { Some(iframely_thumbnail_url) => match fetch_pictrs(&iframely_thumbnail_url) {
Ok(res) => Some(res.url), Ok(res) => Some(res.files[0].file.to_owned()),
Err(e) => { Err(e) => {
error!("pictshare err: {}", e); error!("pictrs err: {}", e);
None None
} }
}, },
// Try to generate a small thumbnail if iframely is not supported // Try to generate a small thumbnail if iframely is not supported
None => match fetch_pictshare(&url) { None => match fetch_pictrs(&url) {
Ok(res) => Some(res.url), Ok(res) => Some(res.files[0].file.to_owned()),
Err(e) => { Err(e) => {
error!("pictshare err: {}", e); error!("pictrs err: {}", e);
None None
} }
}, },
@ -248,7 +258,7 @@ fn fetch_iframely_and_pictshare_data(
iframely_title, iframely_title,
iframely_description, iframely_description,
iframely_html, iframely_html,
pictshare_thumbnail, pictrs_thumbnail,
) )
} }
None => (None, None, None, None), None => (None, None, None, None),