- 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)
+ def _real_extract(self, url):
+ display_id = self._match_id(url)
+
+ response = self._graphql_call('''{
+ %s(slug: "video/%s") {
+ ... on RecordSlug {
+ record {
+ id
+ title
+ teaser
+ publishOn
+ thumb {
+ preview
+ }
+ tags {
+ name
+ }
+ duration
+ }
+ }
+ ... on NotFoundSlug {
+ status
+ }
+ }
+}''', 'Slug', display_id)
+ if response.get('status'):
+ raise ExtractorError('This video is no longer available.', expected=True)
+
+ record = response['record']
+ video_id = record['id']
+
+ srcs = self._graphql_call('''{
+ %s(id: "%s") {
+ src
+ }
+}''', 'RecordVideoSource', video_id)['src']