mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
fix: does not generate the necessary PDF cache when max_width is set too large (#28)
This commit is contained in:
parent
e52547de10
commit
575b7d7090
4 changed files with 21 additions and 10 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
use std::path::{Path, PathBuf};
|
use std::{path::{Path, PathBuf}, sync::Arc};
|
||||||
|
|
||||||
use anyhow::{Error, Result};
|
use anyhow::Result;
|
||||||
use config::PREVIEW;
|
use config::PREVIEW;
|
||||||
use image::{imageops::FilterType, DynamicImage, ImageFormat};
|
use image::{imageops::FilterType, DynamicImage, ImageFormat};
|
||||||
use md5::{Digest, Md5};
|
use md5::{Digest, Md5};
|
||||||
|
|
@ -30,20 +30,31 @@ impl Image {
|
||||||
img.await?
|
img.await?
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn precache(img: Vec<u8>, cache: PathBuf) -> Result<()> {
|
pub async fn precache(img: Arc<Vec<u8>>, cache: impl AsRef<Path>) -> Result<bool> {
|
||||||
|
let cache = cache.as_ref().to_owned();
|
||||||
let result = tokio::task::spawn_blocking(move || {
|
let result = tokio::task::spawn_blocking(move || {
|
||||||
let img = image::load_from_memory(&img)?;
|
let img = image::load_from_memory(&img)?;
|
||||||
let (w, h) = (PREVIEW.max_width, PREVIEW.max_height);
|
let (w, h) = (PREVIEW.max_width, PREVIEW.max_height);
|
||||||
|
|
||||||
if img.width() > w || img.height() > h {
|
if img.width() <= w && img.height() <= h {
|
||||||
img.resize(w, h, FilterType::Triangle).save_with_format(cache, ImageFormat::Jpeg)?;
|
return Ok(false);
|
||||||
}
|
}
|
||||||
Ok::<(), Error>(())
|
|
||||||
|
img.resize(w, h, FilterType::Triangle).save_with_format(cache, ImageFormat::Jpeg)?;
|
||||||
|
Ok(true)
|
||||||
});
|
});
|
||||||
|
|
||||||
result.await?
|
result.await?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub async fn precache_anyway(img: Arc<Vec<u8>>, cache: impl AsRef<Path>) -> Result<()> {
|
||||||
|
Ok(match Self::precache(img.clone(), &cache).await {
|
||||||
|
Ok(true) => (),
|
||||||
|
_ => fs::write(cache, &*img).await?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn cache(path: &Path) -> PathBuf {
|
pub fn cache(path: &Path) -> PathBuf {
|
||||||
format!("/tmp/yazi/{:x}", Md5::new_with_prefix(path.to_string_lossy().as_bytes()).finalize())
|
format!("/tmp/yazi/{:x}", Md5::new_with_prefix(path.to_string_lossy().as_bytes()).finalize())
|
||||||
|
|
|
||||||
4
core/src/external/pdftoppm.rs
vendored
4
core/src/external/pdftoppm.rs
vendored
|
|
@ -4,7 +4,7 @@ use adaptor::Image;
|
||||||
use anyhow::{bail, Result};
|
use anyhow::{bail, Result};
|
||||||
use tokio::process::Command;
|
use tokio::process::Command;
|
||||||
|
|
||||||
pub async fn pdftoppm(src: &Path, dest: &Path) -> Result<()> {
|
pub async fn pdftoppm(src: &Path, dest: impl AsRef<Path>) -> Result<()> {
|
||||||
let output = Command::new("pdftoppm")
|
let output = Command::new("pdftoppm")
|
||||||
.args(["-singlefile", "-jpeg", "-jpegopt", "quality=75"])
|
.args(["-singlefile", "-jpeg", "-jpegopt", "quality=75"])
|
||||||
.arg(src)
|
.arg(src)
|
||||||
|
|
@ -15,5 +15,5 @@ pub async fn pdftoppm(src: &Path, dest: &Path) -> Result<()> {
|
||||||
if !output.status.success() {
|
if !output.status.success() {
|
||||||
bail!("failed to generate PDF thumbnail: {}", String::from_utf8_lossy(&output.stderr));
|
bail!("failed to generate PDF thumbnail: {}", String::from_utf8_lossy(&output.stderr));
|
||||||
}
|
}
|
||||||
Ok(Image::precache(output.stdout, dest.to_path_buf()).await?)
|
Ok(Image::precache_anyway(output.stdout.into(), dest).await?)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ impl Precache {
|
||||||
return Ok(self.sch.send(TaskOp::Adv(task.id, 1, 0))?);
|
return Ok(self.sch.send(TaskOp::Adv(task.id, 1, 0))?);
|
||||||
}
|
}
|
||||||
if let Ok(img) = fs::read(&task.target).await {
|
if let Ok(img) = fs::read(&task.target).await {
|
||||||
Image::precache(img, cache).await.ok();
|
Image::precache(img.into(), cache).await.ok();
|
||||||
}
|
}
|
||||||
self.sch.send(TaskOp::Adv(task.id, 1, 0))?;
|
self.sch.send(TaskOp::Adv(task.id, 1, 0))?;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
{"words":["Punct","KEYMAP","splitn","crossterm","YAZI","unar","peekable","ratatui","syntect","pbpaste","pbcopy","ffmpegthumbnailer","oneshot","Posix","Lsar","XADDOS","zoxide","cands","Deque","precache","imageops","IFBLK","IFCHR","IFDIR","IFIFO","IFLNK","IFMT","IFSOCK","IRGRP","IROTH","IRUSR","ISGID","ISUID","ISVTX","IWGRP","IWOTH","IWUSR","IXGRP","IXOTH","IXUSR","libc","winsize","TIOCGWINSZ","xpixel","ypixel","ioerr","appender","Catppuccin","macchiato","gitmodules","Dotfiles","bashprofile","vimrc","flac","webp","exiftool","mediainfo","ripgrep","nvim","indexmap","indexmap","unwatch","canonicalize","serde","fsevent","Ueberzug","iterm","wezterm","sixel","chafa","ueberzugpp","️ Überzug","️ Überzug","Konsole","Alacritty","Überzug","pkgs","paru","unarchiver","pdftoppm","poppler","prebuild"],"language":"en","version":"0.2","flagWords":[]}
|
{"language":"en","flagWords":[],"words":["Punct","KEYMAP","splitn","crossterm","YAZI","unar","peekable","ratatui","syntect","pbpaste","pbcopy","ffmpegthumbnailer","oneshot","Posix","Lsar","XADDOS","zoxide","cands","Deque","precache","imageops","IFBLK","IFCHR","IFDIR","IFIFO","IFLNK","IFMT","IFSOCK","IRGRP","IROTH","IRUSR","ISGID","ISUID","ISVTX","IWGRP","IWOTH","IWUSR","IXGRP","IXOTH","IXUSR","libc","winsize","TIOCGWINSZ","xpixel","ypixel","ioerr","appender","Catppuccin","macchiato","gitmodules","Dotfiles","bashprofile","vimrc","flac","webp","exiftool","mediainfo","ripgrep","nvim","indexmap","indexmap","unwatch","canonicalize","serde","fsevent","Ueberzug","iterm","wezterm","sixel","chafa","ueberzugpp","️ Überzug","️ Überzug","Konsole","Alacritty","Überzug","pkgs","paru","unarchiver","pdftoppm","poppler","prebuild","singlefile","jpegopt"],"version":"0.2"}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue