#!/bin/sh # lh: the Link Handler # takes one path or URL as its argument, launches the appropriate program for it # set argument 1 to stdin if there are no args if [ $# -eq 0 ] then set -- "$(cat)" fi # 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 "$(cat)") 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 } # while loop for multiple urls while [ $# -ne 0 ] do # handle redirects. tr removes control characters, so the case statement below works as expected. URL=$(echo "$1"|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" & ;; *invidio.us/watch*|*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 shift done