Improve time codes (forced alignment): navigation/filter for the 'to check' rows that need manual review

Open
#16,624 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
76/100
Issue type
Feature
Clarity
Clearly specified
Activity status
Active
Tech stack
csharp

Research direction

Start in src/ui/Features/Tools/ImproveTimeCodes/ImproveTimeCodesViewModel.cs and read NextChange/PreviousChange, OnKeyDown, and the row selection logic; then check ImproveTimeCodesRow.cs for how Apply represents rows needing review. The request allows keyboard navigation, a table filter, or status sorting, with keyboard navigation and filtering preferred. Done means users can reach the unticked rows that need review without scanning every changed row; update docs/features/improve-time-codes.md if the key bindings change.

Written by the indexing model from the issue text.

Description

Context

Regular workflow: re-time a subtitle track with Tools → Improve time codes (forced alignment), using Max shift = 6 s and Check with speech-to-text always on (it's essential for my files — subtitles extracted from the source disc are often a bit out of sync, and subtitles muxed into a differently-framerate MP4 of the same film are off on every line).

A recent real example: subtitles extracted from the film source this morning — all 2044 lines were shifted by the aligner, and 15 of them are flagged for manual review (large moves / disputed by speech). The only way to get to those 15 rows is to scroll the entire 2044-row results table hunting for the amber entries.

Current behaviour (verified against the v5.3.0 source)

  • F7/F8 (or Alt+Up/Alt+Down, or the ▲/▼ buttons) step to the previous/next changed line. NextChange()/PreviousChange() walk every row where IsChanged is true — i.e. all seven move statuses in SubtitleRetimer.IsMove (re-timed, moved with neighbours, large move unconfirmed, confirmed by speech, heard where it was, moved with sync, adjusted by hand). When the max shift is generous, essentially every line in the file is "changed", so F8 degenerates to "next line" — no faster than scrolling, and it still lands on every auto-applied row that needs no review.
  • The window's complete key set is: Space (play/pause), Esc (close), F5/Shift+F5 (play selected line new/old), F7, F8. There is no navigation to the unconfirmed set.
  • There is no filter in the dialog (no "show only to check" toggle).
  • The results table registers no sortable columns (TableViewHeaderSorter exists in src/ui/Logic/TableViewExtras.cs but ImproveTimeCodesWindow doesn't use it), so clicking the Status header does nothing.

The "to check" set is well-defined: SubtitleRetimer.IsUnconfirmed — LargeMoveUnconfirmed and DisputedBySpeech — exactly the rows left unticked in the Apply column ("the user listens and ticks it"), and exactly the count shown in the summary header ("N to check") and the status line ("N large moves to check"). There is currently no in-app way to jump between them.

Request

Make the lines that need a human decision reachable without scrolling the whole table. Any of the following would help; the first two combined would be ideal:

  1. Keyboard navigation to to-check rows only — e.g. F9 / F10 (or Alt+PageUp/Alt+PageDown) for "next/previous line to check", walking exactly the unticked rows (IsChanged && !Apply, which is the unconfirmed set before the user starts ticking/unticking). This is a direct mirror of the existing NextChange/PreviousChange + CanGoNext/CanGoPrevious pattern in ImproveTimeCodesViewModel.
  2. A "to check only" toggle in the results table, so the flagged rows are the entire table for the review pass.
  3. (Smaller alternative) Make the Status column sortable via the existing TableViewHeaderSorter, so amber rows cluster together.

Why it matters

With large max shifts and speech-to-text checking on, the auto-applied rows are the majority and need no human attention; the unconfirmed rows are the small minority that do (in the example above: 15 of 2044). Review speed scales with the whole file instead of the flagged set, and it gets worse the more thoroughly the tool does its job.

Where to look

  • src/ui/Features/Tools/ImproveTimeCodes/ImproveTimeCodesViewModel.cs — OnKeyDown, NextChange/PreviousChange, OnSelectedRowChanged, summary/status counts
  • src/ui/Features/Tools/ImproveTimeCodes/ImproveTimeCodesWindow.cs — results table construction, toolbar buttons
  • src/ui/Features/Tools/ImproveTimeCodes/ImproveTimeCodesRow.cs — Apply = IsChanged && !IsUnconfirmed(...)
  • src/ui/Features/Tools/ImproveTimeCodes/SubtitleRetimer.cs — IsMove, IsUnconfirmed
  • src/ui/Logic/TableViewExtras.cs — TableViewHeaderSorter (option 3)
  • docs/features/improve-time-codes.md — key documentation
Dominant language
C#
Stars
14.8k
Forks
1.4k
Avg merge
58m
Merged PRs (30d)
630

Getting set up

This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from SubtitleEdit/subtitleedit

All issues in SubtitleEdit/subtitleedit

Similar issues

More C# issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.