#!/bin/bash # [b]rowse - overview of given files or current directory # depends: tput stat bat checkaccess # optdepends: timg, neovim (compressed files), pdftoppm (PDF), mtn (video) # args: files to inspect # # Supports: # - listing directories # - listing contents of any compressed file with neovim # - visual files are displayed with timg # video thumbnails via mtn, pdf pages from pdftoppm # - text files are displayed through bat # Automatically requests elevation through sudo when needed set -eo pipefail for last; do true; done last=${last:-.} checkperm() { checkaccess -r "$@" || elevate=sudo mime="$(test -n "$shifted" || $elevate file --dereference --mime "$@")" } checkperm "$last" fileinfo() { for arg do case "$arg" in (-*) continue;; esac tput setaf 4 && $elevate file -E "$arg" tput setaf 3 && $elevate stat --format '%A size %sB, birth %.10w mod %.10y' "$arg" done } prefix=/tmp/b mkdir -p "$prefix" declare -a timg bat ls for arg; do case "$arg" in (-*) args="$args $arg" continue;; esac checkperm "$arg" grid=$(expr $(tput cols) / 20) case "$mime" in (*\ application/pdf\;*) out="$prefix/$(basename "$arg")" test -f "$out-1.png" || pdftoppm -r 70 "$arg" "$out" -l $(expr $grid '*' 2) timg -W --grid=$grid "$out"* ;; (*\ video/*) suffix=_thumbs.jpg mtn -i -t -W -D6 -b 0,6 -c $grid -w $(expr $(tput cols) '*' 20) -O $prefix -o $suffix "$arg" 2>/dev/null timg -W "$prefix/$(basename "${arg%.*}")$suffix" ;; (*\ audio/*) img="$prefix/$arg.png" find "$img" -not -empty 2>/dev/null | grep --quiet . || audiowaveform --quiet --pixels-per-second 5 --height 40 --width 2000 \ --background-color 000000 --waveform-color 99BBFF --axis-label-color 000000 \ --input-filename "$arg" --output-format png >"$img" && timg -g $(tput cols)x2 --upscale "$img" ;; (*\ image/*) timg+=("$arg"); continue;; (*\ inode/directory\;*) ls+=("$arg"); continue;; (*) case "$(file "$arg")" in (*:\ *compress*) /usr/share/nvim/runtime/macros/less.sh "$arg";; (*) bat+=("$arg"); continue;; esac ;; esac fileinfo "$arg" done if test "$timg"; then $elevate timg --center -t0.3 $(test $# -gt 1 && echo "--title --grid=$(expr $(tput cols) / 30)" || echo "-g 60x$(expr $(tput lines) / 2)") "$@" 2>/dev/null || true fileinfo "${timg[@]}" fi if test "$bat"; then $elevate bat --style header --pager 'less -RF' $args "${bat[@]}" fileinfo "${bat[@]}" fi if test "$ls"; then tput sgr0 $(test -x "$arg" || echo "sudo") ls -l $(test $# -gt ${#ls[@]} && echo "-d") --color=always --human-readable --group-directories-first --file-type --dereference-command-line --all "${ls[@]}" | less -RF fi