def plugin_process_playdata(playdata): creds = get_credentials() profile_settings = load_profile(profile_id=1) CDMHEADERS = { 'User-Agent': DEFAULT_USER_AGENT, #'X-Client-Id': CONST_DEFAULT_CLIENTID + '||' + DEFAULT_USER_AGENT, 'X-OESP-License-Token-Type': 'velocix', 'X-OESP-Token': profile_settings['access_token'], 'X-OESP-Username': creds['username'], 'X-OESP-License-Token': profile_settings['drm_token'], 'X-OESP-DRM-SchemeIdUri': 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed', 'X-OESP-Content-Locator': playdata['locator'], } params = [] try: params.append(('_', 'renew_token')) params.append(('path', str(playdata['path']).encode('utf-8'))) params.append(('locator', str(playdata['locator']).encode('utf-8'))) except: params.append(('_', 'renew_token')) params.append(('path', playdata['path'])) params.append(('locator', playdata['locator'])) write_file(file='token_renew', data='plugin://{0}/?{1}'.format(ADDON_ID, urlencode(encode_obj(params))), isJSON=False) item_inputstream = inputstream.Widevine(license_key=playdata['license'], ) return item_inputstream, CDMHEADERS
def create_strm_file(filename, id, label, data): if not os.path.isfile(filename + '.strm'): params = [] params.append(('_', 'play_video')) params.append(('type', 'vod')) params.append(('channel', None)) params.append(('id', id)) params.append(('title', label)) path = 'plugin://{0}/?{1}'.format(ADDON_ID, urlencode(encode_obj(params))) write_file(file=filename + '.strm', data=path, ext=True, isJSON=False) return True else: return False
def build_url(url, addon_id=ADDON_ID, **kwargs): kwargs['_'] = url is_live = kwargs.pop('_is_live', False) params = [] for k in sorted(kwargs): if kwargs[k] == None: continue try: params.append((k, str(kwargs[k]).encode('utf-8'))) except: params.append((k, kwargs[k])) #if is_live: # params.append(('_l', '.pvr')) return 'plugin://{0}/?{1}'.format(addon_id, urlencode(encode_obj(params)))
def plugin_process_watchlist(data, type='watchlist'): items = {} if check_key(data, 'details'): for row in data['details']: currow = data['details'][row] info = plugin_process_info({'info': currow}) context = [] params = [] params.append(('_', 'remove_from_watchlist')) params.append(('type', type)) progress = 0 remove_txt = CONST_WATCHLIST_CAPABILITY[type]['removelist'] if type == 'continuewatch': if currow['type'] == 'episode': params.append(('id', str(currow['id']) + '?series=' + str(currow['series_ref']))) else: params.append(('id', str(currow['id']) + '?series=')) if not currow['type'] == 'series': progress = data['progress'][row] else: params.append(('id', currow['ref'])) if CONST_WATCHLIST_CAPABILITY[type]['remove'] == 1: context.append(( remove_txt, 'RunPlugin({context_url})'.format( context_url='plugin://{0}/?{1}'.format( ADDON_ID, urlencode(encode_obj(params)))), )) type2 = 'vod' if currow['type'] == 'episode': params = [] params.append(('_', 'play_video')) params.append(('type', type2)) params.append(('channel', None)) params.append( ('id', 'E' + str(currow['series_ref'][1:]) + '###' + str(currow['season_id']) + '###' + str(currow['id']))) params.append(('title', None)) path = 'plugin://{0}/?{1}'.format( ADDON_ID, urlencode(encode_obj(params))) playable = True mediatype = 'video' elif currow['type'] == 'series' and not type == 'continuewatch': params = [] params.append(('_', 'vod_series')) params.append(('type', 'series')) params.append(('label', currow['title'])) params.append(('id', currow['ref'])) path = 'plugin://{0}/?{1}'.format( ADDON_ID, urlencode(encode_obj(params))) playable = False mediatype = '' elif currow['type'] == 'movie': params = [] params.append(('_', 'play_video')) params.append(('type', type2)) params.append(('channel', None)) params.append(('id', currow['ref'])) params.append(('title', None)) path = 'plugin://{0}/?{1}'.format( ADDON_ID, urlencode(encode_obj(params))) playable = True mediatype = 'video' else: continue items[str(currow['ref'])] = { 'label1': info['label1'], 'description': info['description'], 'duration': info['duration'], 'mediatype': mediatype, 'image': info['image'], 'image_large': info['image_large'], 'path': path, 'playable': playable, 'progress': progress, 'context': context, 'type': currow['type'] } return items
def play(self): try: if 'seekTime' in self.properties or sys.argv[3] == 'resume:true': self.properties.pop('ResumeTime', None) self.properties.pop('TotalTime', None) except: pass device_id = plugin_get_device_id if not device_id: method = 'settings.GetSettingValue' cursetting = {} cursetting['debug.extralogging'] = json_rpc( method, {"setting": "debug.extralogging"})['value'] cursetting['debug.showloginfo'] = json_rpc( method, {"setting": "debug.showloginfo"})['value'] cursetting['debug.setextraloglevel'] = json_rpc( method, {"setting": "debug.setextraloglevel"})['value'] method = 'settings.SetSettingValue' json_rpc(method, { "setting": "debug.extralogging", "value": "true" }) json_rpc(method, {"setting": "debug.showloginfo", "value": "true"}) json_rpc(method, { "setting": "debug.setextraloglevel", "value": [64] }) if settings.getBool(key='disable_subtitle'): self.properties['disable_subtitle'] = 1 li = self.get_li() handle = _handle() #if 'seekTime' in self.properties: #li.setProperty('ResumeTime', str(self.properties['seekTime'])) #if 'totalTime' in self.properties: # li.setProperty('TotalTime', str(self.properties['totalTime'])) #else: # li.setProperty('TotalTime', '999999') player = MyPlayer() playbackStarted = False seekTime = False replay_pvr = False if handle > 0: if 'Replay' in self.properties or 'PVR' in self.properties: replay_pvr = True self.properties.pop('Replay', None) self.properties.pop('PVR', None) xbmcplugin.setResolvedUrl(handle, True, li) else: xbmcplugin.setResolvedUrl(handle, False, li) player.play(self.path, li) else: player.play(self.path, li) currentTime = 0 upnext = settings.getBool('upnext_enabled') while player.is_active: if xbmc.getCondVisibility("Player.HasMedia") and player.is_started: if playbackStarted == False: playbackStarted = True if upnext: upnext = False result = json_rpc("XBMC.GetInfoLabels", { "labels": ["VideoPlayer.DBID", "VideoPlayer.TvShowDBID"] }) if result and len(str( result['VideoPlayer.DBID'])) > 0 and len( str(result['VideoPlayer.TvShowDBID'])) > 0: result2 = json_rpc( "VideoLibrary.GetEpisodes", { "tvshowid": int(result['VideoPlayer.TvShowDBID']), "properties": [ "title", "plot", "rating", "firstaired", "playcount", "runtime", "season", "episode", "showtitle", "fanart", "thumbnail", "art" ] }) nextep = 0 current_episode = dict() next_episode = dict() if result2: for result3 in result2['episodes']: if nextep == 0 and int( result3['episodeid']) == int( result['VideoPlayer.DBID']): current_episode = dict( episodeid=result3['episodeid'], tvshowid=int( result['VideoPlayer.TvShowDBID']), title=result3["title"], art=result3["art"], season=result3["season"], episode=result3["episode"], showtitle=result3["showtitle"], plot=result3["plot"], playcount=result3["playcount"], rating=result3["rating"], firstaired=result3["firstaired"], runtime=result3["runtime"]) nextep = 1 elif nextep == 1: params = [] params.append(('_', 'play_dbitem')) params.append(('id', result3['episodeid'])) path = 'plugin://{0}/?{1}'.format( ADDON_ID, urlencode(encode_obj(params))) next_info = dict( current_episode=current_episode, next_episode=dict( episodeid=result3['episodeid'], tvshowid=int(result[ 'VideoPlayer.TvShowDBID']), title=result3["title"], art=result3["art"], season=result3["season"], episode=result3["episode"], showtitle=result3["showtitle"], plot=result3["plot"], playcount=result3["playcount"], rating=result3["rating"], firstaired=result3["firstaired"], runtime=result3["runtime"]), play_url=path, #notification_time=60, #notification_offset=notification_offset, ) upnext_signal(sender=ADDON_ID, next_info=next_info) #upnext_signal(sender=ADDON_ID) break if not device_id: player.stop() if 'disable_subtitle' in self.properties: player.showSubtitles(False) self.properties.pop('disable_subtitle', None) if 'seekTime' in self.properties: seekTime = True xbmc.Monitor().waitForAbort(1) player.seekTime(int(self.properties['seekTime'])) self.properties.pop('seekTime', None) if not replay_pvr and not seekTime and 'Live' in self.properties and 'Live_ID' in self.properties and 'Live_Channel' in self.properties: id = self.properties['Live_ID'] channel = self.properties['Live_Channel'] self.properties.pop('Live', None) self.properties.pop('Live_ID', None) self.properties.pop('Live_Channel', None) wait = 60 end = load_file(file='stream_end', isJSON=False) if end: calc_wait = int(end) - int(time.time()) + 30 if calc_wait > 60: wait = calc_wait while not xbmc.Monitor().waitForAbort( wait) and xbmc.getCondVisibility( "Player.HasMedia") and player.is_started: info = None try: info = api_get_info(id=id, channel=channel) except: pass if info: info2 = { 'plot': str(info['description']), 'title': str(info['label1']), 'tagline': str(info['label2']), 'duration': info['duration'], 'credits': info['credits'], 'cast': info['cast'], 'director': info['director'], 'writer': info['writer'], 'genre': info['genres'], 'year': info['year'], } li.setInfo('video', info2) li.setArt({ 'thumb': info['image'], 'icon': info['image'], 'fanart': info['image_large'] }) try: player.updateInfoTag(li) except: pass wait = 60 end = load_file(file='stream_end', isJSON=False) if end: calc_wait = int(end) - int(time.time()) + 30 if calc_wait > 60: wait = calc_wait xbmc.Monitor().waitForAbort(1) try: currentTime = player.getTime() except: pass if playbackStarted == True: api_clean_after_playback(int(currentTime)) try: if settings.getInt(key='max_bandwidth') > 0: _restore_network_bandwidth() except: pass if not device_id: json_rpc( method, { "setting": "debug.showloginfo", "value": cursetting['debug.showloginfo'] }) json_rpc( method, { "setting": "debug.setextraloglevel", "value": str(', '.join([ str(elem) for elem in cursetting['debug.setextraloglevel'] ])) }) json_rpc( method, { "setting": "debug.extralogging", "value": cursetting['debug.setextraloglevel'] })
def plugin_process_watchlist(data, type='watchlist'): items = {} items2 = plugin_process_vod(data, 0) for id in items2: currow = items2[id] context = [] params = [] params.append(('_', 'remove_from_watchlist')) params.append(('type', type)) progress = 0 remove_txt = CONST_WATCHLIST_CAPABILITY[type]['removelist'] params.append(('id', id)) if CONST_WATCHLIST_CAPABILITY[type]['remove'] == 1: context.append(( remove_txt, 'RunPlugin({context_url})'.format( context_url='plugin://{0}/?{1}'.format( ADDON_ID, urlencode(encode_obj(params)))), )) if currow['type'] == 'Serie' and not type == 'continuewatch': params = [] params.append(('_', 'vod_series')) params.append(('type', 'series')) params.append(('label', currow['title'])) params.append(('id', id)) path = 'plugin://{0}/?{1}'.format(ADDON_ID, urlencode(encode_obj(params))) playable = False mediatype = '' else: params = [] params.append(('_', 'play_video')) params.append(('type', 'movie')) params.append(('channel', None)) params.append(('id', id)) params.append(('title', None)) path = 'plugin://{0}/?{1}'.format(ADDON_ID, urlencode(encode_obj(params))) playable = True mediatype = 'video' items[str(id)] = { 'label1': currow['title'], 'description': currow['description'], 'duration': currow['duration'], 'mediatype': mediatype, 'image': currow['icon'], 'image_large': currow['icon'], 'path': path, 'playable': playable, 'progress': progress, 'context': context, 'type': currow['type'] } return items