[rockstargames] Improve and add Youtube fallback (Closes #9737)
authorSergey M․ <dstftw@gmail.com>
Mon, 13 Jun 2016 18:11:24 +0000 (01:11 +0700)
committerSergey M․ <dstftw@gmail.com>
Mon, 13 Jun 2016 18:11:24 +0000 (01:11 +0700)
youtube_dl/extractor/rockstargames.py

index 427ab153ae39f374b9c6fc68ead09e9f475ab2e8..48128e219bf468a1e3a01ec0f1116304ced1221d 100644 (file)
@@ -3,52 +3,67 @@ from __future__ import unicode_literals
 
 from .common import InfoExtractor
 from ..utils import (
-    qualities,
-    parse_iso8601
+    int_or_none,
+    parse_iso8601,
 )
 
 
 class RockstarGamesIE(InfoExtractor):
-    _VALID_URL = r'https?://(?:www\.)?rockstargames\.com/videos/video/(?P<id>[0-9]+)'
-    _TEST = {
+    _VALID_URL = r'https?://(?:www\.)?rockstargames\.com/videos(?:/video/|#?/?\?.*\bvideo=)(?P<id>\d+)'
+    _TESTS = [{
         'url': 'https://www.rockstargames.com/videos/video/11544/',
         'md5': '03b5caa6e357a4bd50e3143fc03e5733',
         'info_dict': {
             'id': '11544',
             'ext': 'mp4',
             'title': 'Further Adventures in Finance and Felony Trailer',
-            'thumbnail': 're:^https?://.*\.jpg$',
             'description': 'md5:6d31f55f30cb101b5476c4a379e324a3',
+            'thumbnail': 're:^https?://.*\.jpg$',
+            'timestamp': 1464876000,
             'upload_date': '20160602',
-            'timestamp': 1464876000
         }
-    }
+    }, {
+        'url': 'http://www.rockstargames.com/videos#/?video=48',
+        'only_matching': True,
+    }]
 
     def _real_extract(self, url):
         video_id = self._match_id(url)
-        json_data = self._download_json(
-            'https://www.rockstargames.com/videoplayer/videos/get-video.json?id=%s&locale=en_us' % video_id,
-            video_id
-        )['video']
 
-        formats = []
+        video = self._download_json(
+            'https://www.rockstargames.com/videoplayer/videos/get-video.json',
+            video_id, query={
+                'id': video_id,
+                'locale': 'en_us',
+            })['video']
+
+        title = video['title']
 
-        for video in json_data['files_processed']['video/mp4']:
+        formats = []
+        for video in video['files_processed']['video/mp4']:
             if not video.get('src'):
                 continue
-            height = video.get('resolution', '').replace('p', '')
-            
+            resolution = video.get('resolution')
+            height = int_or_none(self._search_regex(
+                r'^(\d+)[pP]$', resolution or '', 'height', default=None))
             formats.append({
                 'url': self._proto_relative_url(video['src']),
-                'height': int(height) if height.isdigit() else -1,
+                'format_id': resolution,
+                'height': height,
             })
+
+        if not formats:
+            youtube_id = video.get('youtube_id')
+            if youtube_id:
+                return self.url_result(youtube_id, 'Youtube')
+
         self._sort_formats(formats)
 
         return {
             'id': video_id,
-            'title': json_data['title'],
-            'description': json_data.get('description'),
+            'title': title,
+            'description': video.get('description'),
+            'thumbnail': self._proto_relative_url(video.get('screencap')),
+            'timestamp': parse_iso8601(video.get('created')),
             'formats': formats,
-            'thumbnail': self._proto_relative_url(json_data.get('screencap')),
-            'timestamp': parse_iso8601(json_data.get('created'))
         }