128 lines
3.5 KiB
Python
128 lines
3.5 KiB
Python
from screen import screenlive
|
|
import json, argparse
|
|
from flask import Flask, json
|
|
import threading
|
|
from time import sleep
|
|
from websockets.sync.server import serve
|
|
import websockets
|
|
import array
|
|
import time
|
|
from flask import render_template
|
|
|
|
api = Flask(__name__)
|
|
watchers_last_seen = {}
|
|
web_users = {}
|
|
stream = False
|
|
freeze = False
|
|
debug = False
|
|
|
|
def current_time():
|
|
return str(int(time.time()))
|
|
|
|
@api.route("/", methods=["GET"])
|
|
def web():
|
|
return render_template('index.html')
|
|
|
|
@api.route("/off", methods=["GET"])
|
|
def streaOff():
|
|
global stream
|
|
stream=False
|
|
return "True"
|
|
|
|
@api.route("/freeze", methods=["GET"])
|
|
def freeze_the_stream():
|
|
global freeze
|
|
if freeze == True:
|
|
freeze=False
|
|
return "un-frosen"
|
|
else:
|
|
freeze=True
|
|
return "frosen"
|
|
|
|
@api.route("/on", methods=["GET"])
|
|
def streamOn():
|
|
global stream
|
|
stream=True
|
|
return "True"
|
|
|
|
@api.route("/views", methods=["GET"])
|
|
def return_views():
|
|
global watchers_last_seen
|
|
return str(len(watchers_last_seen.keys()))
|
|
|
|
@api.route("/mode", methods=["GET"])
|
|
def mode():
|
|
global watchers_last_seen
|
|
return "streaming-"+str(stream)+"\n frozen-"+str(freeze)
|
|
|
|
def ws_server(websocket):
|
|
global stream, watchers_last_seen
|
|
if debug: print("WebSocket: Server Started.")
|
|
try:
|
|
while True:
|
|
req=websocket.recv()
|
|
if "%" in req:
|
|
args= req.split("%")[1]
|
|
args = dict(x.split("=") for x in args.split(";"))
|
|
req = req.split("%")[0]
|
|
if debug: print(req,"-----",args)
|
|
match (req):
|
|
case ("get_stream"):
|
|
if freeze == True:
|
|
websocket.send(f"freeze")
|
|
else:
|
|
if stream:
|
|
watchers_last_seen[args["uuid"]] = current_time()
|
|
websocket.send(f""+str(json.dumps([True, screenlive.gen()])))
|
|
else:
|
|
websocket.send(f"null")
|
|
case ("web-site-user"):
|
|
users[args["uuid"]] = current_time()
|
|
case (_):
|
|
websocket.send(f"null")
|
|
except websockets.exceptions.ConnectionClosedOK:
|
|
if debug: print("hungup")
|
|
except websockets.ConnectionClosedError:
|
|
if debug: print("Internal Server Error.")
|
|
|
|
def run_ws_server():
|
|
with serve(ws_server, "0.0.0.0", 5621) as server:
|
|
server.serve_forever()
|
|
|
|
def timeout_task():
|
|
while True:
|
|
for key,value in watchers_last_seen.items():
|
|
if debug: print(key+"||||"+value)
|
|
if (int(current_time())-int(value)) > 5:
|
|
if debug: print(key+"is timed out")
|
|
watchers_last_seen.pop(key)
|
|
break
|
|
for key,value in users.items():
|
|
if debug: print(key+"||||"+value)
|
|
if (int(current_time())-int(value)) > 5:
|
|
if debug: print(key+"is timed out")
|
|
users.pop(key)
|
|
break
|
|
if debug: print("time -",current_time())
|
|
if debug: print("watchers -",watchers_last_seen.keys(),"::::: users - ",users.keys())
|
|
sleep(10)
|
|
|
|
def run_flask_server():
|
|
api.run(host="0.0.0.0", port=5622)
|
|
|
|
def main():
|
|
t1 = threading.Thread(target=run_ws_server)
|
|
t2 = threading.Thread(target=run_flask_server)
|
|
t3 = threading.Thread(target=timeout_task)
|
|
|
|
t1.start()
|
|
t2.start()
|
|
t3.start()
|
|
|
|
t1.join()
|
|
t2.join()
|
|
t3.join()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|