add image previews

feat/vaults
Tomáš Mládek 2022-01-24 17:04:27 +01:00
parent b0b06a6ea0
commit d508cd0a74
5 changed files with 213 additions and 7 deletions

167
Cargo.lock generated
View File

@ -364,6 +364,12 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "adler32"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
[[package]]
name = "ahash"
version = "0.7.6"
@ -536,6 +542,12 @@ version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72feb31ffc86498dacdbd0fcebb56138e7177a8cc5cea4516031d15ae85a742e"
[[package]]
name = "bytemuck"
version = "1.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "439989e6b8c38d1b6570a384ef1e49c8848128f5a97f3914baef02920842712f"
[[package]]
name = "byteorder"
version = "1.4.3"
@ -568,6 +580,9 @@ name = "cc"
version = "1.0.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee"
dependencies = [
"jobserver",
]
[[package]]
name = "cfg-if"
@ -610,6 +625,12 @@ dependencies = [
"vec_map",
]
[[package]]
name = "color_quant"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]]
name = "const_fn"
version = "0.4.8"
@ -728,6 +749,16 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]]
name = "deflate"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
dependencies = [
"adler32",
"byteorder",
]
[[package]]
name = "derive_more"
version = "0.99.17"
@ -882,7 +913,7 @@ dependencies = [
"cfg-if 1.0.0",
"crc32fast",
"libc",
"miniz_oxide",
"miniz_oxide 0.4.4",
]
[[package]]
@ -1035,6 +1066,16 @@ dependencies = [
"wasi 0.10.2+wasi-snapshot-preview1",
]
[[package]]
name = "gif"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3a7187e78088aead22ceedeee99779455b23fc231fe13ec443f99bb71694e5b"
dependencies = [
"color_quant",
"weezl",
]
[[package]]
name = "h2"
version = "0.2.7"
@ -1127,6 +1168,25 @@ dependencies = [
"unicode-normalization",
]
[[package]]
name = "image"
version = "0.23.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
dependencies = [
"bytemuck",
"byteorder",
"color_quant",
"gif",
"jpeg-decoder",
"num-iter",
"num-rational",
"num-traits",
"png",
"scoped_threadpool",
"tiff",
]
[[package]]
name = "indexmap"
version = "1.7.0"
@ -1188,6 +1248,24 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
[[package]]
name = "jobserver"
version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa"
dependencies = [
"libc",
]
[[package]]
name = "jpeg-decoder"
version = "0.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2"
dependencies = [
"rayon",
]
[[package]]
name = "js-sys"
version = "0.3.55"
@ -1259,6 +1337,15 @@ dependencies = [
"vcpkg",
]
[[package]]
name = "libwebp-sys"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e70c064738b35a28fd6f991d27c0d9680353641d167ae3702a8228dd8272ef6"
dependencies = [
"cc",
]
[[package]]
name = "linked-hash-map"
version = "0.5.4"
@ -1377,6 +1464,15 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435"
dependencies = [
"adler32",
]
[[package]]
name = "miniz_oxide"
version = "0.4.4"
@ -1508,6 +1604,28 @@ dependencies = [
"num-traits",
]
[[package]]
name = "num-iter"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]]
name = "num-rational"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]]
name = "num-traits"
version = "0.2.14"
@ -1654,6 +1772,18 @@ version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe"
[[package]]
name = "png"
version = "0.16.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6"
dependencies = [
"bitflags",
"crc32fast",
"deflate",
"miniz_oxide 0.3.7",
]
[[package]]
name = "ppv-lite86"
version = "0.2.16"
@ -1910,6 +2040,12 @@ dependencies = [
"parking_lot",
]
[[package]]
name = "scoped_threadpool"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
[[package]]
name = "scopeguard"
version = "1.1.0"
@ -2167,6 +2303,17 @@ dependencies = [
"num_cpus",
]
[[package]]
name = "tiff"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437"
dependencies = [
"jpeg-decoder",
"miniz_oxide 0.4.4",
"weezl",
]
[[package]]
name = "time"
version = "0.1.43"
@ -2464,6 +2611,7 @@ dependencies = [
"env_logger",
"filebuffer",
"futures-util",
"image",
"is_executable",
"lazy_static",
"lexpr",
@ -2485,6 +2633,7 @@ dependencies = [
"uuid",
"walkdir",
"webbrowser",
"webp",
"xdg",
]
@ -2663,6 +2812,22 @@ dependencies = [
"winapi 0.3.9",
]
[[package]]
name = "webp"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0041a9fcbdbf6402c3cb0ec7c2c1a1c240efd523519a0763ae07753bc95f7713"
dependencies = [
"image",
"libwebp-sys",
]
[[package]]
name = "weezl"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e"
[[package]]
name = "widestring"
version = "0.4.3"

View File

@ -64,7 +64,11 @@ webbrowser = { version = "^0.5.5", optional = true }
nonempty = "0.6.0"
actix-multipart = "0.3.0"
image = { version = "0.23.14", optional = true }
webp = { version = "0.2.0", optional = true }
[features]
default = ["desktop", "previews"]
default = ["desktop", "previews", "previews-image"]
desktop = ["webbrowser", "opener", "is_executable"]
previews = []
previews-image = ["image", "webp"]

32
src/previews/image.rs Normal file
View File

@ -0,0 +1,32 @@
#[cfg(feature = "previews-image")]
use image::{io::Reader as ImageReader, GenericImageView};
use std::{cmp, path::Path};
use anyhow::Result;
use super::Previewable;
pub struct ImagePath<'a>(pub &'a Path);
impl<'a> Previewable for ImagePath<'a> {
fn get_thumbnail(&self) -> Result<Vec<u8>> {
#[cfg(feature = "previews-image")]
{
let image = ImageReader::open(&self.0)?.decode()?;
let (w, h) = image.dimensions();
let thumbnail = if cmp::max(w, h) > 1024 {
image.thumbnail(1024, 1024)
} else {
image
};
let thumbnail = thumbnail.into_rgba8();
let (w, h) = thumbnail.dimensions();
let encoder = webp::Encoder::from_rgba(&thumbnail, w, h);
let result = encoder.encode(90.0);
Ok(result.to_vec())
}
#[cfg(not(feature = "previews-image"))]
Err(anyhow!("Image preview support not enabled!"))
}
}

