diff options
| -rw-r--r-- | solo-tool-project/src/solo_tool/player_mpv.py | 3 | ||||
| -rw-r--r-- | solo-tool-project/src/solo_tool/solo_tool.py | 3 | ||||
| -rw-r--r-- | web-project/src/solo_tool_web.py | 58 | 
3 files changed, 40 insertions, 24 deletions
| diff --git a/solo-tool-project/src/solo_tool/player_mpv.py b/solo-tool-project/src/solo_tool/player_mpv.py index 1297b63..ff7fd1a 100644 --- a/solo-tool-project/src/solo_tool/player_mpv.py +++ b/solo-tool-project/src/solo_tool/player_mpv.py @@ -9,6 +9,9 @@ class Player:          self._player.observe_property("pause", lambda name, value: self._playingStateCallback())          self._player.observe_property("volume", lambda name, value: self._volumeCallback()) +    def __del__(self): +        self._player.close() +      def _dummyCallback(self):          pass diff --git a/solo-tool-project/src/solo_tool/solo_tool.py b/solo-tool-project/src/solo_tool/solo_tool.py index 349f3a0..ad1bb23 100644 --- a/solo-tool-project/src/solo_tool/solo_tool.py +++ b/solo-tool-project/src/solo_tool/solo_tool.py @@ -14,6 +14,9 @@ class SoloTool:          self._keyPoints = []          self._keyPoint = None +    def __del__(self): +        del self._player +      def _updateSong(self, index):          previousSong = self._song          self._song = index diff --git a/web-project/src/solo_tool_web.py b/web-project/src/solo_tool_web.py index 758825d..4d05e01 100644 --- a/web-project/src/solo_tool_web.py +++ b/web-project/src/solo_tool_web.py @@ -5,57 +5,56 @@ from solo_tool.session_manager import loadSession  from solo_tool import handlers  from solo_tool.midi_controller_launchpad_mini import MidiController -st = loadSession("/home/eddy/music/sessions/funk-band-2024.json", "/home/eddy/music") -midiController = MidiController(st) +SESSION_DIR = "/home/eddy/music/sessions" +SONG_POOL = "/home/eddy/music" -try: -    midiController.connect() -except: -    pass +st = None -def songName(path: str) -> str: +def fileName(path: str) -> str:      from os.path import basename, splitext      return basename(splitext(path)[0]) -def addKeyPoint() -> None: -    st.keyPoints += [st.keyPoint] - -def setPosition(e) -> None: -    st.position = e.args -  @ui.refreshable -def keyPointTables() -> None: +def keyPointTables(st: SoloTool) -> None:      for i, song in enumerate(st.songs):          with ui.list().props('separator').bind_visibility_from(st, 'song', value=i):              for kp in st._keyPoints[i]:                  ui.item(f"{kp:0.2}", on_click=handlers.setKeyPoint(st, kp)).props('clickable v-ripple').classes('text-lg') -st.registerKeyPointListCallback(lambda new: keyPointTables.refresh()) - -def main(): +@ui.page('/{sessionFile}') +def sessionPage(sessionFile: str):      fullscreen = ui.fullscreen()      ui.dark_mode().enable()      ui.colors(secondary='#ffc107') -    #ui.run_javascript("rateSliderLabels = { 0: '0°C', 3: { label: '3°C' }, 5: '5°C', 6: '6°C' }") +    ui.page_title(sessionFile) + +    global st +    if st is not None: +        del st +    st = loadSession(f"{SESSION_DIR}/{sessionFile}.json", SONG_POOL) +    st.registerKeyPointListCallback(lambda new: keyPointTables.refresh())      # Header      with ui.header().classes('items-center'):          ui.button(icon='menu', on_click=lambda: song_drawer.toggle()).props('flat round dense color=white') -        ui.label().bind_text_from(st, 'song', lambda index: songName(st.songs[index]) if index is not None else "Select a song").classes('text-lg') +        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')      # Key points list      with ui.right_drawer(top_corner=True, bottom_corner=True).props('width=120 behavior=desktop'):          ui.label("Key Points").classes('text-lg') -        keyPointTables() +        keyPointTables(st) + +        def addKeyPoint() -> None: st.keyPoints += [st.keyPoint]          ui.button(icon='add', on_click=addKeyPoint).props('flat round dense color=white')      # Song list      with ui.left_drawer(bottom_corner=True).props('overlay breakpoint=8000') as song_drawer:          with ui.list().props('separator'):              for i, path in enumerate(st.songs): -                ui.item(songName(path), on_click=handlers.setSong(st, i, lambda: song_drawer.hide())).props('clickable v-ripple') +                ui.item(fileName(path), on_click=handlers.setSong(st, i, lambda: song_drawer.hide())).props('clickable v-ripple')      # Playback position +    def setPosition(e) -> None: st.position = e.args      ui.slider(min=0, max=1.0, step=0.001) \              .bind_value_from(st, 'position') \              .on('change', setPosition) \ @@ -86,7 +85,18 @@ def main():          ui.button(icon='fullscreen', on_click=fullscreen.toggle).props('outline') -    ui.run(binding_refresh_interval=0.5) +@ui.page('/') +def landingPage(): +    ui.dark_mode().enable() +    ui.page_title("Solo Tool") + +    # Header +    with ui.header().classes('items-center'): +        ui.label("Choose a session").classes('text-lg') + +    from glob import glob +    for f in glob(f"{SESSION_DIR}/*.json"): +        sessionName = fileName(f) +        ui.link(sessionName, f"/{sessionName}") -if __name__ in {'__main__', '__mp_main__'}: -    main() +ui.run(binding_refresh_interval=0.2) | 
