#!/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/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