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

Более того, оно проигрывается только с сайта в каком-то кривом плеере, его невозможно перевести на телевизор (airplay/chromecast), да еще и с сайта пропадает через месяц. Встречаются случаи, когда видео недоступно через пару суток после начала просмотра.

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

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

Итак, запустив режим разработчика в браузере мы видим, что плеер по очереди играет видео из плейлиста, при этом каждое видео размером ровно в 10 секунд.

HLS такой HLS

Собственно это HLS:

HLS (HTTP Live Streaming) — коммуникационный протокол для потоковой передачи медиа на основе HTTP, разработанный компанией Apple как часть программного обеспечения QuickTime, Safari, OS X и iOS. В основе работы лежит принцип разбиения цельного потока на небольшие фрагменты, последовательно скачиваемые по HTTP. Поток непрерывен и теоретически может быть бесконечным. В начале сессии скачивается плей-лист в формате M3U, содержащий метаданные об имеющихся вложенных потоках.

HLS также предоставляет стандартный механизм шифрования с использованием AES и метод безопасной доставки ключей по HTTPS либо через авторизацию на устройстве, либо посредством HTTP cookie. Вместе это даёт возможность создавать простые системы DRM.

Существуют решения для скачивания HLS потока, но ни одно у меня не заработало по причине необходимости авторизации — та самая простая DRM. Поэтому я просто скачал все эти маленьние файлы и склеил в один большой. Так как их сотни, надо было автоматизировать процесс.

Ссылка на видеофайл имеет вид: https://video.icped.ru/proxy/HIDDEN/hls/index00000.ts и по мере проигрывания циферки на конце увеличиваются. Два часа видео соответствуют примерно 700 файлам, для ровного счёта пусть будет тысяча.

Создаём файл для wget со ссылками на наши файлы от 00000 до 01000 (как смог, — простите меня, гуру):

MBP:icped ptath$ touch urls
MBP:icped ptath$ for n in $(seq -w $(%05d) 01000); do echo https://video.icped.ru/proxy/HIDDEN/hls/index0$n.ts >> urls; done

Быстро-быстро смотрим в браузере куки (они устареваею примерно минут за 10 или даже меньше и их приходится подставлять заново).

Cookies

После этого скармливаем получившегося франкенштейна wget, указав наш список файлов. Всё в одну строчку, тут ключи разнесены по строкам для удобства, User-Agent и прочее взяты из браузера для правдоподобности:

wget --header="Host: video.icped.ru" 
--header="User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" 
--header="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
--header="Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"
--header="Cookie: 
    browser_has_html5_support=true;
    browser_has_local_storage_support=true;
    tutorials_popup_was_shown=0;
    login_form_email=HIDDEN;
    symfony=HIDDEN;
    _lk=HIDDEN;
    lang=ru"
--header="Connection: keep-alive"
-i urls -c

Wget начнет неторопливо и последовательно выкачивать все файлы с 00000 по 01000, после того как они закончатся довольно быстро завершится, ругаясь на ошибку 404. Если ошибка 503, то скорее всего слетели/истекли cookies, их надо поправить и запустить загрузку заново. Уже скачанные файлы останутся на месте, ничего не сломается.

Скачанные файлы легко объединить в один через ffmpeg. Создаем текстовый файл со списком скачанных видеофайлов для объединения:

MBP:icped ptath$ for n in $(seq -w $(%05d) 01000); do echo file index0$n.ts >> videolist; done

Объединяем:

MBP:icped ptath$ ffmpeg -f concat -i videolist -c copy fullvideo.ts

Процесс идёт на моём стареньком ноуте со скоростью около 200х, пару часов обрабатываются менее минуты.