-
-
Save Squidamatron/4335013d326cfcbe1df5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
#------------------------------------------------- | |
# file: twitcher.py | |
# author: Florian Ehmke | |
# description: dmenu for twitch streams | |
#------------------------------------------------- | |
import argparse | |
import requests | |
from subprocess import Popen, PIPE, STDOUT | |
class Stream(object): | |
def __init__(self, data, options): | |
self.name = data["name"] | |
self.status = data["status"] | |
self.viewers = data["viewers"] | |
self.game = data["game"] | |
self.options = options | |
def display_string(self): | |
display_string = u"{} ({}) {}- {}\n".format(self.name, self.viewers, "[" + self.game + "] " if self.options["show_game"] else "", self.status).strip() | |
return display_string + "\n" | |
def create_arg_parser(): | |
parser = argparse.ArgumentParser(description= | |
'Open twitch stream through dmenu.') | |
parser.add_argument( | |
'-c', '--count', required=False, default=10, type=int, | |
help='How many (default: 10) streams should be displayed?') | |
parser.add_argument( | |
'-g', '--game', required=False, default=False, type=str, | |
help='Which game (default: Starcraft II: Heart of the Swarm)?') | |
parser.add_argument( | |
'-q', '--quality', required=False, default="best", type=str, | |
help='Which quality (default: best)?') | |
parser.add_argument( | |
'-p', '--player', required=False, default="mpv", type=str, | |
help='Which player (default: mpv)?') | |
parser.add_argument( | |
'-f', '--following', action='store_true', | |
help='Shows available streams you\'re following. Edit OAuth in script') | |
parser.add_argument( | |
'-nf', '--dmenu-nf', required=False, default="#899CA1", type=str, | |
help='Dmenu normal foreground color?') | |
parser.add_argument( | |
'-nb', '--dmenu-nb', required=False, default="#2D2D2D", type=str, | |
help='Dmenu normal background color?') | |
parser.add_argument( | |
'-sf', '--dmenu-sf', required=False, default="#C0C0C0", type=str, | |
help='Dmenu selected foreground color?') | |
parser.add_argument( | |
'-sb', '--dmenu-sb', required=False, default="#2D2D2D", type=str, | |
help='Dmenu selected background color?') | |
parser.add_argument( | |
'-fn', '--dmenu-fn', required=False, default="-*-terminus-medium-*-*-*-16-*-*-*-*-*-*-*", type=str, | |
help='Dmenu font?') | |
return vars(parser.parse_args()); | |
def main(): | |
args = create_arg_parser() | |
count = args['count'] | |
game = args['game'] | |
quality = args['quality'] | |
player = args['player'] | |
following = args['following'] | |
# twitch theme: twitcher.py -nf '#ccc' -nb '#301F4F' -sf '#fff' -sb '#6441a5' | |
dmenu_command = ['dmenu', | |
'-l', str(count), | |
'-nf', args['dmenu_nf'], | |
'-nb', args['dmenu_nb'], | |
'-sb', args['dmenu_sb'], | |
'-sf', args['dmenu_sf'], | |
'-fn', args['dmenu_fn'] | |
] | |
# Get your own token from http://twitchapps.com/tmi/ | |
if following: | |
url = "https://api.twitch.tv/kraken/streams/followed" | |
headers = { 'Accept': 'application/vnd.twitch.tv.v3+json', 'Authorization': 'OAuth <OAuth Token>' } | |
r = requests.get(url, headers=headers) | |
else: | |
url = "https://api.twitch.tv/kraken/streams?limit={}".format(count) | |
if game: | |
url += "&game={}".format(game.replace(' ','+')) | |
r = requests.get(url) | |
json_streams = r.json()["streams"] | |
streams = [] | |
for json_stream in json_streams: | |
channel = json_stream.get("channel", "") | |
name = channel.get("name", "") | |
status = channel.get("status", "") | |
viewers = json_stream.get("viewers", "") | |
stream_game = channel.get("game", "") | |
stream_data = { "name": name, "status": status, "viewers": viewers, "game": stream_game } | |
streams.append(Stream(stream_data, { "show_game": not bool(game) })) | |
dmenu_str = "" | |
for stream in streams: | |
dmenu_str += stream.display_string() | |
dmenu_str.strip() | |
p = Popen(dmenu_command, stdout=PIPE, stdin=PIPE, stderr=STDOUT) | |
stream_selection = p.communicate(input=dmenu_str.encode('utf-8'))[0] | |
if stream_selection: | |
livestreamer_url = "twitch.tv/{} {} -p {}".format(stream_selection.decode('utf-8').split()[0], quality, player) | |
print(livestreamer_url) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment