diff options
| author | Sergey M․ <dstftw@gmail.com> | 2016-08-28 02:35:49 +0700 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2016-08-28 02:35:49 +0700 | 
| commit | 92c27a0dbf19eff211e7ffdd8db5895387e75529 (patch) | |
| tree | fcf90dbe16d684208124258da407cb7ebbdccc86 | |
| parent | d181cff685aa889864a0356fa546e2d5605f27d2 (diff) | |
[periscope:user] Fix extraction (Closes #10453)
| -rw-r--r-- | youtube_dl/extractor/periscope.py | 47 | 
1 files changed, 30 insertions, 17 deletions
diff --git a/youtube_dl/extractor/periscope.py b/youtube_dl/extractor/periscope.py index 75f5884a9..6c640089d 100644 --- a/youtube_dl/extractor/periscope.py +++ b/youtube_dl/extractor/periscope.py @@ -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_NAME = 'periscope'      _VALID_URL = r'https?://(?:www\.)?periscope\.tv/[^/]+/(?P<id>[^/?#]+)' @@ -34,14 +41,11 @@ class PeriscopeIE(InfoExtractor):          '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):          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']          status = broadcast['status'] @@ -61,7 +65,8 @@ class PeriscopeIE(InfoExtractor):              'url': broadcast[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 = []          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>[^/]+)/?$'      IE_DESC = 'Periscope user videos'      IE_NAME = 'periscope:user' @@ -106,26 +111,34 @@ class PeriscopeUserIE(InfoExtractor):      }      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(              unescapeHTML(self._search_regex(                  r'data-store=(["\'])(?P<data>.+?)\1',                  webpage, 'data store', default='{}', group='data')), -            user_id) +            user_name) -        user = data_store.get('User', {}).get('user', {}) -        title = user.get('display_name') or user.get('username') -        description = user.get('description') +        user = list(data_store['UserCache']['users'].values())[0]['user'] +        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 = (data_store.get('UserBroadcastHistory', {}).get('broadcastIds') or -                         data_store.get('BroadcastCache', {}).get('broadcastIds', [])) +        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')          entries = [              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]          return self.playlist_result(entries, user_id, title, description)  | 
