[fractal] API, util.rs: dw_media() and resolve_media_url() refactor
- From: Jordan Petridis <jpetridis src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal] API, util.rs: dw_media() and resolve_media_url() refactor
- Date: Wed, 25 Sep 2019 07:48:52 +0000 (UTC)
commit f647742453fdc6fe9e05ae5fbe0fbc2d5ac3c109
Author: Alejandro DomÃnguez <adomu net-c com>
Date: Thu Aug 29 14:29:40 2019 +0200
API, util.rs: dw_media() and resolve_media_url() refactor
Both functions have no mutable variables now and take a ContentType instead
of a bool and the width and height values to indicate whether the media is
a thumbnail (and its size) or the original file.
fractal-matrix-api/src/backend/directory.rs | 6 ++-
fractal-matrix-api/src/backend/media.rs | 12 ++---
fractal-matrix-api/src/backend/room.rs | 10 +++-
fractal-matrix-api/src/backend/user.rs | 12 +++--
fractal-matrix-api/src/globals.rs | 1 -
fractal-matrix-api/src/util.rs | 79 +++++++++++++++--------------
6 files changed, 69 insertions(+), 51 deletions(-)
---
diff --git a/fractal-matrix-api/src/backend/directory.rs b/fractal-matrix-api/src/backend/directory.rs
index 3b1e8dad..9f990243 100644
--- a/fractal-matrix-api/src/backend/directory.rs
+++ b/fractal-matrix-api/src/backend/directory.rs
@@ -8,7 +8,8 @@ use crate::error::Error;
use std::thread;
use crate::util::cache_dir_path;
-use crate::util::media;
+use crate::util::dw_media;
+use crate::util::ContentType;
use crate::util::ResultExpectLog;
use crate::util::HTTP_CLIENT;
@@ -131,7 +132,8 @@ pub fn room_search(
.inspect(|r: &Room| {
if let Some(avatar) = r.avatar.clone() {
if let Ok(dest) = cache_dir_path(None, &r.id) {
- let _ = media(&base, &avatar, Some(&dest));
+ let _ =
+ dw_media(&base, &avatar, ContentType::Download, Some(&dest));
}
}
})
diff --git a/fractal-matrix-api/src/backend/media.rs b/fractal-matrix-api/src/backend/media.rs
index b8f8f5a9..f4a6b6e1 100644
--- a/fractal-matrix-api/src/backend/media.rs
+++ b/fractal-matrix-api/src/backend/media.rs
@@ -7,15 +7,15 @@ use std::sync::mpsc::Sender;
use std::thread;
use url::Url;
-use crate::util;
use crate::util::cache_dir_path;
use crate::util::client_url;
use crate::util::download_file;
+use crate::util::dw_media;
use crate::util::get_prev_batch_from;
use crate::util::json_q;
use crate::util::resolve_media_url;
use crate::util::semaphore;
-use crate::util::thumb;
+use crate::util::ContentType;
use crate::util::ResultExpectLog;
use crate::r0::filter::RoomEventFilter;
@@ -25,7 +25,7 @@ pub fn get_thumb_async(bk: &Backend, media: String, tx: Sender<String>) -> Resul
let baseu = bk.get_base_url();
semaphore(bk.limit_threads.clone(), move || {
- match thumb(&baseu, &media, None) {
+ match dw_media(&baseu, &media, ContentType::default_thumbnail(), None) {
Ok(fname) => {
tx.send(fname).expect_log("Connection closed");
}
@@ -42,7 +42,7 @@ pub fn get_media_async(bk: &Backend, media: String, tx: Sender<String>) -> Resul
let baseu = bk.get_base_url();
semaphore(bk.limit_threads.clone(), move || {
- match util::media(&baseu, &media, None) {
+ match dw_media(&baseu, &media, ContentType::Download, None) {
Ok(fname) => {
tx.send(fname).expect_log("Connection closed");
}
@@ -91,7 +91,7 @@ pub fn get_media(bk: &Backend, media: String) -> Result<(), Error> {
let tx = bk.tx.clone();
thread::spawn(move || {
- match util::media(&baseu, &media, None) {
+ match dw_media(&baseu, &media, ContentType::Download, None) {
Ok(fname) => {
tx.send(BKResponse::Media(fname))
.expect_log("Connection closed");
@@ -110,7 +110,7 @@ pub fn get_media_url(bk: &Backend, media: String, tx: Sender<String>) -> Result<
let baseu = bk.get_base_url();
semaphore(bk.limit_threads.clone(), move || {
- match resolve_media_url(&baseu, &media, false, 0, 0) {
+ match resolve_media_url(&baseu, &media, ContentType::Download) {
Ok(uri) => {
tx.send(uri.to_string()).expect_log("Connection closed");
}
diff --git a/fractal-matrix-api/src/backend/room.rs b/fractal-matrix-api/src/backend/room.rs
index cae35146..babf5725 100644
--- a/fractal-matrix-api/src/backend/room.rs
+++ b/fractal-matrix-api/src/backend/room.rs
@@ -15,9 +15,10 @@ use crate::globals;
use std::thread;
use crate::util::cache_dir_path;
+use crate::util::dw_media;
use crate::util::get_prev_batch_from;
use crate::util::json_q;
-use crate::util::thumb;
+use crate::util::ContentType;
use crate::util::ResultExpectLog;
use crate::util::HTTP_CLIENT;
use crate::util::{client_url, media_url};
@@ -79,7 +80,12 @@ pub fn get_room_avatar(bk: &Backend, roomid: String) -> Result<(), Error> {
let avatar = r["url"].as_str().and_then(|s| Url::parse(s).ok());
let dest = cache_dir_path(None, &roomid).ok();
if let Some(ref avatar) = avatar {
- let _ = thumb(&baseu, avatar.as_str(), dest.as_ref().map(String::as_str));
+ let _ = dw_media(
+ &baseu,
+ avatar.as_str(),
+ ContentType::default_thumbnail(),
+ dest.as_ref().map(String::as_str),
+ );
}
tx.send(BKResponse::RoomAvatar(roomid, avatar))
.expect_log("Connection closed");
diff --git a/fractal-matrix-api/src/backend/user.rs b/fractal-matrix-api/src/backend/user.rs
index e0b5a196..97a9e3e8 100644
--- a/fractal-matrix-api/src/backend/user.rs
+++ b/fractal-matrix-api/src/backend/user.rs
@@ -4,10 +4,11 @@ use crate::backend::types::BKResponse;
use crate::backend::types::Backend;
use crate::error::Error;
use crate::util::cache_dir_path;
+use crate::util::dw_media;
use crate::util::encode_uid;
use crate::util::get_user_avatar;
use crate::util::semaphore;
-use crate::util::thumb;
+use crate::util::ContentType;
use crate::util::ResultExpectLog;
use crate::util::HTTP_CLIENT;
use reqwest::header::HeaderValue;
@@ -632,6 +633,11 @@ fn get_user_avatar_img(baseu: &Url, userid: &str, avatar: &str) -> Result<String
return Ok(String::new());
}
- let dest = cache_dir_path("", &userid)?;
- thumb(baseu, &avatar, Some(&dest))
+ let dest = cache_dir_path(None, &userid)?;
+ dw_media(
+ baseu,
+ &avatar,
+ ContentType::default_thumbnail(),
+ Some(&dest),
+ )
}
diff --git a/fractal-matrix-api/src/globals.rs b/fractal-matrix-api/src/globals.rs
index 327d65c8..e455724f 100644
--- a/fractal-matrix-api/src/globals.rs
+++ b/fractal-matrix-api/src/globals.rs
@@ -4,7 +4,6 @@ use regex::Regex;
pub static TIMEOUT: u64 = 80;
pub static PAGE_LIMIT: i32 = 40;
pub static ROOM_DIRECTORY_LIMIT: i32 = 20;
-pub static THUMBNAIL_SIZE: i32 = 128;
pub static DEVICE_NAME: &str = "Fractal";
lazy_static! {
diff --git a/fractal-matrix-api/src/util.rs b/fractal-matrix-api/src/util.rs
index 2e027353..0d52384d 100644
--- a/fractal-matrix-api/src/util.rs
+++ b/fractal-matrix-api/src/util.rs
@@ -146,6 +146,24 @@ macro_rules! query {
};
}
+pub enum ContentType {
+ Download,
+ Thumbnail(i32, i32),
+}
+
+impl ContentType {
+ pub fn default_thumbnail() -> Self {
+ ContentType::Thumbnail(128, 128)
+ }
+
+ pub fn is_thumbnail(&self) -> bool {
+ match self {
+ ContentType::Download => false,
+ ContentType::Thumbnail(_, _) => true,
+ }
+ }
+}
+
pub fn parse_m_direct(events: &Vec<JsonValue>) -> HashMap<String, Vec<String>> {
events
.iter()
@@ -183,22 +201,24 @@ pub fn get_prev_batch_from(
Ok(prev_batch)
}
-pub fn resolve_media_url(base: &Url, url: &str, thumb: bool, w: i32, h: i32) -> Result<Url, Error> {
+pub fn resolve_media_url(base: &Url, url: &str, media_type: ContentType) -> Result<Url, Error> {
let caps = globals::MATRIX_RE
.captures(url)
.ok_or(Error::BackendError)?;
let server = String::from(&caps["server"]);
let media = String::from(&caps["media"]);
- let mut params: Vec<(&str, String)> = vec![];
-
- let path = if thumb {
- params.push(("width", format!("{}", w)));
- params.push(("height", format!("{}", h)));
- params.push(("method", String::from("scale")));
- format!("thumbnail/{}/{}", server, media)
+ let (params, path) = if let ContentType::Thumbnail(w, h) = media_type {
+ (
+ vec![
+ ("width", w.to_string()),
+ ("height", h.to_string()),
+ ("method", String::from("scale")),
+ ],
+ format!("thumbnail/{}/{}", server, media),
+ )
} else {
- format!("download/{}/{}", server, media)
+ (vec![], format!("download/{}/{}", server, media))
};
media_url(base, &path, ¶ms)
@@ -207,10 +227,8 @@ pub fn resolve_media_url(base: &Url, url: &str, thumb: bool, w: i32, h: i32) ->
pub fn dw_media(
base: &Url,
url: &str,
- thumb: bool,
+ media_type: ContentType,
dest: Option<&str>,
- w: i32,
- h: i32,
) -> Result<String, Error> {
let caps = globals::MATRIX_RE
.captures(url)
@@ -218,21 +236,23 @@ pub fn dw_media(
let server = String::from(&caps["server"]);
let media = String::from(&caps["media"]);
- let mut params: Vec<(&str, String)> = vec![];
-
- let path = if thumb {
- params.push(("width", format!("{}", w)));
- params.push(("height", format!("{}", h)));
- params.push(("method", String::from("crop")));
- format!("thumbnail/{}/{}", server, media)
+ let (params, path) = if let ContentType::Thumbnail(w, h) = media_type {
+ (
+ vec![
+ ("width", w.to_string()),
+ ("height", h.to_string()),
+ ("method", String::from("crop")),
+ ],
+ format!("thumbnail/{}/{}", server, media),
+ )
} else {
- format!("download/{}/{}", server, media)
+ (vec![], format!("download/{}/{}", server, media))
};
let url = media_url(base, &path, ¶ms)?;
let fname = match dest {
- None if thumb => cache_dir_path(Some("thumbs"), &media)?,
+ None if media_type.is_thumbnail() => cache_dir_path(Some("thumbs"), &media)?,
None => cache_dir_path(Some("medias"), &media)?,
Some(d) => String::from(d),
};
@@ -240,21 +260,6 @@ pub fn dw_media(
download_file(url.as_str(), fname, dest)
}
-pub fn media(base: &Url, url: &str, dest: Option<&str>) -> Result<String, Error> {
- dw_media(base, url, false, dest, 0, 0)
-}
-
-pub fn thumb(base: &Url, url: &str, dest: Option<&str>) -> Result<String, Error> {
- dw_media(
- base,
- url,
- true,
- dest,
- globals::THUMBNAIL_SIZE,
- globals::THUMBNAIL_SIZE,
- )
-}
-
pub fn download_file(url: &str, fname: String, dest: Option<&str>) -> Result<String, Error> {
let fpath = Path::new(&fname);
@@ -339,7 +344,7 @@ pub fn get_user_avatar(base: &Url, userid: &str) -> Result<(String, String), Err
.avatar_url
.map(|url| {
let dest = cache_dir_path(None, userid)?;
- thumb(base, &url, Some(&dest))
+ dw_media(base, &url, ContentType::default_thumbnail(), Some(&dest))
})
.unwrap_or(Ok(Default::default()))?;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]