LINUX.ORG.RU

Существует ли универсальный способ сохранения аудио и видео с сайтов?

 , ,


0

1

Все имеющиеся способы (типа yt-dlp) рассчитаны на конкретные сайты. А если для нужного мне сайта инструмента нет? Ведь всё то, что можно воспроизвести, можно и записать. Можно же тупо записать весь отправляемый на звуковую карту звук. Можно записать то, что показано на экране. Теоретически же можно записать звук только с конкретного источника конкретной вкладки браузера и видео без масштабирования. Есть ли инструменты для этого дела?

★★

Существует ли универсальный способ сохранения аудио и видео с сайтов?

Нет.

Теоретически же можно записать звук только с конкретного источника конкретной вкладки браузера и видео без масштабирования

Можно. Только это дебильный способ — lossy2lossless или lossy2lossy кодирование. А главное, нет никакого смысла таким заниматься, если видео и аудио в удобоваримом формате у браузера уже есть. Наиболее универсальным способом, наверное, будет «достать из кэша браузера», но это не очень удобно. Гораздо удобнее всё же расковыривать, как именно сайт отдаёт нужные данные, и, соответственно, делать качалки, которые могут это получить и сохранить удобным образом (как тот же yt-dlp).

Основная причина, почему нет универсального способа это сделать, в том, что часть сайтов (тот же YouTube как яркий пример) намеренно этому сопротивляются и стараются всё усложнить, а старые инструменты «сломать» (ну то есть, сделать, чтобы они перестали работать с новой выдачей). Тем не менее, любая хитро сделанная штука расшифровывается. Если браузер может получить видеопоток и показать его юзеру, то и другая софтина сможет, поэтому авторы yt-dlp таки справляются с тем, чтобы он продолжал работать после всех выкрутасов гугла. С другими сайтами это делается обычно проще, потому что обычно и заморачиваются они меньше гугла.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 4)
Ответ на: комментарий от CrX

Наиболее универсальным способом, наверное, будет «достать из кэша браузера», но это не очень удобно.

Элементарно пишется js-плеер который ничего полезного в кеше не оставляет. И сниффер http-запросов тоже никаких медиапотоков в известных форматах не найдёт. Ценой дополнительной нагрузки на проц клиента, но как будто это волнует владельцев таких сайтов.

Но после принятия вышеуказанных мер просниффить всё равно относительно просто, надо добавить js-хук в MSE и сохранять куда-то всё что там в медиабуфер добавляют.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 3)
Ответ на: комментарий от firkax

Элементарно пишется js-плеер который ничего полезного в кеше не оставляет. И сниффер http-запросов тоже никаких медиапотоков в известных форматах не найдёт.

Это прям с декодером на JS что ли, и в canvas? Или не до такой степени?

В любом случае, если оно в итоге показывается юзеру именно как видео, это видео можно точно так же и сохранить — пусть даже из того же JS. Но да, именно вариант с кэшем обойти можно. Впрочем, обычно не стараются. На большинстве не особо популярных сайтов просто не заморачиваются и делают «защиту» лишь от сохранения по правому клику, при этом порой даже целиком видеофайл на самом деле отдавая, то есть «от честных людей». Прям сильно заморачиваются обычно только на реально популярных — но их как раз таки yt-dlp умеет.

Но в общем да, универсального способа нет. С каждым сайтом надо разбираться отдельно. Это плохая новость. Хорошая же в том, что с 99% сайтов будет значительно проще, чем с пресловутым ютубом.

CrX ★★★★★
()
Ответ на: комментарий от CrX

Всё проще - по сети шлёшь что-то обфусцированное (и в кеше тоже оно остаётся), а перед засовыванием в медиа-буфер обфускацию снимаешь. Ключ обфускации слать отдельно от потока например через куки. Можно даже diffie-hellman организовать чтобы никакой http-сниффер его не смог достать точно. Но против влезания в js отладчиком это не поможет разумеется.

Но в общем да, универсального способа нет.

