aboutsummaryrefslogtreecommitdiffstats
path: root/solo-tool-project/src/solo_tool/session_manager.py
diff options
context:
space:
mode:
authorEddy Pedroni <epedroni@pm.me>2026-01-01 17:57:27 +0100
committerEddy Pedroni <epedroni@pm.me>2026-01-01 17:57:27 +0100
commit8ea2b64ff798af913dcba64baace8d2536bf0b18 (patch)
treef85ea2f371055e67c629909df4897aec2f4bbad2 /solo-tool-project/src/solo_tool/session_manager.py
parent88ce99d87889cdf953af611ef09d7a12b6d23747 (diff)
Add Android app wrapper around web interface
Diffstat (limited to 'solo-tool-project/src/solo_tool/session_manager.py')
-rw-r--r--solo-tool-project/src/solo_tool/session_manager.py88
1 files changed, 10 insertions, 78 deletions
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)