diff options
Diffstat (limited to 'youtube_dl/extractor/periscope.py')
| -rw-r--r-- | youtube_dl/extractor/periscope.py | 53 | 
1 files changed, 50 insertions, 3 deletions
| diff --git a/youtube_dl/extractor/periscope.py b/youtube_dl/extractor/periscope.py index 514e9b433..c23b314e7 100644 --- a/youtube_dl/extractor/periscope.py +++ b/youtube_dl/extractor/periscope.py @@ -2,11 +2,15 @@  from __future__ import unicode_literals  from .common import InfoExtractor -from ..utils import parse_iso8601 +from ..utils import ( +    parse_iso8601, +    unescapeHTML, +)  class PeriscopeIE(InfoExtractor):      IE_DESC = 'Periscope' +    IE_NAME = 'periscope'      _VALID_URL = r'https?://(?:www\.)?periscope\.tv/[^/]+/(?P<id>[^/?#]+)'      # Alive example URLs can be found here http://onperiscope.com/      _TESTS = [{ @@ -41,8 +45,11 @@ class PeriscopeIE(InfoExtractor):          broadcast = broadcast_data['broadcast']          status = broadcast['status'] -        uploader = broadcast.get('user_display_name') or broadcast_data.get('user', {}).get('display_name') -        uploader_id = broadcast.get('user_id') or broadcast_data.get('user', {}).get('id') +        user = broadcast_data.get('user', {}) + +        uploader = broadcast.get('user_display_name') or user.get('display_name') +        uploader_id = (broadcast.get('username') or user.get('username') or +                       broadcast.get('user_id') or user.get('id'))          title = '%s - %s' % (uploader, status) if uploader else status          state = broadcast.get('state').lower() @@ -79,3 +86,43 @@ class PeriscopeIE(InfoExtractor):              'thumbnails': thumbnails,              'formats': formats,          } + + +class PeriscopeUserIE(InfoExtractor): +    _VALID_URL = r'https?://www\.periscope\.tv/(?P<id>[^/]+)/?$' +    IE_DESC = 'Periscope user videos' +    IE_NAME = 'periscope:user' + +    _TEST = { +        'url': 'https://www.periscope.tv/LularoeHusbandMike/', +        'info_dict': { +            'id': 'LularoeHusbandMike', +            'title': 'LULAROE HUSBAND MIKE', +            'description': 'md5:6cf4ec8047768098da58e446e82c82f0', +        }, +        # Periscope only shows videos in the last 24 hours, so it's possible to +        # get 0 videos +        'playlist_mincount': 0, +    } + +    def _real_extract(self, url): +        user_id = self._match_id(url) + +        webpage = self._download_webpage(url, user_id) + +        data_store = self._parse_json( +            unescapeHTML(self._search_regex( +                r'data-store=(["\'])(?P<data>.+?)\1', +                webpage, 'data store', default='{}', group='data')), +            user_id) + +        user = data_store.get('User', {}).get('user', {}) +        title = user.get('display_name') or user.get('username') +        description = user.get('description') + +        entries = [ +            self.url_result( +                'https://www.periscope.tv/%s/%s' % (user_id, broadcast['id'])) +            for broadcast in data_store.get('UserBroadcastHistory', {}).get('broadcasts', [])] + +        return self.playlist_result(entries, user_id, title, description) | 