Если тебя устраивает ситуация, когда для сохранения видео его надо всё просмотреть, т.е. потратить на сохранение столько же времени сколько длина видео, и потратить проц на всю блоатварь которая в сайт встроена, то способ скорее есть. Но обычно хотят сохранить быстрее чем просмотр и не тратя проц.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Если тебя устраивает ситуация, когда для сохранения видео его надо всё просмотреть, т.е. потратить на сохранение столько же времени сколько длина видео, и потратить проц на всю блоатварь которая в сайт встроена, то способ скорее есть. Но обычно хотят сохранить быстрее чем просмотр и не тратя проц.

В некоторых случаях устроит. Если это, например, песня.

Wapieth ★★
() автор топика

Мне кажется вы спрашиваете про онлайн рекордеры. Да, с появлением жадных капиталистов, которые хотят денежку за каждый просмотр фильма и каждое прослушивание звукозаписи всегда появлялись средства перехвата и сохранения видео и аудио потоков от самых примитивных - экранки - до продвинутых - видеозахват, аудио рекординг. Ищите, все есть, зависит от настойчивости и бюджета.

VIT ★★
()
Ответ на: комментарий от praseodim

но если нет работающего способа сохранить напрямую, как yt-dlp

Способ есть всегда. Если браузер может показать видеоряд пользователю, то ничто не мешает его же и сохранить. Без вот этого вот ужаса с экранками.

Просто может понадобиться чуть-чуть поковыряться в коде сайта. Обычно не то чтобы очень сильно.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от CrX

Если браузер может показать видеоряд пользователю, то ничто не мешает его же и сохранить. Без вот этого вот ужаса с экранками.

Подскажи как сохранить видеоряд Яндекс-Телемоста без ужаса с экранками и без установки яндекс браузера. Штатно для этого нужен Яндекс Браузер, в Chrome/Chromium сохраняется только 30 минут общения, в Firefox телемост вообще функцию отключает.

Я не нашел вариантов кроме obs-studio, хотя вещь востребованная, если бы было просто сделать, уже кто-нибудь бы расковырял или плагин написал.

praseodim ★★★★★
()
Последнее исправление: praseodim (всего исправлений: 2)
Ответ на: комментарий от praseodim

Подскажи как сохранить видеоряд Яндекс-Телемоста

Не знаю, не пользовался им.

Штатно для этого нужен Яндекс Браузер в Chrome/Chromium сохраняется только 30 минут, в Firefox телемост вообще ыункцию отключает.

Какую функцию? Телемоста этого? Или сохранения только?

Ну как вариант, просто сохранять по 30 минут в хромиуме, если совсем лень ковыряться — почему бы нет? Ну а так — смотри код страницы, вероятно куски видео запрашиваются скриптом. Вот туда можно вклиниваться и так же запрашивать, но своей качалкой. Надо понимать JS, да.

А yt-dlp не качает оттуда?

Если в яндекс-браузере прям штатно именно сохранить можно, то я бы тупо его запускал в песочнице и не парился. Ну или можно понять, чем он в данном случае отличается от хромиума. Возможно вообще только юзерагентом.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от CrX

Мне кажется ТС намеренно использует слово «универсальный» чтобы показать, что ищет решение независимо от сайта. Тогда только экранка, только платы видеозахвата.

У нас в любом магазине электроники продается решение «сохранения видеокассеты в файл». Уверен, что можно что-то такое приспособить при желании.

VIT ★★
()
Ответ на: комментарий от VIT

Мне кажется ТС намеренно использует слово «универсальный» чтобы показать, что ищет решение независимо от сайта.

И на этот запрос я ответил первым же словом в первом же сообщении темы.

Способ с экранкой действительно универсальный, но идиотский. И это не способ сохранения, это способ записи.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от praseodim

Думаю так же как с другими плеерами: подменой вот этой функции https://developer.mozilla.org/en-US/docs/Web/API/SourceBuffer/appendBuffer на свою реализацию, которая всё присылаемое, кроме передачи в настоящий appendBuffer(), ещё куда-то зеркалит. Насколько я знаю, это (SourceBuffer) единственный способ проигрывания в браузере видео, у которого нет конкретного (скачиваемого) урла для какого-нить mp4 или подобного, так что мимо него они никак не пройдут.

firkax ★★★★★
()
Ответ на: комментарий от CrX

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

