- 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>
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>
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.