diff options
Diffstat (limited to 'solo-tool-project/src/solo_tool')
| -rw-r--r-- | solo-tool-project/src/solo_tool/session_manager.py | 59 | 
1 files changed, 40 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) | 
