Skip to content

Добавить отмену длительной остановки записи#37

Merged
chelslava merged 2 commits intomainfrom
issue-6-cancel-long-stop
Apr 3, 2026
Merged

Добавить отмену длительной остановки записи#37
chelslava merged 2 commits intomainfrom
issue-6-cancel-long-stop

Conversation

@chelslava
Copy link
Copy Markdown
Owner

Что сделано

  • операция остановки записи в GUI переведена в фоновый поток;
  • во время долгой финализации пользователь может запросить отмену остановки;
  • encoder/FFmpeg long process стал отменяемым через cancel event;
  • добавлены unit-тесты на cancel/finalize сценарии в encoder, RecordingController и MainWindow.

Почему

Issue #6 описывает UX-проблему: при остановке большой записи пользователь мог надолго застрять на этапе финализации и не мог отменить операцию.

В этом PR реализован минимальный безопасный scope:

  • отзывчивый GUI-stop flow;
  • отменяемая финализация FFmpeg;
  • без расширения внешнего HTTP/WebSocket контракта в первом проходе.

Ограничения текущего прохода

  • основной упор сделан на GUI lifecycle и внутренний stop/cancel pipeline;
  • отдельный async API протокол / operation_id / progress events можно делать follow-up задачей.

Проверки

  • python -m pytest tests/unit/test_encoder.py tests/unit/test_gui_controllers.py tests/unit/test_main_window.py -q
  • python -m ruff check recorder/encoder.py gui/controllers/recording_controller.py gui/main_window.py tests/unit/test_encoder.py tests/unit/test_gui_controllers.py tests/unit/test_main_window.py
  • python -m mypy recorder/encoder.py gui/controllers/recording_controller.py gui/main_window.py --ignore-missing-imports --follow-imports=skip

Fixes #6

Финализация записи с большим файлом могла зависать на этапе FFmpeg merge,
а кнопка остановки в GUI до конца блокировала пользователя. Перевожу stop
операцию в фоновый поток в MainWindow, добавляю возможность запросить
отмену долгой финализации и делаю Encoding pipeline отменяемым через
cancellable FFmpeg long process.

Constraint: Нужно сохранить текущий sync stop API для внутренних вызовов, но сделать GUI-путь отзывчивым и отменяемым
Rejected: Полноценный async operation API/WebSocket протокол в первом проходе | слишком широкий scope для точечного UX-фикса
Rejected: Просто уменьшить таймауты stop/finalize | не решает отсутствие пользовательской отмены
Confidence: high
Scope-risk: moderate
Reversibility: clean
Directive: Если будете расширять stop cancellation дальше, держите cancel semantics на уровне encoder/controller, а GUI используйте только как orchestration слой для фоновой операции
Tested: python -m pytest tests/unit/test_encoder.py tests/unit/test_gui_controllers.py tests/unit/test_main_window.py -q
Tested: python -m ruff check recorder/encoder.py gui/controllers/recording_controller.py gui/main_window.py tests/unit/test_encoder.py tests/unit/test_gui_controllers.py tests/unit/test_main_window.py
Tested: python -m mypy recorder/encoder.py gui/controllers/recording_controller.py gui/main_window.py --ignore-missing-imports --follow-imports=skip
Not-tested: Ручная проверка force-cancel финализации на реальном большом файле и живом FFmpeg процессе
Добавляю в актуальную Unreleased секцию запись про возможность отмены
длительной остановки записи и про покрывающие её unit-тесты. Основа для
записи взята из свежего origin/main, чтобы не создавать конфликтов при
merge PR #37.

Constraint: Нужно сохранить уже накопленные записи Unreleased из main и добавить новый UX/lifecycle фикс без конфликта changelog
Rejected: Оставить changelog на потом после merge | повышает риск следующего merge-конфликта и теряет контекст задачи
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Для user-visible lifecycle fixes записи всегда дополняйте Unreleased на свежей базе main до merge PR
Tested: Визуальная проверка итоговой секции CHANGELOG.md после обновления
Not-tested: Отдельный markdown lint changelog
@chelslava chelslava merged commit f6e7932 into main Apr 3, 2026
7 checks passed
@chelslava chelslava deleted the issue-6-cancel-long-stop branch April 3, 2026 18:55
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