mirror of
https://github.com/elkowar/dots-of-war.git
synced 2024-12-25 21:52:23 +00:00
222 lines
7.6 KiB
Text
222 lines
7.6 KiB
Text
|
#!/bin/bash
|
||
|
#Thank you curli
|
||
|
getFollowingChannels() {
|
||
|
curl -s -H 'Accept: application/vnd.twitchtv.v5+json' \
|
||
|
-H "Client-ID: $client_id" \
|
||
|
-H "Authorization: OAuth $oauth" \
|
||
|
-X GET "https://api.twitch.tv/kraken/streams/followed" |
|
||
|
jq -c '.streams[] | {"":.channel | {"Streamer ": .name , " playing ": .game}, " for ": .viewers, " viewers ": .video_height}' |
|
||
|
tr -d '\{\}\:\"\,' |
|
||
|
awk '{print $0"p"}'
|
||
|
}
|
||
|
|
||
|
getTwitchUserId() {
|
||
|
curl -H 'Accept: application/vnd.twitchtv.v5+json' \
|
||
|
-H "Client-ID: $client_id" \
|
||
|
-H "Authorization: OAuth $oauth" \
|
||
|
-X GET "https://api.twitch.tv/kraken/user" |
|
||
|
jq -c '. | ._id' |
|
||
|
tr -d '"'
|
||
|
}
|
||
|
|
||
|
# First argument must be the twitch user id
|
||
|
getFollowingGames() {
|
||
|
curl -H 'Accept: application/vnd.twitchtv.v5+json' \
|
||
|
-H "Client-ID: $client_id" \
|
||
|
-H "Authorization: OAuth $oauth" \
|
||
|
-X GET "https://api.twitch.tv/kraken/users/${1}/follows/games" |
|
||
|
jq -c '.follows[] | {"": .game.popularity, " viewers - ": .game.name}' |
|
||
|
tr -d '\{\}\:\"\,'
|
||
|
}
|
||
|
|
||
|
# First argument must be the game's name
|
||
|
getChannelsFromGame() {
|
||
|
curl -s -H 'Accept: application/vnd.twitchtv.v5+json' \
|
||
|
-H "Client-ID: $client_id" \
|
||
|
-X GET "https://api.twitch.tv/kraken/streams?game=${1}" |
|
||
|
jq -c '.streams[] | {"":.channel | {"Streamer ": .name , " playing ": .game}, " for ": .viewers, " viewers ": .video_height}' |
|
||
|
tr -d '\{\}\:\"\,' |
|
||
|
awk '{print $0"p"}'
|
||
|
}
|
||
|
|
||
|
getAllGames() {
|
||
|
curl -s -H 'Accept: application/vnd.twitchtv.v5+json' \
|
||
|
-H "Client-ID: $client_id" \
|
||
|
-H "Authorization: OAuth $oauth" \
|
||
|
-X GET "https://api.twitch.tv/kraken/games/top?limit=$game_limit" |
|
||
|
jq -c '.top[] | {"": .viewers, " viewers - ": .game.name}' |
|
||
|
tr -d '\{\}\:\"\,'
|
||
|
}
|
||
|
if [[ $1 == "-v" ]]; then
|
||
|
echo "0.9.0"
|
||
|
exit 0
|
||
|
fi
|
||
|
cd $(dirname "$0") || exit
|
||
|
|
||
|
source config
|
||
|
|
||
|
quality="best\n1080p60\n1080p\n720p60\n720p\n480p\n360p\naudio_only"
|
||
|
oauth="$(cat oauth | tr -d '\n')"
|
||
|
|
||
|
if [[ -z ${oauth} ]]; then
|
||
|
echo "ERROR: Missing oauth, use theatron -p if you want to enter private mode"
|
||
|
notify-send "Theatron" "Copy the token into a file called oauth"
|
||
|
if [[ ${clip_capabilities} == "true" ]]; then
|
||
|
scope="clips:edit+user_read"
|
||
|
auth_url="https://id.twitch.tv/oauth2/authorize?client_id=$client_id&redirect_uri=$redirect_uri&response_type=token&scope=$scope"
|
||
|
echo "Auth url"
|
||
|
echo ${auth_url}
|
||
|
xdg-open "$auth_url"
|
||
|
fi
|
||
|
exit 1
|
||
|
fi
|
||
|
#Private mode
|
||
|
if [[ $1 == "-p" || $1 == "--private" ]]; then
|
||
|
echo "Entering private mode, check config for list of channels"
|
||
|
#TODO: Make it possible to enter token into rofi
|
||
|
channel="$(echo -e ${following} | ${launcher})"
|
||
|
else
|
||
|
# Check if user wants to see content he's following or not
|
||
|
if [[ ${default_browse_type} == '' ]]; then
|
||
|
browse_type_options="Channels you're following\nGames you're following\nAll games\nAll streams\nChange current stream quality or restart previous stream: $(tail -1 .currently_playing)"
|
||
|
browse_type=$(echo -e "$browse_type_options" | ${launcher})
|
||
|
echo "Selected $browse_type"
|
||
|
else
|
||
|
browse_type=${default_browse_type}
|
||
|
fi
|
||
|
# If user wants to browse the channels they follow
|
||
|
if [[ ${browse_type} == "Games you're following" ]]; then
|
||
|
# Get the user id, which is needed to get the followed games
|
||
|
echo "Getting your user ID..."
|
||
|
user_id=$(getTwitchUserId)
|
||
|
if [[ -z ${user_id} ]]; then
|
||
|
notify-send "You need a new token, remove oauth file and restart the app"
|
||
|
exit 1
|
||
|
fi
|
||
|
# Get the games the user is following, note: the amount of viewers does not reflect the live amount (delayed)
|
||
|
echo "Getting the games you follow..."
|
||
|
empty_games="You're not following any games, choose me to browse top games instead\nBrowse followed channels"
|
||
|
games=$(getFollowingGames ${user_id})
|
||
|
if [[ -z ${games} ]]; then
|
||
|
games="$empty_games"
|
||
|
fi
|
||
|
game=$(echo -e "${games}" | ${launcher})
|
||
|
if [[ -z ${game} ]]; then
|
||
|
exit 1
|
||
|
fi
|
||
|
echo $game
|
||
|
if [[ ${game} == "You're not following any games, choose me to browse top channels instead" ]]; then
|
||
|
browse_type="All games"
|
||
|
if [[ ${game} == "Browse followed channels" ]]; then
|
||
|
browse_type="Channels you're following"
|
||
|
fi
|
||
|
else
|
||
|
game_name=$(echo ${game#*viewers - })
|
||
|
game_formatted=$(echo ${game_name} | jq -s -R -r @uri | rev | cut -c4- | rev)
|
||
|
# Get the channels from the selected game
|
||
|
echo "Getting the channels from ${game_name}..."
|
||
|
channel=$(getChannelsFromGame ${game_formatted} | ${launcher})
|
||
|
#Check for empty pick
|
||
|
if [[ -z ${channel} ]]; then
|
||
|
notify-send "You need to pick a channel..."
|
||
|
exit 1
|
||
|
fi
|
||
|
fi
|
||
|
fi
|
||
|
if [[ ${browse_type} == "Channels you're following" ]]; then
|
||
|
# Get all the channels the user follows
|
||
|
channel=$(getFollowingChannels | ${launcher})
|
||
|
if [[ -z $channel ]]; then
|
||
|
exit 1
|
||
|
fi
|
||
|
fi
|
||
|
# If user wants to browse the games they follow
|
||
|
# If the user wants to browse every game on Twitch
|
||
|
# Changed from elif to support going from one browse type to another
|
||
|
if [[ ${browse_type} == "All games" ]]; then
|
||
|
# Get all the games (top X by most viewers)
|
||
|
# TODO: make more requests after the first 100
|
||
|
echo 'Getting all games...'
|
||
|
game=$(getAllGames | ${launcher})
|
||
|
if [[ -z ${game} ]]; then
|
||
|
notify-send "Selection cancelled"
|
||
|
exit 1
|
||
|
fi
|
||
|
game_name=$(echo ${game#*viewers - })
|
||
|
game_formatted=$(echo ${game_name} | jq -s -R -r @uri | rev | cut -c4- | rev)
|
||
|
# Get the channels from the selected game
|
||
|
echo "Getting the channels from ${game_name}..."
|
||
|
channel=$(getChannelsFromGame ${game_formatted} | ${launcher})
|
||
|
fi
|
||
|
if [[ ${browse_type} == "All streams" ]]; then
|
||
|
channel=$(getChannelsFromGame | ${launcher})
|
||
|
fi
|
||
|
|
||
|
if [[ ${browse_type} == "Change current stream quality"* ]]; then
|
||
|
pid="$(head -n 1 .currently_playing)"
|
||
|
channel="$(tail -1 .currently_playing)"
|
||
|
echo "$channel with quality $picked_quality"
|
||
|
echo "Killing existing ... $pid"
|
||
|
kill $pid
|
||
|
rm .currently_playing
|
||
|
fi
|
||
|
|
||
|
not_following=$(echo ${channel} | awk '{print $2}')
|
||
|
if [[ -n ${not_following} ]]; then
|
||
|
channel=${not_following}
|
||
|
fi
|
||
|
if [[ -z ${channel} ]]; then
|
||
|
exit 1
|
||
|
fi
|
||
|
fi
|
||
|
if [[ -z ${channel} ]]; then
|
||
|
exit 1
|
||
|
notify-send "Theatron" "Didn't pick anything"
|
||
|
fi
|
||
|
if [[ ${vod_mode} == "true" ]]; then
|
||
|
#čšć is used to sanitize output easier, so we don't remove every : but only the json key:value colon
|
||
|
id=$(curl -H 'Accept: application/vnd.twitchtv.v5+json' \
|
||
|
-H "Client-ID: $client_id" \
|
||
|
-X GET "https://api.twitch.tv/kraken/users?login=$channel" |
|
||
|
jq -c '.users[] | ._id' | tr -d '"') \
|
||
|
live=$(curl -H 'Accept: application/vnd.twitchtv.v5+json' \
|
||
|
-H "Client-ID: $client_id" \
|
||
|
-X GET "https://api.twitch.tv/kraken/streams/$id" |
|
||
|
jq -r '.stream')
|
||
|
|
||
|
if [[ ${live} != "null"* ]]; then
|
||
|
live="Channel is live, click me to watch"
|
||
|
else
|
||
|
live="Channel is not yet live, use polling service and wait :( "
|
||
|
fi
|
||
|
echo "$id" >bId.txt
|
||
|
#Use ćšć as unique identifiers of what values are and what the keys are
|
||
|
video=$(curl -H 'Accept: application/vnd.twitchtv.v5+json' \
|
||
|
-H "Client-ID: $client_id" \
|
||
|
-X GET "https://api.twitch.tv/kraken/channels/$id/videos?limit=$vod_mode_limit" |
|
||
|
jq -c --unbuffered '.videos[] | {"čšć" : .title, " (čšć": .created_at, ") čšć": .url}' |
|
||
|
tr -d '\{\}\"\,' | sed 's/čšć://g' |
|
||
|
printf "%s\n%s" "$live" "$(cat -)" | ${launcher} | awk 'NF>0{print $NF}')
|
||
|
|
||
|
# Exit if no selection
|
||
|
if [[ -z ${video} ]]; then
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
fi
|
||
|
picked_quality="best"
|
||
|
if [[ ${always_best} == "false" ]]; then
|
||
|
picked_quality="$(echo -e ${quality} | ${launcher})"
|
||
|
fi
|
||
|
if [[ ${popup_chat} == "true" || $1 == "-p" ]]; then
|
||
|
xdg-open https://www.twitch.tv/popout/${channel}/chat?popout=
|
||
|
fi
|
||
|
if [[ -z ${channel} ]]; then
|
||
|
echo "No channel picked."
|
||
|
exit 1
|
||
|
else
|
||
|
streamlink https://www.twitch.tv/${channel} ${picked_quality} --player=mpv ${streamlink_flags} &
|
||
|
echo -e "$!\n${channel}" >.currently_playing
|
||
|
fi
|
||
|
# vim: ft=sh
|