Skip to content

File safety, playback hardening, and N1–N6 - #11

Draft
ZenQuantDev wants to merge 54 commits into
mainfrom
feature/v0.6.5
Draft

ZenQuantDev wants to merge 54 commits into
mainfrom
feature/v0.6.5

Conversation

@ZenQuantDev

@ZenQuantDev ZenQuantDev commented Nov 7, 2026 •

Copy link
Copy Markdown
Owner

Summary

Closes milestone M1. Everything since the v0.6.4 merge: shipped beta.1 content (keystore v2, consent gate, smart playlists, M3U, four new sources), the beta.2 hardening batch, and the N1–N6 file-safety work.

What's in it

  • Keystore v2 (K1–K4): Linux data-loss fix, locked-keyring fallback, read-only open for unknown/newer formats, 0600 temp files (d0d34e2).
  • File safety (N1–N6): unified FileNamer (1343cb6, bc51187); TagWriteMode + central CanWriteTags (de8765b, 8204ab6); import Keep/Copy with duplicate-check-before-copy and the file-operation journal (8638c23, af82021); OS-native Recycle Bin removal (1343cb6, d3574fd); export pipeline that copies/renames/retags copies only, ID3v2.3 + relative M3U8 (f6e9351, fc7550d).
  • Playback & UI: native Stop() off the UI thread under a generation lock; consent checked before DB insert (no ghost rows); UI hang watchdog; honest update/dependency status (1e42119, 46a6e0a, 32ad56e, 9faa006, 44434fa).
  • Settings reorg: Plugins+Sources merged into Integrations, new Downloads tab, Advanced dissolved (302ebc6).
  • CI: Windows + Ubuntu matrix with banned-API gate -warnaserror:RS0030 (40943a3).

Automated verification

  • 659/659 tests pass locally and in CI on windows-latest and ubuntu-latest (head 4be9e2a, both jobs green; NeedsVlc traits excluded in CI).
  • RS0030 banned-symbol gate active; both checks required by the main ruleset.

Still waiting on manual checks

  • Fedora: secret-tool/libsecret path, keys.enc magic + 0600 mode, locked-keyring fallback
  • Double import in Copy mode (duplicate toast, no second copy)
  • Export: originals byte-identical (hash before/after), ID3v2.3 on copies, relative M3U8 plays
  • Rapid playback switching: no UI stall, no [SLOW] PlayTrack lines
  • Consent decline leaves no library row (single-URL and playlist paths)

Commits

See the Commits tab (37 commits, main..feature/v0.6.5). Note: ce88aa7 is a WIP backup snapshot pulled in by merge 3581b30; its content is superseded by the fix commits above it.

- global.json pins SDK 10.0.403 with latestFeature rollForward
- All projects target net10.0
- System.Security.Cryptography.ProtectedData updated to 10.x
…nload hardening, and comprehensive test suite
…lized metadata

- Add IsOffline flag and Schema v11 migration to quarantine dead URLs instead of deleting them
- Implement auto-relink for missing files using [nw-id-videoId] filename suffixes
- Add Debug Sandbox fallback in NullWavePaths to protect real user data during development
- Restrict ShellHelper.OpenFile to media extensions to prevent arbitrary code execution
- Add '--' defense-in-depth to yt-dlp argument lists to prevent URL flag injection
- Implement SplitWithKnownArtist and ResolveArtistTitle to fix swapped Artist/Title metadata
- Add YouTube Mix/Playlist front-door prompt and Bandcamp album routing
- Globalize search and tokenization (Cyrillic/CJK support, accent folding)
- Add TagLib retry loop to handle file locks from LibVLC/Windows Defender
- Expand Maintenance tab with Relink integration and accurate reporting
…k fallback

- QueueViewModel: Coalesce refresh events to prevent UI thread storms

- PlaybackNavigator: Cache navigation pool by StateVersion

- LibraryService: Add TryRelink name-matching fallback and sweep orphan guard

- PlayerViewModel: Cache track duration, marshal audiobook saves to UI thread

- TrackDetailViewModel: Run artist library scan off the UI thread

- KeyStoreService: Handle temporary I/O errors without quarantining the file

- NullWavePaths: Prevent sandbox LegacyDataDir from touching real user data
ZenQuantDev and others added 24 commits November 7, 2026 00:02
…e, archive old guides

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add Installed/Store tabs with search and category filtering
- Implement effects tier visibility card in Appearance tab
- Add wallpaper minimal tier note
- Redesign settings rail with grouped navigation and art tiles
- Implement lazy page loading with cross-fade transitions
- Add wave spine animation with active page tracking
- Add header watermark glyph per settings page
- Fix plugin state preservation bug (Unavailable/Disabled not overwritten)
- Add plugin manifest support and setup page navigation
- Convert EffectsTierResolver to singleton pattern
- Add localization keys for integrations hub (EN/RU)
…ather reference plugin

- Create NullWave.Plugins.Contracts as standalone packageable project
- Implement PluginDiscovery with AssemblyLoadContext isolation
- Add OpenWeather as first external reference plugin
- Migrate IPlugin/PluginState/ProviderKind to Contracts namespace
- Convert EffectsTierResolver to singleton pattern
- Fix PluginManager state preservation for Unavailable/Disabled
- Add BuiltInPluginManifest factory for legacy providers
- Implement PluginHost with permission-gated API access
…dicators

- Add cross-fade transitions to main window page navigation
- Replace wave spine with sliding pip indicator in settings
- Fix plugin status display (show correct Ready/Off/Needs setup states)
- Add attention dots to Integrations/API Keys when plugins need setup
- Remove ShowWaveSpine property, add IntegrationsNeedsAttention tracking
- Refresh plugin states when switching to Integrations tab
- Add 180ms opacity fade when switching between Installed/Store tabs
- Add 120ms opacity transitions to sidebar filter buttons
- Add 150ms fade-in animation when track list data context changes
- Use BoolToDouble converter for smooth tab transitions
Sign up for free to 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