Commit Graph

49 Commits

Author SHA1 Message Date
69119bb72a Add per-episode podcast cover art and fix nested album grouping
- podcast_feeds.py: fetch per-episode cover art from a feed's itunes:image
  (when it's genuinely distinct from the channel image) or, failing that,
  from the og:image on the episode's own linked page; extract audio from
  video-only enclosures via ffmpeg; match podcast-dl's filename convention
  (illegal characters become "_" instead of being dropped) so enabling
  feed.txt on an already-downloaded show doesn't re-download its back catalog
- scanner.py: _cover_for_episode now checks for a same-stem sidecar cover
  image before falling back to embedded ID3 art and the shared folder cover
- scanner.py/__init__.py: fixed a bug where an album folder nested one level
  deeper than usual (an age-range grouping folder, say) was mistaken for an
  empty album and skipped; added periodic progress logging for long scans
  and analysis passes

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 09:54:33 +02:00
747c390303 Add IR remote control (LIRC) with a number-key content mapping
Adds a TCP client for lircd's classic protocol: play/pause/next/prev/
volume/mute map to the same intents every other front-end already
emits, and number keys 0-9 play an assigned album/audiobook from the
start or a podcast show's newest episode, resolved fresh on every
press. The mapping is configured in config.yml and editable from the
frontend: a small "Taste zuweisen" button on the play screen (or the
A+digit keyboard shortcut) opens a 10-key picker to assign whatever is
currently playing.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 08:31:28 +02:00
57afc32f4a Auto-download new podcast episodes from an RSS feed
A show folder under Kinderpodcasts/ opts in by containing a feed.txt marker
naming its RSS feed. A new PodcastFeedService polls every such feed every 6
hours (and once at startup), downloads any episode not already on disk using
the existing YYYYMMDD - Title.ext convention, and triggers the same
rescan-and-broadcast sequence "Bibliothek neu einlesen" already uses - now
shared via App.rescan_library() instead of duplicated. A show with no
feed.txt is untouched, so there is no new config section for this.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-10 22:43:50 +02:00
2e0e6ad199 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.
2026-09-10 22:42:51 +02:00
8aed3b022b updates 2026-08-27 23:46:19 +02:00
a8ed350aec Add "Mein Zimmer" room-control page (Home Assistant, proxied through the backend)
Implements the room-control page from the design mockup: a scenes row above cards
for shutters, color lamps, and brightness-only lamps, all driven by a new
`general.ha` config section (server URL, token, ordered device/scene lists).

The backend proxies every Home Assistant call server-side (GET/POST /api/ha/...)
rather than the browser calling Home Assistant directly, so the long-lived token
never leaves the LAN device and Home Assistant's own CORS settings don't need to
know about musicmouse at all. Card kind (shutter/color/brightness-only) is
inferred at runtime from what Home Assistant reports about each entity, not
configured explicitly.

Also stops tracking python-backend/config.yml, which had drifted into the repo
despite its own header saying it shouldn't be - it now carries real credentials
locally and needs to stay untracked.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 23:45:29 +02:00
edb6e5e027 Web frontend 2026-08-27 12:32:20 +02:00
d44c24ec97 Full rearchitecture using Claude
- event bus systen
- all components are independent
- preparation for web frontend
2026-08-26 13:22:28 +02:00
55bcc9448c color parsing cleanup 2026-08-26 11:28:48 +02:00
1cb3387fbe Fix: lights now should turn off correctly when playlist ends 2026-08-26 10:54:40 +02:00
7aa7fe4693 Claude cleanup 2026-08-26 10:38:56 +02:00
bd8925a278 Cleaned up repository
- only moving files around
2026-08-25 17:06:53 +02:00
Martin Bauer
b2c060fcc9 Adapted to new aiomqtt version release/1.1 2024-03-07 16:38:05 +01:00
Martin Bauer
11bf0505fb Changes for python3.11 2024-03-06 17:15:07 +01:00
Martin Bauer
ef038a29a4 fixes release/1.0 2024-01-02 17:41:43 +01:00
Martin Bauer
d5a4bbb7e2 new static effect with range select, increment, and transition time 2024-01-01 18:54:24 +01:00
Martin Bauer
6128d8706d MQTT persist discovery msg 2023-10-09 10:54:33 +02:00
Martin Bauer
6850c9646e from desktop pc 2023-10-06 08:51:28 +02:00
Martin Bauer
828d1b3360 missing files 2023-10-06 08:51:27 +02:00
Martin Bauer
804940bfac modification on musicmouse host 2023-01-03 20:50:45 +01:00
Martin Bauer
a67c6078c5 Local modification 2022-10-02 12:40:42 +02:00
Martin Bauer
42f0701c0b mqtt for shelve light using json protocol now -> more reliable 2022-02-04 18:13:46 +01:00
Martin Bauer
4c5db49c61 mqtt integration 2022-01-13 19:20:33 +01:00
Martin Bauer
1458793d74 started mqtt shelve led control 2022-01-12 22:35:49 +01:00
Martin Bauer
1a17d49599 adding shelve leds 2022-01-12 18:13:59 +01:00
Martin Bauer
32b1c54fbc wip 2021-12-28 11:42:39 +01:00
Martin Bauer
59060d6636 Changes on device 2021-12-26 11:30:56 +01:00
Martin Bauer
da9373e74d generalized main - get values from config 2021-12-24 22:11:43 +01:00
Martin Bauer
823552ce7f updates 2021-12-24 00:12:43 +01:00
Martin Bauer
9a68619293 msgs for button background leds 2021-12-20 21:32:05 +01:00
Martin Bauer
74118fbeb7 Reverse swipe 2021-12-20 20:41:50 +01:00
Martin Bauer
bb5d3e1870 Different color for each figure 2021-12-19 13:46:45 +01:00
Martin Bauer
7a1ed75998 Some missing files & fixes 2021-12-16 23:39:13 +01:00
Martin Bauer
6243480f6e prev/next buttons working 2021-12-16 22:34:40 +01:00
Martin Bauer
1c406f8b4e volume control 2021-12-15 23:14:59 +01:00
Martin Bauer
ee632664e6 Touch events & rotary events to host 2021-12-15 22:47:28 +01:00
Martin Bauer
f9f1244807 mouse leds test 2021-12-15 19:21:16 +01:00
Martin Bauer
f4e31176a9 first try with vlc 2021-11-27 22:05:48 +01:00
Martin Bauer
4fbd7f0f1b Firmware cleanup 2021-11-27 21:18:54 +01:00
Martin Bauer
11db5763eb 2way host-firmware comm 2021-11-27 19:04:08 +01:00
Martin Bauer
e1807360f8 started host <-> fw communication 2021-11-25 22:20:04 +01:00
Martin Bauer
da9a96fdfa Color interpolation effect 2021-11-19 20:31:39 +01:00
Martin Bauer
0bbb5d278c Swipe backwards 2021-11-19 17:34:59 +01:00
Martin Bauer
aa76900244 Alexa swipe effect 2021-11-19 17:22:09 +01:00
Martin Bauer
484db9bdfa start/stop for audio player 2021-11-18 17:52:45 +01:00
Martin Bauer
3bb280cda2 c++ audio player 2021-11-18 15:47:49 +01:00
Martin Bauer
5a41c03e8e Separate FreeRTOS task for LED 2021-11-17 23:18:10 +01:00
Martin Bauer
c68114dc4c New led control 2021-11-16 22:04:22 +01:00
Martin Bauer
6a5d4c463c Initial commit 2021-10-27 16:40:18 +02:00