VIT ★★
()
Ответ на: комментарий от CrX

Какую функцию? Телемоста этого? Или сохранения только?

Сохранения.

Ну как вариант, просто сохранять по 30 минут в хромиуме, если совсем лень ковыряться — почему бы нет?

Не получится. После нажатия кнопки записи через 30 минут происходит сохранение, потом кнопки нет.

Сохраняется не из буфера браузера/кэша/etc, а это прямо api у сайта, видеофайл с записью телемоста скачивается с самого яндекса.

Возможно вообще только юзерагентом.

Не пробовал, но говорят глючит если юзерагент поменять.

praseodim ★★★★★
()
Ответ на: комментарий от firkax

Думаю так же как с другими плеерами: подменой вот этой функции https://developer.mozilla.org/en-US/docs/Web/API/SourceBuffer/appendBuffer на свою реализацию, которая всё присылаемое, кроме передачи в настоящий appendBuffer(), ещё куда-то зеркалит.

Хм, а готовых плагинов/сборок неужели нет? Фича вроде как востребованная.

praseodim ★★★★★
()
Ответ на: комментарий от EAT_INSIDE

Я имел в виду за исключением DRM (widevine). Что-то давно на него не натыкался. У меня почему-то просят (точнее firefox просит) его включить сайты, где нет никакого подобного контента.

Wapieth ★★
() автор топика
Ответ на: комментарий от praseodim

Зачем плагины? Открываешь js-консоль, пишешь туда

SourceBuffer.prototype.origAppendBuffer = SourceBuffer.prototype.appendBuffer;
SourceBuffer.prototype.appendBuffer = function (data) { save_to_sniffer(data) /* тут отправляем этот блоб куда-нить например ajax-ом */; this.origAppendBuffer(data); } 
Текст этого «патча» можно заранее где-то приготовить и просто копипастить в консоль. Единственное небольшое неудобство - если плеер запустится раньше чем это сделано, часть видео он может успеть загрузить мимо этого сниффера. Ну, можно что-нить предпринять чтобы страница не грузилась слишком быстро, или вставить этот js каким-нить аддоном на кастомные js.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 3)
Ответ на: комментарий от firkax

Вот пример сниффера который никуда не шлёт а просто сохраняет в js-переменных (это жрёт оперативную память браузера).

window.clog = [];

SourceBuffer.prototype.appendBuffer = function (data) { window.clog.push({ t: Date.now(), b: this, d: data}); this.origAppendBuffer(data); } 
Потом можно смотреть содержимое window.clog и там будет история всех вставок.

firkax ★★★★★
()
Ответ на: комментарий от Wapieth

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

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Можно же тупо записать весь отправляемый на звуковую карту звук. Можно записать то, что показано на экране. Теоретически же можно записать звук только с конкретного источника конкретной вкладки браузера и видео без масштабирования. Есть ли инструменты для этого дела?

OBS Studio.

Но результат будет хуже любого другого метода.

Если есть возможность — лучше сохранять средствами браузера. Или брать из кеша. Или смотреть запросы в консоли и повторять их curl-ом или скриптом. Или более сложными средствами отладки (как Selenium). Если последнее сильно усложняют, становится нужен yt-dlp.

question4 ★★★★★
()
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от anonymous

— Есть ли универсальный способ сделать скриншот, чтоб работало и в Wayland и в Xorg и в фреймбуфере mpv из ядерной консоли.
— Возьми Polaroid и сфоткай экран.

Вот примерно так эти советы выглядят. Да, этот способ универсальный, но это не скриншот в случае с фотиком, и не сохранение видео с сайта в случае с записью экрана. А если ему ещё и песни надо, то качество звука, которое там и без того небось что-нибудь вроде mp3@192kbps было, уйдёт в нулину (ну или он будет писать в лосслесс, тратя огромную кучу места без толку).

Как самый крайний вариант, когда совсем ничего больше не работает, конечно, можно и так, но всерьёз рассматривать это, не попробовав сделать нормально — это финиш. Тем более, что в подавляющем большинстве случаев разобраться, как сохранить нормально, не так уж сложно. Хотя и придётся для каждого сайта (не запиленного уже в том же yt-dlp, orpheus-dl и прочих) это делать отдельно.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)

