aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--solo-tool-project/src/solo_tool/session_manager.py3
-rw-r--r--solo-tool-project/src/solo_tool/storage.py14
-rw-r--r--web-project/src/solo_tool_web.py15
3 files changed, 28 insertions, 4 deletions
diff --git a/solo-tool-project/src/solo_tool/session_manager.py b/solo-tool-project/src/solo_tool/session_manager.py
index 7d98106..96b100a 100644
--- a/solo-tool-project/src/solo_tool/session_manager.py
+++ b/solo-tool-project/src/solo_tool/session_manager.py
@@ -19,6 +19,9 @@ class SessionManager():
def getSessions(self) -> list[str]:
return self._backend.listSessions()
+ def getSongs(self) -> list[str]:
+ return self._backend.listSongs()
+
def loadSession(self, id: str, player=None) -> SoloTool:
session = self._backend.readSession(id)
diff --git a/solo-tool-project/src/solo_tool/storage.py b/solo-tool-project/src/solo_tool/storage.py
index 0c5577f..d07ba25 100644
--- a/solo-tool-project/src/solo_tool/storage.py
+++ b/solo-tool-project/src/solo_tool/storage.py
@@ -24,12 +24,15 @@ class StorageBackend(Protocol):
def writeRecording(self, recording: Path, destination: str) -> None:
raise NotImplementedError
+ @abstractmethod
+ def listSongs(self) -> list[str]:
+ raise NotImplementedError
+
class FileSystemStorageBackend(StorageBackend):
def __init__(self, storagePath: str):
self._storagePath = Path(storagePath)
def listSessions(self) -> list[str]:
- #return [Path(f).stem for f in glob(f"{self._storagePath / "sessions"}/*.json")]
return [Path(f).stem for f in glob(str(self._storagePath / "sessions" / "*.json"))]
def readSession(self, id: str) -> dict:
@@ -44,12 +47,16 @@ class FileSystemStorageBackend(StorageBackend):
def writeRecording(self, recording: Path, destination: str) -> None:
pass
+ def listSongs(self) -> list[str]:
+ return [str(Path(f).absolute()) for f in glob(str(self._storagePath / "songs" / "*"))]
+
class FileBrowserStorageBackend(StorageBackend):
def __init__(self, serverUrl: str):
self._baseUrl = serverUrl
self._username = getenv("ST_USER")
self._password = getenv("ST_PASS")
self._apiKey = self._getApiKey()
+ self._publicUrl = "https://files.0xf7.com/api/public/dl/NR1j-os8/solo-tool"
def listSessions(self) -> list[str]:
url = f"{self._baseUrl}/api/resources/sessions"
@@ -70,6 +77,11 @@ class FileBrowserStorageBackend(StorageBackend):
with open(recording, "rb") as file:
self._request("POST", url, {"Content-Type" : "audio/mpeg"}, data=file)
+ def listSongs(self) -> list[str]:
+ url = f"{self._baseUrl}/api/resources/songs"
+ response = self._request("GET", url)
+ return [f"{self._publicUrl}{item["path"]}" for item in response.json()["items"]]
+
def _getApiKey(self) -> str:
response = requests.post(f"{self._baseUrl}/api/login", json={"username":self._username, "password":self._password})
return response.content
diff --git a/web-project/src/solo_tool_web.py b/web-project/src/solo_tool_web.py
index 25beb6f..98cb9df 100644
--- a/web-project/src/solo_tool_web.py
+++ b/web-project/src/solo_tool_web.py
@@ -69,8 +69,17 @@ def sessionPage(sessionId: str):
ui.keyboard(on_key=makeKeyboardHandler(st))
# Manage songs dialog
- with ui.dialog() as manageSongsDialog:
- ui.label("Under construction")
+ with ui.dialog() as manageSongsDialog, ui.card():
+ with ui.list().props('bordered separator'):
+ for song in sessionManager.getSongs():
+ def addSong(s):
+ st.addSong(s)
+ manageSongsDialog.close()
+ with ui.item(on_click=partial(addSong, song)):
+ with ui.item_section().props('avatar'):
+ ui.icon('music_note')
+ with ui.item_section():
+ ui.item_label(basename(song))
# Header
with ui.header().classes('items-center justify-between'):
@@ -166,5 +175,5 @@ def main(port, refresh, reload, session_path, buffer_size, sampling_rate):
# Hardcoded dev settings
if __name__ in {"__main__", "__mp_main__"}:
- start(8080, 0.5, False, "https://files.0xf7.com", 1024, 48000)
+ start(8080, 0.5, True, "https://files.0xf7.com", 1024, 48000)
#start(8080, 0.5, True, "/home/eddy/music", 1024, 48000)