initial commit
This commit is contained in:
commit
2450c58289
1 changed files with 154 additions and 0 deletions
154
uoeia
Executable file
154
uoeia
Executable file
|
@ -0,0 +1,154 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
show_usage() {
|
||||||
|
printf """uoeia -- Universally Open Every Image Available
|
||||||
|
|
||||||
|
Usage: uoeia [OPTION]... [FILE|URL]
|
||||||
|
|
||||||
|
Displays the specified image using the nsxiv program, or an image viewer of your choice.
|
||||||
|
|
||||||
|
Can open remote urls of individual images, galleries, as well as local files at the same time.
|
||||||
|
Uses gallery-dl for remote gallery opening - so if gallery-dl can open it, so can your image viewer.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-v, --viewer Specify the image viewer to use (default: nsxiv).
|
||||||
|
-q, --quiet Don't display any output during normal operation.
|
||||||
|
-g, --gdlopts Pass through options to gallery-dl. Take care to fully quote each passed option.
|
||||||
|
-r, --replace Url patterns to replace in the format 'mypattern:::myreplacement'
|
||||||
|
-h, --help Show this help message and exit.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
uoeia my-image.jpg Display a local image file using nsxiv.
|
||||||
|
|
||||||
|
uoeia https://example.com/image Display an image/image gallery from a URL using nsxiv.
|
||||||
|
|
||||||
|
uoeia -v imv https://example.com/image Display an image from a URL using imv.
|
||||||
|
|
||||||
|
uoeia -g \"--range 1-10\" https://reddit.com/r/earthporn
|
||||||
|
Download and display the first 10 results using nsxiv.
|
||||||
|
|
||||||
|
uoeia -r 'nitter.net:::twitter.com' https://nitter.net/donttrythis/
|
||||||
|
Display images from twitter directly instead of its
|
||||||
|
open source interface nitter.
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
cache_dir="$(mktemp -d)"
|
||||||
|
imageviewer=nsxiv
|
||||||
|
|
||||||
|
die() {
|
||||||
|
[ -n "$1" ] && printf '%s\n' "$*" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
rm -f -- "$cache_dir"/*
|
||||||
|
}
|
||||||
|
|
||||||
|
from_local() {
|
||||||
|
fpath="$(realpath -e "$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
|
||||||
|
#shellcheck disable=2068
|
||||||
|
gallery-dl -D "$cache_dir" ${gal_args[@]} "$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() {
|
||||||
|
local output
|
||||||
|
# default replacements:
|
||||||
|
# teddit to original redd.it hosted picture
|
||||||
|
output="${1//teddit.net\/pics\/w:null_/i.redd.it/}"
|
||||||
|
# nitter to twitter
|
||||||
|
output="${1//nitter.net/twitter.com}"
|
||||||
|
|
||||||
|
# custom replacements:
|
||||||
|
for rep in "${replacements[@]}"; do
|
||||||
|
output="${1//${rep%:::*}/${rep#*:::}}"
|
||||||
|
done
|
||||||
|
echo "$output"
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
command -v "${imageviewer}" 1>/dev/null 2>&1 || die "Opening images in ${imageviewer} requires ${imageviewer} to be installed and and on the path."
|
||||||
|
|
||||||
|
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 -L "$cache_dir" -type f -print | wc -l)" -ne 0 ] &&
|
||||||
|
${imageviewer} "$cache_dir"
|
||||||
|
}
|
||||||
|
|
||||||
|
gal_args=()
|
||||||
|
replacements=()
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
-h | --help)
|
||||||
|
show_usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-q | --quiet)
|
||||||
|
gal_args+=("-q")
|
||||||
|
;;
|
||||||
|
-v | --viewer)
|
||||||
|
imageviewer=$2
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-g | --gdlopts)
|
||||||
|
if [[ ! "$2" =~ ^- ]]; then
|
||||||
|
printf "Error: No valid option passed: %s" "$2"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
gal_args+=("$2")
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-r | --replace)
|
||||||
|
replacements+=("$2")
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--)
|
||||||
|
shift
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [[ "$1" =~ ^- ]]; then
|
||||||
|
printf "Error: Unrecognized option: %s" "$1"
|
||||||
|
show_usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
arguments+=("$1")
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
arguments+=("$@")
|
||||||
|
|
||||||
|
main "${arguments[@]}"
|
Loading…
Reference in a new issue