- mobj = re.match(self._VALID_URL, url)
-
- display_id = mobj.group('display_id')
- webpage = self._download_webpage(url, display_id)
-
- video_id = mobj.group('video_id')
- if not video_id:
- video_id = self._html_search_regex(
- self._VIDEO_ID_REGEXES, webpage, 'video id')
-
- preload = None
- preloads = re.findall(r'"preload":\s*"([^"]+)"', webpage)
- if preloads:
- preload = max([(len(p), p) for p in preloads])[1]
-
- if not preload:
- preload = ''.join(re.findall(r'this\.push\("([^"]+)"\);', webpage))
-
- if not preload:
- preload = self._html_search_regex([
- r'player,\[?"([^"]+)"\]?', r'player.init\(\[?"([^"]+)"\]?\)'
- ], webpage.replace('","', ''), 'preload data', default=None)
-
- if not preload:
- raise ExtractorError(
- 'Preload information could not be extracted', expected=True)
-
- data = self._parse_json(
- base64.b64decode(preload.encode('ascii')).decode('utf-8'), video_id)
-
- formats = []
- get_quality = qualities(['500k', '480p', '1000k', '720p', '1080p'])
- for filed in data['files']:
- if filed['type'] == 'hls':
- formats.extend(self._extract_m3u8_formats(
- filed['url'], video_id, ext='mp4'))
- else:
- m_format = re.search(r'(\d+(k|p))\.mp4', filed['url'])
- if m_format is not None:
- format_id = m_format.group(1)
- else:
- format_id = filed['bitrate']
- tbr = (
- int(filed['bitrate'])
- if filed['bitrate'].isdigit()
- else None)
-
- formats.append({
- 'url': filed['url'],
- 'ext': 'mp4',
- 'tbr': tbr,
- 'format_id': format_id,
- 'quality': get_quality(format_id),
- })
-
- self._sort_formats(formats)
-
- return {
+ display_id = self._match_id(url)
+
+ response = self._graphql_call('''{
+ %%s(slug: "%%s") {
+ ... on RecordSlug {
+ record {
+ %s
+ }
+ }
+ ... on PageSlug {
+ child {
+ id
+ }
+ }
+ ... on NotFoundSlug {
+ status
+ }
+ }
+}''' % self._RECORD_TEMPL, 'Slug', display_id)
+ if response.get('status'):
+ raise ExtractorError('This video is no longer available.', expected=True)
+
+ child = response.get('child')
+ if child:
+ record = self._graphql_call('''{
+ %%s(id: "%%s") {
+ ... on Video {
+ %s
+ }
+ }
+}''' % self._RECORD_TEMPL, 'Record', child['id'])
+ else:
+ record = response['record']
+ video_id = record['id']
+
+ info = {