Skip to content

chore(release): 3.1.0#938

Merged
vagabondHustler merged 33 commits into
mainfrom
dev
Jun 24, 2026
Merged

chore(release): 3.1.0#938
vagabondHustler merged 33 commits into
mainfrom
dev

Conversation

@github-actions

@github-actions github-actions Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor
Release validation passed — src tree 6a3a19d407cd6b77362690c1d3add1db02cfc23f (run 28131605434)

✨ Features:

  • 9d98d29 - tools: support marking commits as important in changelog
  • 9b99548 - record: replace logging system with queue-backed recorder
  • 76cb5d5 - logging: add spinner console with banner-driven progress

🐛 Fixes:

  • d51593e - subsource: present provider notifications on the GUI thread
  • cfdfb6c - release: repair update check and scope changelog to target version
  • 71b06d8 - io: create parent directory before writing config tmp file
  • 023ff19 - ci: capture binary stderr and detect early exit during window-wait
  • bc8f4ba - ci: validate gate finds ready PRs and always runs on dispatch
  • a185cf5 - tools: show top N commits above fold before collapsing the rest
  • 69e0176 - logging: keep console output to spinner banners only
Show all Fixes
  • d2d7126 - ui: avoid disconnect warning when reusing the number popup
  • 36e55b1 - ui: route reused number popup to one handler per season/episode step

⚙️ Other:

  • e5b7f09 - startup: improve startup times
  • 6e6077d - ui: consolidate application modules into ui/core
  • e99b244 - ui: split application module into a package
  • 4e8f94a - ui: split subtitle_workspace module into a package
Show all Other
  • 0c856af - pipeline: drive stages via spinner events and report skips
  • a692bde - remove commented-out dead code and orphaned browse handler
Full changelog: 3.0.0...3.1.0

Remove the scheduled license-year workflow and ignore local AGENTS.md guidance.

Refresh README capabilities, support links, and MSI build instructions, and clarify GPL/source wording in third-party notices.
@github-actions github-actions Bot added the release A new version is released label Jun 21, 2026
@github-actions github-actions Bot requested a review from vagabondHustler June 21, 2026 17:48
@github-actions github-actions Bot changed the title chore(release): 3.1.0 chore(release): 3.0.1 Jun 21, 2026
@github-actions

github-actions Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor Author

Release validation passed — src tree 6a3a19d407cd6b77362690c1d3add1db02cfc23f (run 28131605434)

@github-actions github-actions Bot changed the title chore(release): 3.0.1 chore(release): 3.1.0 Jun 22, 2026
vagabondHustler and others added 16 commits June 24, 2026 21:18
Scrape the GitHub release page to fix the broken update check, and scope
the changelog to the target version, honoring section order and dropping
the last-edited line. Also removes unused screenshot assets.
ㅤ
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v4...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
…release

Replace dry-run-release.yml and prepare-release.yml with a single validate-release.yml, and extend the actions/jobs scripts to support the merged flow.
Defer heavy provider/HTTP imports and fix Windows version reporting, and
decouple the search job from the UI worker with deferred bootstrap setup
so the app reaches an interactive window faster.
ㅤ
…step

The season and episode pickers share one NumberSuggestionPopup, both
connecting to its number_chosen signal. UniqueConnection only blocks
duplicate slots, not the prior step's slot, so choosing an episode also
fired the still-connected season handler and clobbered _pending_season
with the episode number -- producing terms like S07E07 from a season 1,
episode 7 selection. Disconnect any existing slot before wiring the next
step's handler.
Drop two commented-out helper functions in log_sanitizer, an abandoned
summary_line variant in pipeline, and the disabled browse-video wiring in
subtitle_workspace along with its now-unused _browse_for_video_file method
and QFileDialog import. Aligns with the repo's no-dead-code comment rules.
Group terminal output under a spinning banner (title while running,
done-title on close) with a single transient line for mid-banner updates.
Mirror the same banner/spinner protocol into the GUI console by replaying
captured console records through one state machine. The 'Waiting for user
inputs' banner is owned by open_settings_window only when no immediate
search runs, so the search worker's banners don't tear it down early.
…rkflow

Turn on warn_return_any, disallow_untyped_defs and exclude_gitignore
in mypy config, then annotate the previously untyped defs across io,
parsing, providers and ui to satisfy it. Also consolidate the release
validation workflow and its actions script.
Break the 924-line subtitle_workspace.py into one file per widget under
cards/subtitle_workspace/, with shared constants in _constants.py. The
public import path subsearch.ui.cards.subtitle_workspace is preserved via
__init__ re-exports, so application.py and the tests are unchanged.
Track the connected slot and disconnect only it, instead of clearing the
whole signal. Disconnecting an empty signal made PySide emit a 'Failed to
disconnect (None)' RuntimeWarning on the first (season) step.
A fresh install with Subsource enabled and no API key froze the app with
no logging. Provider searches run in a ThreadPoolExecutor; on a missing
key the pipeline called system_tray.display_toast from that worker
thread. The toast nests its own QEventLoop around a QWidget, which only
the GUI thread can service, so the worker blocked forever, the search
job never joined, and the UI hung with nothing logged.

Collect provider notifications during the search and present them after
the workers join, back on the GUI thread. display_toast now asserts it
runs on the GUI thread so a worker-thread caller can never silently
reintroduce the deadlock.

Guard against reaching that path at all: run_conditions skips Subsource
when no API key is configured, and the provider checkbox is greyed out
in the UI while credentials.subsource.api_key_exists is false.

Tests cover the worker-thread guard, the collect/drain ordering, the
run-condition skip, and the UI grey-out.

Fixes #940
Break the composition root into application/{window,entrypoint,
settings_interface,_constants}.py. open_settings_window moves to
entrypoint.py, where the 'Waiting for user inputs' banner is gated on
start_search_immediately so the search worker owns the banner sequence.
Console sinks ignored log level, so debug diagnostics (run_conditions
evaluation, guard skip/call lines, dataclass dumps) leaked to the
terminal and GUI console. Gate sinks on level: debug now goes to the
file log only; info and above reach the console.

Stop the guard decorator from announcing skips on-console — it logs at
debug only; meaningful skips are reported by the step's caller under its
banner.

Make the GUI console 1-to-1 with the terminal: clear the transient
status line when a banner finishes, and render the finished banner as
the plain done-title (no checkmark), exactly as the terminal prints it.

Add parity and level-gating tests.
The validation result was only a marker comment, which renders inline
with the commit/CI timeline. Mirror it into a release-validation block
at the top of the PR body so the latest result always sits above the
timeline. jobs.py preserves the block across body regeneration, the
same way it preserves the manual-summary block.

The hidden marker comment is kept as the machine-readable state that
should_validate/last_validation parse, so re-validation gating is
unchanged. Add tests for the body-block upsert and preservation.
…words

requests was only referenced by a TYPE_CHECKING-only hint; all HTTP goes
through curl_cffi. Simplify the download_response annotation to CurlResponse
and remove the dead dependency. Also drop the stale subscene keyword and add
subsource, tvsubtitles, and gestdown.
Move ui/application/* plus the top-level qt_application and system_tray
modules into a single ui/core package, and promote the entrypoint to
ui/entrypoint. Retarget the background warmup import to the new
entrypoint module and update its test.
Important commits (body ending with U+3164) render above the fold,
displacing normal commits into a collapsible <details> block per section.
Fold limits per section type keep changelogs scannable at a glance.
Split validate-release triggers so the prepare job (changelog render +
PR body update) runs on every push to dev, while build and test remain
cron/manual-only via the existing gate proceed logic.

Also collapse all normal commits into a blockquoted <details> block in
the changelog template; only important-marked commits render above fold.
Previously all non-important commits were pushed directly into the
<details> block, making the fold limits (5/5/3) have no effect.
Push to dev now only updates the release PR; binary builds only run on
schedule (when src changed) or workflow_dispatch.
@vagabondHustler vagabondHustler marked this pull request as ready for review June 24, 2026 19:49
vagabondHustler and others added 5 commits June 24, 2026 21:59
push to dev triggers update-release-pr.yml (PR update only).
schedule and dispatch trigger validate-release.yml (build + test + record).
- Remove --draft filter from open_release_pr so validation works against
  both draft and ready-for-review release PRs
- On workflow_dispatch with no open PR, fail immediately instead of
  silently skipping
- On workflow_dispatch with a PR, always proceed regardless of src tree hash
- Cron path still uses should_validate to skip unchanged src trees
Pass the launched process into assert_window_rendered so it can detect
process death before the timeout fires, and surface stderr in the error
message. Also capture stderr=PIPE in _launch_executable. Drops html from
the Build excluded-modules list.
On first launch the app data directory does not exist yet, so the
atomic-write temp file open fails with ENOENT and logs an ERROR.
@vagabondHustler vagabondHustler merged commit 9254681 into main Jun 24, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release A new version is released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Application Crashes After File Processing Completion Popup

1 participant