1
0
mirror of https://github.com/l1ving/youtube-dl synced 2025-03-12 23:07:29 +08:00

[ceskatelevize] Support for live video streams of the 2017 IIHF World Ice Hockey Championship

To get the streams use URL http://mshokej.ceskatelevize.cz.

  NOTE: This is without tests (so far), because I don't know how to
  make tests of something that changes in the course of hours.
This commit is contained in:
Jiri Palecek 2017-05-05 22:28:39 +02:00
parent 3faf928475
commit e8222af8cd

View File

@ -25,7 +25,7 @@ from ..utils import (
class CeskaTelevizeIE(InfoExtractor): class CeskaTelevizeIE(InfoExtractor):
_VALID_URL = r'https?://(?:(?:www\.)?ceskatelevize\.cz/ivysilani/|mshokej\.ceskatelevize\.cz/)(?:[^/?#&]+/)*(?P<id>[^/#?]+)' _VALID_URL = r'https?://(?:(?:www\.)?ceskatelevize\.cz/ivysilani/|mshokej\.ceskatelevize\.cz/)(?:[^/?#&]+/)*(?P<id>[^/#?]+)|https?://mshokej\.ceskatelevize\.cz/'
_TESTS = [{ _TESTS = [{
'url': 'http://www.ceskatelevize.cz/ivysilani/ivysilani/10441294653-hyde-park-civilizace/214411058091220', 'url': 'http://www.ceskatelevize.cz/ivysilani/ivysilani/10441294653-hyde-park-civilizace/214411058091220',
'info_dict': { 'info_dict': {
@ -129,19 +129,19 @@ class CeskaTelevizeIE(InfoExtractor):
is_mshokej = re.match(r'^https?://mshokej\..*', url) is_mshokej = re.match(r'^https?://mshokej\..*', url)
if is_mshokej: if is_mshokej:
ids = [unescapeHTML(m.group('id')) for m in re.finditer(r'<(?:[^>]*?\b(?:class=["\'](?P<class>[^"\']*)["\']|data-(?:videoarchive_autoplay|id)=["\'](?P<id>[^"\']*)["\']|data-type=["\'](?P<dataType>[^"\']*)["\']))*', webpage) ids = [(unescapeHTML(m.group('id')), "broadcast" in m.group('class')) for m in re.finditer(r'<(?:[^>]*?\b(?:class=["\'](?P<class>[^"\']*)["\']|data-(?:videoarchive_autoplay|id|live_channel)=["\'](?P<id>[^"\']*)["\']|data-type=["\'](?P<dataType>[^"\']*)["\']))*', webpage)
if ((m.group('dataType') and m.group('dataType') == 'media') or if ((m.group('dataType') and m.group('dataType') == 'media') or
m.group('class') and "video-archive__video" in m.group('class')) and m.group('class') and re.search(r'\b(?:video-archive__video|broadcast)\b', m.group('class'))) and
m.group('id') m.group('id')
] ]
o = set() o = set()
for id in ids: for id, is_broadcast in ids:
if id not in o: if id not in o:
data.append({ data.append({
'playlist[0][type]': 'ct24', 'playlist[0][type]': 'ct24',
'playlist[0][id]': id, 'playlist[0][id]': id,
'requestUrl': url, 'requestUrl': url,
'requestSource': 'sport', 'requestSource': 'sport' if not is_broadcast else 'mshokej-live',
'type': 'dash' 'type': 'dash'
}) })
o.add(id) o.add(id)
@ -176,12 +176,20 @@ class CeskaTelevizeIE(InfoExtractor):
for data in data: for data in data:
for user_agent in (None, USER_AGENTS['Safari']): for user_agent in (None, USER_AGENTS['Safari']):
req = None
if data['requestSource'] == 'mshokej-live':
req = sanitized_Request(
'http://playlist.ceskatelevize.cz/get-live-playlist/flash/%s' % data['playlist[0][id]']
)
else:
req = sanitized_Request( req = sanitized_Request(
'http://mshokej.ceskatelevize.cz/get-client-playlist' if is_mshokej else 'http://mshokej.ceskatelevize.cz/get-client-playlist' if is_mshokej else
'http://www.ceskatelevize.cz/ivysilani/ajax/get-client-playlist', 'http://www.ceskatelevize.cz/ivysilani/ajax/get-client-playlist',
data=urlencode_postdata(data)) data=urlencode_postdata(data))
req.add_header('Content-type', 'application/x-www-form-urlencoded') req.add_header('Content-type', 'application/x-www-form-urlencoded')
req.add_header('x-addr', '127.0.0.1') req.add_header('x-addr', '127.0.0.1')
req.add_header('X-Requested-With', 'XMLHttpRequest') req.add_header('X-Requested-With', 'XMLHttpRequest')
if user_agent: if user_agent:
@ -193,6 +201,11 @@ class CeskaTelevizeIE(InfoExtractor):
if not playlistpage: if not playlistpage:
continue continue
playlist = None
playlist_title = None
playlist_description = None
if playlistpage.get('url'):
playlist_url = playlistpage['url'] playlist_url = playlistpage['url']
if playlist_url == 'error_region': if playlist_url == 'error_region':
raise ExtractorError(NOT_AVAILABLE_STRING, expected=True) raise ExtractorError(NOT_AVAILABLE_STRING, expected=True)
@ -204,9 +217,15 @@ class CeskaTelevizeIE(InfoExtractor):
playlist_description = self._og_search_description(webpage, default=None) playlist_description = self._og_search_description(webpage, default=None)
playlist = self._download_json(req, playlist_id, fatal=False) playlist = self._download_json(req, playlist_id, fatal=False)
else:
playlist = playlistpage
if not playlist: if not playlist:
continue continue
playlist_title = playlist_title or playlist.get('setup').get('title')
playlist_description = playlist_description or playlist.get('setup').get('description')
playlist = playlist.get('playlist') playlist = playlist.get('playlist')
if not isinstance(playlist, list): if not isinstance(playlist, list):
continue continue