feat: Edit episode title, description, and artwork from the UI #7

Merged
w33ble merged 3 commits from feat/edit-title into main 2026-09-06 22:14:07 -06:00
Collaborator

Summary

  • Done episodes get a CSS-only "done → Edit" badge swap on row hover, leading to a server-rendered edit page
  • The edit page supports three fields in one multipart form: title (empty keeps existing), description (clearing is allowed — feed omits it), and artwork upload (jpg/png/webp sniffed by magic bytes, 5MB cap)
  • Custom artwork overrides runner-derived art in the feed (itunes:image) and the index thumbnail; a remove control restores the Source-derived art
  • Custom art files live under data/art/<public_id>.<ext>, served at /art/ on the authed app surface (deliberately not a MEDIACAST_FEED_AUTH catcher route); entry deletion cleans the file up
  • Migration v6: nullable episodes.custom_art_path (NULL = no override); /entries/ subtree now dispatches delete | edit; the previous /title route was folded into POST /entries/<id>/edit before release

Why

The runner's auto-derived titles and art are often rough; the operator needs a no-JS way to fix titles, add show notes, and replace artwork per episode without touching the database.

Tests

Seam tests in internal/server/edit_test.go: prefilled form, title/description reflected in index + feed, art upload/remove/ext-change round-trip, bad-magic and oversize rejection, delete cleanup, /art/ extension whitelist, auth/method/state guards.

## Summary - Done episodes get a CSS-only "done → Edit" badge swap on row hover, leading to a server-rendered edit page - The edit page supports three fields in one multipart form: title (empty keeps existing), description (clearing is allowed — feed omits it), and artwork upload (jpg/png/webp sniffed by magic bytes, 5MB cap) - Custom artwork overrides runner-derived art in the feed (`itunes:image`) and the index thumbnail; a remove control restores the Source-derived art - Custom art files live under `data/art/<public_id>.<ext>`, served at `/art/` on the authed app surface (deliberately not a `MEDIACAST_FEED_AUTH` catcher route); entry deletion cleans the file up - Migration v6: nullable `episodes.custom_art_path` (NULL = no override); `/entries/` subtree now dispatches `delete | edit`; the previous `/title` route was folded into `POST /entries/<id>/edit` before release ## Why The runner's auto-derived titles and art are often rough; the operator needs a no-JS way to fix titles, add show notes, and replace artwork per episode without touching the database. ## Tests Seam tests in `internal/server/edit_test.go`: prefilled form, title/description reflected in index + feed, art upload/remove/ext-change round-trip, bad-magic and oversize rejection, delete cleanup, `/art/` extension whitelist, auth/method/state guards.
Done rows get a CSS-only done->Edit badge swap leading to a
server-rendered edit form; POST /entries/<id>/title saves and 303s
back. /entries/ subtree dispatches delete|edit|title.
feat: edit description and upload custom episode art
All checks were successful
ci / check (pull_request) Successful in 4m16s
ce938506b6
The edit form gains a description textarea and an artwork upload:
jpg/png/webp sniffed by magic bytes, 5MB cap, stored under
data/art/<id>.<ext> and served at /art/ on the authed app surface.
Custom art overrides runner-derived art in feed + thumbnails; a remove
control restores it. Migration v6 adds nullable episodes.custom_art_path.
Title edits fold into the same POST /entries/<id>/edit handler.
w33ble approved these changes 2026-09-06 22:00:05 -06:00
Dismissed
style: purple edit affordance on done rows
All checks were successful
ci / check (pull_request) Successful in 1m2s
5261838e74
w33ble approved these changes 2026-09-06 22:13:47 -06:00
w33ble merged commit 2ea2ffa00e into main 2026-09-06 22:14:07 -06:00
w33ble deleted branch feat/edit-title 2026-09-06 22:14:07 -06:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
w33ble/mediacast!7
No description provided.