+        return {
+            'id': video_id,
+            'title': data.get('description') or alt_title or 'Vine video',
+            'alt_title': alt_title,
+            'thumbnail': data.get('thumbnailUrl'),
+            'timestamp': unified_timestamp(data.get('created')),
+            'uploader': username,
+            'uploader_id': data.get('userIdStr'),
+            'view_count': int_or_none(data.get('loops')),
+            'like_count': int_or_none(data.get('likes')),
+            'comment_count': int_or_none(data.get('comments')),
+            'repost_count': int_or_none(data.get('reposts')),
+            'formats': formats,
+        }
+
+
+class VineUserIE(InfoExtractor):
+    IE_NAME = 'vine:user'
+    _VALID_URL = r'(?:https?://)?vine\.co/(?P<u>u/)?(?P<user>[^/]+)/?(\?.*)?$'
+    _VINE_BASE_URL = 'https://vine.co/'
+    _TESTS = [
+        {
+            'url': 'https://vine.co/Visa',
+            'info_dict': {
+                'id': 'Visa',
+            },
+            'playlist_mincount': 46,
+        },
+        {
+            'url': 'https://vine.co/u/941705360593584128',
+            'only_matching': True,
+        },
+    ]
+
+    def _real_extract(self, url):
+        mobj = re.match(self._VALID_URL, url)
+        user = mobj.group('user')
+        u = mobj.group('u')