Skip to content

Dvurechensky-Tools/YouTubeMusicToolkit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 

Repository files navigation

YouTube Music MSE Audio Dumper Toolkit (Chrome DevTools)

Минималистичный 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.

Не через расширения, не через мутные "загрузчики", не через внешний MITM или сетевые пляски, а изнутри самой вкладки, на уровне того, как сайт кормит аудио в <audio> через MSE (Media Source Extensions).

Идея была простой:

  • зацепиться за MediaSource.prototype.addSourceBuffer
  • перехватывать appendBuffer()
  • собирать все аудио-чанки в память
  • привязывать их к конкретному треку
  • и при необходимости сохранять всё это как файл

В итоге получился чистый DevTools toolkit, который можно просто вставить в Chrome DevTools Console на странице YouTube Music и сразу использовать.


Что умеет этот toolkit

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

1) Перехват MSE аудио-потока

Я хукаю:

  • MediaSource.prototype.addSourceBuffer
  • SourceBuffer.appendBuffer()

И собираю все аудио-чанки, которые YouTube Music скармливает плееру.


2) Автоматическое создание "сессий"

Каждый новый SourceBuffer создаёт отдельную session, в которой хранится:

  • id
  • mime
  • createdAt
  • замороженная meta на момент создания
  • массив chunks
  • суммарный размер totalBytes
  • флаг saved

То есть каждая сессия — это отдельный контейнер с перехваченным аудио.


3) Чистое получение меты трека

Я отдельно сделал сбор названия и артиста именно из YouTube Music player bar, а не из SEO-мусора страницы.

Инструмент тянет:

  • title
  • artist
  • audio.currentSrc
  • currentTime
  • duration
  • paused

Причём специально избегается мусор вроде:

  • просмотров
  • лайков
  • SEO-заголовков
  • лишней byline-инфы

4) Ручное сохранение перехваченного аудио

Можно в любой момент сохранить:

  • самую актуальную аудио-сессию
  • или предыдущую завершённую
  • или конкретную по ID

Toolkit сам соберёт Blob и отдаст скачивание через браузер.


5) Авто-сохранение при переключении треков

Это одна из самых полезных частей.

Я добавил отдельный ytAuto, который:

  • отслеживает текущий трек
  • понимает, когда реально произошла смена композиции
  • не реагирует на случайные дрожания DOM
  • ждёт стабильного подтверждения
  • и только потом сохраняет предыдущую завершённую аудио-сессию

Это позволяет просто включить плейлист / радио / автоподбор и дать инструменту самому собирать треки по мере проигрывания.


6) Инспекция и дебаг

Можно посмотреть:

  • список всех сессий
  • содержимое конкретной сессии
  • состояние <audio>
  • buffered ranges
  • текущий src
  • текущую мету

То есть это не просто "дампер", а ещё и удобный диагностический инструмент.


Как это работает

Архитектура

Хук на MediaSource.addSourceBuffer

Когда YouTube Music создаёт новый SourceBuffer, я:

  1. вызываю оригинальный addSourceBuffer
  2. создаю новую session
  3. замораживаю мету трека на этот момент
  4. подменяю appendBuffer

Хук на SourceBuffer.appendBuffer

Каждый раз, когда YouTube Music докидывает очередной аудио-фрагмент:

  • я копирую входной ArrayBuffer / TypedArray
  • сохраняю chunk в session.chunks
  • увеличиваю session.totalBytes

Таким образом в памяти постепенно собирается весь аудио-поток.


Логика "track change"

Автоматическое сохранение не триггерится тупо по одному изменению текста на странице.

Я сделал защиту от ложных срабатываний:

  • вычисляется trackKey
  • новый ключ должен удержаться несколько тиков подряд
  • только после этого смена трека считается подтверждённой

Это защищает от:

  • морганий DOM
  • промежуточных состояний плеера
  • лишних ререндеров YouTube Music

Установка / запуск

Вариант: через Chrome DevTools

1. Открываю YouTube Music

Перехожу на:

https://music.youtube.com/

2. Открываю DevTools

Нажимаю:

F12

или

Ctrl + Shift + I

3. Иду в Console

Открываю вкладку:

Console

4. Вставляю весь toolkit-код

Просто вставляю мой скрипт целиком и жму Enter.

Если всё ок — в консоли появляется сообщение:

[YT] Clean toolkit v3 installed.

Типичный сценарий использования

