Skip to content

v1.5.0: стабильный захват 1440p/2160p через нативное меню (SABR игнорирует JS API), фикс заморозки кадра, части, пам ть, MP3 192/320, тесты - #5

Open
Sucotasch wants to merge 19 commits into
HelpFreedom:mainfrom
Sucotasch:pr/author-review

Conversation

@Sucotasch

@SucotaschSucotasch commented Aug 11, 2026

Copy link
Copy Markdown

Что в этом PR

Расширение работает как и раньше (MSE-захват потока плеера, без yt-dlp), но теперь:

Новые возможности

  • 1440p и 2160p в дополнение к 720p/1080p (только если ролик их поддерживает). Выбор качества для всех разрешений идёт через нативное меню настроек плеера — тот же путь, что клик мышью, потому что JS-API качества в современном SABR-плеере не работает: setPlaybackQualityRange молча переводит плеер в AUTO-режим (ABR отдаёт 720p и режет дорожку), а setPlaybackQuality игнорируется вовсе.
  • Загрузка по частям («По частям» в меню): длинные ролики сохраняются последовательными файлами по ~15 минут ((part N of M)).
  • Адаптивное предупреждение о памяти: перед большим захватом оценивается пиковое потребление RAM и предлагается скачать по частям / целиком / отмена.
  • Выбор битрейта MP3: 192 kbps (как в оригинале, по умолчанию) или 320 kbps.

Исправления

  • «Замороженный кадр» в конце файла: цикл захвата раньше опирался на video.buffered (объединение краёв всех дорожек) — на высоких битрейтах аудио-буфер уходит далеко вперёд, и захват объявлялся завершённым, когда видео-дорожка была ещё короткой. Теперь хопы и завершение считаются по отдельным краям видео и аудио.
  • Качество принуждается ДО записи, а не во время неё: переключение качества во время захвата ре-инициализирует SourceBuffer и обрезает записываемую дорожку.
  • Честное информирование: если плеер отдал разрешение ниже запрошенного, файл называется по реальному разрешению, а тост сообщает «плеер отдал Np вместо Mp»; если захват прерван (stall / переключение качества) — тост предупреждает, что файл может быть обрезан.
  • AV1-стриминг оставлен как был (плеер отдаёт VP9, который умеет декодировать встроенный ffmpeg).
  • Исправления по аудиту: восстановление после сбоя загрузки ffmpeg, тайминги отзыва blob-URL по завершении загрузки, проверка входных данных моста postMessage, minimum_chrome_version: 116, приём файлов малого размера.

Раунд стабильности (итоговая версия 1.5.0)

  • Все переключения качества — только через нативное меню (единый путь для 720p/1080p/1440p/2160p/mp3), с подтверждением реальной высоты (videoHeight) до старта записи; если плеер за ~12 с не переключился — понятная ошибка с подсказкой, а не молчаливый 720p-файл.
  • Восстановление качества после загрузки: начальное разрешение плеера запоминается и возвращается через меню после завершения (успех или сбой) — плеер не остаётся в чужом разрешении.
  • Склейка повторных init одного потока (seams): mid-capture re-init с идентичным init-сегментом (штатный сброс буфера плеером на высоких битрейтах) больше не выбрасывает захваченную часть — файл остаётся целым, ложное «файл может быть обрезан» убрано. Обрезка остаётся только при реальной смене потока (другой init).
  • Пункты «Np Premium» пропускаются, если есть обычный пункт той же высоты (иначе для неподписчиков выбирался недоступный Premium-вариант).
  • Флаш-переключение перед захватом выполняется только когда плеер уже стоит на запрошенном разрешении — старт загрузки быстрее.

Качество

  • Чистые функции вынесены в extension/lib/format.js (UMD: работает и в расширении, и в node).
  • Добавлены тесты tests/format.test.js (node --test tests/ — 24 теста, без зависимостей): round-trip времени, матрица решений «точная обрезка / копирование», base64 через границу чанков, каскад ffmpeg-запусков, имена файлов, битрейт MP3.
  • Версия поднята до 1.5.0.

Известные внешние факторы (не баги)

  • Расширения, принудительно меняющие качество (например «YouTube Auto HD + FPS»), перебивают выбор качества и режут захват — их нужно отключать.
  • YouTube может временно деприоритизировать доставку сегментов конкретного ролика при повторных полных загрузках — тогда ролик качается медленнее, другие — нормально (само восстанавливается).
  • Точная обрезка фрагмента ≤ 60 с в 2160p перекодируется и занимает минуты (4× пикселей + однопоточный WASM ffmpeg) — это ожидаемо.
  • Блокировщик рекламы (uBlock Origin) по-прежнему обязателен (без него YouTube вставляет рекламные вставки в поток).

Проверено вживую

720p/1080p/1440p/2160p (включая переключение «стояло 720 → скачал 2160 → вернулось 720»), MP3 (192 и 320), субтитры, фрагменты, загрузка по частям (53-минутный ролик → 4 части), адаптивное предупреждение о памяти.

…ater mode for 1440p/2160p; report actual resolution
…enu height matching and hidden-item clicks; close menu on all paths
…d edges (not the union), force quality before recording, track mid-capture re-inits as incomplete
…essful menu selection (it switches to auto-range mode, overriding the manual pick and cutting the capture); API only as fallback + playback-quality diagnostics
… Auto HD + FPS) override the menu selection and cut the capture
…at.js (shared with node:test suite); drop Log.txt from git; fix bare b64decode ref in offscreen chunk handler
…e delivery deprioritization, not a code bug (control-video check)
…k option); thread through single/parts paths; test + READMEs
@SucotaschSucotasch changed the title v1.5.0: 1440p/2160p через нативное меню, фикс заморозки кадра, части, пам ть, MP3 192/320, тестыv1.5.0: 1440p/2160p через нативное меню, фикс заморозки кадра, части, память, MP3 192/320, тестыAug 11, 2026
…PI), glue same-stream re-inits (seams), restore the player's prior quality after capture, skip 'Np Premium' entries, conditional flush
@SucotaschSucotasch changed the title v1.5.0: 1440p/2160p через нативное меню, фикс заморозки кадра, части, память, MP3 192/320, тестыv1.5.0: стабильный захват 1440p/2160p через нативное меню (SABR игнорирует JS API), фикс заморозки кадра, части, пам ть, MP3 192/320, тестыAug 14, 2026
Sign up for freeto 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

@Sucotasch