aboutsummaryrefslogtreecommitdiffstats
path: root/web-project/src
diff options
context:
space:
mode:
authorEddy Pedroni <epedroni@pm.me>2025-07-15 22:54:55 +0200
committerEddy Pedroni <epedroni@pm.me>2025-07-15 22:54:55 +0200
commit1d42bfe5f7b3c671fc5b50e716c5e8aa68728fb3 (patch)
tree0645cba6faaf0e20926a03c3d5e2dd4d878c1d7b /web-project/src
parentfb63f6b5912171595065ea7498d1d770a175d1d9 (diff)
Refactor session manager to be independent of the underlying storage
Diffstat (limited to 'web-project/src')
-rw-r--r--web-project/src/solo_tool_web.py46
1 files changed, 24 insertions, 22 deletions
diff --git a/web-project/src/solo_tool_web.py b/web-project/src/solo_tool_web.py
index 20d2d11..5512408 100644
--- a/web-project/src/solo_tool_web.py
+++ b/web-project/src/solo_tool_web.py
@@ -1,4 +1,3 @@
-from glob import glob
import sys
from os import getenv
from os.path import basename, splitext
@@ -8,12 +7,9 @@ from starlette.formparsers import MultiPartParser
import click
from solo_tool import SoloTool
-from solo_tool.session_manager import loadSession, saveSession
+from solo_tool.session_manager import getSessionManager
from solo_tool import handlers
-SESSION_DIR = getenv("SESSION_DIR", "/home/eddy/music/sessions")
-SONG_POOL = getenv("SONG_POOL", "/home/eddy/music/songs")
-
def fileName(path: str) -> str:
return basename(splitext(path)[0])
@@ -31,13 +27,7 @@ def songList(st: SoloTool, songDrawer) -> None:
ui.item(fileName(path), on_click=handlers.songAbsolute(st, i, lambda: songDrawer.hide())).props('clickable v-ripple')
sessions = {}
-for f in glob(f"{SESSION_DIR}/*.json"):
- sessionName = fileName(f)
- songTool = loadSession(f, SONG_POOL)
- songTool.registerKeyPointListCallback(lambda new: keyPointList.refresh())
- songTool.registerSongSelectionCallback(lambda new: keyPointList.refresh())
- songTool.registerSongListCallback(lambda new: songList.refresh())
- sessions[sessionName] = songTool
+sessionManager = None
@ui.page('/{sessionName}')
def sessionPage(sessionName: str):
@@ -56,11 +46,12 @@ def sessionPage(sessionName: str):
# Upload song dialog
def handleFileUpload(e):
- from shutil import copyfileobj
- newSong = f"{SONG_POOL}/{e.name}"
- with open(newSong, "wb") as f:
- copyfileobj(e.content, f)
- st.addSong(newSong)
+ if False:
+ from shutil import copyfileobj
+ newSong = f"{SONG_POOL}/{e.name}"
+ with open(newSong, "wb") as f:
+ copyfileobj(e.content, f)
+ st.addSong(newSong)
with ui.dialog() as uploadSongDialog:
ui.upload(label="Upload songs", auto_upload=True, on_upload=handleFileUpload).classes('max-w-full')
@@ -72,7 +63,7 @@ def sessionPage(sessionName: str):
ui.label().bind_text_from(st, 'song', lambda index: fileName(st.songs[index]) if index is not None else "Select a song").classes('text-lg')
with ui.row().classes('items-center justify-start'):
ui.button(icon='home', on_click=lambda: ui.navigate.to("/")).props('flat dense round color=white')
- def save(): saveSession(st, f"{SESSION_DIR}/{sessionName}.json")
+ def save(): sessionManager.saveSession(st, f"{sessionName}.json")
ui.button(icon='save', on_click=save).props('flat dense round color=white')
ui.button(icon='fullscreen', on_click=fullscreen.toggle).props('flat dense round color=white')
@@ -129,7 +120,16 @@ def landingPage():
for name, soloTool in sessions.items():
ui.button(name, on_click=partial(ui.navigate.to, f"/{name}"))
-def start(port, refresh, reload):
+def start(port, refresh, reload, session_path, song_path):
+ sessionManager = getSessionManager(song_path, session_path)
+
+ for key in sessionManager.getSessions():
+ songTool = sessionManager.loadSession(key)
+ songTool.registerKeyPointListCallback(lambda new: keyPointList.refresh())
+ songTool.registerSongSelectionCallback(lambda new: keyPointList.refresh())
+ songTool.registerSongListCallback(lambda new: songList.refresh())
+ sessions[fileName(key)] = songTool
+
try:
ui.run(reload=reload, binding_refresh_interval=refresh, port=port)
except KeyboardInterrupt:
@@ -139,9 +139,11 @@ def start(port, refresh, reload):
@click.option("--port", type=int, default=8080, help="Port on which to bind.")
@click.option("--refresh", type=float, default=0.5, help="Refresh interval in seconds.")
@click.option("--reload/--no-reload", default=True, help="Auto-reload when files change.")
-def main(port, refresh, reload):
- start(port, refresh, reload)
+@click.option("--session_path", default="/home/eddy/music/sessions", help="Look for sessions in this location.")
+@click.option("--song_path", default="/home/eddy/music/songs", help="Look for songs in this location.")
+def main(port, refresh, reload, session_path, song_path):
+ start(port, refresh, reload, session_path, song_path)
# Hardcoded dev settings
if __name__ in {"__main__", "__mp_main__"}:
- start(8080, 0.5, True)
+ start(8080, 0.5, True, "/home/eddy/music/sessions", "/home/eddy/music/songs")