Сценарий 1 — вручную

Если я хочу просто быстро вытащить текущий трек:

ytMSE.list()
ytMSE.inspect()
ytMSE.save()

Сценарий 2 — авто-сбор треков

Если я хочу включить плейлист и дать инструменту самому сохранять:

ytAuto.start()

Потом просто листаю / слушаю / даю трекам переключаться.

Когда закончил:

ytAuto.stop()

Сценарий 3 — отладка

Если нужно понять, что вообще происходит у плеера:

ytMSE.getMeta()
ytMSE.playerInfo()
ytAuto.status()

Почему это полезно

Преимущества такого подхода

Не нужен MITM / прокси

Я не ломаюсь в TLS, не ставлю внешние сертификаты и не строю кривой сетевой перехват.


Работаю прямо на уровне плеера

Я беру не "какие-то догадки по сети", а реальный бинарный поток, который уже идёт в SourceBuffer.


Минимум внешних зависимостей

Всё работает внутри DevTools, без расширения, сборки, npm-пакетов и отдельного приложения.


Удобно для исследования YouTube Music

Этот toolkit полезен не только для сохранения, но и для:

  • анализа поведения MSE
  • изучения буферизации
  • исследования структуры проигрывания
  • дебага смены треков
  • диагностики blob:-источников

Ограничения

1) Это не "магический универсальный загрузчик"

Инструмент завязан на то, как YouTube Music сейчас реализует проигрывание.

Если сайт поменяет:

  • DOM player bar
  • способ сборки byline
  • MSE-логику
  • формат буферов

— что-то может потребовать правки.


2) Возможны дубли / лишние сессии

YouTube Music иногда создаёт новые SourceBuffer не совсем так, как ожидается "по-человечески", поэтому в некоторых случаях можно увидеть несколько сессий на один и тот же трек.

Я уже добавил логику отбора лучшей предыдущей завершённой аудио-сессии, но это всё равно важно понимать.


3) Это инструмент для технического исследования

Я писал это как технический DevTools toolkit, а не как polished user-facing extension с красивой UI-обвязкой.


Dev Notes

Почему я замораживаю meta при создании session

Это один из ключевых моментов.

Если брать title / artist в момент сохранения, то есть шанс, что UI уже показывает следующий трек, а буфер у меня ещё относится к предыдущему.

Поэтому я сохраняю createdMeta в момент создания SourceBuffer, а не в момент скачивания.

Именно это даёт корректные имена файлов и нормальную привязку чанков к треку.


Почему я сохраняю не "самую новую" session, а "лучшую предыдущую"

При автосохранении я не беру слепо последнюю сессию.

Я специально ищу:

самую большую завершённую предыдущую аудио-сессию

Это сильно снижает шанс сохранить:

  • обрубок следующего трека
  • недописанный буфер
  • мусорную короткую сессию
  • промежуточный аудио-переход

Почему тут нет UI

Потому что сначала мне нужна была чистая рабочая логика, а не декоративная обвязка.

Сначала я хотел:

  • надёжно перехватывать
  • надёжно определять трек
  • надёжно сохранять
  • и только потом уже думать про extension / overlay / панель

Troubleshooting

Не появляется [YT] Clean toolkit v3 installed.

Проверь:

  • что код вставлен целиком
  • что ты находишься именно на:
    https://music.youtube.com/
    
  • что в консоли нет синтаксической ошибки выше

ytMSE.list() пустой

Возможные причины:

  • ты вставил toolkit до старта воспроизведения
  • трек ещё не начал реально буферизоваться
  • YouTube Music ещё не создал SourceBuffer

Что делать:

  1. обновить страницу
  2. снова вставить toolkit
  3. запустить трек
  4. подождать 2–5 секунд
  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()

Полный список команд


Disclaimer

Caution

Этот проект публикуется как технический исследовательский toolkit для изучения поведения MSE / SourceBuffer / runtime media pipelines в браузере.

Авторская цель проекта:

  • исследование поведения проигрывателя,
  • отладка и анализ буферизации,
  • технический runtime-debug,
  • reverse / browser instrumentation.

Если вы используете этот код, вы делаете это на свой страх и риск и под свою ответственность.


About

Минималистичный DevTools-инструмент для перехвата аудио-чанков из YouTube Music через MediaSource / SourceBuffer, просмотра активных сессий, авто-сохранения треков при переключении и дебага текущего проигрывателя.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors