mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	[periscope:user] Fix extraction (Closes #10453)
This commit is contained in:
		| @@ -8,7 +8,14 @@ from ..utils import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
|  |  | ||||||
| class PeriscopeIE(InfoExtractor): | class PeriscopeBaseIE(InfoExtractor): | ||||||
|  |     def _call_api(self, method, query, item_id): | ||||||
|  |         return self._download_json( | ||||||
|  |             'https://api.periscope.tv/api/v2/%s' % method, | ||||||
|  |             item_id, query=query) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class PeriscopeIE(PeriscopeBaseIE): | ||||||
|     IE_DESC = 'Periscope' |     IE_DESC = 'Periscope' | ||||||
|     IE_NAME = 'periscope' |     IE_NAME = 'periscope' | ||||||
|     _VALID_URL = r'https?://(?:www\.)?periscope\.tv/[^/]+/(?P<id>[^/?#]+)' |     _VALID_URL = r'https?://(?:www\.)?periscope\.tv/[^/]+/(?P<id>[^/?#]+)' | ||||||
| @@ -34,14 +41,11 @@ class PeriscopeIE(InfoExtractor): | |||||||
|         'only_matching': True, |         'only_matching': True, | ||||||
|     }] |     }] | ||||||
|  |  | ||||||
|     def _call_api(self, method, value): |  | ||||||
|         return self._download_json( |  | ||||||
|             'https://api.periscope.tv/api/v2/%s?broadcast_id=%s' % (method, value), value) |  | ||||||
|  |  | ||||||
|     def _real_extract(self, url): |     def _real_extract(self, url): | ||||||
|         token = self._match_id(url) |         token = self._match_id(url) | ||||||
|  |  | ||||||
|         broadcast_data = self._call_api('getBroadcastPublic', token) |         broadcast_data = self._call_api( | ||||||
|  |             'getBroadcastPublic', {'broadcast_id': token}, token) | ||||||
|         broadcast = broadcast_data['broadcast'] |         broadcast = broadcast_data['broadcast'] | ||||||
|         status = broadcast['status'] |         status = broadcast['status'] | ||||||
|  |  | ||||||
| @@ -61,7 +65,8 @@ class PeriscopeIE(InfoExtractor): | |||||||
|             'url': broadcast[image], |             'url': broadcast[image], | ||||||
|         } for image in ('image_url', 'image_url_small') if broadcast.get(image)] |         } for image in ('image_url', 'image_url_small') if broadcast.get(image)] | ||||||
|  |  | ||||||
|         stream = self._call_api('getAccessPublic', token) |         stream = self._call_api( | ||||||
|  |             'getAccessPublic', {'broadcast_id': token}, token) | ||||||
|  |  | ||||||
|         formats = [] |         formats = [] | ||||||
|         for format_id in ('replay', 'rtmp', 'hls', 'https_hls'): |         for format_id in ('replay', 'rtmp', 'hls', 'https_hls'): | ||||||
| @@ -88,7 +93,7 @@ class PeriscopeIE(InfoExtractor): | |||||||
|         } |         } | ||||||
|  |  | ||||||
|  |  | ||||||
| class PeriscopeUserIE(InfoExtractor): | class PeriscopeUserIE(PeriscopeBaseIE): | ||||||
|     _VALID_URL = r'https?://www\.periscope\.tv/(?P<id>[^/]+)/?$' |     _VALID_URL = r'https?://www\.periscope\.tv/(?P<id>[^/]+)/?$' | ||||||
|     IE_DESC = 'Periscope user videos' |     IE_DESC = 'Periscope user videos' | ||||||
|     IE_NAME = 'periscope:user' |     IE_NAME = 'periscope:user' | ||||||
| @@ -106,26 +111,34 @@ class PeriscopeUserIE(InfoExtractor): | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     def _real_extract(self, url): |     def _real_extract(self, url): | ||||||
|         user_id = self._match_id(url) |         user_name = self._match_id(url) | ||||||
|  |  | ||||||
|         webpage = self._download_webpage(url, user_id) |         webpage = self._download_webpage(url, user_name) | ||||||
|  |  | ||||||
|         data_store = self._parse_json( |         data_store = self._parse_json( | ||||||
|             unescapeHTML(self._search_regex( |             unescapeHTML(self._search_regex( | ||||||
|                 r'data-store=(["\'])(?P<data>.+?)\1', |                 r'data-store=(["\'])(?P<data>.+?)\1', | ||||||
|                 webpage, 'data store', default='{}', group='data')), |                 webpage, 'data store', default='{}', group='data')), | ||||||
|             user_id) |             user_name) | ||||||
|  |  | ||||||
|         user = data_store.get('User', {}).get('user', {}) |         user = list(data_store['UserCache']['users'].values())[0]['user'] | ||||||
|         title = user.get('display_name') or user.get('username') |         user_id = user['id'] | ||||||
|  |         session_id = data_store['SessionToken']['broadcastHistory']['token']['session_id'] | ||||||
|  |  | ||||||
|  |         broadcasts = self._call_api( | ||||||
|  |             'getUserBroadcastsPublic', | ||||||
|  |             {'user_id': user_id, 'session_id': session_id}, | ||||||
|  |             user_name)['broadcasts'] | ||||||
|  |  | ||||||
|  |         broadcast_ids = [ | ||||||
|  |             broadcast['id'] for broadcast in broadcasts if broadcast.get('id')] | ||||||
|  |  | ||||||
|  |         title = user.get('display_name') or user.get('username') or user_name | ||||||
|         description = user.get('description') |         description = user.get('description') | ||||||
|  |  | ||||||
|         broadcast_ids = (data_store.get('UserBroadcastHistory', {}).get('broadcastIds') or |  | ||||||
|                          data_store.get('BroadcastCache', {}).get('broadcastIds', [])) |  | ||||||
|  |  | ||||||
|         entries = [ |         entries = [ | ||||||
|             self.url_result( |             self.url_result( | ||||||
|                 'https://www.periscope.tv/%s/%s' % (user_id, broadcast_id)) |                 'https://www.periscope.tv/%s/%s' % (user_name, broadcast_id)) | ||||||
|             for broadcast_id in broadcast_ids] |             for broadcast_id in broadcast_ids] | ||||||
|  |  | ||||||
|         return self.playlist_result(entries, user_id, title, description) |         return self.playlist_result(entries, user_id, title, description) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user