]>
jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/zype.py
2 from __future__
import unicode_literals
6 from .common
import InfoExtractor
7 from ..compat
import compat_HTTPError
17 class ZypeIE(InfoExtractor
):
18 _ID_RE
= r
'[\da-fA-F]+'
19 _COMMON_RE
= r
'//player\.zype\.com/embed/%s\.(?:js|json|html)\?.*?(?:access_token|(?:ap[ip]|player)_key)='
20 _VALID_URL
= r
'https?:%s[^&]+' % (_COMMON_RE
% ('(?P<id>%s)' % _ID_RE
))
22 'url': 'https://player.zype.com/embed/5b400b834b32992a310622b9.js?api_key=jZ9GUhRmxcPvX7M3SlfejB6Hle9jyHTdk2jVxG7wOHPLODgncEKVdPYBhuz9iWXQ&autoplay=false&controls=true&da=false',
23 'md5': 'eaee31d474c76a955bdaba02a505c595',
25 'id': '5b400b834b32992a310622b9',
27 'title': 'Smoky Barbecue Favorites',
28 'thumbnail': r
're:^https?://.*\.jpe?g',
29 'description': 'md5:5ff01e76316bd8d46508af26dc86023b',
30 'timestamp': 1504915200,
31 'upload_date': '20170909',
36 def _extract_urls(webpage
):
39 for mobj
in re
.finditer(
40 r
'<script[^>]+\bsrc=(["\'])(?P
<url
>(?
:https?
:)?
%s.+?
)\
1' % (ZypeIE._COMMON_RE % ZypeIE._ID_RE),
43 def _real_extract(self, url):
44 video_id = self._match_id(url)
47 response = self._download_json(re.sub(
48 r'\
.(?
:js|html
)\?', '.json?
', url), video_id)['response
']
49 except ExtractorError as e:
50 if isinstance(e.cause, compat_HTTPError) and e.cause.code in (400, 401, 403):
51 raise ExtractorError(self._parse_json(
52 e.cause.read().decode(), video_id)['message
'], expected=True)
55 body = response['body
']
56 video = response['video
']
57 title = video['title
']
61 if isinstance(body, dict):
63 for output in body.get('outputs
', []):
64 output_url = output.get('url
')
67 name = output.get('name
')
69 formats, subtitles = self._extract_m3u8_formats_and_subtitles(
70 output_url, video_id, 'mp4
',
71 'm3u8_native
', m3u8_id='hls
', fatal=False)
75 'tbr
': int_or_none(output.get('bitrate
')),
78 if name in ('m4a
', 'mp3
'):
82 'height
': int_or_none(output.get('height
')),
83 'width
': int_or_none(output.get('width
')),
86 text_tracks = body.get('subtitles
') or []
88 m3u8_url = self._search_regex(
89 r'(["\'])(?P<url>(?:(?!\1).)+\.m3u8(?:(?!\1).)*)\1',
90 body, 'm3u8 url', group='url', default=None)
92 source = self._search_regex(
93 r'(?s)sources\s*:\s*\[\s*({.+?})\s*\]', body, 'source')
96 return self._search_regex(
97 r'\b%s\s*:\s*([\'"])(?P
<val
>(?
:(?
!\
1).)+)\
1' % key,
98 source, key, group='val
')
100 if get_attr('integration
') == 'verizon
-media
':
101 m3u8_url = 'https
://content
.uplynk
.com
/%s.m3u8
' % get_attr('id')
102 formats, subtitles = self._extract_m3u8_formats_and_subtitles(
103 m3u8_url, video_id, 'mp4
', 'm3u8_native
', m3u8_id='hls
')
104 text_tracks = self._search_regex(
105 r'textTracks\s
*:\s
*(\
[[^
]]+\
])',
106 body, 'text tracks
', default=None)
108 text_tracks = self._parse_json(
109 text_tracks, video_id, js_to_json, False)
110 self._sort_formats(formats)
113 for text_track in text_tracks:
114 tt_url = dict_get(text_track, ('file', 'src
'))
117 subtitles.setdefault(text_track.get('label
') or 'English
', []).append({
122 for thumbnail in video.get('thumbnails
', []):
123 thumbnail_url = thumbnail.get('url
')
124 if not thumbnail_url:
127 'url
': thumbnail_url,
128 'width
': int_or_none(thumbnail.get('width
')),
129 'height
': int_or_none(thumbnail.get('height
')),
134 'display_id
': video.get('friendly_title
'),
136 'thumbnails
': thumbnails,
137 'description
': dict_get(video, ('description
', 'ott_description
', 'short_description
')),
138 'timestamp
': parse_iso8601(video.get('published_at
')),
139 'duration
': int_or_none(video.get('duration
')),
140 'view_count
': int_or_none(video.get('request_count
')),
141 'average_rating
': int_or_none(video.get('rating
')),
142 'season_number
': int_or_none(video.get('season
')),
143 'episode_number
': int_or_none(video.get('episode
')),
145 'subtitles
': subtitles,