diff --git a/app/__pycache__/main.cpython-313.pyc b/app/__pycache__/main.cpython-313.pyc deleted file mode 100644 index cdefe65..0000000 Binary files a/app/__pycache__/main.cpython-313.pyc and /dev/null differ diff --git a/app/__pycache__/video_class.cpython-313.pyc b/app/__pycache__/video_class.cpython-313.pyc deleted file mode 100644 index 6f2c0c5..0000000 Binary files a/app/__pycache__/video_class.cpython-313.pyc and /dev/null differ diff --git a/app/main.py b/app/main.py index ed3fed8..3aa62b2 100755 --- a/app/main.py +++ b/app/main.py @@ -8,17 +8,19 @@ import threading import time from datetime import date +import uvicorn from fastapi import FastAPI, Request, WebSocket, WebSocketDisconnect from fastapi.staticfiles import StaticFiles from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates +from starlette.websockets import WebSocketState import app.video_class as vc # Settings language = ["ger", "eng"] subtitle_codec_blacklist = ["hdmv_pgs_subtitle", "dvd_subtitle"] -max_tasks = 2 +max_tasks = 1 # Globale Variablen queue = asyncio.Queue() @@ -27,7 +29,7 @@ video_files = {} active_process = set() active_tasks = set() connected_clients = set() -semaphore = threading.Semaphore(1) +semaphore = threading.Semaphore(max_tasks) date = date.today() if not os.path.exists("./logs"): @@ -105,7 +107,7 @@ def get_ffprobe(select, source_file): # Convert Process ------------------------------------------------------------------------------------------------------ def queue_video(): for key, obj in video_files.items(): - with semaphore: + if obj.finished == 0: obj.task = threading.Thread(target=video_convert, args=(obj,)) obj.task.start() active_tasks.add(obj) @@ -114,6 +116,8 @@ def queue_video(): def video_convert(obj): global active_process + semaphore.acquire() + obj.convert_start = time.time() # Erstelle und setze einen Event-Loop für diesen Thread loop = asyncio.new_event_loop() @@ -123,7 +127,7 @@ def video_convert(obj): "ffmpeg", "-y", "-i", obj.source_file, "-map", "0:0", "-c:v", "libsvtav1", - "-preset", "8", + "-preset", "5", "-crf", "30", "-g", "240", "-pix_fmt", "yuv420p10le", @@ -150,6 +154,7 @@ def video_convert(obj): ]) command.append(obj.output_file) logging.info(f"{command}") + loop.run_until_complete(queue.put(video_list())) # Prozess try: @@ -179,9 +184,11 @@ def video_convert(obj): active_process.discard(obj) active_tasks.discard(obj) obj.convert_end = time.time() + semaphore.release() except Exception as e: obj.finished = 2 + semaphore.release() logging.error(f"Convert Process Failure: {e}") #UviCorn WebServer Teil @@ -194,11 +201,9 @@ def read_output(qu): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) - print(active_process) - while True: if not len(active_process): - time.sleep(30) + time.sleep(5) continue for obj in list(active_process): @@ -213,6 +218,13 @@ def read_output(qu): logging.info(f"Data Packet created: {obj.to_dict()}") loop.run_until_complete(qu.put(obj.to_dict())) +def video_list(): + vlist = [] + for video in video_files.values(): + vlist.append(video.get_vars()) + + return json.dumps({"video_list": vlist}) + @app.post("/") async def receive_video_file(data: dict): @@ -242,20 +254,30 @@ async def websocket_v(websocket: WebSocket): read_output_task = threading.Thread(target=read_output, args=(queue,)) read_output_task.start() - # await queue.put(obj_list()) - try: + var_first_sending = 0 while True: + if websocket not in connected_clients: + break + message = await queue.get() # Warten auf neue Nachricht aus der Queue await websocket.send_text(message) + if not var_first_sending: + await queue.put(video_list()) + var_first_sending = 1 + except WebSocketDisconnect: logging.info("WebSocket disconnected") except Exception as e: logging.error(f"WebSocket error: {e}") finally: connected_clients.discard(websocket) - await websocket.close() + if websocket.client_state == WebSocketState.CONNECTED: + await websocket.close() @app.get("/clients") async def get_clients_count(): return {"active_clients": len(connected_clients), "active_processes": len(active_process), "active_tasks": len(active_tasks)} + +if __name__ == "__main__": + uvicorn.run("app.main:app", host="127.0.0.1", port=8000, reload=False) \ No newline at end of file diff --git a/app/templates/webs-ui.html b/app/templates/webs-ui.html index 0a51bc8..f235964 100644 --- a/app/templates/webs-ui.html +++ b/app/templates/webs-ui.html @@ -8,7 +8,9 @@