Add librosa beat/mood analysis and an Ambience background driven by it
The background worker now runs a real librosa analyzer (tempo, beat grid, per-second energy/valence curves) instead of only the null baseline, kept behind build_analyzer() so a plain checkout without the analysis extra still runs fine. The web player reads that per-track analysis and drives a new animated "Ambience" background (bubbles, colour, current) that reacts to the beat and the mood curve as the track plays, plus a debug overlay for tuning it. Also adds a one-off script to backfill podcast cover art from iTunes.
This commit is contained in:
@@ -34,7 +34,6 @@ from musicmouse.events import (
|
||||
from musicmouse.services.web.hub import StateHub
|
||||
from musicmouse.services.web.schemas import (
|
||||
AlbumOut,
|
||||
BeatsOut,
|
||||
HaConfigOut,
|
||||
HaDeviceOut,
|
||||
LibraryOut,
|
||||
@@ -43,6 +42,8 @@ from musicmouse.services.web.schemas import (
|
||||
SeekIn,
|
||||
SettingsIn,
|
||||
SettingsOut,
|
||||
TrackCurvesOut,
|
||||
TrackDetailOut,
|
||||
VolumeIn,
|
||||
)
|
||||
from musicmouse.services.web.settings import (
|
||||
@@ -86,11 +87,16 @@ def build_router(
|
||||
)
|
||||
|
||||
@router.get("/tracks/{album_id}/{index}/analysis")
|
||||
def get_track_analysis(album_id: str, index: int) -> BeatsOut:
|
||||
def get_track_analysis(album_id: str, index: int) -> TrackDetailOut:
|
||||
grid = app.library.beats(album_id, index)
|
||||
if grid is None:
|
||||
curve = app.library.curve(album_id, index)
|
||||
if grid is None and curve is None:
|
||||
raise HTTPException(status_code=404, detail="not analyzed")
|
||||
return BeatsOut(times=list(grid.times), strengths=list(grid.strengths))
|
||||
return TrackDetailOut(
|
||||
times=list(grid.times) if grid else [],
|
||||
strengths=list(grid.strengths) if grid else [],
|
||||
curve=TrackCurvesOut(**curve.to_json()) if curve else None,
|
||||
)
|
||||
|
||||
@router.post("/library/refresh", status_code=202)
|
||||
async def refresh_library() -> Response:
|
||||
|
||||
Reference in New Issue
Block a user