A set of POSIX* shell scripts designed for personal use. No guarantees when it comes to quality, as these are also used for various minor experiments of mine.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
POSIX_Scripts/invcli

74 lines
2.1 KiB

#!/bin/sh -e
search()
{
rm -f /tmp/invidious_results
query_sanitized="$(printf "%s\n" "$1"|sed -e 's/ */%20/g')"
curl --output /tmp/invidious_results "https://vid.puffyan.us/search?q=$query_sanitized"
}
extract_names()
{
viable=$(grep watch /tmp/invidious_results|grep youtube|expr $(wc -l) - 1)
sed -ne 's/<p dir.*>\(.*\)<\/p>/\1/p' /tmp/invidious_results|sed -ne 's/ *//' -e '/^$/d' -e p|sed ${viable}q
}
extract_urls()
{
for id in $(sed -ne 's/ */ /g' -e 's/<a style=.* href="\(\/watch?v=.*\)">/\1/p' /tmp/invidious_results|sed -ne 's/ *//p')
do
printf "https://vid.puffyan.us%s\n" $id
done
}
watch_vid()
{
ffplay "https://vid.puffyan.us/latest_version?id=$id&itag=$itag" 2>>/dev/stdout|sed -ne 's/< Location: \(.*\)/\1/p'
}
fetch_itag()
{
# 22 seems to be the itag associated with audio+video MP4s at 720p...
curl --silent $1|sed -ne 's/.*"itag":"\([0-9][0-9]*\)".*/\1/p' #|grep 22
}
fetch_id()
{
curl --silent $(extract_urls|sed $chosen_video!d)|grep itag|sed -ne 's/.*"id":"\(.*\)","itag":.*/\1/p'|sed 1!d
}
generate_locations()
{
# 18 is for 360p, 22 is for 720p
# In the future, this will be automatic.
for itag in 18 #$(fetch_itag $(extract_urls|sed $chosen_video!d)|sed $chosen_video!d)
do
watch_vid
done
}
#Use this snippet to only retrieve URLs that are actually in the results...
#grep 'watch?v=' /tmp/invidious_results|grep youtube
#
#Hopefully this is the key to fixing the weird interactions between extract_names and fetch_itag
main()
{
printf "Enter your search terms: "
read -r query
search "$query"
extract_names|nl
printf "Choose the desired media: "
read -r chosen_video
printf "Attempting to retrieve primary source for: "
printf "\"%s\"" "$(extract_names|sed $chosen_video!d)"
printf "...\nPlease wait.\n\n"
chosen_video=$(expr $chosen_video - 1)
itag=$(echo $(fetch_itag $(extract_urls|sed $chosen_video!d))|cut -f$chosen_video -d' ')
id=$(fetch_id)
media="$(generate_locations|sed 1!d)"
printf "Loading %s...\n" "$media"
# ffplay -autoexit "$media"
}
main