Make the licences readable from inside the app - #37
Merged
Conversation
Two obligations were being met on paper and not in practice. NOTICE and LICENSE shipped as files beside the executable. That satisfies the predecessor's MIT notice and the bundled LGPL ffmpeg only for as long as the files stay next to the .exe, which a zip unpacked selectively or a copy of just the executable does not guarantee - and nobody opens a folder to read one anyway. Both files are embedded in the assembly now and shown by a window the Advanced page links to, with the running version and short commit at the top so a bug report can name its build. A test asserts the window still contains what the two files say, so they cannot drift apart. The second was missing outright: nothing in the app credited Spotify or Last.fm for the track details it writes into recordings, though Spotify's Developer Terms require it. The line sits under the provider picker, where it is obvious what it refers to, and is empty for "Nothing" - an attribution to a service the app is not calling is a false one. The entry point is on the Application section's header rather than under the last setting, and that is not cosmetic. A version line and a button below the ffmpeg path pushed both off the bottom edge at the window's minimum size, which is the shell's written promise that no setting is unreachable without scrolling. Raising the floor is not available - at 150% scaling the window is already 1050 physical pixels tall - so the header line is the only room in a full card that costs nothing. Also records the Phase 8 findings and states plainly what is still not done: the clean-VM install to uninstall pass needs a virtual machine and a person at it, and CI does not substitute for it.
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Phase 8's remaining item: third-party notices reachable from inside the app, not only as a file in the repo. It turned up a second gap on the way — nothing in the app carried the Spotify attribution its Developer Terms require.
What changed
A notices window. "Licence and notices" on the Advanced page's Application section opens Offstream's MIT licence, the predecessor's copyright notice, the bundled LGPL-3.0-or-later ffmpeg and its source offer, TagLib# (LGPL-2.1-only) and VB-CABLE's origin and donationware terms. The running version and short commit sit at the top, so a bug report can name its build.
The text is embedded, not read from disk.
LICENSEandNOTICEareEmbeddedResourceitems inOffstream.App.csproj. Both licences oblige the notice to travel with the software, and a loose file does not survive a zip unpacked selectively, a copy of just the.exe, or a run out ofbin\.ThirdPartyNoticesTestsasserts the shown text still contains what both files say, so the window and the repository cannot drift.Attribution beside the provider. CLAUDE.md says attribution lives on the Settings page next to the provider that requires it. It did not —
Strings.resxhad 131 keys and none of them credited anyone. Selecting Spotify or Last.fm now says whose data is being written into the recordings. It is empty for "Nothing": crediting a service the app is not calling is a false statement.The placement is load-bearing
The first attempt put a version line and a button under the ffmpeg path. Both were clipped off the bottom of the window at its minimum size — the shell's
MinHeightis a written promise that no setting is ever unreachable without scrolling, and this broke it silently. Raising the floor was not available either: at 150% scaling the window is already 1050 physical pixels tall, so a taller minimum stops fitting a 1080p screen.The section header line is the one place in a full card with room that costs nothing vertically; the rule simply runs up to the link instead of across. Anything added to the Advanced page from here needs the same arithmetic done first, and the finding says so.
Verified
dotnet format --verify-no-changesclean, analyzers as errors.0.1.0-dev+90360c5at the top, and the attribution line renders under the provider summary. The Advanced page's Application card is unchanged in height.Also here
docs/MODERNIZATION-PLAN.md, and a status line stating plainly that the clean-VM install → record → uninstall pass has not happened. It needs a virtual machine and a person at it; CI installs and uninstalls nothing, so it is not a substitute. The installer is known to compile and known to produce an executable, which is a weaker claim than the exit criterion makes.Notes
Strings.resxandStrings.fr.resx— the parity test fails the build otherwise.Services/ThirdPartyNotices.csimportsSystem.IOexplicitly. The throwaway project WPF builds first to resolve XAML type references does not inheritImplicitUsings, and the error names a_wpftmp.csprojthat does not exist on disk.