From b56e4f36b42a1746deb97acb85a9e36659511c82 Mon Sep 17 00:00:00 2001 From: Matthias Blankertz Date: Sun, 2 Nov 2025 14:24:15 +0100 Subject: [PATCH] fix(main): Make upgrade from tag directories more ergonomical As we don't have an API to upload files and create playlists yet, we used the convention "tag uid as directory name" to allow testing playback. With the introduction of the database in #39 "Add playlist db" a builddb() function to initialize the database from the tag directories was added, but it is not automatically called. To make the developer experience more ergonomical, add a check for that automatically runs builddb() when no database exists. Signed-off-by: Matthias Blankertz --- software/src/main.py | 59 +++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/software/src/main.py b/software/src/main.py index 7317e65..3abfb06 100644 --- a/software/src/main.py +++ b/software/src/main.py @@ -3,9 +3,11 @@ import aiorepl # type: ignore import asyncio +from errno import ENOENT import machine import micropython import network +import os import time from math import pi, sin, pow @@ -62,6 +64,9 @@ def setup_wifi(): wlan.active(True) +DB_PATH = '/sd/tonberry.db' + + def run(): asyncio.new_event_loop() # Setup LEDs @@ -73,27 +78,36 @@ def run(): # Setup MP3 player with SDContext(mosi=hwconfig.SD_DI, miso=hwconfig.SD_DO, sck=hwconfig.SD_SCK, ss=hwconfig.SD_CS, - baudrate=hwconfig.SD_CLOCKRATE), \ - BTreeFileManager('/sd/tonberry.db') as playlistdb, \ - AudioContext(hwconfig.I2S_DIN, hwconfig.I2S_DCLK, hwconfig.I2S_LRCLK) as audioctx: + baudrate=hwconfig.SD_CLOCKRATE): + # Temporary hack: build database from folders if no database exists + # Can be removed once playlists can be created via API + try: + _ = os.stat(DB_PATH) + except OSError as ex: + if ex.errno == ENOENT: + print("No playlist DB found, trying to build DB from tag dirs") + builddb() - # Setup NFC - reader = MFRC522(spi_id=hwconfig.RC522_SPIID, sck=hwconfig.RC522_SCK, miso=hwconfig.RC522_MISO, - mosi=hwconfig.RC522_MOSI, cs=hwconfig.RC522_SS, rst=hwconfig.RC522_RST, tocard_retries=20) + with BTreeFileManager(DB_PATH) as playlistdb, \ + AudioContext(hwconfig.I2S_DIN, hwconfig.I2S_DCLK, hwconfig.I2S_LRCLK) as audioctx: - # Setup app - deps = app.Dependencies(mp3player=lambda the_app: MP3Player(audioctx, the_app), - nfcreader=lambda the_app: Nfc(reader, the_app), - buttons=lambda the_app: Buttons(the_app, pin_volup=hwconfig.BUTTON_VOLUP, - pin_voldown=hwconfig.BUTTON_VOLDOWN, - pin_next=hwconfig.BUTTON_NEXT), - playlistdb=lambda _: playlistdb) - the_app = app.PlayerApp(deps) + # Setup NFC + reader = MFRC522(spi_id=hwconfig.RC522_SPIID, sck=hwconfig.RC522_SCK, miso=hwconfig.RC522_MISO, + mosi=hwconfig.RC522_MOSI, cs=hwconfig.RC522_SS, rst=hwconfig.RC522_RST, tocard_retries=20) - # Start - asyncio.create_task(aiorepl.task({'timer_manager': TimerManager(), - 'app': the_app})) - asyncio.get_event_loop().run_forever() + # Setup app + deps = app.Dependencies(mp3player=lambda the_app: MP3Player(audioctx, the_app), + nfcreader=lambda the_app: Nfc(reader, the_app), + buttons=lambda the_app: Buttons(the_app, pin_volup=hwconfig.BUTTON_VOLUP, + pin_voldown=hwconfig.BUTTON_VOLDOWN, + pin_next=hwconfig.BUTTON_NEXT), + playlistdb=lambda _: playlistdb) + the_app = app.PlayerApp(deps) + + # Start + asyncio.create_task(aiorepl.task({'timer_manager': TimerManager(), + 'app': the_app})) + asyncio.get_event_loop().run_forever() def builddb(): @@ -101,10 +115,11 @@ def builddb(): For testing, build a playlist db based on the previous tag directory format. Can be removed once uploading files / playlist via the web api is possible. """ - import os - - os.unlink('/sd/tonberry.db') - with BTreeFileManager('/sd/tonberry.db') as db: + try: + os.unlink(DB_PATH) + except OSError: + pass + with BTreeFileManager(DB_PATH) as db: for name, type_, _, _ in os.ilistdir(b'/sd'): if type_ != 0x4000: continue