+        username = data.get('username')
+
+        alt_title = 'Vine by %s' % username if username else None
+
+        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/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)
+        user = mobj.group('user')
+        u = mobj.group('u')