blob: 4332487b7d9d6ab94917fccd31a9e2cc027b11d0 (
plain) (
tree)
|
|
#!/bin/sh
# lh: the Link Handler
# takes one path or URL as its argument, launches the appropriate program for it
# if $1 isn't provided, spawn $BROWSER and exit. this allows lh to be used as a pseudo-browser.
[ -z "$1" ] && exec "$BROWSER"
#from pure-sh-bible
#splits a string by $2
split() {
set -f
old_ifs=$IFS
IFS=$2
set -- $1
printf '%s\n' "$@"
IFS=$old_ifs
set +f
}
#strips from the right end of a string
lstrip() {
printf '%s\n' "${1##$2}"
}
# redir unwinding
# prints all redirect locations
findredir() {
#note: for loop turns all whitespace into newlines
for line in $(curl -sIL "$1")
do
# catch is used to find the line after location:
if [ -n "$catch" ]
then
# return caught line
echo "$line"
# reset catch variable
unset -- catch
fi
# set catch if the current line is location
if echo "$line"|grep -Fq 'ocation:'
then
catch=1
fi
done
}
# handle redirects. tr removes control characters, so the case statement below works as expected.
URL=$(findredir|tail -1|tr -d '[:cntrl:]')
# if there were no redirects, just set URL to the first argument
[ -z "$URL" ] && URL="$1"
case "$URL" in
gemini://*|gopher://*)
$TERMINAL -e bombadillo "$URL" ;;
*.mkv*|*.webm*|*.mp4*)
mpv --no-terminal "$URL" & ;;
*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*hooktube.com*|*bitchute.com*|*twitch.tv/videos/*|*twitch.tv/*/v/*)
mpv --no-terminal --ytdl "$URL" & ;;
*twitch.tv/*)
STREAMQUAL="$(split "$(streamlink "$URL"|grep 'Available streams')" ", "|\
grep -E "[0-9]"|\
dmenu -p "choose stream quality for $URL")"
streamlink -p mpv $URL $STREAMQUAL >/dev/null 2>&1 & ;;
*.png*|*.jpg*|*.jpe*|*.jpeg*|*.gif*)
IMGPATH="/tmp/$(lstrip "$URL" "*/")"
curl -sL "$URL" >"$IMGPATH"&&sxiv -pqa "$IMGPATH" & ;;
*.mp3*|*.m4a*|*.flac*|*.aiff*|*.opus*|*.ogg*|*.mp3?source*)
mpv --no-terminal "$URL"& ;;
*.epub*|*.pdf*|*.djvu*)
BOOKPATH="/tmp/$(lstrip "$URL" "*/")"
if [ -n "$READER" ]; then
curl -sL "$URL" >"$BOOKPATH"&&$READER "$BOOKPATH">/dev/null 2>&1 &
else
curl -sL "$URL" >"$BOOKPATH" &
fi ;;
*)
if [ -f "$URL" ]; then
op "$URL"
else
$BROWSER "$URL" >/dev/null 2>&1 &
fi ;;
esac
|