Открываешь консоль разработчика на вкладке Network, запускаешь воспроизведение и находишь там свой видеофайл и жмёшь Save as. Если повезёт. Если не повезёт, там будет не один видеофайл, а много, но тогда надо искать m3u со списком всех секций и качать уже его.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

«Список секций» не обязательно в m3u8. Он ещё может быть в формате mpd - из стандартных. А ещё может быть в любом нестандартном т.к. парсится он джаваскриптами а их можно написать любые. Исключение только яблоустройства, там современные медиапотоки до сих пор не поддерживаются, зато есть захардкоденная в браузерах поддержка m3u8.

firkax ★★★★★
()
Ответ на: комментарий от anonymous

Ссыкотно, чет, такое ставить. Безопасно? Оно ж там требует доступ ко всему, чему можно..

Требуемые разрешения:
Блокировка содержимого на любой странице
Скачивать файлы, а также читать и изменять историю скачиваний браузера
Показывать вам уведомления
Получать доступ ко вкладкам браузера
Получать доступ к активности браузера при навигации
Получать доступ к вашим данных на сайтах в youtube.com домене
Получать доступ к вашим данных на сайтах в vimeo.com домене
Получать доступ к вашим данных на сайтах в facebook.com домене
Получать доступ к вашим данных на сайтах в instagram.com домене
Получать доступ к вашим данных на сайтах в ok.ru домене
Получать доступ к вашим данных на сайтах в m.ok.ru домене
Получать доступ к вашим данных на сайтах в canva.com домене
Получать доступ к вашим данных на сайтах в iq.com домене
Получать доступ к вашим данных на сайтах в twitcasting.tv домене
Получать доступ к вашим данных на vk.com
Получать доступ к вашим данных на vk.ru
Получать доступ к вашим данных на vkvideo.ru
Получать доступ к вашим данных на live.vkvideo.ru
Получать доступ к вашим данных на v10.downloadhelper.net
Получать доступ к вашим данных на app.v10.downloadhelper.net

Jeronimo ★★★
()
Ответ на: комментарий от KivApple

Открываешь консоль разработчика на вкладке Network, запускаешь воспроизведение и находишь там свой видеофайл и жмёшь Save as. Если повезёт. Если не повезёт, там будет не один видеофайл, а много, но тогда надо искать m3u со списком всех секций и качать уже его.

В Chrome и Firefox можно из этой консоли скопировать готовую команду для curl-а, со всеми необходимыми хедерами и куками. Обычно я ею скачиваю m3u8, и затем ею же все перечисленные в нём части, меняя в команде только URL.

question4 ★★★★★
()
Ответ на: комментарий от question4

Мысль для размышления, вот льешь 1080, а потом автовыбор битрейта ставит 480: «в глазах на минуту blur» и уже «на глаз» видно, что 1080 стало 480 и обратно. Да, декодирование на клиенте есть, но очевидно что потовое вещание ауди и видео не зря режут на кусочки,- какие-то вещи больше js-разрабы подскажут.

anonymous
()

Можно же тупо записать весь отправляемый на звуковую карту звук. Можно записать то, что показано на экране.

«Универсальный» в таком случае - запись с экрана :)

А так, сколько сайтов столько и особенностей же. Как таблетку от всего попросил сейчас)

frunobulax ★★★★
()

Сайты не используют универсальный способ представления аудио и видео –> для сайтов нет универсального спобова сохранения аудио и видео.

Логично же.

Нужно дорабатывать какой-то браузер для этого - минимум.

Bfgeshka ★★★★★
()
Ответ на: комментарий от anonymous

Я полагаю, что это делают для удобного seek (в файле со списком сегментов у каждого есть временная метка), а ещё чтобы лимитировать нагрузку на сервер. Один файл браузер вытянет до конца на той скорости, которую канал позволяет, а сегментрированный файл позволяет буфферизовать только N следующих сегментов (при этом для юзера это наоборот невыгодно, так как на плохом канале не получится поставить видео на паузу и дождаться полной загрузки, чтобы потом смотреть без пауз - загрузка остановится в какой-то момент и не дойдёт до конца). В подтверждение этого я замечал, что длинные видео чаще сегментированные, чем короткие.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от KivApple

