Marty Oehme
aa47068fd0
Opens basically any path, local or remote in nsxiv. Can take multiple paths to open all of them. Additionally, alias whichever version of the image viewer is available on the system as `iv`, using `nsxiv-rifle`, `nsxiv`, `sxiv` in order of preference.
75 lines
1.8 KiB
Bash
Executable file
75 lines
1.8 KiB
Bash
Executable file
#!/usr/bin/env sh
|
|
#
|
|
# Advanced nsxiv url opening script.
|
|
#
|
|
# Can open remote urls of individual images, galleries, and local files at the same time.
|
|
# Uses gallery-dl for remote gallery opening - so if gallery-dl can open it, so can nsxiv.
|
|
#
|
|
# Usage: simply add multiple urls/paths as arguments.
|
|
# nsxiv-rifle "https://linkto.my/image.png" my/local/relative-path.jpg /home/absolute.gif
|
|
|
|
cache_dir="$(mktemp -d)"
|
|
|
|
die() {
|
|
[ -n "$1" ] && printf '%s\n' "$*" >&2
|
|
exit 1
|
|
}
|
|
|
|
cleanup() {
|
|
rm -f -- "$cache_dir"/*
|
|
}
|
|
|
|
from_local() {
|
|
fpath="$(realpath "$1")"
|
|
ln -s "$fpath" "$cache_dir"
|
|
}
|
|
|
|
# invokes single image downloading or gallery downloading depending on content type
|
|
from_remote() {
|
|
link="$(dereference "$1")"
|
|
if curl -sLI "$link" | grep -i '^Content-Type:' | grep -q image; then
|
|
get_single_image "$link"
|
|
else
|
|
get_gallery "$link"
|
|
fi
|
|
}
|
|
|
|
get_gallery() {
|
|
command -v gallery-dl 1>/dev/null 2>&1 || return
|
|
gallery-dl -q -D "$cache_dir" "$1"
|
|
}
|
|
|
|
get_single_image() {
|
|
pwd="$PWD"
|
|
cd "$cache_dir" && curl -sSLO "$1"
|
|
cd "$pwd" || exit 1
|
|
}
|
|
|
|
# unaliases urls which will not be downloaded correctly otherwise
|
|
dereference() {
|
|
# teddit
|
|
if echo "$1" | grep -qe "https\?://w\?w\?w\?\.\?teddit\.net.\+"; then
|
|
echo "$1" | sed -e 's|^.*pics/w:null_\(.\+\)$|https://i.redd.it/\1|'
|
|
else
|
|
echo "$1"
|
|
fi
|
|
}
|
|
|
|
### main ###
|
|
command -v nsxiv 1>/dev/null 2>&1 || die "Requires nsxiv installed"
|
|
|
|
[ -z "$1" ] && nsxiv
|
|
trap cleanup EXIT
|
|
[ -d "$cache_dir" ] || mkdir -p -- "$cache_dir" || die
|
|
im_number=1
|
|
while [ -n "$1" ]; do
|
|
case "$1" in
|
|
*://*.*) from_remote "$1" ;;
|
|
*) from_local "$1" ;;
|
|
esac
|
|
im_number=$((im_number + 1))
|
|
shift
|
|
done
|
|
|
|
[ "$(find "$cache_dir" -type f -print | wc -l)" -ne 0 ] &&
|
|
nsxiv -p "$cache_dir"
|