147 lines
3.6 KiB
Python
Executable File
147 lines
3.6 KiB
Python
Executable File
import time
|
|
import os
|
|
from flask import Flask, render_template, request, make_response, redirect
|
|
import json
|
|
import random
|
|
import socket
|
|
|
|
app = Flask("chaoszone-tv-media")
|
|
|
|
APPROOT = '/'
|
|
|
|
class ReverseProxied(object):
|
|
def __init__(self, app):
|
|
self.app = app
|
|
|
|
def __call__(self, environ, start_response):
|
|
script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
|
|
if script_name:
|
|
environ['SCRIPT_NAME'] = script_name
|
|
path_info = environ['PATH_INFO']
|
|
if path_info.startswith(script_name):
|
|
environ['PATH_INFO'] = path_info[len(script_name):]
|
|
|
|
scheme = environ.get('HTTP_X_SCHEME', '')
|
|
if scheme:
|
|
environ['wsgi.url_scheme'] = scheme
|
|
return self.app(environ, start_response)
|
|
|
|
app.wsgi_app = ReverseProxied(app.wsgi_app)
|
|
|
|
|
|
|
|
|
|
def to_dict(args):
|
|
outdict = {}
|
|
for key, val in args.items():
|
|
outdict[key] = val
|
|
return outdict
|
|
|
|
|
|
def list_files():
|
|
filelist = os.listdir('storage/')
|
|
return sorted(filelist)
|
|
|
|
|
|
def get_ninja_secrets():
|
|
secrets = dict()
|
|
for scr in ['S1', 'S2', 'S3']:
|
|
with open(f'{scr}_ninjasecret') as infile:
|
|
secret = infile.read()
|
|
secrets[scr] = secret
|
|
return secrets
|
|
|
|
|
|
def regenerate_secret(scr):
|
|
new_secret = ''
|
|
for i in range(24):
|
|
new_secret += random.choice('cHaOsZoNEtV')
|
|
with open(f'{scr}_ninjasecret', 'w') as secfile:
|
|
secfile.write(new_secret)
|
|
|
|
|
|
def request_time():
|
|
byte_message = bytes("get_time", "utf-8")
|
|
with socket.socket(socket. AF_INET, socket. SOCK_DGRAM) as opened_socket:
|
|
opened_socket.sendto(byte_message, ("127.0.0.1", 7123))
|
|
time.sleep(0.1)
|
|
|
|
|
|
@app.route('/get_time.json')
|
|
def get_time():
|
|
request_time()
|
|
res = {}
|
|
for sid in ('S1', 'S2', 'S3'):
|
|
if not os.path.isfile(f'curtime_{sid}.json'):
|
|
continue
|
|
with open(f'curtime_{sid}.json') as curtime:
|
|
res[sid] = json.loads(curtime.read())
|
|
if not os.path.isfile(f'{sid}_pause'):
|
|
continue
|
|
with open(f'{sid}_pause') as pause:
|
|
res[sid]['pause'] = pause.read().strip()
|
|
|
|
r = make_response(json.dumps(res))
|
|
r.mimetype = 'application/json'
|
|
return r
|
|
|
|
|
|
@app.route('/media.html')
|
|
def media():
|
|
edit = False
|
|
data = to_dict(request.args)
|
|
if 'edit' in data:
|
|
edit = True
|
|
filelist = list_files()
|
|
secrets = get_ninja_secrets()
|
|
return render_template(
|
|
'media.html',
|
|
filelist=filelist,
|
|
secrets=secrets,
|
|
screens=['S1', 'S2','S3'],
|
|
edit=edit,
|
|
approot=APPROOT)
|
|
|
|
|
|
@app.route('/obs_multiview.html')
|
|
def obs_multiview():
|
|
return render_template(
|
|
'obs_multiview.html',
|
|
approot=APPROOT)
|
|
|
|
|
|
|
|
@app.route('/programm.html')
|
|
def atem_multiview():
|
|
return render_template(
|
|
'programm.html',
|
|
approot=APPROOT)
|
|
|
|
@app.route('/get_media')
|
|
def get_media():
|
|
with open('play.json') as playfile:
|
|
jsn = playfile.read()
|
|
r = make_response(jsn)
|
|
r.mimetype = 'application/json'
|
|
return r
|
|
|
|
@app.route('/set_media')
|
|
def set_media():
|
|
filelist = list_files()
|
|
to_set = to_dict(request.args)
|
|
for s in ('S1', 'S2', 'S3'):
|
|
if to_set[s] not in filelist:
|
|
to_set[s] = ''
|
|
with open('play.json', 'w') as playfile:
|
|
playfile.write(json.dumps(to_set))
|
|
return redirect('/media.html')
|
|
|
|
@app.route('/regenerate_ninja_link')
|
|
def regenerate_ninja_link():
|
|
scr = to_dict(request.args).get('scr')
|
|
regenerate_secret(scr)
|
|
return redirect('/media.html')
|
|
|
|
|
|
|