beefcarver
512c9a663f
fix(packaging): resolve repo root from script directory
2026-11-15 09:45:48 -05:00
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