[youtube] Fix extraction.
[youtube-dl] / youtube_dl / extractor / meta.py
index 2ca7092e5199211a944e2b2f87b0c07f47364003..cdb46e163b07d432b69a3cb3a32e2e365dbadfcb 100644 (file)
@@ -2,6 +2,7 @@
 from __future__ import unicode_literals
 
 from .common import InfoExtractor
+from .pladform import PladformIE
 from ..utils import (
     unescapeHTML,
     int_or_none,
@@ -27,33 +28,46 @@ class METAIE(InfoExtractor):
     }, {
         'url': 'http://video.meta.ua/iframe/5502115',
         'only_matching': True,
+    }, {
+        # pladform embed
+        'url': 'http://video.meta.ua/7121015.video',
+        'only_matching': True,
     }]
 
     def _real_extract(self, url):
         video_id = self._match_id(url)
         webpage = self._download_webpage(url, video_id)
 
-        st_html5 = self._search_regex(r"st_html5\s*=\s*'#([^']+)'", webpage, 'uppod html5 st')
-        json_str = ''
-        for i in range(0, len(st_html5), 3):
-            json_str += '&#x0%s;' % st_html5[i:i + 3]
-        uppod_data = self._parse_json(unescapeHTML(json_str), video_id)
-        error = uppod_data.get('customnotfound')
-        if error:
-            raise ExtractorError('%s said: %s' % (self.IE_NAME, error), expected=True)
-
-        video_url = uppod_data['file']
-        info = {
-            'id': video_id,
-            'url': video_url,
-            'title': uppod_data.get('comment') or self._og_search_title(webpage),
-            'description': self._og_search_description(webpage),
-            'thumbnail': uppod_data.get('poster') or self._og_search_thumbnail(webpage),
-            'duration': int_or_none(self._og_search_property('video:duration', webpage)),
-        }
-        if 'youtube.com/' in video_url:
-            info.update({
-                '_type': 'url_transparent',
-                'ie_key': 'Youtube',
-            })
-        return info
+        st_html5 = self._search_regex(
+            r"st_html5\s*=\s*'#([^']+)'", webpage, 'uppod html5 st', default=None)
+
+        if st_html5:
+            # uppod st decryption algorithm is reverse engineered from function un(s) at uppod.js
+            json_str = ''
+            for i in range(0, len(st_html5), 3):
+                json_str += '&#x0%s;' % st_html5[i:i + 3]
+            uppod_data = self._parse_json(unescapeHTML(json_str), video_id)
+            error = uppod_data.get('customnotfound')
+            if error:
+                raise ExtractorError('%s said: %s' % (self.IE_NAME, error), expected=True)
+
+            video_url = uppod_data['file']
+            info = {
+                'id': video_id,
+                'url': video_url,
+                'title': uppod_data.get('comment') or self._og_search_title(webpage),
+                'description': self._og_search_description(webpage, default=None),
+                'thumbnail': uppod_data.get('poster') or self._og_search_thumbnail(webpage),
+                'duration': int_or_none(self._og_search_property(
+                    'video:duration', webpage, default=None)),
+            }
+            if 'youtube.com/' in video_url:
+                info.update({
+                    '_type': 'url_transparent',
+                    'ie_key': 'Youtube',
+                })
+            return info
+
+        pladform_url = PladformIE._extract_url(webpage)
+        if pladform_url:
+            return self.url_result(pladform_url)