[youtube] Fix extraction.
[youtube-dl] / youtube_dl / extractor / dumpert.py
index 52d07deac008cccbe769d3e23641410c48e8d112..d9d9afdecba0a996bbcf36cfe46bc604344bd117 100644 (file)
@@ -1,47 +1,80 @@
 # coding: utf-8
 from __future__ import unicode_literals
 
-import base64
-
 from .common import InfoExtractor
+from ..utils import (
+    int_or_none,
+    qualities,
+)
 
 
 class DumpertIE(InfoExtractor):
-    _VALID_URL = (r'https?://(?:www\.)?dumpert\.nl/mediabase/'
-                  r'(?P<id>[0-9]+/[0-9a-zA-Z]+)/?.*')
-    _TEST = {
-        'url': 'http://www.dumpert.nl/mediabase/6646981/951bc60f/',
+    _VALID_URL = r'(?P<protocol>https?)://(?:(?:www|legacy)\.)?dumpert\.nl/(?:mediabase|embed|item)/(?P<id>[0-9]+[/_][0-9a-zA-Z]+)'
+    _TESTS = [{
+        'url': 'https://www.dumpert.nl/item/6646981_951bc60f',
         'md5': '1b9318d7d5054e7dcb9dc7654f21d643',
         'info_dict': {
             'id': '6646981/951bc60f',
             'ext': 'mp4',
             'title': 'Ik heb nieuws voor je',
-            'description': 'Niet schrikken hoor'
+            'description': 'Niet schrikken hoor',
+            'thumbnail': r're:^https?://.*\.jpg$',
         }
-    }
+    }, {
+        'url': 'https://www.dumpert.nl/embed/6675421_dc440fe7',
+        'only_matching': True,
+    }, {
+        'url': 'http://legacy.dumpert.nl/mediabase/6646981/951bc60f',
+        'only_matching': True,
+    }, {
+        'url': 'http://legacy.dumpert.nl/embed/6675421/dc440fe7',
+        'only_matching': True,
+    }]
 
     def _real_extract(self, url):
-        video_id = self._match_id(url)
-        webpage = self._download_webpage(url, video_id)
+        video_id = self._match_id(url).replace('_', '/')
+        item = self._download_json(
+            'http://api-live.dumpert.nl/mobile_api/json/info/' + video_id.replace('/', '_'),
+            video_id)['items'][0]
+        title = item['title']
+        media = next(m for m in item['media'] if m.get('mediatype') == 'VIDEO')
 
-        title = self._html_search_meta('title', webpage)
-        description = self._html_search_meta('description', webpage)
+        quality = qualities(['flv', 'mobile', 'tablet', '720p'])
+        formats = []
+        for variant in media.get('variants', []):
+            uri = variant.get('uri')
+            if not uri:
+                continue
+            version = variant.get('version')
+            formats.append({
+                'url': uri,
+                'format_id': version,
+                'quality': quality(version),
+            })
+        self._sort_formats(formats)
 
-        files_base64 = self._html_search_regex(r'data-files="(.*?)"',
-                                               webpage,
-                                               'files')
-        files_json = base64.b64decode(files_base64).decode('iso-8859-1')
-        files = self._parse_json(files_json, video_id)
+        thumbnails = []
+        stills = item.get('stills') or {}
+        for t in ('thumb', 'still'):
+            for s in ('', '-medium', '-large'):
+                still_id = t + s
+                still_url = stills.get(still_id)
+                if not still_url:
+                    continue
+                thumbnails.append({
+                    'id': still_id,
+                    'url': still_url,
+                })
 
-        format_names = ['flv', 'mobile', 'tablet', '720p']
-        formats = [{'format_id': name,
-                    'url': files[name].replace(r'\/', '/')}
-                   for name in format_names
-                   if name in files]
+        stats = item.get('stats') or {}
 
         return {
             'id': video_id,
             'title': title,
-            'description': description,
-            'formats': formats
+            'description': item.get('description'),
+            'thumbnails': thumbnails,
+            'formats': formats,
+            'duration': int_or_none(media.get('duration')),
+            'like_count': int_or_none(stats.get('kudos_total')),
+            'view_count': int_or_none(stats.get('views_total')),
         }