Есть ли способ получить контент HTTP Live Streaming (HLS) с помощью Firefox / Chrome?

#python #selenium #beautifulsoup #blob #http-live-streaming

#python #селен #beautifulsoup #большой двоичный объект #http-live-streaming

Вопрос:

Я очищаю источник видео с помощью Selenium и BeautifulSoup. Я хочу спросить, есть ли способ извлечь файл m3u8 (содержимое HLS), а не blob-файл, с помощью Firefox или Chrome?

Следующий код очистит источник видео в виде строки списка воспроизведения, используя веб-драйвер Selenium Safari.

 from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import urllib.request


def get_all_channels(base: str="https://www.telewebion.com/channels"):
    channels_url = urllib.request.urlopen(f"{base}")
    soup_channels_url = BeautifulSoup(channels_url, "lxml")

    # create a list of all channels
    all_channels_list = []
    for a in soup_channels_url.select('.no-featured a'):
        all_channels_list.append(a['href'])
        # all_channels_list.append(a['href'], a.get_text(strip=True))

    # return the list
    return all_channels_list


def get_video_src(url: str, base: str="https://www.telewebion.com"):
    channel_url = f"{base}{url}"

    wd = webdriver.Safari()
    # wd = webdriver.Chrome()
    # wd = webdriver.Firefox(executable_path='/usr/local/bin/geckodriver')

    wd.get(channel_url)
    WebDriverWait(wd, 6000).until(EC.visibility_of_element_located(
        (By.CLASS_NAME, "position-relative")))

    html_page = wd.page_source

    # Now use html_page
    soup = BeautifulSoup(html_page, "lxml")

    video = soup.find_all("video", class_="rmp-object-fit-contain")
    video_src = video[0]['src']

    wd.quit()

    return video_src

for channel in get_all_channels():
    print(get_video_src(channel))
  

Меня интересуют строки списка воспроизведения m3u8 (содержимое HLS), но это не масштабируемое решение, поскольку работает только при установленном Safari. Веб-драйверы Firefox / Chrome Selenium вместо этого возвращают строки больших двоичных объектов. Моя конечная цель — загрузить расширенный плейлист M3U (m3u8) (или любой другой тип видеопотока), а не фрагменты видеопотока, чтобы использовать его в качестве источника видео Kodi add-ons.

PS Источники видео являются динамическими и отображаются JavaScript для загрузки их содержимого; поэтому я использовал Selenium для вызова браузера.

Комментарии:

1. Я не ищу программное обеспечение / инструмент для загрузки и / или конвертации видео. Как я уже спрашивал, я хочу знать, есть ли способ получать файлы плейлистов, а не фрагменты, с помощью веб-драйвера firefox / chrome для Selenium.

Ответ №1:

Я не думаю, что вам нужно использовать selenium для получения списка каналов или ссылок на каналы.

ШАГИ: Вы можете использовать любой язык программирования по своему усмотрению.

  1. Get All channels:
Make a get request to this url to get all the channels.
https://wa1.telewebion.com/v2/channels/getChannels?logo_version=4amp;thumb_size=240

If you look at the response. "data" is an array of channel that has attribute called "descriptor" which gives us value of "channel_desc" for next request

 2. Get channel links:
Make a get request to using link below to get all links of channel from first request
https://wa1.telewebion.com/v2/channels/getChannelLinks?channel_desc=tv1amp;device=desktopamp;logo_version=4

The channel desc value "tv1" was received from first call.
On the response if you look at the links on data you will see all the m3u8 urls to for the tv1 channel. 

 3. Now you can use https://github.com/carlanton/m3u8-parser 
 to parse the m3u8 file to get the playlist urls or segment urls on the master or media manifests.
  

Вы можете прочитать о спецификации m3u8 здесь: https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-08

Комментарии:

1. Я не могу получить доступ к списку «данные», поскольку доступ к этому API запрещен (код: 403) для обоих URL-адресов. Кроме того, я использовал Selenium, чтобы иметь возможность очищать отображаемый контент javascript (файл m3u8) с помощью BeautifulSoup.

2. @AliAghelmaleki Это сработало для меня. Вот пример запроса curl -X GET 'https://wa1.telewebion.com/v2/channels/getChannels?logo_version=4amp;thumb_size=240' -H 'Origin: https://www.telewebion.com' -H 'Postman-Token: bf4cea3d-7ad5-43ac-8541-b2c8fb8f43b1' -H 'Referer: https://www.telewebion.com/channels' -H 'cache-control: no-cache' , в заголовки которого только что добавлены origin и referer

3. Да, вы были правы. Изначально я использовал наивный подход для выполнения запросов. Теперь я получил содержимое списка данных, но мой вопрос в том, где этот URL-адрес ‘ wa1.telewebion.com/v2/channels … «откуда пришел? И есть ли способ быть уверенным, что он будет стабильным?

4. @AliAghelmaleki — Похоже, что они используют конечную точку внутреннего API. Вы можете проверить сетевые вызовы вашего браузера. Я не думаю, что они будут менять его так часто. Гораздо стабильнее полагаться на элементы пользовательского интерфейса для получения значений с использованием selenium

5. @AliAghelmaleki — Пожалуйста, отметьте мой ответ как действительный, если он работает для вас. Спасибо