Created
May 16, 2020 00:45
-
-
Save cirrusUK/e57666cf872e25bbe89decaae723966b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# free keys complements of pastebin, and wtf goofle why AIza | |
keylist=( | |
"AIzaSyAafvOlmpO-nhRMdTKhwcK2jVQ8XeZwBfg" | |
"AIzaSyAAW1uwHofZ7c1zxl75u0flELX5PMs2LvM" | |
"AIzaSyA8OmKcw2DMNkJicyCJ0vqvf90xgeH52zE" | |
"AIzaSyBSnh-sIjd97_FmQVzlyGbcaYXuSt_oh84" | |
"AIzaSyBBcXtLP34Evs2rrdvYyZ63qbY36bQ96wk" | |
"AIzaSyCQu8QRr-9H_qyWvbXpL6jseGthkd1VCtw" | |
"AIzaSyBegVlinA8yY6Hug0cSonZq_OuiW_Z3jIM" | |
"AIzaSyDWaA2OoArAjQTHqmN6r9XrpHYNkpKGyGw" | |
"AIzaSyBnm60DnSJ2xVsRjo-L_9Mx_mALPy4ttUY" | |
"AIzaSyCXwkHwY_0YewOIL62RsZeTIzkKCbMxkjg" | |
"AIzaSyBOYIUuYzvMSyEJCmi1eGk2UcaMiZVmMog" | |
"AIzaSyBaQmipq396vQVJMMjI9bXBUTO9JXkvBdE" #ok | |
"AIzaSyBi_v-hWKzwlj-VsEoPJpWKdE23sCN_VHM" | |
"AIzaSyCotxgGpPD_mRMsGM0A7YoD4I6mttxkhck" | |
"AIzaSyA-dlBUjVQeuc4a6ZN4RkNUYDFddrVLxrA" | |
"AI39si7ZLU83bKtKd4MrdzqcjTVI3DK9FvwJR6a" | |
"AIzaSyC_W8DX6RK1ciPWemIlxPznBMK9zRs3B8s" | |
"AIzaSyBtd0Rm6EoowNo16BoCBpQwxqgv40Z5P0U" | |
"AIzaSyDzYZyqUA9AjEif5QDItyoUd4vu4OQKfGE" #ok | |
"AIzaSyDzYZyqUA9AjEif5QDItyoUd4vu4OQKfGE" | |
"AIzaSyCmBjbbqEH7Ppig7eC1mtzq7jp4RY0F0T8" | |
"AIzaSyAdNoP9MXjnYVzYzMli1Kbzw_AbCZyKXf4" | |
"AIzaSyBArVIf1n768KazWANv4PYpZQAj8PQk53Y" | |
"AIzaSyAkya3iGuulRQRlvU5ZRk0awyrGJRu7Ecc" | |
"AIzaSyD_mnR7Tgt7-oyjhPr5pyKzv9-0Mx8XMpw" | |
) | |
usage(){ | |
local helpstr=( "$0 is a script to GET and print links, for search query" | |
"on youtube.com. Place this script somewhere in PATH." | |
"In addition to the parameters the environmental variable \`max\` sets how" | |
"many URL to print. If using lower case variable bothers you, use YT_MAXQ" | |
"Usage: ${0##*/} [--once] [[--api video|playlist|channel] | [-p] | [-c] | [-v]] QUERY" | |
) | |
#for i in {0.."${#helpstr}"}; do | |
# printf "%s\n" "${helpstr[$i]}" | |
#done | |
printf -- "%s\n%s\n%s\n%s\n\n%s\n" "${helpstr[0]}" "${helpstr[1]}" "${helpstr[2]}" "${helpstr[3]}" "${helpstr[4]}" | |
} | |
bail(){ | |
usage >&2 | |
exit "${1:-1}" | |
} | |
getkey(){ | |
local l="${#keylist[@]}" | |
local idx="$((RANDOM%$l))" | |
local key="${keylist[$idx]}" | |
printf "%s" "$key" | |
} | |
apisearch(){ | |
local api="https://www.googleapis.com/youtube/v3/search" | |
local max="${max:-5}" | |
local type="" | |
local part="snippet" | |
local key="$(getkey)" | |
local q="" u="" url="" title="" id="" err="" | |
case $1 in | |
--playlist) type="playlist" && shift && q="$(urlenc "$@")" && \ | |
url="https://www.youtube.com/playlist?list=";; | |
--channel) type="channel" && shift && q="$(urlenc "$@")" && \ | |
url="https://www.youtube.com/channel/";; | |
--video) type="video" && shift && q="$(urlenc "$@")" && \ | |
url="https://www.youtube.com/watch?v=";; | |
*) type="video" && shift && q="$(urlenc "$@")" && \ | |
url="https://www.youtube.com/watch?v=";; | |
esac | |
local u="$(curl "${api}?maxResults=${max}&type=${type}&part=${part}&key=${key}&q=${q}" 2>/dev/null)"; | |
[[ "$u" =~ "error" ]] && err="$(grep reason <<<"$u")" && printf "\x1b[0;31m;ERROR:\x1b[0m invalid key %s\nreason: %s" "$key" "$err" && exit 2 | |
eval local title=( $(gawk -F '"' '/title/ {print "\"" $4 "\""}' <<<"$u") ) | |
local id=( $(gawk -F '"' '/'${type}'Id/ {print $4}' <<<"$u") ) | |
for i in $(seq 0 $((max-1)) ); do | |
printf "%s\n%s%s\n\n" "${title[$i]}" "${url}" "${id[$i]}" | |
#printf "%s :: %s%s" "${title[$i]}" "${url}" "${id[$i]}" | |
done | |
} | |
urlenc(){ | |
local arg="$@" | |
[[ -n "$1" ]] && exarg(){ printf -- "$arg"; } || exarg(){ cat; } | |
exarg | gawk 'BEGIN{FS="";RS="";ORS=""} | |
{for(n=0;n<256;n++) ord[sprintf("%c", n)]=n} | |
{for(nf=1;nf<=NF;nf++) | |
{if($nf !~ /[!*"'\''"();:@&=+$,/?#[\] ]/) | |
{printf "%c", ord[$nf]} | |
else{printf "%%%x", ord[$nf]} }}' | |
} | |
getdata(){ | |
local q="$(urlenc "$@")" | |
curl "https://www.youtube.com/results?q=${q}" 2>/dev/null | |
} | |
parsedata(){ | |
#gawk 'BEGIN{RS="href";FS="\""} {if($10 ~ /spf-prefech|description-id/) print "\"" $2 "\"" " " "\"" $8 "\""}' <<<"$@" | |
gawk 'BEGIN{RS="href";FS="\""} {if($0 ~ /description-id/) print $2 "\n" $8 }' <<<"$@" | |
} | |
search(){ | |
local q="$@" | |
local max="${max:-10}" | |
local url="https://youtube.com" | |
local u="" data="" last="" i="" t="" | |
u="$(getdata "$q")" | |
mapfile -t data <<<"$(parsedata "$u")" | |
last="${#data[@]}" | |
for i in $(seq 0 2 $((last-2)) ); do | |
t="$((i+1))" | |
((${t}/2>=${max})) && break | |
printf "%s\n%s%s\n\n" "${data[$t]}" "${url}" "${data[$i]}" | |
#printf "%s :: %s%s" "${title[$i]}" "${url}" "${id[$i]}" | |
done | |
} | |
mpvcmd(){ | |
# lol thats one way to print titles.. | |
exec 4<&2 | |
mpv 2>&1 >(grep -i error >&4) "$( ((search "$1" |tee -a >(cut -d $'\n' -f1 >&2)) |cut -d$'\n' -f2) )" | |
} | |
loop(){ | |
eval "$(declare -f ${FUNCNAME[1]})" | |
${FUNCNAME[1]} "$@" | |
} | |
run(){ | |
#[[ "${max:-X}" =~ "[[:didit:]]+" ]] && declare -i max=5 | |
[[ ! -z "$YT_MAXQ" ]] && max="${YT_MAXQ}" | |
local t="" | |
while (($#)); do | |
case $1 in | |
--help) usage && exit;; | |
--once) max="1" && shift && v="$1" && mpvcmd "$v" && exit;; | |
--max) export max="$2" && shift 2;; # && loop "$@";; | |
--api) [[ "$2" =~ (video|playlist|channel) ]] || bail; t="--$2" && shift 2 && break;; | |
-p) (($#>1)) || bail; shift && t='--playlist' && break;; | |
-c) (($#>1)) || bail; shift && t='--channel' && break;; | |
-v) (($#>1)) || bail; shift && t='--video' && break;; | |
--*) bail;; | |
-*) bail;; | |
*) search "$@" | bat && exit $?;; | |
esac | |
done | |
apisearch "$t" "$@" | |
} | |
[[ ! -z "${SHELLTUBE_EXEC}" ]] && once="--once" | |
[[ -n $1 ]] || bail | |
run "$once" "$@" | |
############################################################### | |
# BONUS!: A quick gawk script to create lazy playlists | |
# usage: yt QUERY | ym3u [| [vim -] [>FILE] [...]] | |
# | |
# #!/bin/gawk -f | |
# BEGIN{ | |
# RS="\n\n";FS="http"; | |
# printf("%s","#EXTM3U") | |
# } | |
# {printf("\n# %shttp%s", $1, $2)} | |
# | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment