From 8ea2b64ff798af913dcba64baace8d2536bf0b18 Mon Sep 17 00:00:00 2001 From: Eddy Pedroni Date: Thu, 1 Jan 2026 17:57:27 +0100 Subject: Add Android app wrapper around web interface --- solo-tool-project/src/solo_tool/session_manager.py | 88 +++------------------- 1 file changed, 10 insertions(+), 78 deletions(-) (limited to 'solo-tool-project/src/solo_tool/session_manager.py') diff --git a/solo-tool-project/src/solo_tool/session_manager.py b/solo-tool-project/src/solo_tool/session_manager.py index 8624207..7d98106 100644 --- a/solo-tool-project/src/solo_tool/session_manager.py +++ b/solo-tool-project/src/solo_tool/session_manager.py @@ -1,12 +1,7 @@ -from typing import Protocol -from abc import abstractmethod -from . import SoloTool - from pathlib import Path -from glob import glob -import json -import requests -from os import getenv + +from . import SoloTool +from .storage import FileSystemStorageBackend, FileBrowserStorageBackend class SessionManager(): def __init__(self, sessionPath: str): @@ -15,17 +10,17 @@ class SessionManager(): from re import search match = search(r"^([a-z0-9]+://)", sessionPath) if not match or match.group(0) == "file://": - self._backend = _FileSystemBackend(sessionPath) + self._backend = FileSystemStorageBackend(sessionPath) elif match.group(0) in ["http://", "https://"]: - self._backend = _FileBrowserBackend(sessionPath) + self._backend = FileBrowserStorageBackend(sessionPath) else: raise ValueError(f"Unsupported session path: {sessionPath}") def getSessions(self) -> list[str]: - return self._backend.listIds() + return self._backend.listSessions() def loadSession(self, id: str, player=None) -> SoloTool: - session = self._backend.read(id) + session = self._backend.readSession(id) st = SoloTool(player=player) for i, entry in enumerate(session): @@ -48,70 +43,7 @@ class SessionManager(): } session.append(entry) - self._backend.write(session, id) - -class _Backend(Protocol): - @abstractmethod - def listIds(self) -> list[str]: - raise NotImplementedError - - @abstractmethod - def read(self, id: str) -> dict: - raise NotImplementedError - - @abstractmethod - def write(self, session: dict, id: str) -> None: - raise NotImplementedError - -class _FileSystemBackend(_Backend): - def __init__(self, sessionPath: str): - self._sessionPath = Path(sessionPath) - - def listIds(self) -> list[str]: - return [Path(f).stem for f in glob(f"{self._sessionPath}/*.json")] - - def read(self, id: str) -> dict: - with open(self._sessionPath / f"{id}.json", "r") as f: - session = json.load(f) - return session - - def write(self, session: dict, id: str) -> None: - with open(self._sessionPath / f"{id}.json", "w") as f: - json.dump(session, f) - -class _FileBrowserBackend(_Backend): - def __init__(self, serverUrl: str): - self._baseUrl = serverUrl - self._username = getenv("ST_USER") - self._password = getenv("ST_PASS") - self._apiKey = self._getApiKey() - - def listIds(self) -> list[str]: - url = f"{self._baseUrl}/api/resources" - response = self._request("GET", url) - return [item["name"][0:-5] for item in response.json()["items"] if item["extension"] == ".json"] - - def read(self, id: str) -> dict: - url = f"{self._baseUrl}/api/raw/{id}.json" - response = self._request("GET", url) - return json.loads(response.content) - - def write(self, session: dict, id: str) -> None: - url = f"{self._baseUrl}/api/resources/{id}.json" - self._request("PUT", url, json=session) - - def _getApiKey(self) -> str: - response = requests.post(f"{self._baseUrl}/api/login", json={"username":self._username, "password":self._password}) - return response.content - - def _request(self, verb: str, url: str, **kwargs): - headers = {"X-Auth" : self._apiKey} - response = requests.request(verb, url, headers=headers, **kwargs) - if response.status_code == requests.codes.UNAUTHORIZED: - # if unauthorized, the key might have expired - self._apiKey = self._getApiKey() - headers["X-Auth"] = self._apiKey - response = requests.request(verb, url, headers=headers, **kwargs) - response.raise_for_status() - return response + self._backend.writeSession(session, id) + def saveRecording(self, recording: Path, destination: str) -> None: + self._backend.writeRecording(recording, destination) -- cgit v1.2.3