Audion Media Tools

v3.0.0 ·

Опись прежнего окна (NiceGUI, 2.6.1)

RU

Опись прежнего окна (NiceGUI, 2.6.1)

Что окно на NiceGUI делает само, помимо передачи формы движку. Снято 15.10.2026 с кода эталона E:\TOOLS\Audion Media Tools NiceGUI (system_core\ui_nicegui\app.py 5970 строк, window.py, workbench.py) и с его консольных меню. Каждая строка при переносе получает отметку в последнем столбце: перенесено, заменено (чем) или убрано, потому что.

Параметры, которые окно отдаёт движку, записаны отдельно и числом: tests\former_window_parameters.json (сценарий tests\capture_former_window_parameters.py). Тексты окна - подписи и подсказки - снимаются в карту прежнего окна (раздел 10.3 спека).

Куда: модель - system_core\core\operation_model.py (правила формы, одна копия для окна и консоли); движок - служба или media_cli.cmd; окно - Avalonia; данные - манифест, раскладка, Source\config\i18n.json.

1. Запуск и окно

Что Где Куда Отметка
Окно - браузерная рамка: window.py поднимает сервер app.py (127.0.0.1:8080), ждёт порт, открывает pywebview; PID сервера в logs\gui_server.pid window.py убрано: окно - один исполняемый файл убрано: окно - один AudionMediaTools.exe, сервера и порта нет
Размер 1600 × 900, наименьший 1280 × 720 (из ui манифеста) window.py load_ui_defaults заменено: 1500 × 880 / 1180 × 700, как у Image Tools заменено: 1500 × 880, наименьший 1180 × 700; размер помнится в window_settings.json
Значок окна system_core\icons\app.ico, AppUserModelID Audion.Tools.<папка> window.py окно перенесено: тот же app.ico (ApplicationIcon), AppUserModelID в Program.cs
Сервер отказывается слушать не-loopback адрес без AUDION_ALLOW_REMOTE_GUI=1 assert_gui_host_allowed убрано: сервера нет убрано: сервера нет
Второй запуск при занятом порте открывает уже работающее окно main окно: один экземпляр на папку заменено: один экземпляр на папку (Core\OneWindow.cs) - второй запуск поднимает первое окно
--smoke: страница строится без браузера, перебор 429 состояний форм build_ui_once, run_gui_smoke заменено: самопроверка окна и тест модели по записи заменено: --self-test собранного окна (каждая страница и поле) и тест модели по записи прежнего окна
Пул процессов NiceGUI отключается, если среда запрещает multiprocessing tolerate_missing_process_pool убрано убрано: NiceGUI нет
Выбор файлов и папок - сценариями PowerShell (WinForms) через портативный pwsh, под заданием Windows, по одному диалогу; DPI-осведомлённость в каждом сценарии run_picker_script, pick_* заменено: диалоги Avalonia заменено: диалоги Avalonia, без PowerShell
При выходе закрывается плеер mpv и задание диалогов atexit, on_shutdown окно: закрытие окна закрывает плеер перенесено: закрытие окна закрывает mpv (Player.Shared.Close)

2. Настройки и состояние

Что Где Куда Отметка
config\gui_settings.yaml: язык, тема, emoji, allow_runtime_switching, advanced_open; source_path и destination_path пишутся всегда пустыми save_app_settings заменено: config\window_settings.json заменено: config\window_settings.json - тема, язык, размер, шрифты, папки, формы
Источник и Назначение при старте - из кэша путей (cached_source_path, cached_output_path), иначе Source и Transcoded state, _resolve_workspace_path окно (рабочая зона Image Tools), папки input / output перенесено: последние папки из window_settings.json, иначе input / output (MainWindow.Io.cs)
Смена темы и языка - запись настроек и перезагрузка страницы set_theme, toggle_language окно: без перезапуска заменено: тема и язык меняются на лету, без перезапуска
Тем 7 (code_dark по умолчанию, code_graphite, code_light, code_warm, audion_light, audion_dark, asar_dark), токены поверх из config\ui_colors.yaml BUILTIN_THEMES, load_ui_colors заменено: четыре темы оболочки, Code Dark по умолчанию заменено: четыре темы оболочки, Code Dark по умолчанию; ui_colors.yaml окном не читается
Состояние «Дополнительно» раскрыто или нет - в настройках save_advanced_open окно убрано, потому что «Дополнительно» всегда раскрыто под своим разделителем (владелец, 10.10.2026)
Значения полей живут одни на все разделы: поле с тем же id (audio_bitrate, overwrite, input_formats…) переходит из раздела в раздел state["field_values"] решить: в новом окне - своё на раздел или общее решено владельцем 15.10.2026 («формы раздельные»): своя форма у каждого режима, общие - только кодер и декодер; формы помнятся в window_settings.json
История строки команд config\terminal_commands.json: до 200 команд, закреплённые, последняя, оболочка, папка (своя папка проекта хранится относительной) load_terminal_cache, save_terminal_cache окно заменено: история строки команды Image Tools (Core\CommandHistory.cs), оболочка - App\AudionPs.exe
Закреплённые пресеты (pinned_profiles) - идут первыми в списке профиля profile_options окно убрано, потому что владелец против закрепления пресетов (15.10.2026)
Кэш LUT config\lut_cache.json: выбранный, недавние, закреплённые core\lut_cache.py движок (describe), окно перенесено: движок core\lut_cache.py (config\gui_lut_cache.json), окно - закрепление и импорт (Views\Form.Lut.cs)

