dotfiles-ansible/roles/scripts/templates/preview.j2

204 lines
5.8 KiB
Django/Jinja

#!/bin/bash
_cache_thumbnail() {
thumbnail_dir="${XDG_CACHE_HOME:-$HOME/.cache}/thumbnails"
[ ! -d "${thumbnail_dir}" ] && mkdir -p "${thumbnail_dir}"
tmpfile="${thumbnail_dir}/$(stat -c '%n%i%F%s%Y' -- "$(readlink -f "$2")" | sha256sum | awk '{print $1}').jpg"
if [ ! -f "$tmpfile" ]; then
case "$1" in
video)
ffmpegthumbnailer -i "$2" -o "$tmpfile" -s 0
;;
font)
read -r -d '' font_preview_text <<-EOF
ABCDEFGHIJKLM
NOPQRSTUVWXYZ
abcdefghijklm
nopqrstuvwxyz
1234567890
!@$\%<>(){}[]
== != => <=
愛してるおかえりなさい
EOF
convert -size 900x900 xc:"{{ colors.background }}" \
-gravity center \
-pointsize 40 \
-font "$2" \
-fill "{{ colors.white2 }}" \
-annotate +0+0 "$font_preview_text" \
-flatten "$tmpfile"
;;
esac
fi
# Return the location
printf "%s" "$tmpfile"
}
_preview_markdown() {
mdcat "$1" || glow -s ~/.config/glow/styles/{{ theme }}.json "$1" || lowdown -t term "$1"
}
_preview_image() {
chafa --animate=off --polite=on --size="$2"x"$3" "$1" || exiftool "$1"
}
_preview_video() {
_preview_image "$(_cache_thumbnail video "$1")" "$2" "$3" || fprobe -hide_banner -pretty "$1" || exiftool "$1"
}
_preview_font() {
_preview_image "$(_cache_thumbnail font "$1")" "$2" "$3" || exiftool "$1"
}
# Take 2 additional arguments as width and height (rows/cols)
FILE="$1"
WIDTH="$2"
HEIGHT="$3"
mimetype=$(file --dereference --brief --mime-type -- "$FILE")
filename="$(basename "$FILE")"
if [[ $mimetype == inode/directory ]]; then
# Don't preview the inode ../
if [ -z "${FILE##*/..*}" ]; then
echo ""
else
lsd -1FAL --group-dirs first --icon always --color always "$FILE"
fi
exit
fi
if [[ $mimetype == @(image/vnd.djvu?(+multipage)|image/x-djvu) ]]; then
djvutxt "$FILE" || exiftool "$FILE"
exit
fi
if [[ $mimetype == image/* ]]; then
_preview_image "$FILE" "$WIDTH" "$HEIGHT"; exit
fi
if [[ $mimetype == video/* ]]; then
_preview_video "$FILE" "$WIDTH" "$HEIGHT"; exit
fi
if [[ $mimetype == audio/* ]]; then
fprobe -hide_banner -pretty "$FILE" || exiftool "$FILE"
exit
fi
if [[ $mimetype == @(font/*|application/x-font*|application/vnd.ms-opentype) ]]; then
_preview_font "$FILE" "$WIDTH" "$HEIGHT"; exit
fi
if [[ $mimetype == application/pdf ]]; then
mutool draw -F txt -i -- "$FILE" 1-10 || pdftotext -l 10 -nopgbrk -q -- "$FILE" - || exiftool "$FILE"
exit
fi
if [[ $mimetype == application/postscript ]]; then
pstotext "$FILE" || ps2ascii "$FILE" || exiftool "$FILE"
exit
fi
if [[ $mimetype == @(text/?(x-)troff|application/x-troff-*) ]]; then
man "$FILE" | col -b
exit
fi
if [[ $mimetype == application/vnd.oasis.opendocument.text* ]]; then
odt2txt "$FILE" || (pandoc -s -t markdown -- "$FILE" | _preview_markdown -)
exit
fi
if [[ $mimetype == application/epub+zip ]]; then
epub2txt "$FILE" || exiftool "$FILE"
exit
fi
if [[ $mimetype == @(application/x-fictionbook+xml|application/vnd.openxmlformats-officedocument.wordprocessingml.document) ]]; then
pandoc -s -t markdown -- "$FILE" | _preview_markdown -
exit
fi
if [[ $mimetype == application/x-bittorrent ]]; then
dumptorrent -v "$FILE" || transmission-show -- "$FILE" || exiftool "$FILE"
exit
fi
if [[ $mimetype == @(application/zip|application/zlib|application/java-archive|application/vnd.android.package-archive|application/x-zip*) ]]; then
zip -sf "$FILE" || zipinfo "$FILE" || bsdtar -tf "$FILE"
exit
fi
if [[ $filename == @(*.tar.@(zst|gz|lz|lzma|lzo|xz|Z)|*.tb2|*.tz2|*.tbz|*.tbz2|*.taz|*.tgz|*.tlz|*.txz|*.tZ|*.taZ|*.tzst) ]] || [[ $mimetype == @(application/x-?(g)tar*|application/*-compressed-tar) ]]; then
tar -tvf "$FILE" || bsdtar -tf "$FILE"
exit
fi
if [[ $mimetype == application/zstd ]]; then
zstd -l "$FILE"; exit
fi
if [[ $mimetype == @(application/x-xz*|application/*-xz-compressed) ]]; then
xz --list "$FILE" || bsdtar -tf "$FILE"
exit
fi
if [[ $mimetype == @(application/vnd.rar|application/vnd.comicbook-rar|application/x-rar*) ]]; then
unrar lt -p- -- "$FILE" || bsdtar -tf "$FILE"
exit
fi
if [[ $mimetype == application/x-7z-compressed ]]; then
7z l -p -- "$FILE" || bsdtar -tf "$FILE"
exit
fi
if [[ $mimetype == @(application/vnd.efi.iso|application/x-*-rom|application/x-compressed-iso|application/x*-iso?(9660)-?(app)image) ]]; then
isoinfo -f -i "$FILE" || bsdtar -tf "$FILE"
exit
fi
if [[ $mimetype == application/x-cpio* ]]; then
cpio -tF "$FILE" || bsdtar -tf "$FILE"
exit
fi
if [[ $mimetype == application/?(x-)gzip ]]; then
bsdtar -tf "$FILE" || gzip -l "$FILE"
exit
fi
if [[ $mimetype == @(application/vnd.ms-cab-compressed|application/x-archive|application/?(x-)bzip*|application/x-lzma|application/x-lzip|application/x-lha|application/x-lzh-compressed|application/x-lhz|application/x-lzop|application/x-lz4|application/x-lrzip) ]]; then
bsdtar -tf "$FILE"; exit
fi
if [[ $mimetype == application/x-ipynb+json ]]; then
notedown --from notebook "$FILE" --to markdown | _preview_markdown -
exit
fi
if [[ $mimetype == text/plain ]] && [[ $filename == *.json?(c|5) ]] || [[ $mimetype == @(application/json*|application/*+json) ]]; then
jq . "$FILE" | gojq -C . "$FILE" || jaq --color=always . "$FILE" || bat --style=plain --color=always "$FILE" || python3 -m json.tool -- "$FILE"
exit
fi
if [[ $mimetype == text/plain ]] && [[ $filename == *.@(md|mkd|markdown) ]] || [[ $mimetype == text/markdown ]]; then
_preview_markdown "$FILE"; exit
fi
if [[ $mimetype == @(text/*|application/javascript|application/xhtml+xml) ]]; then
bat --style plain --color=always "$FILE"; exit
fi
# Try to get something out of exiftool
# NOTE: exiftool always prints what it can retrieve to stdout, so suppress the message here
metadata="$(exiftool "$FILE")"
if ! (echo "$metadata" | awk -F':' '{print $1}' | grep -q '^Error'); then
echo "$metadata"
else
echo '----- File Type Classification -----' && file --dereference --brief -- "$FILE"
fi