Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@infinisil
Created August 16, 2019 20:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save infinisil/ddd0c742fa76b06834bf93f99020cf80 to your computer and use it in GitHub Desktop.
Save infinisil/ddd0c742fa76b06834bf93f99020cf80 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
# Get from https://dev.twitch.tv/docs/api/#step-1-setup
clientId=
headers=$(mktemp)
get() {
if rg 'ratelimit-remaining: 0' "$headers" >/dev/null; then
echo "API limit reached, waiting for 3 seconds.." >&2
sleep 3
fi
url="https://api.twitch.tv/helix/$1"
shift
while ! result=$(curl -sSf -H "Client-ID: $clientId" -D "$headers" -G "$url" "$@"); do
echo "Error response: $result" >&2
cat "$headers" >&2
done
echo "$result"
}
choosegame() {
echo -n "What game [empty for any game]? "
read game
if [ -n "$game" ] && ! gameid=$(get games --data-urlencode "name=$game" | jq '.data[]?.id' -r -e); then
echo "Couldn't get game id for game '$game'" >&2
choosegame
fi
}
choosegame
gameidpart=${gameid:+--data-urlencode "game_id=$gameid"}
echo -n "What language (ISO 639-1 code) [empty for en]? "
read language
language=${language:-en}
echo "Game $game ($gameid), language $language"
streamUsers() {
pagepart=${1:+--data-urlencode "after=$1"}
echo "Getting streams for $game in $language${1:+ after cursor $1}" >&2
result=$(get streams \
--data-urlencode "language=$language" \
--data-urlencode "first=100" \
$pagepart \
$gameidpart)
jq '.data[].user_id' -r <<< "$result"
cursor=$(jq '.pagination.cursor' -r <<< "$result")
if [ "$cursor" = null ]; then
echo "No more streams" >&2
else
streamUsers "$cursor"
fi
}
userToUrl() {
result=$(get users --data-urlencode "id=$1")
login=$(echo "$result" | jq '.data[].login' -r)
echo "https://twitch.tv/$login"
}
streamUsers | shuf | while read user; do
mpv "$(userToUrl "$user")" "$@"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment