Skip to content

Commit

Permalink
[picarto] Use API and add token support
Browse files Browse the repository at this point in the history
This is just more reliable than trying to extract
it from the page itself.
  • Loading branch information
TingPing authored and dstftw committed Nov 11, 2018
1 parent 83852e5 commit f17a24a
Showing 1 changed file with 9 additions and 27 deletions.
36 changes: 9 additions & 27 deletions youtube_dl/extractor/picarto.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,13 @@
from ..utils import (
ExtractorError,
js_to_json,
try_get,
update_url_query,
urlencode_postdata,
)


class PicartoIE(InfoExtractor):
_VALID_URL = r'https?://(?:www.)?picarto\.tv/(?P<id>[a-zA-Z0-9]+)'
_VALID_URL = r'https?://(?:www.)?picarto\.tv/(?P<id>[a-zA-Z0-9]+)(?:/(?P<token>[a-zA-Z0-9]+))?'
_TEST = {
'url': 'https://picarto.tv/Setz',
'info_dict': {
Expand All @@ -34,40 +33,25 @@ def suitable(cls, url):

def _real_extract(self, url):
channel_id = self._match_id(url)
stream_page = self._download_webpage(url, channel_id)
metadata = self._download_json(
'https://api.picarto.tv/v1/channel/name/' + channel_id,
channel_id)

if '>This channel does not exist' in stream_page:
raise ExtractorError(
'Channel %s does not exist' % channel_id, expected=True)

player = self._parse_json(
self._search_regex(
r'(?s)playerSettings\[\d+\]\s*=\s*(\{.+?\}\s*\n)', stream_page,
'player settings'),
channel_id, transform_source=js_to_json)

if player.get('online') is False:
if metadata.get('online') is False:
raise ExtractorError('Stream is offline', expected=True)

cdn_data = self._download_json(
'https://picarto.tv/process/channel', channel_id,
data=urlencode_postdata({'loadbalancinginfo': channel_id}),
note='Downloading load balancing info')

def get_event(key):
return try_get(player, lambda x: x['event'][key], compat_str) or ''

token = self._VALID_URL_RE.match(url).group('token') or 'public'
params = {
'token': player.get('token') or '',
'ticket': get_event('ticket'),
'con': int(time.time() * 1000),
'type': get_event('ticket'),
'scope': get_event('scope'),
'token': token,
}

prefered_edge = cdn_data.get('preferedEdge')
default_tech = player.get('defaultTech')

formats = []

for edge in cdn_data['edges']:
Expand All @@ -81,8 +65,6 @@ def get_event(key):
preference = 0
if edge_id == prefered_edge:
preference += 1
if tech_type == default_tech:
preference += 1
format_id = []
if edge_id:
format_id.append(edge_id)
Expand All @@ -109,7 +91,7 @@ def get_event(key):
continue
self._sort_formats(formats)

mature = player.get('mature')
mature = metadata.get('adult')
if mature is None:
age_limit = None
else:
Expand All @@ -119,7 +101,7 @@ def get_event(key):
'id': channel_id,
'title': self._live_title(channel_id),
'is_live': True,
'thumbnail': player.get('vodThumb'),
'thumbnail': metadata.get('thumbnails', {}).get('web'),
'age_limit': age_limit,
'formats': formats,
}
Expand Down

0 comments on commit f17a24a

Please sign in to comment.