From e466857046d01e8018a272dbd8d74a5911f9d952 Mon Sep 17 00:00:00 2001 From: arabcoders Date: Sun, 8 Jun 2025 00:29:12 +0300 Subject: [PATCH] WIP --- .vscode/settings.json | 1 + app/native.py | 48 ++++++++++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index b404a990..169ff6e9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -51,6 +51,7 @@ "muxdelay", "nodesc", "noprogress", + "onefile", "pathex", "plexmatch", "postprocessor", diff --git a/app/native.py b/app/native.py index 6528a0e0..d2081d11 100644 --- a/app/native.py +++ b/app/native.py @@ -1,11 +1,9 @@ import json -import logging import os import socket import threading from pathlib import Path -# 1) create a global event ready = threading.Event() APP_NAME = "YTPTube" @@ -13,7 +11,7 @@ APP_NAME = "YTPTube" try: import webview # type: ignore except ImportError as e: - msg = "Please install the 'pywebview' to run YTPTube in native mode." + msg = "Please run 'pipenv install pywebview[qt]' package to run YTPTube in native mode." raise ImportError(msg) from e @@ -34,7 +32,7 @@ def set_env(): if os.getenv("YTP_ACCESS_LOG", None) is None: dct["YTP_ACCESS_LOG"] = "false" - if len(dct) > 0: + if dct: os.environ.update(dct) @@ -54,26 +52,48 @@ def app_start(host: str, port: int) -> None: if __name__ == "__main__": host = "127.0.0.1" - set_env() - cfg = Path(os.getenv("YTP_CONFIG_PATH")) / "webview.json" - if cfg.exists(): - port = json.loads(cfg.read_text())["port"] - else: - logging.info(f"Creating configuration file at '{cfg}'.") + cfg_path: Path = Path(os.getenv("YTP_CONFIG_PATH")) / "webview.json" + + port = None + win_conf: dict[str, int] = {} + if cfg_path.exists(): + data = json.loads(cfg_path.read_text()) + port = data.get("port") + for key in ("width", "height", "x", "y"): + if key in data: + win_conf[key] = data[key] + + if not port: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((host, 0)) port = s.getsockname()[1] - cfg.write_text(json.dumps({"port": port})) + cfg_path.write_text(json.dumps({"port": port})) threading.Thread(target=app_start, args=(host, port), daemon=True).start() - ready.wait() - webview.create_window(APP_NAME, f"http://{host}:{port}") + create_kwargs = {**win_conf, "resizable": True} + + window = webview.create_window(APP_NAME, f"http://{host}:{port}", **create_kwargs) + + def save_geometry(): + cfg = { + "port": port, + "width": window.width, + "height": window.height, + "x": window.x, + "y": window.y, + } + cfg_path.write_text(json.dumps(cfg)) + + window.events.resized += lambda *_: save_geometry() + window.events.moved += lambda *_: save_geometry() + webview.start( + gui=str(os.getenv("YTP_WV_GUI", "qt")), # e.g. "qt" or "gtk" debug=os.getenv("YTP_WV_DEBUG", "false").lower() in ("true", "1", "yes"), - storage_path=os.path.join(os.getenv("YTP_CONFIG_PATH", os.getcwd()), "webview"), + storage_path=str(Path(os.getenv("YTP_TEMP_PATH", os.getcwd())) / "webview"), private_mode=False, )