Минималистичный DevTools-инструмент для перехвата аудио-чанков из YouTube Music через MediaSource / SourceBuffer, просмотра активных сессий, авто-сохранения треков при переключении и дебага текущего проигрывателя.
Warning
Этот toolkit работает за счёт runtime-hook'ов браузера и зависит от текущей реализации YouTube Music.
Если Google изменит DOM, MSE-пайплайн, структуру плеера или способ буферизации — часть логики может потребовать правки.
Note
Это не расширение и не отдельное приложение.
Toolkit запускается прямо в Chrome DevTools Console и работает внутри текущей вкладки YouTube Music.
Important
Инструмент задуман как технический DevTools toolkit для исследования и анализа воспроизведения, а не как polished end-user продукт с интерфейсом "на одну кнопку".
- YouTube Music MSE Audio Dumper Toolkit (Chrome DevTools)
- Что умеет этот toolkit
- Как это работает
- Установка / запуск
- Типичный сценарий использования
- Почему это полезно
- Ограничения
- Dev Notes
- Troubleshooting
- Дальнейшие идеи развития
- Быстрый старт
- Disclaimer
Я хотел получить прямой технический контроль над тем, что реально прилетает в браузер при проигрывании музыки в YouTube Music.
Не через расширения, не через мутные "загрузчики", не через внешний MITM или сетевые пляски, а изнутри самой вкладки, на уровне того, как сайт кормит аудио в <audio> через MSE (Media Source Extensions).
Идея была простой:
- зацепиться за
MediaSource.prototype.addSourceBuffer - перехватывать
appendBuffer() - собирать все аудио-чанки в память
- привязывать их к конкретному треку
- и при необходимости сохранять всё это как файл
В итоге получился чистый DevTools toolkit, который можно просто вставить в Chrome DevTools Console на странице YouTube Music и сразу использовать.
Я хукаю:
MediaSource.prototype.addSourceBufferSourceBuffer.appendBuffer()
И собираю все аудио-чанки, которые YouTube Music скармливает плееру.
Каждый новый SourceBuffer создаёт отдельную session, в которой хранится:
idmimecreatedAt- замороженная
metaна момент создания - массив
chunks - суммарный размер
totalBytes - флаг
saved
То есть каждая сессия — это отдельный контейнер с перехваченным аудио.
Я отдельно сделал сбор названия и артиста именно из YouTube Music player bar, а не из SEO-мусора страницы.
Инструмент тянет:
- title
- artist
audio.currentSrccurrentTimedurationpaused
Причём специально избегается мусор вроде:
- просмотров
- лайков
- SEO-заголовков
- лишней byline-инфы
Можно в любой момент сохранить:
- самую актуальную аудио-сессию
- или предыдущую завершённую
- или конкретную по ID
Toolkit сам соберёт Blob и отдаст скачивание через браузер.
Это одна из самых полезных частей.
Я добавил отдельный ytAuto, который:
- отслеживает текущий трек
- понимает, когда реально произошла смена композиции
- не реагирует на случайные дрожания DOM
- ждёт стабильного подтверждения
- и только потом сохраняет предыдущую завершённую аудио-сессию
Это позволяет просто включить плейлист / радио / автоподбор и дать инструменту самому собирать треки по мере проигрывания.
Можно посмотреть:
- список всех сессий
- содержимое конкретной сессии
- состояние
<audio> - buffered ranges
- текущий src
- текущую мету
То есть это не просто "дампер", а ещё и удобный диагностический инструмент.
Когда YouTube Music создаёт новый SourceBuffer, я:
- вызываю оригинальный
addSourceBuffer - создаю новую
session - замораживаю мету трека на этот момент
- подменяю
appendBuffer
Каждый раз, когда YouTube Music докидывает очередной аудио-фрагмент:
- я копирую входной
ArrayBuffer/TypedArray - сохраняю chunk в
session.chunks - увеличиваю
session.totalBytes
Таким образом в памяти постепенно собирается весь аудио-поток.
Автоматическое сохранение не триггерится тупо по одному изменению текста на странице.
Я сделал защиту от ложных срабатываний:
- вычисляется
trackKey - новый ключ должен удержаться несколько тиков подряд
- только после этого смена трека считается подтверждённой
Это защищает от:
- морганий DOM
- промежуточных состояний плеера
- лишних ререндеров YouTube Music
Перехожу на:
https://music.youtube.com/
Нажимаю:
F12
или
Ctrl + Shift + I
Открываю вкладку:
Console
4. Вставляю весь toolkit-код
Просто вставляю мой скрипт целиком и жму Enter.
Если всё ок — в консоли появляется сообщение:
[YT] Clean toolkit v3 installed.
Если я хочу просто быстро вытащить текущий трек:
ytMSE.list()
ytMSE.inspect()
ytMSE.save()Если я хочу включить плейлист и дать инструменту самому сохранять:
ytAuto.start()Потом просто листаю / слушаю / даю трекам переключаться.
Когда закончил:
ytAuto.stop()Если нужно понять, что вообще происходит у плеера:
ytMSE.getMeta()
ytMSE.playerInfo()
ytAuto.status()Я не ломаюсь в TLS, не ставлю внешние сертификаты и не строю кривой сетевой перехват.
Я беру не "какие-то догадки по сети", а реальный бинарный поток, который уже идёт в SourceBuffer.
Всё работает внутри DevTools, без расширения, сборки, npm-пакетов и отдельного приложения.
Этот toolkit полезен не только для сохранения, но и для:
- анализа поведения MSE
- изучения буферизации
- исследования структуры проигрывания
- дебага смены треков
- диагностики
blob:-источников
Инструмент завязан на то, как YouTube Music сейчас реализует проигрывание.
Если сайт поменяет:
- DOM player bar
- способ сборки byline
- MSE-логику
- формат буферов
— что-то может потребовать правки.
YouTube Music иногда создаёт новые SourceBuffer не совсем так, как ожидается "по-человечески", поэтому в некоторых случаях можно увидеть несколько сессий на один и тот же трек.
Я уже добавил логику отбора лучшей предыдущей завершённой аудио-сессии, но это всё равно важно понимать.
Я писал это как технический DevTools toolkit, а не как polished user-facing extension с красивой UI-обвязкой.
Это один из ключевых моментов.
Если брать title / artist в момент сохранения, то есть шанс, что UI уже показывает следующий трек, а буфер у меня ещё относится к предыдущему.
Поэтому я сохраняю createdMeta в момент создания SourceBuffer, а не в момент скачивания.
Именно это даёт корректные имена файлов и нормальную привязку чанков к треку.
При автосохранении я не беру слепо последнюю сессию.
Я специально ищу:
самую большую завершённую предыдущую аудио-сессию
Это сильно снижает шанс сохранить:
- обрубок следующего трека
- недописанный буфер
- мусорную короткую сессию
- промежуточный аудио-переход
Потому что сначала мне нужна была чистая рабочая логика, а не декоративная обвязка.
Сначала я хотел:
- надёжно перехватывать
- надёжно определять трек
- надёжно сохранять
- и только потом уже думать про extension / overlay / панель
Проверь:
- что код вставлен целиком
- что ты находишься именно на:
https://music.youtube.com/ - что в консоли нет синтаксической ошибки выше
Возможные причины:
- ты вставил toolkit до старта воспроизведения
- трек ещё не начал реально буферизоваться
- YouTube Music ещё не создал
SourceBuffer
Что делать:
- обновить страницу
- снова вставить toolkit
- запустить трек
- подождать 2–5 секунд
- снова вызвать:
ytMSE.list()Попробуй увеличить порог:
ytAuto.setMinBytes(500000)или даже:
ytAuto.setMinBytes(1000000)Это особенно полезно, если YouTube Music создаёт короткие промежуточные аудио-сессии.
Возможные причины:
- DOM плеера обновляется нестабильно
- byline/title обновляются раньше или позже аудио
- YouTube Music пересоздаёт буферы нестандартно
Что можно попробовать:
- уменьшить/увеличить интервал авто-опроса
- чаще смотреть
ytAuto.status() - смотреть
ytMSE.inspect() - логировать больше промежуточных состояний
Скорее всего это как раз один из пограничных случаев смены UI/буфера.
Для анализа проверь:
ytMSE.inspect()
ytMSE.getMeta()
ytAuto.status()Если я продолжу развивать этот toolkit, я бы добавил:
- фильтрацию только реально полезных аудио-сессий
- UI-панель прямо в странице
- экспорт session history в JSON
- авто-детект "полностью завершённого" трека
- отдельное различение audio/video SourceBuffer
- hook на
fetch/XMLHttpRequestдля дополнительного сопоставления сетевых запросов - связку с DevTools Snippets
- поддержку YouTube (не только YouTube Music)
- нормальный Chrome Extension wrapper
- кнопку "сохранить текущий трек"
- live-индикатор текущей активной session
- экспорт технички для reverse/debug анализа
ytAuto.start()Послушал музыку / полистал треки / дал им переключиться.
Потом:
ytAuto.stop()Или вручную:
ytMSE.save()Полный список команд
Caution
Этот проект публикуется как технический исследовательский toolkit для изучения поведения MSE / SourceBuffer / runtime media pipelines в браузере.
Авторская цель проекта:
- исследование поведения проигрывателя,
- отладка и анализ буферизации,
- технический runtime-debug,
- reverse / browser instrumentation.
Если вы используете этот код, вы делаете это на свой страх и риск и под свою ответственность.