From c960c07a6a8b1dc702681d9a26ee072f6bfb7c87 Mon Sep 17 00:00:00 2001 From: npeter83 Date: Thu, 3 Sep 2026 21:59:09 +0200 Subject: [PATCH] release: 0.79.0 notes + version bump E9 Playlist module: total playtime in both playlist headers, the header compacted to two rows, and the sticky column header sitting flush. Plus the six defects the epic-end deep review confirmed. --- VERSION | 2 +- frontend/src/lib/releaseNotes.ts | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 2fd796a8..17fd0aed 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.78.8 \ No newline at end of file +0.79.0 \ No newline at end of file diff --git a/frontend/src/lib/releaseNotes.ts b/frontend/src/lib/releaseNotes.ts index 12170016..c68213a5 100644 --- a/frontend/src/lib/releaseNotes.ts +++ b/frontend/src/lib/releaseNotes.ts @@ -14,6 +14,26 @@ export interface ReleaseEntry { } export const RELEASE_NOTES: ReleaseEntry[] = [ + { + version: "0.79.0", + date: "2026-09-03", + summary: + "A playlist now tells you how long it is, and its header takes half the room it used to — so you see more of the list and less of the frame around it.", + features: [ + 'Every playlist header shows the total playtime beside the video count: "32 videos · 2h 17m". It is the whole playlist, not whatever a filter is currently showing, so it answers the question you actually have — is there time for this tonight?', + "The header was three stacked rows next to a large cover; it is two tight ones next to a smaller cover. Nothing was hidden behind a menu to get there — the title, rename, the YouTube link, Play all, the sync and delete buttons, group-by-channel, the view controls and undo are all still on screen. That band never scrolls, so the height it gave back is list you can now see: about eighty pixels on a normal window.", + "Plex playlists show their total playtime in the same place, in the same words.", + ], + fixes: [ + "The column header no longer jolts upward the instant you start scrolling a playlist. It used to sit twelve pixels below the top of the list and snap flush on the first scroll, which read as the page flinching.", + 'A playlist’s length is written one way everywhere now. The list on the left said "2:15:30" while the header beside it said "2h 15m" for the very same playlist — one number in two shapes, side by side.', + 'A playlist shorter than a minute reported "0m". A single Short is 45 seconds long, and the header said it had no runtime at all; it now says "45s".', + 'A Plex playlist holding exactly one thing said "1 items" in English.', + ], + chores: [ + '12D reads the durations already in hand rather than adding an endpoint: both headers reduce over their own items, and formatRuntime grew a sub-minute tier because an aggregate is the first input that can legitimately land between 1 and 59 seconds — the fix lives in the function, not behind a `>= 60` guard at each of its seven call sites. PlaylistsRail moved off formatDuration onto the same helper so a playlist total has one renderer. 12A keeps every control and its gating (`items.length > 1 || viewActive`, editable/canWrite/canEdit, linked && dirty) byte-for-byte; 12B drops the wrapper’s pt-3 and passes fadeTop:false for the playlists page, matching the channel table. formatRuntime had no unit tests across seven call sites and now has a tier table plus a sweep asserting no non-zero second ever renders as "0m". Epic-end deep review over five dimensions: eighteen raw findings, ten distinct, two dropped after 3-of-3 adversarial refutations (meta-line segment order; the null-duration lower bound, which matches the server’s own long-shipped SUM), six fixed, two logged as deferrals. Rounds converged 6 → 1 → 0.', + ], + }, { version: "0.78.8", date: "2026-09-02",