72 lines
2.8 KiB
Bash
Executable file
72 lines
2.8 KiB
Bash
Executable file
#!/bin/sh
|
|
FILE_PATH="$1"
|
|
w="$2"
|
|
h="$3"
|
|
x="$4"
|
|
y="$5"
|
|
|
|
CACHE_DIR="$HOME/.cache/lf/thumbnail"
|
|
mkdir -p "$CACHE_DIR"
|
|
|
|
CACHE_BASE="$CACHE_DIR/$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$FILE_PATH")" | sha256sum | awk '{print $1}')"
|
|
|
|
get_cell_size() {
|
|
size_info=$(kitten @ get-window-size --self)
|
|
cell_w=$(echo "$size_info" | awk 'BEGIN{RS="[{} ,]"} /"xpixels"/{gsub(/"/,"",$0); split($0,a,":"); x=a[2]} /"cols"/{gsub(/"/,"",$0); split($0,a,":"); c=a[2]} END{if(c) print int(x/c); else print 8}')
|
|
cell_h=$(echo "$size_info" | awk 'BEGIN{RS="[{} ,]"} /"ypixels"/{gsub(/"/,"",$0); split($0,a,":"); y=a[2]} /"rows"/{gsub(/"/,"",$0); split($0,a,":"); r=a[2]} END{if(r) print int(y/r); else print 16}')
|
|
}
|
|
|
|
draw() {
|
|
kitten icat --stdin no --transfer-mode memory --place "${w}x${h}@${x}x${y}" "$1" </dev/null >/dev/tty
|
|
exit 1
|
|
}
|
|
|
|
get_cell_size
|
|
preview_px_w=$((w * ${cell_w:-8} - 16))
|
|
preview_px_h=$((h * ${cell_h:-16} - 16))
|
|
PREVIEW_LINE_COUNT=200
|
|
|
|
mime_type=$(file -Lb --mime-type "$FILE_PATH")
|
|
|
|
case "$mime_type" in
|
|
image/gif | video/*)
|
|
if [ "$(stat -c %Y "$FILE_PATH" 2>/dev/null || echo 0)" -gt "$(stat -c %Y "${CACHE_BASE}.jpg" 2>/dev/null || echo 0)" ]; then
|
|
ffmpeg -y -i "$FILE_PATH" -vf "select=eq(n\,0),scale=${preview_px_w}:-1" -vframes 1 "${CACHE_BASE}.jpg"
|
|
fi
|
|
draw "${CACHE_BASE}.jpg"
|
|
;;
|
|
image/svg+xml | image/svg)
|
|
if [ "$(stat -c %Y "$FILE_PATH")" -gt "$(stat -c %Y "${CACHE_BASE}.png" 2>/dev/null || echo 0)" ]; then
|
|
rsvg-convert --keep-aspect-ratio --width "$preview_px_w" --format=png "$FILE_PATH" -o "${CACHE_BASE}.png"
|
|
fi
|
|
draw "${CACHE_BASE}.png"
|
|
;;
|
|
image/*)
|
|
draw "$FILE_PATH"
|
|
;;
|
|
application/pdf)
|
|
if [ "$(stat -c %Y "$FILE_PATH")" -gt "$(stat -c %Y "${CACHE_BASE}.jpg" 2>/dev/null || echo 0)" ]; then
|
|
pdftoppm -f 1 -l 1 -scale-to-x "$preview_px_w" -scale-to-y -1 -singlefile -jpeg -- "$FILE_PATH" "${CACHE_BASE}"
|
|
fi
|
|
draw "${CACHE_BASE}.jpg"
|
|
;;
|
|
application/epub+zip | application/x-mobipocket-ebook)
|
|
if [ "$(stat -c %Y "$FILE_PATH")" -gt "$(stat -c %Y "${CACHE_BASE}.png" 2>/dev/null || echo 0)" ]; then
|
|
gnome-epub-thumbnailer -s "$preview_px_w" "$FILE_PATH" "${CACHE_BASE}.png" 2>/dev/null || convert -size "${preview_px_w}x${preview_px_w}" xc:gray "${CACHE_BASE}.png"
|
|
fi
|
|
[ -f "${CACHE_BASE}.png" ] && draw "${CACHE_BASE}.png"
|
|
;;
|
|
audio/*)
|
|
if [ "$(stat -c %Y "$FILE_PATH")" -gt "$(stat -c %Y "${CACHE_BASE}.jpg" 2>/dev/null || echo 0)" ]; then
|
|
ffmpeg -y -i "$FILE_PATH" -an -vcodec copy "${CACHE_BASE}.jpg" 2>/dev/null || convert -size "${preview_px_w}x${preview_px_w}" xc:gray "${CACHE_BASE}.jpg"
|
|
fi
|
|
draw "${CACHE_BASE}.jpg"
|
|
;;
|
|
*)
|
|
nvim --headless -u NONE \
|
|
-c "luafile $XDG_CONFIG_HOME/lf/lf.lua" \
|
|
-c "lua lf.setup()" \
|
|
-c "lua lf.preview([[${FILE_PATH}]], ${PREVIEW_LINE_COUNT})" \
|
|
-c "quitall!"
|
|
;;
|
|
esac
|