Shell scripts minimizing machine time, maximizing tao time.

git clone git://watertao.xyz/programs/tao_shells.git

tao_url.sh (6990B)


      1 #!/bin/sh
      2 
      3 # A core component of the url tao shells.
      4 # See README
      5 
      6 export PROGDIR="$(cd -- "$(dirname -- "$0")" && pwd)"
      7 
      8 dn=/dev/null
      9 cmdf(){ command -v $1 >$dn 2>&1; }
     10 
     11 cu(){
     12 	e="${1:-0}"; rm "$t" 2>$dn 1>&2;
     13 	kill -1 $(ps -oppid,pid | sed -n "s/^[ ]*$$ //p") 2>$dn
     14 	exit "$e";
     15 }
     16 trap cu INT
     17 
     18 # dmenu command
     19 if [ -z "$DMENU" ]
     20 then
     21 	a="dmenu sxmo_dmenu.sh bemenu rofi"
     22 	for i in $a; do cmdf "$i" && export DMENU="$i" && break; done
     23 fi
     24 dm="$DMENU"
     25 
     26 # term command
     27 if [ -z "$TERMINAL" ]
     28 then
     29 	a="st urxvt xterm sxmo_terminal.sh"
     30 	for i in $a; do cmdf "$i" && export TERMINAL="$i" && break; done
     31 fi
     32 trm="$TERMINAL"
     33 
     34 # optional configs
     35 if [ -z "$DMENU_OPTS" ]
     36 then
     37 	a="$HOME/.config/tao/tao_dmenu.conf" && [ -f "$a" ] && \
     38 		DMENU_OPTS=$(<"$a" sed -n '1p' | tr -d "\n")
     39 	export DMENU_OPTS="${DMENU_OPTS:-""}"
     40 fi
     41 dmo="-i $DMENU_OPTS"
     42 
     43 a="$HOME/.config/tao/tao_url.conf" && [ -f "$a" ] && . "$a"
     44 ofile="$HOME/.config/tao/tao_openers.conf"
     45 TAO_QUERY_ENG="${TAO_QUERY_ENG:-"https://ddg.gg?q="}"
     46 TAO_LOCAL_DIRS="${TAO_LOCAL_DIRS:-"$(printf "%s\n" "$HOME")"}"
     47 
     48 # File types: Local(1)(default) Remote(2) Query(3)
     49 ft=2
     50 cdir="$HOME/.local/share/tao/url"
     51 qfile="${cdir}/query"
     52 bfile="${cdir}/bookmark"
     53 hfile="${cdir}/history"
     54 w3mh="$HOME/.w3m/history"
     55 ytqry_cmd="tao_youtube_query.sh"
     56 noterm=0
     57 
     58 mk_ofile()
     59 {
     60 cat <<EOF >"$ofile"
     61 qutebrowser
     62 w3m :: TERM
     63 firefox
     64 links :: TERM
     65 surf
     66 yt download > play %% ytdlp/mpv
     67 a/v download > play %% mpv --msg-level=all=status,ffmpeg/video=error :: DL MEDIA_PLAYER TERM
     68 a/v/yt stream %% mpv --msg-level=all=status,ffmpeg/video=error :: TERM
     69 yt channel (20) %% yt/channel/20
     70 yt channel (all) %% yt/channel/all
     71 yt search %% yt/query/100
     72 yank %% tao_copy.sh
     73 zathura :: DL
     74 nsxiv :: DL
     75 bookmark
     76 EOF
     77 }
     78 
     79 [ ! -d "$cdir" ] && mkdir -p "$cdir" && touch "$qfile" "$bfile" "$hfile"
     80 [ ! -f "$w3mh" ] && w3mh=$dn
     81 
     82 t="$(mktemp)"
     83 
     84 # Options
     85 usage()
     86 {
     87 	printf "%s\n" "Usage: tao_file [OPTION] [FILE ...]" "" "Options:"
     88 	printf "\t-%s\t%s\n" "l" "local file" "r" "remote file" "q" "query" "h" "help"
     89 	exit 0
     90 }
     91 
     92 prnt(){ printf "%s\n" "$1"; }
     93 
     94 dl_then_view()
     95 {
     96 	if prnt "$t" | grep -q "DL_OPT"; then
     97 		dmenu_yn "[ Download then view? ]" && return 0
     98 	fi
     99 
    100 	x="$(mktemp -d)"; [ ! -d "$x" ] && cu
    101 	"$trm" -- wget --user-agent=Firefox "$u" -P "$x"
    102 	"$trm" -- $p "$x"/* 2>$dn
    103 	dmenu_yn "[ Remove tmp files: $(ls -1 "$x"/) ? y/n ]" && \
    104 		"$trm" -d "$x" || rm -r "$x"
    105 	cu
    106 }
    107 
    108 dmenu_for_file()
    109 {
    110         [ $ft -eq 2 ] && input_remote && return 0
    111         [ $ft -eq 3 ] && input_query && return 0
    112         input_local && return 0
    113 	return 1
    114 }
    115 
    116 dmenu_yn() { [ "$(printf "y\nn" | "$dm" $dmo -p "${1:-"[]"}")" = "n" ]; }
    117 
    118 bookmark()
    119 { 
    120 	a=$(prnt "$1" | $dm $dmo -p "[ Add Bookmark url + tags ]")
    121 
    122 	if <"$bfile" grep -Fqix "$a"; then
    123 		<$dn "$dm" $dmo -p "[ Bookmark already exists: $a ]"
    124 	else
    125 		prnt "$a" >>"$bfile" && \
    126 		<$dn "$dm" $dmo -p "[ Bookmark success: $a ]"
    127 	fi
    128 	return 0
    129 }
    130 
    131 file_action()
    132 {
    133 	u="$1"; [ -z "$ft" ] || [ -z "$u" ] && cu 1
    134 
    135 	if [ $ft -ne 1 ]
    136 	then
    137 		p=$(<$ofile sed 's/[ ]\?\%\%.*$//; t; s/[ ]\?::.*$//' | "$dm" $dmo -p "[ $u ]")
    138 
    139 		[ -z "$p" ] && cu
    140 
    141 		# Sanitize $p for sed matching
    142 		p=$(prnt "$p" | sed 's/\([\/\#%]\)/\\\1/g')
    143 		# From ofile, translate opener name to command (if different) (with tags included)
    144 		p=$(<$ofile sed -n "/^$p\([ ]\?::.*\)\?$/{b a;}
    145 			s/^$p[ ]\?%%//; T
    146 			:a s/^[ ]//; s/[ ]*::/::/
    147 			p; q")
    148 
    149 		# Get tags
    150 		t=$(prnt "$p" | sed -n 's/.*:://p')
    151 		p="${p%%::*}"
    152 
    153 		# yt-dlp, special
    154 		if [ "$p" = "ytdlp/mpv" ]
    155 		then
    156 			# A serarate shell runs async so we aren't
    157 			# held up by the yt-dlp process.
    158 			nohup "$trm" -t "$p" -- tao_url.sh -y "$u" 1>$dn 2>&1 &
    159 			cu
    160 		fi
    161 
    162 		if [ "${p%%/*}" = "yt" ]; then
    163 			a="${p#*/}"
    164 			if [ "${a%%/*}" = "channel" ]; then
    165 				[ "${a##*/}" = "all" ] && \
    166 					p="$ytqry_cmd -c -a" || \
    167 					p="$ytqry_cmd -c -l ${a##*/}"
    168 			fi
    169 			[ "${a%%/*}" = "query" ] && p="$ytqry_cmd -q -l "${a##*/}""
    170 		else
    171 			[ $ft -eq 3 ] && query_stage
    172 		fi
    173 
    174 		# download-then-views first
    175 		prnt "$t" | grep -q "DL" && dl_then_view
    176 
    177 		# open term if needed
    178 		# A kill line is in there as this whole thing crashes
    179 		# on INT ^C during mpv stream. This hopefully kills
    180 		# the mpv terminal. q out of mpv, no problems.
    181 		if prnt "$t" | grep -q "TERM" && [ $noterm -ne 1 ]; then
    182 			"$trm" -- $p "$u" 1>$dn 2>&1 || \
    183 			kill $(ps -oppid,pid | sed -n "s/^[ ]*$$ //p") 2>$dn
    184 			cu
    185 		fi
    186 
    187 		# for all else just run it
    188 		$p "$u" && cu
    189 
    190 	else
    191 		case "$(prnt "$(file --mime-type -b "$u")" | tr "[:upper:]" "[:lower:]")" in
    192 			*webp|*jpeg|*jpg|*png|*gif|*svg ) p="nsxiv" ;;
    193 			*mp4|*m4a|*avi|*mpg|*ogg|*mp3|*flac|*flv|*matroska ) p="$trm -- mpv" ;;
    194 			*txt|*md|*text ) p="$trm -- $EDITOR" ;;
    195 			*pdf ) p="zathura" ;;
    196 			* ) p="w3m" ;;
    197 		esac
    198 
    199 		$p "$u" 2>$dn &
    200 	fi
    201 }
    202 
    203 input_local()
    204 {
    205         u="$(prnt "$TAO_LOCAL_DIRS" | \
    206                 xargs -r -i{} find {} -type f | \
    207                 "$dm" $dmo -p "[ local file ]")"
    208 	return 0
    209 }
    210 
    211 input_query()
    212 {
    213         [ ! -f "$qfile" ] && touch "$qfile"
    214         u="$(tac "$qfile" | \
    215                 "$dm" $dmo -p "[ query ]")" \
    216                 || cu 1
    217         # Add query to query file if not already exists
    218         grep -q -F "$u" "$qfile" \
    219                 || prnt "$u" >> "$qfile"
    220 	return 0
    221 }
    222 
    223 input_remote()
    224 {
    225         # Dmenu for url to task
    226         u="$(<"$bfile" sed 's/$/ bookmark/' | \
    227                 tac "$hfile" "$w3mh" - 2>$dn | \
    228                 sed '/^file:/d' | \
    229                 "$dm" $dmo -p "[ url ]")" \
    230                 || cu
    231 
    232         # Clean up the history/bookmark link
    233         u="$(prnt "$u" | \
    234                 sed -E 's/[^ ]+ +//g' | \
    235                 grep -E "https?:" \
    236                 || prnt "$u" | \
    237                 cut -d" " -f1 )"
    238 	return 0
    239 }
    240 
    241 query_stage()
    242 {
    243 	# Encode the search string (i.e. the rest of q). xxd was formerly used
    244 	# here, but xxd is part of vim packages on some systems, whereas od is
    245 	# ubiquitous. A search script that breaks if someone accidentally removes
    246 	# vim is stupid.
    247 	#u="${TAO_QUERY_ENG}$(printf "%s" "$u" | od -w1048 -t x1 -An | tr "[:space:]" "%20")"
    248 	u="${TAO_QUERY_ENG}$(printf "%s" "$u" | \
    249 		od -w1048 -t x1 -An | \
    250 		tr " " "%")"
    251 }
    252 
    253 tao_mp_set()
    254 {
    255 	[ -z "$TAO_MP" ] && \
    256 		TAO_MP=$(<$ofile sed -n '
    257 		/::.*MEDIA_PLAYER/ {
    258 			s/.*%%[ ]\?//
    259 			s/[ ]\?::.*$//
    260 			p; q;
    261 		}; $c mpv')
    262 }
    263 ytdlp_mpv()
    264 {
    265 	tao_mp_set
    266 
    267 	t=$(mktemp -d)
    268 
    269 	yt-dlp  --no-warnings \
    270 		-f 'bestvideo[ext=mp4][height<=720]+bestaudio[ext=m4a]/best[height<=720]' \
    271 		-o ${t}/'%(title)s-%(id)s.%(ext)s' "$u" 2>$dn
    272 
    273 	$TAO_MP -- "$t"/*
    274 
    275 	read -p "Remove tmp a/v file?" yn
    276 	[ "$yn" = "n" ] && "$trm" -d "$t" || rm -r "$t"
    277 
    278 	cu
    279 }
    280 
    281 while getopts "hlnqry" a; do
    282 	case $a in
    283 		h) usage ;; l) ft=1 ;; n) noterm=1 ;; q) ft=3 ;; r) ft=2 ;; y) ft=4 ;;
    284 	esac
    285 done
    286 
    287 shift $((OPTIND - 1))
    288 
    289 if [ $ft -eq 4 ]; then u="$1"; ytdlp_mpv; cu; fi
    290 
    291 # Chk for opener config file
    292 [ -f "$ofile" ] || mk_ofile
    293 
    294 # If files passed as arguments, open em up, else dmenu for url/file
    295 [ -n "$*" ] && \
    296 	for fn in "$@"; do file_action "$fn"; done || \
    297 	dmenu_for_file && [ -n "$u" ] && file_action "$u"
    298 cu