def _get_streams(self): # create a new api api = self._create_api() try: # parse the media id from the url media_id = int(self.url.split('/')[-1].split('-')[-1]) except ValueError: raise exceptions.PluginError('Invalid url') try: # try to obtain the info on streams for this media item stream_data = api.get_info(media_id, fields=['media.stream_data' ])['stream_data'] except APIError as e: raise exceptions.PluginError('Media lookup error: {0}'.format( e.args[0])) if stream_data: streams_raw = stream_data['streams'] else: raise exceptions.NoStreamsError(self.url) # convert the raw stream data into the stream list expected by # livestreamer (adaptive get's filtered since it isn't supported) streams = dict((s['quality'], stream.HLSStream(self.session, s['url'])) for s in streams_raw if s['quality'] != 'adaptive') return streams
def _create_api(self): '''Creates a new CrunchyrollAPI object, initiates it's session and tries to authenticate it either by using saved credentials or the user's username and password. ''' if self.options.get('purge_credentials'): self.cache.set('session_id', None, 0) self.cache.set('auth', None, 0) current_time = datetime.datetime.utcnow() api = CrunchyrollAPI( self.cache.get('session_id'), self.cache.get('auth')) self.logger.debug('Creating session...') try: expires = api.start_session(self._get_device_id()) except APIError as e: if e.args[0] == 'Unauthenticated request': self.logger.info('Aparently credentials got debunked') api = CrunchyrollAPI() expires = api.start_session(self._get_device_id()) else: raise e self.cache.set( 'session_id', api.session_id, (expires - current_time).total_seconds() ) self.logger.debug('Success!') if api.auth: self.logger.info('Using saved credentials') elif self.options.get('username'): try: self.logger.info( 'Trying to login using user and password...') expires = api.login( self.options.get('username'), self.options.get('password') ) self.cache.set( 'auth', api.auth, (expires - current_time).total_seconds() ) self.logger.info('Success!') except APIError as e: raise exceptions.PluginError( 'Authentication error: {0}'.format(e.args[0])) else: self.logger.warning( "No authentication provided, you won't be able to access " "premium restricted content" ) return api