[+] Add thumbnailers to generatro
This commit is contained in:
@@ -12,6 +12,7 @@ use std::io::{BufReader};
|
|||||||
use xdg_mime::{SharedMimeInfo};
|
use xdg_mime::{SharedMimeInfo};
|
||||||
use anyhow::{Result};
|
use anyhow::{Result};
|
||||||
use serde::{de, Deserialize, ser, Serialize};
|
use serde::{de, Deserialize, ser, Serialize};
|
||||||
|
use crate::thumbnailer::{Thumbnailers};
|
||||||
|
|
||||||
const DOT_PATH: &str = ".meow_index";
|
const DOT_PATH: &str = ".meow_index";
|
||||||
|
|
||||||
@@ -24,12 +25,13 @@ pub struct ReturnPath {
|
|||||||
|
|
||||||
pub struct Generator {
|
pub struct Generator {
|
||||||
pub(crate) mime_db: SharedMimeInfo,
|
pub(crate) mime_db: SharedMimeInfo,
|
||||||
|
pub(crate) thumbnailers: Thumbnailers,
|
||||||
pub(crate) base: PathBuf,
|
pub(crate) base: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Generator {
|
impl Generator {
|
||||||
pub fn new(base: PathBuf) -> Generator {
|
pub fn new(base: PathBuf) -> Result<Generator> {
|
||||||
Generator { mime_db: SharedMimeInfo::new(), base }
|
Ok(Generator { mime_db: SharedMimeInfo::new(), thumbnailers: Thumbnailers::load_all()?, base })
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the same file location in DOT_PATH directory
|
/// Get the same file location in DOT_PATH directory
|
||||||
@@ -76,5 +78,63 @@ impl Generator {
|
|||||||
Ok(())
|
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<ReturnPath> = 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(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ extern crate pretty_env_logger;
|
|||||||
fn main() {
|
fn main() {
|
||||||
pretty_env_logger::init();
|
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 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)
|
let mime = gen.get_mime(&path)
|
||||||
|
|||||||
Reference in New Issue
Block a user