From 83165256abf8b3833ea530fd9e0ec73719686c60 Mon Sep 17 00:00:00 2001 From: Azalea Gui Date: Thu, 23 Feb 2023 13:57:59 -0500 Subject: [PATCH] [+] Add thumbnailers to generatro --- backend/src/generator.rs | 64 ++++++++++++++++++++++++++++++++++++++-- backend/src/test.rs | 2 +- 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/backend/src/generator.rs b/backend/src/generator.rs index a19ad0e..62101d4 100644 --- a/backend/src/generator.rs +++ b/backend/src/generator.rs @@ -12,6 +12,7 @@ use std::io::{BufReader}; use xdg_mime::{SharedMimeInfo}; use anyhow::{Result}; use serde::{de, Deserialize, ser, Serialize}; +use crate::thumbnailer::{Thumbnailers}; const DOT_PATH: &str = ".meow_index"; @@ -24,12 +25,13 @@ pub struct ReturnPath { pub struct Generator { pub(crate) mime_db: SharedMimeInfo, + pub(crate) thumbnailers: Thumbnailers, pub(crate) base: PathBuf, } impl Generator { - pub fn new(base: PathBuf) -> Generator { - Generator { mime_db: SharedMimeInfo::new(), base } + pub fn new(base: PathBuf) -> Result { + Ok(Generator { mime_db: SharedMimeInfo::new(), thumbnailers: Thumbnailers::load_all()?, base }) } /// Get the same file location in DOT_PATH directory @@ -76,5 +78,63 @@ impl Generator { Ok(()) }) } + + /// Process a single file + pub fn get_thumb(&self, file: &PathBuf) -> Result<()> { + let dot = self.dot_path(&file); + let thumb = dot.with_extension("thumb.jpg"); + + if thumb.exists() { + match (thumb.metadata(), file.metadata()) { + // Thumbnail already up to date + (Ok(tm), Ok(fm)) => if tm.mtime() >= fm.mtime() { return Ok(()) }, + _ => {} + } + } + + // Generate new thumbnail + info!("Generating thumbnail for {}\nto {}", file.display(), thumb.display()); + + Ok(()) + } + + /// Process a directory + pub fn process_dir(&self, dir: &PathBuf) -> Result<()> { + // List files + let files: Vec<(DirEntry, Metadata)> = dir.to_owned().read_dir()? + .filter_map(|x| x.ok()) + .filter_map(|x| { + let meta = x.metadata(); + Some((x, meta.ok()?)) + }).collect(); + + // Recurse into directories + files.iter().for_each(|(f, m)| { + if f.path().is_dir() { + // Recurse into directory + let _ = self.process_dir(&f.path()); + } + }); + + // Check if directory listing needs update + let d_info = self.dot_path(&dir).with_extension(".json"); + let d_mtime = d_info.metadata()?.mtime(); + if files.iter().any(|(f, m)| m.mtime() > d_mtime) { + // Update directory listing + let paths: Vec = files.iter() + .filter_map(|(f, m)| Some(ReturnPath { + name: f.file_name().to_str()?.to_string(), + file_type: f.path().file_type().to_string(), + mtime: m.mtime(), + })).collect(); + + let json = serde_json::to_string(&paths)?; + // fs::write(d_info, json)?; + } + + + + Ok(()) + } } diff --git a/backend/src/test.rs b/backend/src/test.rs index 2f039b9..c2ad96e 100644 --- a/backend/src/test.rs +++ b/backend/src/test.rs @@ -13,7 +13,7 @@ extern crate pretty_env_logger; fn main() { pretty_env_logger::init(); - let gen = Generator::new("/data".into()); + let gen = Generator::new("/data".into()).unwrap(); let path: PathBuf = "/data/Anime/1977 Star Wars Collection/01 Star Wars Episode I The Phantom Menace - George Lucas 1999 Eng Subs 720p [H264-mp4].mp4".into(); let mime = gen.get_mime(&path)