3. Рабочая зона путей

Что Где Куда Отметка
Строки Источника и Назначения, история до 100 путей, закрепление, выбор папки, «один файл» Источником, открыть папку (файл - выделить в Проводнике), «Список» файлов Источника в журнал с номерами workbench.py, workspace_*_handler, show_input_file_list заменено: рабочая зона Image Tools (MainWindow.Io.cs, PathHistory.cs) заменено: рабочая зона Image Tools (MainWindow.Io.cs, PathHistory.cs), история - config\path_history.json
«Сбросить»: история чистится, закреплённые остаются, оба пути - по умолчанию reset_workspace_paths_click_handler Image Tools перенесено: ResetPaths рабочей зоны
Удалить содержимое Источника / Назначения - операциями движка cleanup_source / cleanup_transcoded с подтверждением и путём в нём; «оба» - сначала Источник, Назначение только после успеха workspace_delete_*_handler заменено: очистка в Корзину (FolderCleaner.cs) заменено: очистка в Корзину (FolderCleaner.cs); операции движка cleanup_* окном не зовутся
Смена Источника сбрасывает «Сведения» о прежнем save_workspace_path окно убрано, потому что «Сведения» - прогон в журнал, строки под формой нет: сбрасывать нечего
Во время операции пути не меняются («Другая операция уже выполняется») обработчики рабочей зоны окно перенесено: рабочая зона заперта, пока идёт прогон (ApplyIoBusy)

4. Разделы и формы

Что Где Куда Отметка
Дерево разделов: группа с одной операцией открывается сразу её формой; «Назад»; заголовок - путь разделов compact_single_child_command_path, activate_command_node, command_nav_row заменено: ленты разделов и ленты внутри заменено: ленты разделов и режимов (config\window_layout.yaml)
Операция без полей запускается по нажатию сразу activate_command_node окно перенесено: пункт СЕРВИС и СВЕДЕНИЯ запускает сразу
Дочерние операции с теми же полями, что у группы, - кнопками в строке над общей формой can_inline_child_actions окно (раскладка данными) заменено: кнопки у поля (window_layout.yaml, buttons) - ФОРМАТЫ у ссылки, DPAPI у cookies
Кнопка «Сведения» (source_info) - только в разделах audio, archive, editing, storage, delivery, remux, fps, grading SOURCE_INFO_COMMAND_IDS данные раскладки заменено: меню СВЕДЕНИЯ рабочей зоны - во всех разделах (window_layout.yaml, details)
Поля по блокам: блок = group поля, без него - по таблице ключей (preset, source, codecs, backend, decode, audio, format, options, package, fps, color, encoding, run, иначе parameters) field_section_id данные: блок у каждого поля в манифесте перенесено: блок задан у каждого поля в манифесте; ключевая таблица убрана
Порядок блоков: workflow ставится перед preset, decode - перед backend; блоки mastering и channels - в полширины group_fields_by_section, render_field_grid данные раскладки перенесено: порядок и ширина блоков - данными раскладки
Блок из одного поля encode_backend, decode_backend или audio_mode рисуется без заголовка поля should_flatten_single_section_field окно заменено: у блока, где выбор стоит первым, имя поля встаёт на место заголовка блока - один заголовок, не два (Views\Form.cs, TwoColumns)
«Дополнительно»: поля с advanced, priority: advanced/expert/rare или окончанием _model_override, _chunk_tokens… (наследие LLM-проектов) is_advanced_field модель: только advanced и priority перенесено: модель - только advanced и priority; окончания LLM-проектов убраны
Поле показано, если visible_if выполнено и hidden_if нет; поле, ещё не нарисованное, в условии читается своим умолчанием field_is_visible, _condition_actual_value модель перенесено: модель (operation_model.py), тест по записи
Условие: равенство без регистра, список - «любое из», not, neq, in, exists, all, any; для списка значений - пересечение _value_matches_condition модель перенесено: модель, тест по записи
Вариант выключен по disabled_if или невыполненному enabled_if; скрыт по visible_if / hidden_if option_is_disabled, option_is_visible модель перенесено: модель, тест по записи
При отрисовке переключатель с выключенным или чужим значением встаёт на первый разрешённый вариант (со связями set_field_value) render_field, радио модель перенесено: модель - при открытии и каждом изменении, а не при отрисовке
При отрисовке ряд флажков оставляет только разрешённые и в порядке вариантов render_field, sync_checkboxes модель перенесено: модель, тест по записи
При отрисовке пресет раздела применяет свои значения, если ещё не применён; профиль-список (youtube_preset) при этом не трогает флажки и списки render_field (пресеты, профиль) модель перенесено: модель, тест по записи
Выпадающий список не предлагает выключенный вариант, но текущий оставляет select_options модель перенесено: модель; выпадающих списков в окне нет - кнопки вариантов
Нажатие пресета: значения пресета пишутся как есть (без связей), потом id пресета apply_preset модель перенесено: модель, тест по записи
Связи на клик: контейнер MXF - звук в PCM 24 (кроме PCM 16/24 и «без звука»), MOV - FLAC меняется на PCM 24; MP3 - 384k меняется на 320k; режим remux - восстанавливает цели mp4 / mka set_field_value модель перенесено: модель, тест по записи
Цветовой сценарий ставит гамму: пре-экспозиция 1,15, прегамма 0,85 (или из профиля сценария), иначе пусто color_profile_gamma, set_script_preset_value модель перенесено: модель, тест по записи
Число целого шага приходит целым (2.0 → 2, запятая как точка) normalize_field_value модель перенесено: модель
▲▼ числа: шаг поля, зажим в min/max adjusted_number_value окно заменено: число шагает клавишами ↑↓ с шагом поля, зажим в min / max (Views\Form.cs)
Отказ до запуска: в ряду флажков меньше min_selected - «Выберите хотя бы один пункт: …» validate_pending_fields модель (код выхода 2) перенесено: модель - отказ в строке состояния, в консоли код выхода 2
Опасная операция (kind: dangerous) - подтверждение с названием и предупреждением start_operation окно; из консоли опасное не запускается, как у Image Tools перенесено: вопрос окна (MayRun); консоль опасное не запускает
Тон варианта (copy / uncompressed / lossless / lossy) вычисляется по словам значения и подписи для полей форматов и кодеков и перекрывает tone манифеста detected_format_tone, FORMAT_TONE_FIELDS, *_FORMAT_TOKENS модель (describe отдаёт тон) перенесено: модель, describe отдаёт тон
Варианты из функции (options_source, сейчас - файлы нарезки), кэш 45 с, ошибка - вариантом с текстом ошибки load_dynamic_options движок перенесено: движок, форма-сервер
LUT: список - закреплённые, выбранный, недавние, найденные в LUTs; выбор пишет кэш; импорт файлов или папки копирует в LUTs (папку - подпапкой) lut_options, _import_luts движок + окно перенесено: движок (lut_cache.py) + окно (Views\Form.Lut.cs)
Образец 18 % серого: куда гамма до LUT переносит серый; для HDR→SDR - отметка tonemap color_gamma_preview_state, render_color_gamma_preview окно, расчёт - модель перенесено: окно (Views\Form.Colour.cs), расчёт - модель (gamma_preview)
Таблицы совместимости remux в окне - мёртвые: поля «исходный формат» нет, исходник определяет и проверяет движок своими таблицами VIDEO_REMUX_COMPATIBILITY, ensure_remux_target_for_source убрано, потому что не вызывается убрано, потому что не вызывались
Подсказка под целями remux: «Source определяется автоматически; несовместимые файлы будут пропущены с записью в лог» - в коде render_field данные перенесено: подсказка поля цели в манифесте - несовместимый файл пропускается с причиной

