[fractal] API, util.rs: dw_media() and resolve_media_url() refactor



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, &params)
@@ -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, &params)?;
 
     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]