Skip to content

Make the Record tab say what it is doing - #18

Merged
revtex merged 1 commit into
mainfrom
feat/record-tab-polish
Aug 14, 2026
Merged

Make the Record tab say what it is doing#18
revtex merged 1 commit into
mainfrom
feat/record-tab-polish

Conversation

@revtex

Copy link
Copy Markdown
Owner

The Record tab was a meter and a log, and the log took the whole surface because nothing else was on it. A log is diagnostics — what you open when something is wrong — so giving it the largest panel made the tab read as a console with an instrument bolted on, while leaving both of the questions the page exists to answer unanswered: will this work, and what has it done?

The log fix

Microsoft.Hosting.Lifetime was never muted, so every launch opened the activity log with:

Application started. Press Ctrl+C to shut down.
Hosting environment: "Production"
Content root path: "C:\Code\offstream\src\..."

None of that is Offstream talking, and the Ctrl+C line is advice for a console application. One MinimumLevel.Override.

Readiness

Five checks off one settings read and one endpoint enumeration: ffmpeg, the library folder, which endpoint will be captured, the metadata provider, VB-CABLE.

Blocked and degraded are kept apart deliberately. Only ffmpeg and the folder can stop a session; telling a user their recording will not start when it will is worse than saying nothing. The two quiet ones are the reason the panel exists — a provider selected without credentials degrades silently to untagged files, and a machine with no virtual cable records every sound it makes into the recording.

ReadinessProbe takes IAudioDeviceCatalog rather than calling AudioEndpoints statically, so it is testable without hardware and its two device rows cannot disagree about what is plugged in. 14 new tests.

Saved this session

TrackSaved was already raised and nothing consumed it. It now fills the panel the log used to have — track, destination, length, and a reveal button per row (explorer /select, via ArgumentList, since the path is built from a window title). Totals sit beside the now-playing strip. Capped at 50 rows; the library is the archive.

Cover art, album, destination

All three were already known and thrown away — the enricher fetches the art to embed it, and the destination is rendered to decide where to write. RecordingSession now raises TrackEnriched when the lookup lands, a second into a track rather than at the end of one, which is what makes any of it worth showing. The art is decoded eagerly (BitmapCacheOption.OnLoad) because the file it comes from is a temporary the encode deletes.

The art sits below the display, not on it: everything on that panel is segments, and a colour photograph behind the glass would read as a different device.

Not built

The waveform/history graph, by agreement — it looks impressive and tells you nothing the meter doesn't.

Testing

805 Core, 185 UI at Category!=Desktop, as CI runs them. dotnet format --verify-no-changes clean.

Heads-up for manual testing: five RecordPageTests FlaUI cases fail locally because the log moved into a collapsed expander and they assert it is directly visible. CI skips Category=Desktop so this PR is green either way, but those tests need updating and are worth a look during the manual pass.

🤖 Generated with Claude Code

The page was a meter and a log, and the log took the whole surface because
nothing else was on it. But a log is diagnostics — what you open when something
is wrong — so giving it the largest panel made the tab read as a console with an
instrument bolted on, while leaving both of the questions the page exists to
answer unanswered: will this work, and what has it done?
Readiness. Five checks, run off one settings read and one endpoint enumeration:
ffmpeg, the library folder, which endpoint will be captured, the metadata
provider, and VB-CABLE. Blocked and degraded are kept apart deliberately — only
ffmpeg and the folder can stop a session, and telling a user their recording
will not start when it will is worse than saying nothing. The two quiet ones are
the point: a provider selected without credentials degrades silently to untagged
files, and a machine with no virtual cable records every sound it makes.
Saved this session. TrackSaved was already raised and nothing consumed it. It
now fills the panel the log used to have, with a reveal button per row, and the
totals sit beside the now-playing strip.
Cover art, album and destination. All three were already known and thrown away:
the enricher fetches the art to embed it, and the destination is rendered to
decide where to write. RecordingSession raises TrackEnriched when the lookup
lands — a second into a track, not at the end of one, which is what makes it
worth showing. The art is decoded eagerly because the file it comes from is a
temporary the encode deletes.
The art sits below the display, not on it. Everything on that panel is segments
and a colour photograph behind the glass would read as a different device.
Also: Microsoft.Hosting.Lifetime is muted. "Application started. Press Ctrl+C to
shut down." was the first line of the activity log on every launch, and it is
neither Offstream talking nor true — this is not a console application.
ReadinessProbe takes IAudioDeviceCatalog rather than calling AudioEndpoints
statically, so it is testable without hardware and cannot report different
endpoints in its two device rows.
805 Core, 185 UI (Category!=Desktop, as CI runs them).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@revtex
revtex merged commit 7e71053 into mainAug 14, 2026
1 check passed
@revtex
revtex deleted the feat/record-tab-polish branch August 14, 2026 03:26
revtex added a commit that referenced this pull request Aug 14, 2026
* Bring the changelog up to date with PRs 12-23
It was last touched in #11 and ten PRs have merged since, so the file
described an app several phases behind the one in the tree - which for
a Keep a Changelog file is worse than an empty one, because it reads as
current.
Entries for: the refresh token lost an hour into every session, SMTC as
the primary track source and the TFM raise that allows it, endpoint
hot-plug, extended-length paths, VB-CABLE detection, the existing-file
policy checked before it could know the destination, the Logs tab and
the Record page rework, the Spotify match guard, genre from Spotify's
artists with Last.fm behind it, the media-session floor and its two
mappers, Last.fm's missing album guard, the shutdown that left a ghost
process, and the provider summaries on Settings.
Readiness is deliberately absent: it was added in #18 and removed in
#19, so no release ever carried it and an entry for each would be two
lines describing nothing.
Test count updated to 1051 (877 Core, 174 UI).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Require a changelog entry per PR, and drop two stray images
The changelog going ten PRs stale was not an oversight anyone would
catch by trying harder, so it is a rule with a check behind it now
rather than a good intention. CLAUDE.md states it; a CI job fails a
pull request whose diff does not touch CHANGELOG.md, with a
`no-changelog` label as the escape hatch so a test-only fix opts out
by saying so instead of by staying quiet.
The job runs on ubuntu with no `needs`, so it answers in seconds
alongside the Windows build rather than behind it - which is why it is
a job of its own, despite the note on `build` arguing against exactly
that for publish-check. That case was gated on `needs: build` and paid
for a second VM to run strictly afterwards; this one does not.
Also removes 06aa2f03-...jpg and b514cfc3-...jpg from the repository
root. Both were untracked, and both were mine to be suspicious of and
wrong about: I guessed earlier they were leaked cover-art downloads.
They are not. CoverArtFetcher writes to GetTempPath() under the name
"<random>.offstream-cover.jpg" and never to the working directory, and
these were a matched pair of 1024x572 images, which is not the shape
album art comes in.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@revtex