Files
slidetogether/present/present.py

74 lines
1.7 KiB
Python
Raw Normal View History

2020-05-03 22:51:16 +00:00
#!/usr/bin/env python3
2020-05-04 02:40:21 +00:00
# To install dependencies:
2020-06-22 22:03:04 -07:00
# pip3 install requests sseclient-py pyautogui
2020-05-04 02:40:21 +00:00
import argparse
2020-05-03 22:51:16 +00:00
import json
import requests
import sseclient
import subprocess
2020-05-03 22:51:16 +00:00
import sys
import time
import urllib
ALLOWED_CONTROLS = {'left', 'right'}
parser = argparse.ArgumentParser(description='slidetogether.io presenter client')
parser.add_argument('url')
parser.add_argument('--keynote', action='store_true')
args = parser.parse_args()
2020-05-03 22:51:16 +00:00
url = urllib.parse.urlparse(args.url)
2020-05-03 22:51:16 +00:00
qs = urllib.parse.parse_qs(url.query)
if 'room' not in qs or len(qs['room']) != 1:
2020-05-04 02:34:46 +00:00
print(f'invalid url: {sys.argv[1]}')
2020-05-03 22:51:16 +00:00
room = qs['room'][0]
presentUrl = urllib.parse.urlunparse([
url.scheme,
url.netloc,
2020-11-25 15:53:09 -08:00
url.path + 'api/present',
2020-05-03 22:51:16 +00:00
url.params,
urllib.parse.urlencode({'room_id': room}),
url.fragment,
])
if args.keynote:
LOOKUP = {
'left': 'show previous',
'right': 'show next',
}
def send_key(key):
subprocess.run([
'osascript',
'-e', 'tell application "Keynote"',
'-e', LOOKUP[key],
'-e', 'end tell',
])
else:
import pyautogui
pyautogui.FAILSAFE = False
def send_key(key):
pyautogui.press(control)
2020-05-03 22:51:16 +00:00
while True:
try:
response = requests.get(presentUrl, stream=True)
client = sseclient.SSEClient(response)
for event in client.events():
parsed = json.loads(event.data)
control = parsed['control']
if control == '':
continue
2020-05-03 22:51:16 +00:00
if control not in ALLOWED_CONTROLS:
print(f'INVALID CONTROL: {control}')
continue
print(control)
send_key(control)
2020-05-03 22:51:16 +00:00
except Exception as e:
print(e)
time.sleep(2)