From f0f6df63b64415d4591564c99f42362d1c526265 Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Fri, 12 Apr 2024 17:49:36 -0400 Subject: Sixel previews with lf --- .config/lf/scope | 130 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 85 insertions(+), 45 deletions(-) (limited to '.config/lf') diff --git a/.config/lf/scope b/.config/lf/scope index cc55669..139a5af 100755 --- a/.config/lf/scope +++ b/.config/lf/scope @@ -1,56 +1,96 @@ #!/bin/sh -# File preview handler for lf. - set -C -f -IFS="$(printf '%b_' '\n')"; IFS="${IFS%_}" - -image() { - if [ -f "$1" ] && [ -n "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && command -V ueberzug >/dev/null 2>&1; then - printf '{"action": "add", "identifier": "PREVIEW", "x": "%s", "y": "%s", "width": "%s", "height": "%s", "scaler": "contain", "path": "%s"}\n' "$4" "$5" "$(($2-1))" "$(($3-1))" "$1" > "$FIFO_UEBERZUG" - else - mediainfo "$6" - fi +IFS="$(printf '%b_' '\n')" +IFS="${IFS%_}" + +PREVIEW_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/lf" +PREVIEW_WIDTH=600 # px + +# TODO: Render in the original width when it's smaller than PREVIEW_WIDTH + +# PrefixGen: generates a hash prefix for the given file +# This is a unique identifier for the file to preview +PrefixGen() { + sha256sum "$(readlink -f "$1")" | cut -d' ' -f1 } -ifub() { - [ -n "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && command -V ueberzug >/dev/null 2>&1 +# SuffixGen: generates a hash suffix for the given file +# This suffix is used to determine if the preview is outdated +SuffixGen() { + stat -Lc "%Y" "$1" } -# Note that the cache file name is a function of file information, meaning if -# an image appears in multiple places across the machine, it will not have to -# be regenerated once seen. +# Prevent recursive thumbnails (if the file ends in .six) +[ "${1##*.}" = "six" ] && cat "$1" && exit 1 case "$(file --dereference --brief --mime-type -- "$1")" in - image/avif) CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" - [ ! -f "$CACHE" ] && convert "$1" "$CACHE.jpg" - image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" ;; - image/vnd.djvu) - CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" - [ ! -f "$CACHE" ] && djvused "$1" -e 'select 1; save-page-with /dev/stdout' | convert -density 200 - "$CACHE.jpg" > /dev/null 2>&1 - image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" ;; - image/*) image "$1" "$2" "$3" "$4" "$5" "$1" ;; - text/html) lynx -width="$4" -display_charset=utf-8 -dump "$1" ;; - text/troff) man ./ "$1" | col -b ;; - text/* | */xml | application/json | application/x-ndjson) bat --terminal-width "$(($4-2))" -f "$1" ;; - audio/* | application/octet-stream) mediainfo "$1" || exit 1 ;; - video/* ) - CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" - [ ! -f "$CACHE" ] && ffmpegthumbnailer -i "$1" -o "$CACHE" -s 0 - image "$CACHE" "$2" "$3" "$4" "$5" "$1" - ;; - */pdf) - CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" - [ ! -f "$CACHE.jpg" ] && pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE" - image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" - ;; - */epub+zip|*/mobi*) - CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" - [ ! -f "$CACHE.jpg" ] && gnome-epub-thumbnailer "$1" "$CACHE.jpg" - image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" - ;; - application/*zip) atool --list -- "$1" ;; - *opendocument*) odt2txt "$1" ;; - application/pgp-encrypted) gpg -d -- "$1" ;; +text/html) + lynx -width="$4" -display_charset=utf-8 -dump "$1" + ;; +text/troff) + man ./ "$1" | col -b + ;; +text/* | */xml | application/json | application/x-ndjson) + bat --terminal-width "$(($4 - 2))" -f "$1" + ;; +audio/* | application/octet-stream) + mediainfo "$1" || exit 1 + ;; +image/vnd.djvu) + prefix="$(PrefixGen "$1")" + suffix="$(SuffixGen "$1")" + filename="$prefix-$suffix" + [ ! -f "$PREVIEW_DIR/$filename.six" ] && { + rm -f "$PREVIEW_DIR/$prefix-*" + djvused "$1" -e 'select 1; save-page-with /dev/stdout' | + convert djvu:- png:- | + img2sixel -S -E size -q high -w $PREVIEW_WIDTH -o "$PREVIEW_DIR/$filename.six" + } + cat "$PREVIEW_DIR/$filename.six" + ;; +image/*) + prefix="$(PrefixGen "$1")" + suffix="$(SuffixGen "$1")" + filename="$prefix-$suffix" + [ ! -f "$PREVIEW_DIR/$filename.six" ] && { + rm -f "$PREVIEW_DIR/$prefix-*" + img2sixel -S -E size -q high -w $PREVIEW_WIDTH "$1" -o "$PREVIEW_DIR/$filename.six" + } + cat "$PREVIEW_DIR/$filename.six" + ;; +*/pdf) + prefix="$(PrefixGen "$1")" + suffix="$(SuffixGen "$1")" + filename="$prefix-$suffix" + [ ! -f "$PREVIEW_DIR/$filename.six" ] && { + rm -f "$PREVIEW_DIR/$prefix-*" + pdftocairo -singlefile -scale-to-x $PREVIEW_WIDTH -scale-to-y -1 -png "$1" - | + img2sixel -S -E size -q high -o "$PREVIEW_DIR/$filename.six" + } + cat "$PREVIEW_DIR/$filename.six" + ;; +video/*) + prefix="$(PrefixGen "$1")" + suffix="$(SuffixGen "$1")" + filename="$prefix-$suffix" + # XXX: thumbnail seems to get re-generated every time the file is selected + [ ! -f "$PREVIEW_DIR/$filename.six" ] && { + rm -f "$PREVIEW_DIR/$prefix-*" + ffmpegthumbnailer -i "$1" -s 0 -c png -f -o - | + img2sixel -S -E size -q high -w $PREVIEW_WIDTH -o "$PREVIEW_DIR/$filename.six" + } + cat "$PREVIEW_DIR/$filename.six" + ;; +application/*zip) + atool --list -- "$1" + ;; +*opendocument*) + odt2txt "$1" + ;; +application/pgp-encrypted) + gpg -d -- "$1" + ;; esac + exit 1 -- cgit v1.2.3