From b552b922fa4a81d36455cc33260ed2c77b9ea365 Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Wed, 19 Feb 2020 21:30:12 -0800 Subject: [PATCH] Finish implementation of option parameter resize. --- Cargo.lock | 116 +++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 5 +++ src/library.rs | 27 +++++++----- src/web.rs | 5 +-- 4 files changed, 139 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 56e2752..214591b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -140,6 +140,18 @@ dependencies = [ "byte-tools", ] +[[package]] +name = "bstr" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502ae1441a0a5adb8fbd38a5955a6416b9493e92b465de5e4a9bde6a539c2c48" +dependencies = [ + "lazy_static 1.4.0", + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "buf_redux" version = "0.8.4" @@ -206,6 +218,15 @@ dependencies = [ "ppv-lite86", ] +[[package]] +name = "cast" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" +dependencies = [ + "rustc_version 0.2.3", +] + [[package]] name = "cc" version = "1.0.50" @@ -308,6 +329,41 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "criterion" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc755679c12bda8e5523a71e4d654b6bf2e14bd838dfc48cde6559a05caf7d1" +dependencies = [ + "atty", + "cast", + "clap", + "criterion-plot", + "csv", + "itertools", + "lazy_static 1.4.0", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01e15e0ea58e8234f96146b1f91fa9d0e4dd7a38da93ff7a75d42c0b9d3a545" +dependencies = [ + "cast", + "itertools", +] + [[package]] name = "crossbeam-deque" version = "0.7.2" @@ -353,6 +409,28 @@ dependencies = [ "lazy_static 1.4.0", ] +[[package]] +name = "csv" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" +dependencies = [ + "bstr", + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + [[package]] name = "ct-logs" version = "0.6.0" @@ -1333,6 +1411,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" +[[package]] +name = "oorandom" +version = "11.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcec7c9c2a95cacc7cd0ecb89d8a8454eca13906f6deb55258ffff0adeb9405" + [[package]] name = "opaque-debug" version = "0.2.3" @@ -1459,6 +1543,7 @@ dependencies = [ name = "photosync" version = "0.1.0" dependencies = [ + "criterion", "google-photoslibrary1", "google_api_auth", "hexihasher", @@ -1518,6 +1603,18 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" +[[package]] +name = "plotters" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e3bb8da247d27ae212529352020f3e5ee16e83c0c258061d27b08ab92675eeb" +dependencies = [ + "js-sys", + "num-traits", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "png" version = "0.15.3" @@ -1875,6 +1972,15 @@ dependencies = [ "thread_local 1.0.1", ] +[[package]] +name = "regex-automata" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" +dependencies = [ + "byteorder 1.3.4", +] + [[package]] name = "regex-syntax" version = "0.6.14" @@ -2454,6 +2560,16 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "tinytemplate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a3c6667d3e65eb1bc3aed6fd14011c6cbc3a0665218ab7f5daf040b9ec371a" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "tokio" version = "0.1.22" diff --git a/Cargo.toml b/Cargo.toml index 9d82a8c..83c23ee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,3 +32,8 @@ version = "0.7.0" [dev-dependencies] tempdir = "0.3.7" +criterion = "0.3" + +#[[bench]] +#name = "image" +#harness = false diff --git a/src/library.rs b/src/library.rs index 7d95493..47deebe 100644 --- a/src/library.rs +++ b/src/library.rs @@ -7,6 +7,7 @@ use std::sync::Arc; use google_photoslibrary1 as photos; use image::imageops::FilterType; +use image::GenericImageView; use image::ImageFormat; use log::error; use log::info; @@ -18,7 +19,7 @@ use rocksdb::IteratorMode; use rocksdb::DB; // Used to ensure DB is invalidated after schema changes. -const LIBRARY_GENERATION: &'static str = "11"; +const LIBRARY_GENERATION: &'static str = "12"; #[derive(Clone)] pub struct Library { @@ -154,8 +155,7 @@ impl Library { pub fn generate_thumbnail( &self, media_items_id: &str, - w: Option, - h: Option, + (w, h): (Option, Option), filter: FilterType, ) -> Result, io::Error> { match self.original(&media_items_id) { @@ -176,6 +176,7 @@ impl Library { (Some(w), Some(h)) => (w, h), (Some(w), None) => (w, orig_h * w / orig_w), (None, Some(h)) => (orig_w * h / orig_h, h), + (None, None) => (orig_w, orig_h), }; let img = orig_img.resize_to_fill(w, h, filter); let mut buf = Vec::new(); @@ -185,13 +186,19 @@ impl Library { } } } - pub fn thumbnail(&self, media_items_id: &str, dimensions: (u32, u32)) -> Option> { - fn cache_key(media_items_id: &str, dimensions: (u32, u32)) -> String { - let (w, h) = dimensions; - Library::generational_key( - LIBRARY_GENERATION, - &format!("{}-w={}-h={}", media_items_id, w, h), - ) + pub fn thumbnail( + &self, + media_items_id: &str, + dimensions: (Option, Option), + ) -> Option> { + fn cache_key(media_items_id: &str, dimensions: (Option, Option)) -> String { + let dim = match dimensions { + (Some(w), Some(h)) => format!("-w={}-h={}", w, h), + (Some(w), None) => format!("-w={}", w), + (None, Some(h)) => format!("-h={}", h), + (None, None) => "".to_string(), + }; + Library::generational_key(LIBRARY_GENERATION, &format!("{}{}", media_items_id, dim)) } let key = cache_key(media_items_id, dimensions); let db = self.cache_db.clone(); diff --git a/src/web.rs b/src/web.rs index fed5daf..fcc7f1e 100644 --- a/src/web.rs +++ b/src/web.rs @@ -81,10 +81,7 @@ fn image( params: ImageParams, ) -> Result { // TODO(wathiede): add caching headers. - match lib.thumbnail( - &media_items_id, - (params.w.unwrap_or(0), params.h.unwrap_or(0)), - ) { + match lib.thumbnail(&media_items_id, (params.w, params.h)) { None => { warn!("Couldn't find original {}", &media_items_id); Err(warp::reject::not_found())