| 
									
										
										
										
											2014-01-31 14:17:21 +01:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-23 22:26:30 +02:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2014-02-23 19:01:15 +07:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2014-05-10 23:18:20 -04:00
										 |  |  | import itertools | 
					
						
							| 
									
										
										
										
											2013-06-23 22:26:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2014-02-23 19:01:15 +07:00
										 |  |  | from ..utils import unified_strdate | 
					
						
							| 
									
										
										
										
											2013-06-23 22:26:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class VineIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2014-01-31 14:17:21 +01:00
										 |  |  |     _VALID_URL = r'https?://(?:www\.)?vine\.co/v/(?P<id>\w+)' | 
					
						
							| 
									
										
										
										
											2013-06-27 20:46:46 +02:00
										 |  |  |     _TEST = { | 
					
						
							| 
									
										
										
										
											2014-01-31 14:17:21 +01:00
										 |  |  |         'url': 'https://vine.co/v/b9KOOWX7HUx', | 
					
						
							|  |  |  |         'md5': '2f36fed6235b16da96ce9b4dc890940d', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': 'b9KOOWX7HUx', | 
					
						
							|  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |             'title': 'Chicken.', | 
					
						
							| 
									
										
										
										
											2014-12-12 03:34:28 +01:00
										 |  |  |             'alt_title': 'Vine by Jack Dorsey', | 
					
						
							| 
									
										
										
										
											2014-02-23 19:01:15 +07:00
										 |  |  |             'description': 'Chicken.', | 
					
						
							|  |  |  |             'upload_date': '20130519', | 
					
						
							|  |  |  |             'uploader': 'Jack Dorsey', | 
					
						
							|  |  |  |             'uploader_id': '76', | 
					
						
							| 
									
										
										
										
											2014-01-31 14:17:21 +01:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2013-06-27 20:46:46 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-06-23 22:26:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2014-12-12 02:59:52 +01:00
										 |  |  |         video_id = self._match_id(url) | 
					
						
							| 
									
										
										
										
											2014-02-23 19:01:15 +07:00
										 |  |  |         webpage = self._download_webpage('https://vine.co/v/' + video_id, video_id) | 
					
						
							| 
									
										
										
										
											2013-06-23 22:26:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-23 19:01:15 +07:00
										 |  |  |         data = json.loads(self._html_search_regex( | 
					
						
							|  |  |  |             r'window\.POST_DATA = { %s: ({.+?}) }' % video_id, webpage, 'vine data')) | 
					
						
							| 
									
										
										
										
											2014-04-30 14:12:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-12 02:59:52 +01:00
										 |  |  |         formats = [{ | 
					
						
							|  |  |  |             'url': data['videoLowURL'], | 
					
						
							|  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |             'format_id': 'low', | 
					
						
							|  |  |  |         }, { | 
					
						
							|  |  |  |             'url': data['videoUrl'], | 
					
						
							|  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |             'format_id': 'standard', | 
					
						
							|  |  |  |         }] | 
					
						
							| 
									
										
										
										
											2013-06-23 22:26:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-31 14:17:21 +01:00
										 |  |  |         return { | 
					
						
							|  |  |  |             'id': video_id, | 
					
						
							|  |  |  |             'title': self._og_search_title(webpage), | 
					
						
							| 
									
										
										
										
											2014-12-12 03:34:28 +01:00
										 |  |  |             'alt_title': self._og_search_description(webpage), | 
					
						
							| 
									
										
										
										
											2014-02-23 19:01:15 +07:00
										 |  |  |             'description': data['description'], | 
					
						
							|  |  |  |             'thumbnail': data['thumbnailUrl'], | 
					
						
							|  |  |  |             'upload_date': unified_strdate(data['created']), | 
					
						
							|  |  |  |             'uploader': data['username'], | 
					
						
							|  |  |  |             'uploader_id': data['userIdStr'], | 
					
						
							|  |  |  |             'like_count': data['likes']['count'], | 
					
						
							|  |  |  |             'comment_count': data['comments']['count'], | 
					
						
							|  |  |  |             'repost_count': data['reposts']['count'], | 
					
						
							|  |  |  |             'formats': formats, | 
					
						
							| 
									
										
										
										
											2014-04-30 10:02:03 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2014-05-10 23:18:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-13 09:50:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-10 23:18:20 -04:00
										 |  |  | class VineUserIE(InfoExtractor): | 
					
						
							|  |  |  |     IE_NAME = 'vine:user' | 
					
						
							| 
									
										
										
										
											2014-12-04 20:12:06 +06:00
										 |  |  |     _VALID_URL = r'(?:https?://)?vine\.co/(?P<u>u/)?(?P<user>[^/]+)/?(\?.*)?$' | 
					
						
							| 
									
										
										
										
											2014-05-10 23:18:20 -04:00
										 |  |  |     _VINE_BASE_URL = "https://vine.co/" | 
					
						
							| 
									
										
										
										
											2014-12-04 20:12:06 +06:00
										 |  |  |     _TESTS = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             'url': 'https://vine.co/Visa', | 
					
						
							|  |  |  |             'info_dict': { | 
					
						
							|  |  |  |                 'id': 'Visa', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             'playlist_mincount': 46, | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2014-12-04 20:12:06 +06:00
										 |  |  |         { | 
					
						
							|  |  |  |             'url': 'https://vine.co/u/941705360593584128', | 
					
						
							|  |  |  |             'only_matching': True, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2014-05-10 23:18:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-13 09:50:03 +02:00
										 |  |  |     def _real_extract(self, url): | 
					
						
							|  |  |  |         mobj = re.match(self._VALID_URL, url) | 
					
						
							|  |  |  |         user = mobj.group('user') | 
					
						
							| 
									
										
										
										
											2014-12-04 20:12:06 +06:00
										 |  |  |         u = mobj.group('u') | 
					
						
							| 
									
										
										
										
											2014-05-10 23:18:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-04 20:12:06 +06:00
										 |  |  |         profile_url = "%sapi/users/profiles/%s%s" % ( | 
					
						
							|  |  |  |             self._VINE_BASE_URL, 'vanity/' if not u else '', user) | 
					
						
							| 
									
										
										
										
											2014-05-13 09:50:03 +02:00
										 |  |  |         profile_data = self._download_json( | 
					
						
							|  |  |  |             profile_url, user, note='Downloading user profile data') | 
					
						
							| 
									
										
										
										
											2014-05-10 23:18:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         user_id = profile_data['data']['userId'] | 
					
						
							|  |  |  |         timeline_data = [] | 
					
						
							|  |  |  |         for pagenum in itertools.count(1): | 
					
						
							| 
									
										
										
										
											2014-12-04 20:12:06 +06:00
										 |  |  |             timeline_url = "%sapi/timelines/users/%s?page=%s&size=100" % ( | 
					
						
							| 
									
										
										
										
											2014-05-13 09:50:03 +02:00
										 |  |  |                 self._VINE_BASE_URL, user_id, pagenum) | 
					
						
							|  |  |  |             timeline_page = self._download_json( | 
					
						
							|  |  |  |                 timeline_url, user, note='Downloading page %d' % pagenum) | 
					
						
							| 
									
										
										
										
											2014-05-10 23:18:20 -04:00
										 |  |  |             timeline_data.extend(timeline_page['data']['records']) | 
					
						
							|  |  |  |             if timeline_page['data']['nextPage'] is None: | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-13 09:50:03 +02:00
										 |  |  |         entries = [ | 
					
						
							|  |  |  |             self.url_result(e['permalinkUrl'], 'Vine') for e in timeline_data] | 
					
						
							| 
									
										
										
										
											2014-05-10 23:18:20 -04:00
										 |  |  |         return self.playlist_result(entries, user) |