Скачиваем видео с новостного сайта

  [fishshell],  [lifehacks],  [linux],  [shell]

Шаг 1. Осматриваемся

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

player.src([{"src":"https:\/\/video.inmedis.ru\/hls\/361559_c2f7a1dc0385e4be41ae95c74c990428\/master.m3u8","type":"application\/x-mpegURL"}]);

Посмотрел содержимое этого файла master.m3u8:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=4527940,RESOLUTION=1920x1080,FRAME-RATE=25.000,CODECS="avc1.640028,mp4a.40.2"
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/index-f1-v1-a1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2061917,RESOLUTION=1280x720,FRAME-RATE=25.000,CODECS="avc1.64001f,mp4a.40.2"
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/index-f2-v1-a1.m3u8

#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=164722,RESOLUTION=1920x1080,CODECS="avc1.640028",URI="http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/iframes-f1-v1-a1.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=101294,RESOLUTION=1280x720,CODECS="avc1.64001f",URI="http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/iframes-f2-v1-a1.m3u8"

Затем содержимое этого файла index-f1-v1-a1.m3u8:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:YES
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-1-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-2-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-3-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-4-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-5-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-6-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-7-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-8-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-9-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-10-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-11-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-12-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-13-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-14-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-15-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-16-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-17-f1-v1-a1.ts
#EXTINF:10.000,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-18-f1-v1-a1.ts
#EXTINF:7.093,
http://video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-19-f1-v1-a1.ts
#EXT-X-ENDLIST

Шаг 2. Скачиваем фрагменты

Скачал все файлики в текущую папку с именами содержащими лишь номер файла, одной командой для FishShell:

for n in (seq 19)
    http -o $n.ts -d video.inmedis.ru/hls/361559_c2f7a1dc0385e4be41ae95c74c990428/seg-$n-f1-v1-a1.ts
end

Шаг 3. Склеиваем фрагменты в один файл

Создал файл frames.txt со списком этих файлов в формате удобном для ffmpeg:

for x in (seq 19)
    echo file \'$x.ts\' >> frames.txt
end

И наконец склеил все скачаные фрагменты в один файл news.ts:

ffmpeg -f concat -safe 0 -i frames.txt -c copy news.ts