Skip to content

Fix reporting flow, stem-collection availability, and YouTube import gaps - #387

Merged
thcp merged 5 commits into
mainfrom
fix-reporting-and-library-availability
Aug 17, 2026
Merged

Fix reporting flow, stem-collection availability, and YouTube import gaps#387
thcp merged 5 commits into
mainfrom
fix-reporting-and-library-availability

Conversation

@thcp

@thcp thcp commented Aug 17, 2026

Copy link
Copy Markdown
Collaborator

Summary

Five commits:

Test plan

  • ruff check / ruff format --check clean
  • bandit -r app/ -ll clean
  • Full pytest suite: 564 passed (14 pre-existing failures unrelated to this branch - Windows-specific: POSIX file-mode bits, process-signal semantics)
  • node --check on every touched JS file
  • tests/js/report-url.test.mjs: 62/62 checks pass
  • Manual verification against the real Tauri desktop build (this was developed and tested against the dev server; the Windows Explorer bug specifically only reproduces through the desktop open_url command)

Thales added 5 commits August 17, 2026 17:46
…reimport

The backend now checks the stems folder on disk for every "done" job and
reports "unavailable" when it's missing, replacing the old client-side
heuristic that only reacted to a 404 on the single-job endpoint and missed
the case where the registry entry survived but the folder did not. Desktop
shows a yellow "click to reimport" warning wired to the existing
importFromUrl restore path; mobile gets the same detection and one-tap
reimport from scratch, since it had none before.

Closes #380
…port

normalize_youtube_url() rejected these outright with "could not extract a
video ID from URL" or "unsupported host". /live/<id> is what premieres and
creator livestreams keep once they end and become a normal VOD - common for
concert/DJ-set recordings. youtube-nocookie.com (the privacy-embed domain)
wasn't recognized as a YouTube host at all; added alongside /embed/<id>
support on the regular domain too.

Closes #382
The Settings API silently clamped any requested max_duration_sec back down
to 1200 seconds regardless of what was sent - _DURATION_MAX was a hardcoded
product ceiling, not just a default. Full albums, DJ sets, and concert
recordings routinely exceed 20 minutes.

Closes #383
…orer

bug, add Discord, full traceback, opt-in logs, and anonymization

Root cause of the Explorer bug: the pre-filled GitHub URL carried the full
diagnostic dump (up to 6000 chars) as a query param, and Windows opens it via
explorer.exe, which silently falls back to a plain File Explorer window past
roughly 2000 characters instead of erroring. buildReportUrl() now fills the
"Logs / screenshots" field directly with as much of the traceback/stderr
tail as fits (keeping the end, where the actual error is - no paste needed
for the common case), and only points at the clipboard for what doesn't fit.
buildReportText() always has the complete, untruncated version.

Also added:
- A second "Report on Discord" button next to "Report on GitHub".
- Full backend traceback capture (_quarantine_failed_job), not just a
  one-line exception repr - fixed a latent bug in the same change where the
  tail parser would have silently swallowed a second section into the first.
- An opt-in "Include recent logs" button pulling from the backend/
  application/setup log views already exposed by Settings -> Logs, scoped to
  a window around the failure's own timestamp.
- Anonymization (app/core/redact.py): strips the reporter's home directory,
  any YouTube/SoundCloud source URL (download.py logs every job's URL, not
  just the failing one - a raw log tail would otherwise leak everything
  imported in the fetched window), and any IPv4 address (the mobile UI talks
  to this backend over the LAN). Applied unconditionally in GET
  /api/logs/{view}, not just for the report flow, and to the per-job
  traceback/tail/exception before error.txt is ever written. title:/source:
  stay unredacted in that file on purpose - they're already excluded from
  the public API response, so redacting them there loses local diagnostic
  value for no privacy gain.

Closes #381, #384
Matches the pattern of the actual last version-bump commit (b2379ed): only
templates/stemdeck.xml is hand-edited. desktop/src-tauri/Cargo.toml,
tauri.conf.json, and package.json stay at their 0.0.0 placeholder - they're
sed-rewritten transiently inside each release workflow run, never committed.
pyproject.toml's version is derived from the git tag by hatch-vcs and is
never hand-edited at all (see its own header comment).

Note: v0.11.0 is not yet a published tag/release, so this pin won't
resolve to a real image until one is cut.
@thcp
thcp merged commit 57d44f5 into main Aug 17, 2026
10 checks passed
@thcp
thcp deleted the fix-reporting-and-library-availability branch August 17, 2026 17:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment