env/bin/invidious.sh

112 lines
1.9 KiB
Bash
Raw Permalink Normal View History

2019-09-11 04:11:40 +02:00
#!/bin/sh
2019-12-08 19:14:46 +01:00
# invidious
2019-09-11 04:11:40 +02:00
# Written in 2019 by Leslie
# Modified in 2019-2020 by Lucas
2019-09-11 04:11:40 +02:00
# CC0 1.0 Universal/Public domain - No rights reserved
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any
# warranty. You should have received a copy of the CC0 Public Domain
# Dedication along with this software. If not, see
# <http://creativecommons.org/publicdomain/zero/1.0/>.
2019-12-08 19:14:46 +01:00
usage()
{
printf "Usage: [-T] %s url\n" "${0##*/}" >&2
2019-09-11 04:11:40 +02:00
exit 1
}
2019-12-08 19:14:46 +01:00
err()
{
printf "%s: %s\n" "${0##*/}" "$*" >&2
exit 1
}
2020-11-01 19:51:45 +01:00
fetch_file()
{
# Assumes utility supports `-o output_file`
case $(uname) in
OpenBSD)
$torsocks ftp -MV "$@"
;;
*)
$torsocks curl -fLSs "$@"
;;
esac
}
api()
{
printf "https://%s%s\n" "$INVIDIOUS" "$*"
}
2020-05-02 22:43:38 +02:00
known_site()
{
printf "%s\n" "$1" | grep -Eq \
2020-06-07 16:02:36 +02:00
-e "^https?://(www\.)?youtube\.com/" \
-e "^https?://youtu\.be/" \
-e "^https?://(www\.)?invidio\.us/" \
-e "^https?://invidious\.snopyta\.org/" \
-e "^https?://yewtu\.be/"
2020-05-02 22:43:38 +02:00
}
2020-05-02 22:44:19 +02:00
get_id_path()
{
printf "%s\n" "${1##*/}"
}
get_id_query()
{
oldIFS=$IFS
IFS="&"
set -- ${1##*"?"}
IFS=$oldIFS
id=
for param; do
case $param in
2020-08-22 02:01:38 +02:00
v=*)
id=${param#v=}
2020-05-02 22:44:19 +02:00
break
;;
esac
done
printf "%s\n" "$id"
}
get_id()
{
case $1 in
*"?v="*)
get_id_query "$1"
2020-05-02 22:44:19 +02:00
;;
*) get_id_path "$1"
2020-05-02 22:44:19 +02:00
;;
esac
}
: ${INVIDIOUS:=invidious.snopyta.org}
2019-09-11 04:11:40 +02:00
torsocks=torsocks
while getopts T flag; do
case $flag in
2020-08-22 02:01:38 +02:00
T) torsocks= ;;
*) usage ;;
esac
2019-09-11 04:11:40 +02:00
done
shift $((OPTIND - 1))
[ $# -eq 1 ] || usage
url=$1
2020-05-03 16:47:27 +02:00
known_site "$url" || err "unknown site $url"
2019-09-11 04:11:40 +02:00
2020-05-02 22:44:19 +02:00
id=$(get_id "$url")
2020-05-03 16:47:27 +02:00
[ ${#id} -eq 11 ] || err "invalid video ID $id"
2019-09-11 04:11:40 +02:00
# XXX choose in some clever way
2020-11-01 19:51:45 +01:00
itag=$(fetch_file -o - "$(api "/api/v1/videos/$id")" |
jq -r ".formatStreams[].itag" | head -n 1)
api "/latest_version?id=$id&itag=$itag"