[letv] LetvCloud: guard against invalid URLs
[youtube-dl] / youtube_dl / extractor / letv.py
index c096cb1ab97d258e1cc5b9e8c2b649553c2217cb..b8d4f5bb8ca02482504a9d8eca0a188542f311a1 100644 (file)
@@ -272,23 +272,32 @@ class LetvCloudIE(InfoExtractor):
     }]
 
     def _real_extract(self, url):
-        uu = re.search('uu=([\w]+)', url).group(1)
-        vu = re.search('vu=([\w]+)', url).group(1)
+        uu_mobj = re.search('uu=([\w]+)', url)
+        vu_mobj = re.search('vu=([\w]+)', url)
+
+        if not uu_mobj or not vu_mobj:
+            raise ExtractorError('Invalid URL: %s' % url, expected=True)
+
+        uu = uu_mobj.group(1)
+        vu = vu_mobj.group(1)
         media_id = uu + '_' + vu
 
         play_json_req = sanitized_Request(
             'http://api.letvcloud.com/gpc.php?cf=html5&sign=signxxxxx&ver=2.2&format=json&' +
-            "uu=" + uu + "&vu=" + vu)
+            'uu=' + uu + '&vu=' + vu)
         play_json = self._download_json(play_json_req, media_id, 'Downloading playJson data')
 
-        formats = [{
-            'url': base64.b64decode(media['play_url']['main_url'].encode('utf-8')).decode("utf-8"),
-            'ext': 'mp4',
-            'format_id': int_or_none(media.get('play_url', {}).get('vtype')),
-            'format_note': str_or_none(media.get('play_url', {}).get('definition')),
-            'width': int_or_none(media.get('play_url', {}).get('vwidth')),
-            'height': int_or_none(media.get('play_url', {}).get('vheight')),
-        } for media in play_json['data']['video_info']['media'].values()]
+        formats = []
+        for media in play_json['data']['video_info']['media'].values():
+            play_url = media['play_url']
+            formats.append({
+                'url': base64.b64decode(play_url['main_url'].encode('utf-8')).decode('utf-8'),
+                'ext': 'mp4',
+                'format_id': int_or_none(play_url.get('vtype')),
+                'format_note': str_or_none(play_url.get('definition')),
+                'width': int_or_none(play_url.get('vwidth')),
+                'height': int_or_none(play_url.get('vheight')),
+            })
         self._sort_formats(formats)
 
         return {