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