Skip to content

Instantly share code, notes, and snippets.

@cirrusUK
Created May 16, 2020 00:45
Show Gist options
  • Save cirrusUK/e57666cf872e25bbe89decaae723966b to your computer and use it in GitHub Desktop.
Save cirrusUK/e57666cf872e25bbe89decaae723966b to your computer and use it in GitHub Desktop.
#!/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