5. Нарезка и плеер

Что Где Куда Отметка
Файл нарезки - бейдж с именем (середина длинного имени вырезана, полное - в подсказке), счётчик n/N, стрелки по кругу; одна запись - стрелки выключены render_trim_file_field, trim_short_name окно перенесено: окно (Views\Form.Trim.cs, TakeBar)
Смена файла стирает IN, OUT, строки и точки step модель перенесено: модель («take»)
Звук или видео - по расширению; от этого зависят поля trim_media_kind_of модель перенесено: модель
Таблица ffprobe файла по кнопке show_trim_probe окно, данные - движок перенесено: окно, данные - движок (probe)
Строки вариантов: строка 1 - trim_start / trim_end, дальше trim_rows; длительность куска: для «оставить» с одним IN - до конца файла, «вырезать» - только с обеими точками render_trim_variant_rows, trim_piece_seconds модель + окно перенесено: модель + окно (TrimRows)
«+» горит, когда последняя строка заполнена («оставить» - хотя бы одна точка, «вырезать» - обе), до предела TRIM_MAX_VARIANTS / SPLIT_MAX_POINTS; «+» очищает петлю A-B плеера trim_can_add, trim_add_click окно перенесено: окно, пределы 20 вариантов / 30 точек
Разделение: точки только вперёд; точка позади - отказ с причиной trim_split_take, mpv_apply_split_point модель перенесено: модель + окно (отказ с причиной)
▲▼ таймкода: шаг части, где стоит курсор (часы, минуты, секунды, кадр файла или миллисекунда для звука), зажатая кнопка повторяет через 420 мс, потом каждые 110 мс с растущим шагом TRIM_SPINNER_JS окно перенесено: окно (TimeBox, 420 / 110 мс); набор цифр сам ставит разделители
Плеер: «Открыть», «A-B», IN, OUT, «A» (точка разделения), «Точка», «Закрыть»; для разделения - свои кнопки render_player_transport, mpv_action_handler окно (mpv по именованному каналу) перенесено: окно говорит с mpv по именованному каналу (Core\Player.cs), без Python
Точки берутся только если плеер показывает выбранный файл (сверка path); иначе - какой файл он показывает mpv_shows_chosen_file окно перенесено: окно, сверка path
«Отметить здесь» ставит и точку в поле, и границу петли A-B плеера (кусок крутится) mpv_mark_here окно перенесено: окно, петля A-B плеера

6. Запуск, журнал, строка команд

Что Где Куда Отметка
Одна операция за раз; статус «Выполняется: …», «Готово: … [код] N.Nс» start_operation окно перенесено: окно
Строка состояния: точка и полоса по состоянию (ожидание, идёт, готово, ошибка), часы прогона мм:сс, процент; обновление раз в 0,5 с, только изменившееся build_ui refresh заменено: строка состояния Image Tools заменено: строка состояния Image Tools
Кнопка отмены в шапке видна во время работы; ставит cancel build_ui заменено: СТОП (stop.flag, задание Windows) заменено: СТОП (stop.flag, задание Windows); недописанный файл FFmpeg не остаётся (раздел 11)
После операции: путь последнего отчёта, «Сведения» об источнике (строка под формой и в подвале журнала, с пометкой «устарело» при смене Источника), обновление бейджа железа после hardware_capabilities start_operation, probe_status_text окно заменено: путь отчёта - строкой журнала; «Сведения» - прогоном в журнал; бейджи компонентов обновляются после установки, кодеры - в SETTINGS
«Предпросмотр команды» - та же операция с dry_run и youtube_dry_run preview_operation_from_pending media_cli.cmd run --dry-run, кнопка окна перенесено: кнопка КОМАНДА перед ЗАПУСКОМ - у операций, которые умеют сухой прогон; консоль --dry-run прочим отказывает
Журнал: до 1500 строк, цвета ANSI → HTML, дописывание без перерисовки, прокрутка вниз - только если пользователь внизу и ничего не выделил add_log, audionTerminalAppend заменено: журнал Image Tools заменено: журнал Image Tools, цвета ANSI
Журнал в большом окне, очистка видимого, кнопки «Логи», «Отчёты» (встроенный список), «Конфиг» build_ui, reports_view окно перенесено: журнал во всю ширину, очистка, кнопки logs, report, config
Строка команд: оболочка PowerShell / CMD, история и закреплённые, папка, «Папка» / «Файл» (файл дописывается аргументом в кавычках, папка становится рабочей), Ctrl+Enter; запуск службой sample_service:terminal_command terminal_command_bar, start_terminal_command заменено: строка команды на App\AudionPs.exe заменено: строка команды на App\AudionPs.exe
Разделитель журнала тянется, ширина в localStorage (по умолчанию 640, левая часть не уже 520, правая 360) JS в build_ui окно перенесено: разделитель тянется (GridSplitter), ширина помнится в window_settings.json (JournalWidth); журнал во всю ширину - кнопкой