View File

@ -9,10 +9,11 @@ use std::{
sync::{Arc, Mutex},
};
use self::image::ImagePath;
use self::text::TextPath;
use self::video::VideoPath;
pub mod image;
pub mod text;
pub mod video;
@ -57,12 +58,16 @@ impl PreviewStore {
let connection = self.db.connection()?;
let files = connection.retrieve_file(hash)?;
if let Some(file) = files.get(0) {
let data = match tree_magic_mini::from_filepath(&file.path) {
Some(tm) if tm.starts_with("text") => Ok(TextPath(&file.path).get_thumbnail()?),
Some(tm) if tm.starts_with("video") => Ok(VideoPath(&file.path).get_thumbnail()?),
Some(tm) if tm.starts_with("video") => {
Ok(VideoPath(&file.path).get_thumbnail()?)
}
Some(tm) if tm.starts_with("image") => {
Ok(ImagePath(&file.path).get_thumbnail()?)
}
Some(unknown) => Err(anyhow!("No capability for {:?} thumbnails.", unknown)),
_ => Err(anyhow!("Unknown file type, or file doesn't exist."))
_ => Err(anyhow!("Unknown file type, or file doesn't exist.")),
}?;
std::fs::create_dir_all(&self.path)?;

View File

@ -37,7 +37,7 @@
{/if}
{#if mimeType?.startsWith("image")}
<a target="_blank" href="/api/raw/{address}">
<img src="/api/raw/{address}" alt={address} />
<img src="/api/thumb/{address}" alt={address} />
</a>
{/if}
{#if mimeType?.startsWith("model")}