2023-09-29 10:08:43 +00:00
|
|
|
#!/usr/bin/python
|
|
|
|
import sys
|
|
|
|
import time
|
|
|
|
import traceback
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
|
|
|
|
import pytz
|
|
|
|
from requests import get
|
|
|
|
|
|
|
|
from hosted import config, node
|
|
|
|
|
|
|
|
config.restart_on_update()
|
|
|
|
|
|
|
|
|
|
|
|
def log(msg):
|
|
|
|
sys.stderr.write("[pretalx] {}\n".format(msg))
|
|
|
|
|
|
|
|
|
|
|
|
def idle(seconds, event_start, event_tz):
|
|
|
|
end = time.time() + seconds
|
|
|
|
log("sleeping for {} seconds".format(seconds))
|
|
|
|
while time.time() < end:
|
|
|
|
send_data = {
|
|
|
|
'day': '??',
|
2023-09-30 07:29:37 +00:00
|
|
|
'time': time.time()
|
2023-09-29 10:08:43 +00:00
|
|
|
}
|
|
|
|
if event_start is not None:
|
2023-09-30 07:37:26 +00:00
|
|
|
event_now = datetime.now(event_tz)
|
2023-09-29 10:08:43 +00:00
|
|
|
utc_now = datetime.now(pytz.utc)
|
|
|
|
|
|
|
|
utc_offset = (event_now - utc_now).total_seconds()
|
|
|
|
|
|
|
|
day_zero = event_start.replace(
|
|
|
|
hour=0,
|
|
|
|
minute=0,
|
|
|
|
second=0,
|
|
|
|
tzinfo=timezone
|
|
|
|
) - timedelta(days=1)
|
|
|
|
|
|
|
|
day_info = event_now - day_zero
|
|
|
|
|
|
|
|
log("Day0: {}".format(day_zero.isoformat()))
|
|
|
|
log("NOW: {}".format(event_now.isoformat()))
|
|
|
|
|
|
|
|
send_data['day'] = day_info.days
|
|
|
|
|
|
|
|
for k,v in send_data.items():
|
|
|
|
node.send_raw('root/plugin/pretalx/{}:{}'.format(k, v))
|
|
|
|
node.send_raw('root/plugin/pretalx-broadcast-tools/{}:{}'.format(k, v))
|
|
|
|
time.sleep(1)
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
event_info = None
|
|
|
|
event_start = None
|
|
|
|
schedule = None
|
2023-09-30 07:37:26 +00:00
|
|
|
event_tz = pytz.utc
|
2023-09-29 10:08:43 +00:00
|
|
|
|
|
|
|
while True:
|
|
|
|
event_url = config["event_url"]
|
|
|
|
if not event_url.endswith("/"):
|
|
|
|
event_url = event_url + "/"
|
|
|
|
if "example.com" in event_url:
|
|
|
|
log("default event url, waiting for config update")
|
|
|
|
# sleep forever, service will get restarted if the config
|
|
|
|
# changes.
|
|
|
|
time.sleep(99999999)
|
|
|
|
|
|
|
|
log("event url: {}".format(event_url))
|
|
|
|
|
|
|
|
try:
|
|
|
|
r = get(
|
|
|
|
event_url + "p/broadcast-tools/event.json",
|
|
|
|
)
|
|
|
|
r.raise_for_status()
|
|
|
|
except Exception as e:
|
|
|
|
log("updating event info failed: {}".format(repr(e)))
|
|
|
|
# Only print the error message. If we have fetched the event
|
|
|
|
# info json blob atleast once, we have all the information
|
|
|
|
# we need.
|
|
|
|
else:
|
|
|
|
event_info = r.json()
|
|
|
|
node.write_json("event.json", event_info)
|
|
|
|
log("updated event info json")
|
|
|
|
|
2023-09-30 07:37:26 +00:00
|
|
|
if event_info is not None:
|
|
|
|
event_start = datetime.strptime(event_info["start"], "%Y-%m-%d")
|
|
|
|
event_tz = pytz.timezone(event_info['timezone'])
|
|
|
|
|
2023-09-29 10:08:43 +00:00
|
|
|
try:
|
|
|
|
r = get(
|
|
|
|
event_url + "p/broadcast-tools/schedule.json",
|
|
|
|
)
|
|
|
|
r.raise_for_status()
|
|
|
|
except Exception as e:
|
|
|
|
log("updating schedule failed: {}".format(repr(e)))
|
|
|
|
# Only print the error message. If we have fetched the schedule
|
|
|
|
# info json blob atleast once, we have all the information
|
|
|
|
# we need.
|
|
|
|
else:
|
|
|
|
schedule = r.json()
|
|
|
|
for talk in schedule['talks']:
|
2023-09-30 07:38:31 +00:00
|
|
|
talk['start_str'] = datetime.fromtimestamp(talk['start_ts']).replace(tzinfo=pytz.utc).astimezone(event_tz).strftime('%H:%M')
|
2023-09-29 10:08:43 +00:00
|
|
|
node.write_json("schedule.json", schedule)
|
|
|
|
log("updated schedule json")
|
|
|
|
|
|
|
|
idle(30, event_start, event_tz)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
try:
|
|
|
|
main()
|
|
|
|
except:
|
|
|
|
traceback.print_exc()
|
|
|
|
time.sleep(30)
|