|
@@ -7,6 +7,7 @@ from ..utils import parse_iso8601
|
|
|
|
|
|
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 = [{
|
|
@@ -79,3 +80,39 @@ 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',
|
|
|
+ },
|
|
|
+ # 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)
|
|
|
+
|
|
|
+ broadcast_data = self._parse_json(self._html_search_meta(
|
|
|
+ 'broadcast-data', webpage, default='{}'), user_id)
|
|
|
+ username = broadcast_data.get('user', {}).get('display_name')
|
|
|
+ user_broadcasts = self._parse_json(
|
|
|
+ self._html_search_meta('user-broadcasts', webpage, default='{}'),
|
|
|
+ user_id)
|
|
|
+
|
|
|
+ entries = [
|
|
|
+ self.url_result(
|
|
|
+ 'https://www.periscope.tv/%s/%s' % (user_id, broadcast['id']))
|
|
|
+ for broadcast in user_broadcasts.get('broadcasts', [])]
|
|
|
+
|
|
|
+ return self.playlist_result(entries, user_id, username)
|