about summary refs log blame commit diff stats
path: root/bin/lh
blob: 331b358a8a1fe073d53a76584d7c1791f18a574d (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                      
                                                                                
 





                                              

                                                                                               
                   

                      








                          








                                                          
                                         















                                                                
 


                              
                                                                                                 
                                                    
 


                                                                
              
                              
                                                 

                                             
                                                                                                                                                    
                                                    
                     
                                                                                          
                                         

                                                                       






                                                                      
                                         
                                                                                          
                    
                                                      

                     
                                      
                                 
                    
                                                         

                     

     
#!/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