7. Диагностика и железо

Что Где Куда Отметка
Бейдж железа в разделе «Диагностика»: процессор и видеоконтроллеры (CIM через powershell.exe), NVIDIA - nvidia-smi (имя, драйвер), версия FFmpeg, итог проверки кодеров из config\hardware_capabilities_cache.json; кэш 5 минут, кнопка обновить hardware_badge_data заменено: бейдж системы в SETTINGS, данные - движок заменено: бейджи компонентов в заголовке и карта системы в SETTINGS (движок components), кодеры - из кэша проверки
Совет по драйверу NVIDIA: от 570 - «NVENC + свежий BtbN 8.x», от 471.41 - «BtbN 7.1.x», ниже - обновить; для AMD - AMF, Intel - QSV после проверки; RTX 50xx называется отдельно hardware_badge_data движок (components), SETTINGS заменено: выбор сборки FFmpeg по драйверу - в установщике (план скачивания называет файл и причину) и в подсказке SETTINGS

8. Тексты в коде

Полный список - в карте прежнего окна. Здесь - где они живут.

Что Где Куда Отметка
34 подсказки полей, которых нет в манифесте; input_formats подсказки не получает FIELD_TOOLTIP_FALLBACKS, TOOLTIP_EXCLUDED_FIELD_IDS данные: манифест перенесено: в манифест
Подсказка поля - по цепочке tooltip → hint → description → запасная из кода field_tooltip модель перенесено: модель
Подсказки кнопок журнала и строки команд, кнопок папок (с путём) audion_terminal_action_tooltip, audion_folder_button_tooltip данные: i18n.json перенесено: i18n.json
Подписи окна RU / EN LABELS данные: i18n.json перенесено: i18n.json, 0 без пары (check_i18n.py)
Подтверждения, образец серого, бейдж железа, подсказка remux - фразы в коде по месту данные перенесено: данные (i18n.json, манифест)
Задержка подсказки 1500 мс, скрытие 100 мс AUDION_CANONICAL_TOOLTIP_* окно (как у Image Tools) перенесено: как у Image Tools (App.axaml)

9. Мёртвое и наследие

Что Где Куда Отметка
system_core\ui_nicegui\i18n.py (84 строки) - никем не импортируется   убрано, потому что не используется убрано: в окно не переносится; уходит с папкой ui_nicegui (этап 7)
Таблицы совместимости remux окна (раздел 4) app.py 944-998, 2931-2987 убрано убрано
Значки-эмодзи в заголовках (emoji: false) em убрано убрано
_startup_workspace_path и _workspace_setting_for_disk возвращают постоянное, их параметры не читаются app.py 246-262 убрано убрано
Окончания полей LLM-проектов в «Дополнительно» ADVANCED_FIELD_SUFFIXES убрано убрано

10. Консольные меню и обёртки