Временные метки, достаточные для быстрого seek, есть и в длинных монолитных файлах, но в вебе как всегда костыль на костыле, и без этой сегментированности они и правда ими пользоваться нормально не умеют.

firkax ★★★★★
()
Ответ на: комментарий от KivApple

В mp4 они есть. «Файл должен быть завершённым» это что? Плеер сам может выбирать какое его место скачивать, и даже если кто-то сделал наобум файл с метаданными в конце - плееру никто не мешает http range запросом этот самый конец прочитать.

Но, повторю, в вебе всегда всё на костылях, нормально они (что авторы сайтов, что авторы js-блобов, что авторы браузеров) делать не в состоянии.

Что касается стриминга, то его очевидно в «просто mp4» не засунуть т.к. «просто mp4» предполагает фиксированный файл, а в стриминге постоянно добавляются новый данные. Но необходимость дополнительных штук для стриминга никак не отменяет того, что обычные видео могли бы быть в обычном mp4.

firkax ★★★★★
()
Ответ на: комментарий от frunobulax

Ну хотя бы можно сделать «таблетку от всего» для записи звука. Чтобы записывался звук только с отдельной вкладки, а не всё, что воспроизводит компьютер.

Wapieth ★★
() автор топика
Ответ на: комментарий от firkax

seek в видеофайлах работает за счёт индекса, который даёт опорные точки какие таймстемпы какому смещению в потоке соответствуют (ведь разные кадры имеют разный размер смотря как их получилось сжать). Чтобы индекс построить нужно иметь все кадры от первого до последнего. У кодеков есть специальный этап «финализация файла», когда этот самый индекс строится. Очень наглядно проявляется в том, что если некорректно завершить кодировщик, то получается битый файл, который некоторые плееры всё равно могут воспроизвести, но прокрутка работать не будет.

Так вот. Если у нас какой-нибудь стриминг, то файл by design не финализирован, потому что на момент отдачи неизвестны все его кадры. И разбиение на чанки позволит реализовать прокрутку в таком видео (разумеется, нужен будет какой-нибудь API для регулярного обновления списка чанков).

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Чтобы индекс построить нужно иметь все кадры от первого до последнего. У кодеков есть специальный этап «финализация файла»

Нет, не нужно. Это всё последствия кодинга в стиле «наберём готовых компонент и как-нить слепим».

Или если ты про постройку индекса на сервере то да, его обычно делают после того как видеопоток готов, но этот аспект никак на работу клиентского плеера (кроме стриминга) не влияет.

А про стриминг я уже написал, что для него и правда надо дополнительное что-то, там эти m3u8 оправданы, впрочем, традиционно, m3u8 сделан макисимально тупо и приводит к оведхедам, а более новый mpd просто наркоманский в дурацком xml с кучей мусорных тегов.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

А что там DеRьM-ом ещё не помазали разве браузеры? Вроде как да и судя по тому куда идёт Windows и вместе с ним вся айтишечка DеRьM-ом будут мазать поверх TPM, что будет совсем беда-печаль, тогда только экранки помогут и прочий захват видеопотока с экрана монитора. Но это очень неприятно, там тоже нынче сигнал шифруется.

anonymous
()
Ответ на: комментарий от anonymous

Мысль для размышления, вот льешь 1080, а потом автовыбор битрейта ставит 480: «в глазах на минуту blur» и уже «на глаз» видно, что 1080 стало 480 и обратно. Да, декодирование на клиенте есть, но очевидно что потовое вещание ауди и видео не зря режут на кусочки,- какие-то вещи больше js-разрабы подскажут.

И что? Обычно есть общий главный m3u8 на все битрейты, в нём перечислены m3u8 на каждый битрейт, и надо выбирать нужный и качать ts из него.

С передачей Соловьёва год или два назад столкнулся с проблемой, что для некоторых битрейтов некоторые ts отсутствовали — ошибка 404. yt-dlp справлялся, заменяя их кусками с более низким битрейтом. VLC нормально проигрывал.

question4 ★★★★★
()
Последнее исправление: question4 (всего исправлений: 1)