python_screen_share/server.py
2024-12-15 17:09:10 +00:00

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()