diff options
author | Eddy Pedroni <epedroni@pm.me> | 2025-07-15 22:54:55 +0200 |
---|---|---|
committer | Eddy Pedroni <epedroni@pm.me> | 2025-07-15 22:54:55 +0200 |
commit | 1d42bfe5f7b3c671fc5b50e716c5e8aa68728fb3 (patch) | |
tree | 0645cba6faaf0e20926a03c3d5e2dd4d878c1d7b /web-project/src | |
parent | fb63f6b5912171595065ea7498d1d770a175d1d9 (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.py | 46 |
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") |