78 Commits
Author SHA1 Message Date
beefcarver 86da224448 chore(release): 1.2.5 v1.2.5 2026-11-15 09:18:45 -05:00
beefcarver 29d2b75209 chore(tools): drop the unused ansi_art generator 2026-11-15 09:07:51 -05:00
beefcarver e000b296b5 chore(tools): move bump_packaging.py to the repository root 2026-11-15 09:07:42 -05:00
beefcarver cbce35441d ci(release): publish the release to tildeforge as well 2026-11-15 09:07:37 -05:00
beefcarver 11ae0e2f7d chore(release): 1.2.4 v1.2.4 2026-11-14 17:28:24 -05:00
beefcarver 4d9058b9b2 ci(release): let a re-run override the existing release 2026-11-14 17:27:40 -05:00
beefcarver bdc9594408 chore(release): 1.2.3 v1.2.3 2026-11-14 17:05:22 -05:00
beefcarver e493b02796 docs: document the packaging bump tool 2026-11-14 17:05:22 -05:00
beefcarver 77a7e2b513 feat(tools): add bump_packaging to sync the AUR package and tap 2026-11-14 17:05:22 -05:00
beefcarver a597aef8cd ci(release): publish the sdist and wheel with each release 2026-11-14 17:05:22 -05:00
beefcarver ba41a426cc docs(readme): document uv tool install into ~/.local/bin 2026-11-14 16:40:45 -05:00
beefcarver 94c9363e1f ci: add Forgejo workflows for tests and tagged releases 2026-11-14 09:35:17 -05:00
beefcarver 456f6afa44 docs(tools): note that ansi_art heroes must opt out of the gradient 2026-11-14 09:35:10 -05:00
beefcarver 06ae18a17d docs: document the contrib layout, tap submodule and developer workflow 2026-11-14 09:35:05 -05:00
beefcarver a2b5771922 build(contrib): move packaging under contrib and track the tap as a submodule 2026-11-14 09:34:55 -05:00
beefcarver 499f99113f test(header): assert every catalogue follows the palette gradient 2026-11-14 09:34:53 -05:00
beefcarver 6aac4f4085 refactor(providers): paint every hero with the palette gradient 2026-11-14 09:34:52 -05:00
beefcarver e6684ddbbd docs(readme): document makepkg install while AUR sign-ups are closed 2026-11-04 17:07:14 -05:00
beefcarver d06a94f388 build(aur): add generated .SRCINFO metadata 2026-11-04 17:05:04 -05:00
beefcarver 1f686ce7ba build(homebrew): add Homebrew tap formula and publishing notes 2026-11-04 17:04:52 -05:00
beefcarver cbcdfae8bf build(aur): add AUR packaging 2026-11-04 17:04:47 -05:00
beefcarver ffd67fc90d docs(readme): document Arch Linux AUR installation 2026-11-04 17:04:38 -05:00
beefcarver 941c744638 docs(readme): trim licence section to the licence reference 2026-11-04 16:22:54 -05:00
beefcarver 2753a7b6ba chore(release): bump version to 1.2.2 2026-11-04 16:20:38 -05:00
beefcarver dc6ed00abe docs(readme): document Nix installation, modules and the flake dev shell 2026-11-04 16:20:38 -05:00
beefcarver 12792b1265 build(nix): add flake with package, dev shell and NixOS/Home Manager modules 2026-11-04 16:20:38 -05:00
beefcarver 4346f75eac test: spawn fake mpv and parec helpers with sys.executable 2026-11-04 16:20:38 -05:00
beefcarver e0e1ad5df3 chore(release): bump version to 1.2.1 2026-11-04 15:49:28 -05:00
beefcarver ec2ca72efb fix(frame): start the corner fade at the brightest palette stop
A ladder is a hue walk, not a brightness walk, so painting the hot end
backwards put the dim colour at the corner.  Sort the ramp by stock
brightness and follow the pane height for the bottom-left glow.
2026-11-04 15:49:26 -05:00
beefcarver 81116282cb chore(release): bump version to 1.2.0 2026-11-04 15:11:54 -05:00
beefcarver 03297e8751 docs(readme): rewrite for public release 2026-11-04 15:11:49 -05:00
beefcarver 638cc9eddb feat(radiobrowser): add search, paging and favourite lookup 2026-11-04 15:11:42 -05:00
beefcarver f96923b5b7 chore(release): 1.1.0 2026-11-04 08:56:10 -05:00
beefcarver 7ba2d50503 fix(ui): keep the help and catalogue menus inside the screen 2026-11-04 08:56:04 -05:00
beefcarver 43ddd8666b feat(palette): sixteen ANSI colour ladders, cycled with c 2026-11-04 08:55:51 -05:00
beefcarver 253b462df1 chore(release): 1.0.0 2026-11-03 20:38:34 -05:00
beefcarver 5eb60d378c feat(catalogue): tune a single-station catalogue on switch 2026-11-03 20:31:18 -05:00
beefcarver 0219df454c feat(ui): draw pane frames, page keys and a scroll thumb 2026-11-03 20:25:02 -05:00
beefcarver 49f7efe0d2 feat(providers): add nine catalogues and the Radio Browser directory 2026-11-03 20:24:53 -05:00
beefcarver a3ad693132 fix(ui): keep the catalogue picker title and hint apart 2026-11-03 18:44:57 -05:00
beefcarver b3bd8c1e9f chore(tools): key out white backgrounds in the ANSI art converter 2026-11-03 18:44:52 -05:00
beefcarver e14a349c2d fix(artwork): letterbox images and back alpha art with black 2026-11-03 18:44:47 -05:00
beefcarver 50a9a735f7 feat(bassdrive): add the drum & bass relay and a shared wordmark font 2026-11-03 18:44:40 -05:00
beefcarver 84ec3b08f6 docs(agents): record the uv sync requirement for checked-out venvs 2026-11-03 17:51:32 -05:00
beefcarver ba114599d0 fix(stage): name the presenter instead of a lone artwork glyph 2026-11-03 17:51:29 -05:00
beefcarver b31ad3f6fb feat(ui): add catalogue picker, schedule pane and per-provider hero 2026-11-03 17:51:27 -05:00
beefcarver 058d336a2c feat(tilderadio): add the tildeverse community stream as a catalogue 2026-11-03 17:51:23 -05:00
beefcarver 58e9202e25 test(providers): cover the registry and the app's catalogue independence
Registry lookup and its fallback for a stale slug, SomaFM branding and guessed mirrors, provider round-trip in the config, legacy-config migration and BEEFY_*/SOMAFM_* precedence - plus an end-to-end boot against a fake second provider, which is what actually proves the UI no longer knows about SomaFM.
2026-11-03 16:10:39 -05:00
beefcarver c4cc91ee1a feat(providers): add a pluggable station-catalogue seam
The app now holds one RadioProvider and asks it for stations, song history and stream URLs instead of importing SomaFM's HTTP client directly.

