diff options
| author | Eddy Pedroni <epedroni@pm.me> | 2025-07-17 11:46:39 +0200 | 
|---|---|---|
| committer | Eddy Pedroni <epedroni@pm.me> | 2025-07-17 11:46:39 +0200 | 
| commit | 878ed5d699597dfa197636efe67f38000b67fe7e (patch) | |
| tree | 38d7e2f6ff3863d80dda4f9d58e22a0eabfd2e8c | |
| parent | cd6a5068a81b775e545946dd591a3ab83412985d (diff) | |
Add partial implementation of FB session manager
| -rw-r--r-- | solo-tool-project/src/solo_tool/session_manager.py | 59 | ||||
| -rw-r--r-- | web-project/pyproject.toml | 1 | ||||
| -rw-r--r-- | web-project/src/solo_tool_web.py | 1 | 
3 files changed, 42 insertions, 19 deletions
| diff --git a/solo-tool-project/src/solo_tool/session_manager.py b/solo-tool-project/src/solo_tool/session_manager.py index be928a4..4f831ba 100644 --- a/solo-tool-project/src/solo_tool/session_manager.py +++ b/solo-tool-project/src/solo_tool/session_manager.py @@ -4,6 +4,7 @@ from glob import glob  import json  from pathlib import Path  from . import SoloTool +import requests  class SessionManager(Protocol):      @abstractmethod @@ -22,19 +23,9 @@ class SessionManager(Protocol):      def addSong(self, name: str, content: BinaryIO) -> None:          raise NotImplementedError -class _FileSystemSessionManager(SessionManager): -    def __init__(self, songPool: str, sessionPath: str): -        self._songPool = Path(songPool) -        self._sessionPath = Path(sessionPath) - -    def getSessions(self) -> list[str]: -        return [Path(f).stem for f in glob(f"{self._sessionPath}/*.json")] - -    def loadSession(self, key: str, player=None) -> SoloTool: -        with open(self._sessionPath / f"{key}.json", "r") as f: -            session = json.load(f) - -        st = SoloTool(self._songPool, player=player) +    @staticmethod +    def _dict2st(session: dict, songPool: str, player) -> SoloTool: +        st = SoloTool(songPool, player=player)          for i, entry in enumerate(session):              songPath = entry["path"] @@ -45,16 +36,32 @@ class _FileSystemSessionManager(SessionManager):          return st -    def saveSession(self, soloTool: SoloTool, key: str) -> None: +    @staticmethod +    def _st2dict(soloTool: SoloTool) -> dict:          session = [] -          for i, song in enumerate(soloTool.songs):              entry = {                  "path": song,                  "key_points" : soloTool._keyPoints[i]              }              session.append(entry) +        return session + +class _FileSystemSessionManager(SessionManager): +    def __init__(self, songPool: str, sessionPath: str): +        self._songPool = Path(songPool) +        self._sessionPath = Path(sessionPath) + +    def getSessions(self) -> list[str]: +        return [Path(f).stem for f in glob(f"{self._sessionPath}/*.json")] + +    def loadSession(self, key: str, player=None) -> SoloTool: +        with open(self._sessionPath / f"{key}.json", "r") as f: +            session = json.load(f) +        return SessionManager._dict2st(session, self._songPool, player) +    def saveSession(self, soloTool: SoloTool, key: str) -> None: +        session = SessionManager._st2dict(soloTool)          with open(self._sessionPath / f"{key}.json", "w") as f:              json.dump(session, f) @@ -65,14 +72,24 @@ class _FileSystemSessionManager(SessionManager):              copyfileobj(content, f)  class _FileBrowserSessionManager(SessionManager): -    def __init__(self, songPool: str, sessionPath: str): -        pass +    def __init__(self, songPoolUrl: str, sessionUrl: str): +        self._baseUrl = "https://files.0xf7.com" +        self._songPool = songPoolUrl +        self._username = "solo-tool" +        self._password = "mwC0ML8vLpJLPCLHKuxkiOxtIaE" +        self._apiKey = self._getApiKey()      def getSessions(self) -> list[str]: -        pass +        url = f"{self._baseUrl}/api/resources/sessions" +        response = requests.get(url, headers={"X-Auth":self._apiKey}) +        response.raise_for_status() +        return [item["name"][0:-5] for item in response.json()["items"] if item["extension"] == ".json"]      def loadSession(self, key: str, player=None) -> SoloTool: -        pass +        url = f"{self._baseUrl}/api/raw/sessions/{key}.json" +        response = requests.get(url, headers={"X-Auth":self._apiKey}) +        response.raise_for_status() +        return SessionManager._dict2st(json.loads(response.content), self._songPool, player=player)      def saveSession(self, soloTool: SoloTool, key: str) -> None:          pass @@ -80,6 +97,10 @@ class _FileBrowserSessionManager(SessionManager):      def addSong(self, name: str, content: BinaryIO) -> None:          pass +    def _getApiKey(self) -> str: +        response = requests.post(f"{self._baseUrl}/api/login", json={"username":self._username, "password":self._password}) +        return response.content +  def getSessionManager(songPool: str, sessionPath: str) -> SessionManager:      from re import search      match = search(r"^([a-z0-9]+://)", sessionPath) diff --git a/web-project/pyproject.toml b/web-project/pyproject.toml index b175dcc..19353c2 100644 --- a/web-project/pyproject.toml +++ b/web-project/pyproject.toml @@ -12,6 +12,7 @@ requires-python = ">=3.13"  dependencies = [      "nicegui==2.11.1",      "click==8.2.1", +    "requests==2.32.4",      "solo_tool>=2.0"  ]  dynamic = ["version"] diff --git a/web-project/src/solo_tool_web.py b/web-project/src/solo_tool_web.py index 7b36b75..ace19b1 100644 --- a/web-project/src/solo_tool_web.py +++ b/web-project/src/solo_tool_web.py @@ -143,4 +143,5 @@ def main(port, refresh, reload, session_path, song_path):  # Hardcoded dev settings  if __name__ in {"__main__", "__mp_main__"}: +    #start(8080, 0.5, True, "https://files.0xf7.com", "https://files.0xf7.com/api/public/dl/NR1j-os8/guitar-practice/solo-tool/songs")      start(8080, 0.5, True, "/home/eddy/music/sessions", "/home/eddy/music/songs") | 
