[vine:user] Improve extraction (closes #16190)
authorSergey M․ <dstftw@gmail.com>
Sun, 15 Apr 2018 15:43:25 +0000 (22:43 +0700)
committerSergey M․ <dstftw@gmail.com>
Sun, 15 Apr 2018 15:46:43 +0000 (22:46 +0700)
youtube_dl/extractor/vine.py

index 08ddffa66e0df85f34a0b4119cb95173210eee07..80b896b5638ce5c7835c3a5ec8ab687cacc61ae0 100644 (file)
@@ -4,6 +4,7 @@ from __future__ import unicode_literals
 import re
 
 from .common import InfoExtractor
+from ..compat import compat_str
 from ..utils import (
     determine_ext,
     int_or_none,
@@ -111,21 +112,24 @@ class VineIE(InfoExtractor):
 
 class VineUserIE(InfoExtractor):
     IE_NAME = 'vine:user'
-    _VALID_URL = r'(?:https?://)?vine\.co/(?P<u>u/)?(?P<user>[^/]+)/?(\?.*)?$'
+    _VALID_URL = r'https?://vine\.co/(?P<u>u/)?(?P<user>[^/]+)'
     _VINE_BASE_URL = 'https://vine.co/'
-    _TESTS = [
-        {
-            'url': 'https://vine.co/itsruthb',
-            'info_dict': {
-                'id': 'itsruthb',
-            },
-            'playlist_mincount': 611,
-        },
-        {
-            'url': 'https://vine.co/u/942914934646415360',
-            'only_matching': True,
+    _TESTS = [{
+        'url': 'https://vine.co/itsruthb',
+        'info_dict': {
+            'id': 'itsruthb',
+            'title': 'Ruth B',
+            'description': '| Instagram/Twitter: itsruthb | still a lost boy from neverland',
         },
-    ]
+        'playlist_mincount': 611,
+    }, {
+        'url': 'https://vine.co/u/942914934646415360',
+        'only_matching': True,
+    }]
+
+    @classmethod
+    def suitable(cls, url):
+        return False if VineIE.suitable(url) else super(VineUserIE, cls).suitable(url)
 
     def _real_extract(self, url):
         mobj = re.match(self._VALID_URL, url)
@@ -137,11 +141,14 @@ class VineUserIE(InfoExtractor):
         profile_data = self._download_json(
             profile_url, user, note='Downloading user profile data')
 
-        user_id = profile_data['data']['userId']
-        user_archive = self._download_json(
+        data = profile_data['data']
+        user_id = data.get('userId') or data['userIdStr']
+        profile = self._download_json(
             'https://archive.vine.co/profiles/%s.json' % user_id, user_id)
-        posts = user_archive['posts']
         entries = [
-            self.url_result('https://vine.co/v/%s' % post_id, 'Vine')
-            for post_id in posts]
-        return self.playlist_result(entries, user)
+            self.url_result(
+                'https://vine.co/v/%s' % post_id, ie='Vine', video_id=post_id)
+            for post_id in profile['posts']
+            if post_id and isinstance(post_id, compat_str)]
+        return self.playlist_result(
+            entries, user, profile.get('username'), profile.get('description'))