- models.py: provider-neutral Song/Station plus the shared parsers every catalogue needs (Station.provider/.uid keep ids unique once there is more than one).
- providers/base.py: the RadioProvider interface and the toolkit it needs in practice - httpx client factory, .pls/.m3u resolution with an 8h disk cache, and a default stream_candidates() strategy.
- providers/somafm/: everything SomaFM-specific (channels.json, songs/<id>.json, PLS layout, guessed icecast mirrors) behind SomaFMProvider.
- providers/__init__.py: registry, get_provider() and --provider, remembered in the config file.

Widgets render branding, splash copy and the help credits from the active provider, so a second catalogue needs no UI changes; with SomaFM selected the screen is byte-identical to before.
2026-11-03 16:10:30 -05:00
beefcarver e30ca09627 refactor!: rename somafm-tui to beefy-player
The app is now a general internet-radio player rather than a SomaFM client, so the package, console script, MPRIS identity, mpv namespaces, macOS tap names, XDG directories and docs all move to beefy-player.

Environment variables are now BEEFY_* (the old SOMAFM_* spellings are still honoured) and an existing ~/.config/somafm-tui/config.json is migrated on first run, so favourites and volume survive the rename.

The visible interface is untouched: same layout, same logo, same keys.
2026-11-03 16:10:25 -05:00