Скачивание фрагментов видео по ссылкам m3u8

Я пытался изучить веб-скрапинг с помощью python и сейчас практикуюсь, загружая эпизоды определенного кулинарного шоу (выпечка Анны Олсон - http://www.foodnetwork.ca/shows/bake-with-anna-olson/episode-guide/), который транслируется с их сайта. . Глядя на сетевой трафик Firebug, я обнаружил, что каждый эпизод загружается небольшими сегментами и начинается с файла m3u8. Я написал некоторый код для загрузки файлов m3u8, затем открывал каждый из них как текстовый файл, открывал и сохранял каждый сегмент в файл mp4. После этого я получил полноразмерные видеофайлы (~ 144 МБ), но когда я их открываю, они не воспроизводятся, хотя плеер говорит, что у них есть продолжительность.

Вот часть кода, которая открывает каждый текстовый файл, загружает URL-адреса из файла и сохраняет их в файл mp4 с тем же именем.

import requests
import os
from os.path import isfile, join

folder = r"C:\food\videos\Bake"
files=[f for f in os.listdir(folder) if isfile(join(folder,f))]

for episode in files:
    fepisode = open(join(folder,episode), 'r')
    urls =  [link for link in fepisode.readlines() if link.startswith("http:")]
    video_file = open(join(folder,episode.replace("txt","mp4")), "wb")
    for url in urls:
        video_link = requests.get(url)
        if video_link.status_code ==200:
            for chunk in video_link.iter_content(100):
                video_file.write(chunk)
    video_file.close()

Вот пример ссылки на один из файлов m3u8:

http://foodnetwork-vh.akamaihd.net/i/501/859/FOOD_BakeWithAnna_E201b_,средний,самыйвысокий,высокий,низкий,самыйнизкий,_16x9.mp4.csmil/index_2_av.m3u8?null=

Я пытаюсь понять, чего не хватает для воспроизведения видео. Спасибо


person Amos    schedule 16.11.2015    source источник
comment
сегменты - это не mp4, это ts.   -  person szatmary    schedule 17.11.2015
comment
Я знаю. Сначала я пытался сохранить все это как .ts, но это не имело значения.   -  person Amos    schedule 17.11.2015


Ответы (1)


Вы пробовали requests.get(url, stream=True) ?

Также попробуйте:

for chunk in video_link.iter_content(chunk_size=100): 
    if chunk: # filter out keep-alive new chunks
        video_file.write(chunk)
video_file.close()
person Andrés Pérez-Albela H.    schedule 16.11.2015
comment
Да, я пробовал это раньше, но не нашел, что это имеет значение. Может потому что сегменты такие маленькие? - person Amos; 16.11.2015
comment
@ Амос, я обновил свой ответ. Пожалуйста, проверьте и посмотрите, работает ли это. - person Andrés Pérez-Albela H.; 16.11.2015
comment
Спасибо, но все равно выдает ту же проблему. Я не уверен, что понимаю, что должен ловить оператор if. Если video_link повторяется, не должен ли цикл for просто заканчиваться в конце итерации и не давать пустой фрагмент? - person Amos; 16.11.2015
comment
@Amos Прочтите закомментированную строку - person Andrés Pérez-Albela H.; 16.11.2015
comment
Я сделал. Я хотел спросить, что такое блоки поддержки активности и почему они могут вызывать проблемы? - person Amos; 16.11.2015