Что Где Куда Отметка
Меню проекта на FZF с запасным числовым: YouTube, FPS 23.976, FPS SPEED SELECTOR, звук, LUT, ProRes / DNxHR, remux, x264 / HEVC, сборщик launcher_project.cmd, cli\launcher-*.cmd убрано после описи: те же операции - окно и media_cli.cmd убрано на этапе 7: те же операции - окно и media_cli.cmd
FPS SPEED SELECTOR: режим (conform / varispeed), исходная частота (25…179,82 → 23,976), выход, PCM и передискретизация - переменными среды для обёртки cli\launcher-select-fps-speed.cmd раздел ЧАСТОТА окна; переменные - в карте обёрток перенесено: раздел ЧАСТОТА окна; переменные - в config\wrappers.yaml
Меню инструментов: проверка окружения, лицензии (сбор, чистка, дубли), архив выпуска, открыть папки launcher_tools.cmd решить: сборщик и Build-стек решено: проверки - СЕРВИС окна, лицензии и архив выпуска - Build-стек; меню уходит на этапе 7
95 обёрток Scripts\*.cmd - профиль того же имени в config\script_profiles.yaml; исполняет свой Scripts\Common\script_runner.py (2030 строк): общие с движком только контракты core\*_contract.py и _fps_output_args, команду FFmpeg он строит сам Scripts\ остаются; решить: свести их к media_cli.cmd run решено владельцем 15.10.2026: обёртки остаются и зовут media_cli.cmd wrapper; script_runner.py в Корзине, 95 из 95 сверены
Ручки обёрток - около 45 переменных среды AUDION_* (источник, назначение, кодеки, бэкенд, CRF / CQ, звук, LUT, гамма, нарезка, частота…) script_runner.py, first_env карта обёрток перенесено: config\wrappers.yaml
Маркер проекта у cleanup_project.cmd - system_core\ui_nicegui\app.py, файл прежнего окна cleanup_project.cmd на этапе чистки - маркер system_core\cli.py на этапе 7

11. Найдено прогонами консольной команды

Что Где Куда Отметка
СТОП посреди кодирования оставляет в Назначении недописанный файл (long.mp4, 2,6 МБ из 30 секунд); прежнее окно вело себя так же. Нарезка свой кусок убирает (аудит 2.6.0) encode_targets, run_process движок: писать во временное имя и ставить на место только целое, как Image Tools (.writing) исправлено 15.10: FFmpeg пишет имя.writing.ext, имя - только целому; СТОП и сбой не оставляют ничего (tests\test_writing_output.py)
При остановке в журнал идёт трассировка Python RuntimeError: Operation cancelled by user. execute_operation движок: одна строка «остановлено» исправлено 15.10: одна строка [STOPPED], без трассировки

12. Найдено на материале владельца (15.10.2026, input)

Что Где Куда Отметка
ProRes LT 4096×2160 (Ellie Goulding … Fragment.mov): r_frame_rate 24000/1001, avg_frame_rate 7188000/299299 = 24,016 (599 кадров на 24,94 с). Расхождение 0,17 % - ниже порога «плавающей» частоты (1 %), и нарезка берёт за сетку кадров 24,016: к 20-й секунде сетка уходит почти на кадр; «Сведения» пишут 24.016p media_service.py 4705-4711, 4077, 4993, 6210 (rate_source), 2191 (_rate_label(avg)) движок: при постоянной частоте - r_frame_rate, точная дробь; среднее - только если номинальной нет. Тест на этом файле исправлено 15.10: trim_contract.stream_rate во всех местах; «Частота» на этом файле - 23,976 → 23,976, скорость не меняется, итог 24000/1001 ровно
ARRIRAW в MXF (ARRI_Helen_John_ALEXA_35_ARRIRAW.mxf, 10 ГБ): FFmpeg видит видеопоток без кодека и размеров. Нарезка отказывает внятно (TRIM_UNREADABLE_VIDEO), «Сведения» показывают ? _video_stream_is_unreadable, probe_source движок: в «Сведениях» - та же внятная фраза: ARRIRAW FFmpeg не декодирует исправлено 15.10: «camera RAW, FFmpeg has no decoder» и фраза под таблицей
Файл, который ещё копируется, даёт в «Сведениях» ERROR: … Permission denied и попадает в итоговую строку как видео всей папки probe_source движок: «файл занят» отдельной строкой, итог - по прочитанным исправлено 15.10: строка «busy», итог - по прочитанным
«Сведения» на стеке образцов: 25i (field_order=tt) показан 25p; плавающая частота - 28.875p без пометки VFR; у звукового файла в колонке видео ? вместо -; итог папки берётся с первого файла (24p, A: - у ARRIRAW) probe_source, _rate_label движок: 25i, VFR 30 (≈28,875), - у звука; итог - по большинству исправлено 15.10: 25i, VFR 30 (avg 28.875), - у звука, итог по большинству (tests\test_probe_source.py)