def auth(self): pin_url = '{}/pin/get?agent={}'.format(self.base_url, self.agent_identifier) resp = requests.get(pin_url).json() expiry = pin_ttl = int(resp['expired_in']) auth_complete = False tools.copy2clip(resp['pin']) tools.progressDialog.create('{} - {}'.format(tools.addonName, 'AllDebrid Auth')) tools.progressDialog.update(100, tools.lang(32024).format(tools.colorString(resp['base_url'])), tools.lang(32025).format(tools.colorString( resp['pin'])), 'This code has been copied to your clipboard') # Seems the All Debrid servers need some time do something with the pin before polling # Polling to early will cause an invalid pin error time.sleep(5) while not auth_complete and not expiry <= 0 and not tools.progressDialog.iscanceled(): auth_complete, expiry = self.poll_auth(resp['check_url']) progress_percent = 100 - int((float(pin_ttl - expiry) / pin_ttl) * 100) tools.progressDialog.update(progress_percent) time.sleep(1) try:tools.progressDialog.close() except:pass self.store_user_info() if auth_complete: tools.showDialog.ok(tools.addonName, 'AllDebrid {}'.format(tools.lang(32026))) else: return
def auth(self): user_code = '' url = 'https://api.trakt.tv/oauth/device/code' postData = {'client_id': self.ClientID} response = requests.post(url, data=postData) response = json.loads(response.text) try: user_code = response['user_code'] device = response['device_code'] interval = int(response['interval']) expiry = int(response['expires_in']) except: tools.showDialog.ok(tools.addonName, tools.lang(32032).encode('utf-8')) return currentTime = 0 tools.copy2clip(user_code) tools.progressDialog.create( tools.addonName + ': ' + tools.lang(32031).encode('utf-8'), tools.lang(32024).encode('utf-8') + tools.colorString('https://trakt.tv/activate \n') + tools.lang(32025).encode('utf-8') + tools.colorString(user_code) + "\n" + tools.lang(32071).encode('utf-8')) tools.progressDialog.update(100) while currentTime < (expiry - interval): if tools.progressDialog.iscanceled(): tools.progressDialog.close() return progressPercent = int(100 - ((float(currentTime) / expiry) * 100)) tools.progressDialog.update(progressPercent) sleep(interval) postData = { 'code': device, 'client_id': self.ClientID, 'client_secret': self.ClientSecret } url = 'https://api.trakt.tv/oauth/device/token' response = requests.post(url, data=postData) if '200' in str(response): response = json.loads(response.text) tools.setSetting('trakt.auth', response['access_token']) tools.setSetting('trakt.refresh', response['refresh_token']) self.headers[ 'Authorization'] = 'Bearer %s' % response['access_token'] username = self.get_username() tools.setSetting('trakt.username', username) tools.progressDialog.close() tools.showDialog.ok(tools.addonName, 'Sucessfully authenticated with Trakt') break if '400' in str(response): pass else: tools.showDialog.ok(tools.addonName, tools.lang(32032).encode('utf-8')) tools.progressDialog.close() tools.showDialog.ok(tools.addonName, tools.lang(32033).encode('utf-8'))
def auth(self): data = {'client_id': self.client_id, 'response_type': 'device_code'} token = requests.post('https://www.premiumize.me/token', data=data).json() expiry = token['expires_in'] token_ttl = token['expires_in'] poll_again = True success = False tools.copy2clip(token['user_code']) tools.progressDialog.create(tools.addonName, line1=tools.lang(32024).format( tools.colorString( token['verification_uri'])), line2=tools.lang(32025).format( tools.colorString(token['user_code']))) tools.progressDialog.update(0) while poll_again and not token_ttl <= 0 and not tools.progressDialog.iscanceled( ): poll_again, success = self.poll_token(token['device_code']) progress_percent = 100 - int((float( (expiry - token_ttl) / expiry) * 100)) tools.progressDialog.update(progress_percent) time.sleep(token['interval']) token_ttl -= int(token['interval']) tools.progressDialog.close() if success: tools.showDialog.ok(tools.addonName, tools.lang(32026))
def auth(self): self.ClientSecret = '' self.ClientID = 'X245A4XAIBGVM' url = ("client_id=%s&new_credentials=yes" % self.ClientID) url = self.OauthUrl + self.DeviceCodeUrl % url response = json.loads(requests.get(url).text) tools.copy2clip(response['user_code']) tools.progressDialog.create(tools.lang(32023)) tools.progressDialog.update(-1, tools.lang(32024).format(tools.colorString( 'https://real-debrid.com/device')), tools.lang(32025).format(tools.colorString( response['user_code'])), 'This code has been copied to your clipboard') self.OauthTimeout = int(response['expires_in']) self.OauthTimeStep = int(response['interval']) self.DeviceCode = response['device_code'] while self.ClientSecret == '': self.auth_loop() self.token_request() user_information = self.get_url('user') if user_information['type'] != 'premium': tools.showDialog.ok(tools.addonName, tools.lang(40156))
def showListBuilder(self, trakt_list, forceResume=False, info_only=False): try: if len(trakt_list) == 0: tools.log('We received no titles to build a list', 'error') return except: import traceback traceback.print_exc() return if 'show' in trakt_list[0]: trakt_list = [i['show'] for i in trakt_list] show_ids = [i['ids']['trakt'] for i in trakt_list] self.itemList = trakt_database.get_show_list(show_ids) self.itemList = [x for x in self.itemList if x is not None and 'info' in x] self.itemList = tools.sort_list_items(self.itemList, trakt_list) item_list = [] for item in self.itemList: try: # Add Arguments to pass with items args = {'trakt_id': item['ids']['trakt'], 'item_type': 'show'} args = tools.quote(json.dumps(args, sort_keys=True)) name = tools.display_string(item['info']['tvshowtitle']) if info_only: return args if not self.is_aired(item['info']): if tools.getSetting('general.hideUnAired') == 'true': continue name = tools.colorString(name, 'red') name = tools.italic_string(name) item['info'] = tools.clean_air_dates(item['info']) item['info']['title'] = item['info']['tvshowtitle'] if tools.getSetting('smartplay.clickresume') == 'true' or forceResume is True: action = 'playbackResume' else: if tools.getSetting('general.flatten.episodes') == 'true': action = 'flatEpisodes' else: action = 'showSeasons' except: import traceback traceback.print_exc() continue item_list.append(tools.addDirectoryItem(name, action, item['info'], item['art'], item['cast'], isFolder=True, isPlayable=False, actionArgs=args, bulk_add=True, set_ids=item['ids'])) tools.addMenuItems(syshandle, item_list, len(item_list))
def adjust_providers(self, status, package_disable=False): if status == 'disabled': action = 'enabled' if status == 'enabled': action = 'disabled' if len(self.known_providers) == 0: self.known_providers = database.get_providers() packages = list(set([provider['package'] for provider in self.known_providers])) selection = tools.showDialog.select("%s: %s Providers" % (tools.addonName, action[:-1].title()), packages) if selection == -1: return providers = [i for i in self.known_providers if i['package'] == packages[selection] and i['status'] == status] if package_disable is False: display_list = ["%s - %s" % (tools.colorString(i['provider_name'].upper()), i['provider_type'].title()) for i in providers if i['status'] == status] selection = tools.showDialog.multiselect("%s: %s Providers" % (tools.addonName, action[:-1].title()), display_list) if selection is None: return for i in selection: provider = providers[i] database.add_provider(provider['provider_name'], provider['package'], action, self.language, provider['provider_type']) elif package_disable is True: for i in providers: database.add_provider(i['provider_name'], i['package'], action, self.language, i['provider_type'])
def adjust_providers(self, status, package_disable=False): if status == 'disabled': action = 'enabled' if status == 'enabled': action = 'disabled' if len(self.known_providers) == 0: self.known_providers = database.get_providers() known_packages = [i for i in self.known_packages] package_display = list( set([ '%s - %s' % (pack['pack_name'], pack['version']) for pack in known_packages ])) if len(known_packages) == 0: tools.showDialog.ok(tools.addonName, tools.lang(32074)) return selection = tools.showDialog.select( "%s: %s Providers" % (tools.addonName, action[:-1].title()), package_display) if selection == -1: return providers = [ i for i in self.known_providers if i['package'] == known_packages[selection]['pack_name'] and i['status'] == status and i['country'] == self.language ] if package_disable is False: display_list = [ "%s - %s" % (tools.colorString( i['provider_name'].upper()), i['provider_type'].title()) for i in providers if i['status'] == status ] selection = tools.showDialog.multiselect( "%s: %s Providers" % (tools.addonName, action[:-1].title()), display_list) if selection is None: return for i in selection: provider = providers[i] database.adjust_provider_status(provider['provider_name'], provider['package'], action) elif package_disable is True: for i in providers: database.adjust_provider_status(i['provider_name'], i['package'], action)
def build_display_title(source): if 'debrid_provider' in source: debrid_provider = tools.colorString(tools.shortened_debrid(source.get('debrid_provider', ''))) if debrid_provider != '': debrid_provider = " " + debrid_provider + " |" else: tools.log('No Debrid Provider') else: debrid_provider = '' quality = tools.color_quality(source['quality']) release_title = tools.colorString(source['release_title']) info = source['info'] if len(info) > 0: info = ' '.join(info) info = '| ' + info else: info = '' title = '' if source['type'] == 'torrent': size = tools.colorString(tools.source_size_display(source['size'])) title = "%s |%s %s | %s %s\n%s" % ( quality, debrid_provider, source['source'].upper(), size, info, release_title ) if source['type'] == 'hoster': title = "%s |%s %s | %s %s\n%s" % ( quality, debrid_provider, source['provider'].upper(), source['source'], info, release_title, ) if tools.getSetting('general.sourceselectlines') == 'false': title = title.replace('\n', ' | ') return title
def seasonListBuilder(self, show_id, smartPlay=False): self.itemList = trakt_database.get_season_list(show_id) self.itemList = [x for x in self.itemList if x is not None and 'info' in x] self.itemList = sorted(self.itemList, key=lambda k: int(k['info']['season'])) if len(self.itemList) == 0: tools.log('We received no titles to build a list', 'error') return hide_specials = False if tools.getSetting('general.hideSpecials') == 'true': hide_specials = True item_list = [] for item in self.itemList: try: if hide_specials and int(item['info']['season']) == 0: continue action = 'seasonEpisodes' args = {'trakt_id': item['showInfo']['ids']['trakt'], 'season': item['info']['season'], 'item_type': 'season'} args = tools.quote(json.dumps(args, sort_keys=True)) item['trakt_object']['show_id'] = item['showInfo']['ids']['trakt'] name = item['info']['season_title'] if not self.is_aired(item['info']) or 'aired' not in item['info']: if tools.getSetting('general.hideUnAired') == 'true': continue name = tools.colorString(name, 'red') name = tools.italic_string(name) item['info']['title'] = name item['info'] = tools.clean_air_dates(item['info']) except: import traceback traceback.print_exc() continue if smartPlay is True: return args item_list.append(tools.addDirectoryItem(name, action, item['info'], item['art'], item['cast'], isFolder=True, isPlayable=False, actionArgs=args, set_ids=item['ids'], bulk_add=True)) tools.addMenuItems(syshandle, item_list, len(item_list))
def list_premiumize_transfers(self): from resources.lib.debrid import premiumize transfer_list = premiumize.PremiumizeFunctions().list_transfers() if len(transfer_list['transfers']) == 0 or 'transfers' not in transfer_list: tools.closeDirectory(self.view_type) return for i in transfer_list['transfers']: title = '%s - %s%% : %s' % \ (tools.colorString(i['status'].title()), str(i['progress'] * 100), i['name'][:50] + "...") tools.addDirectoryItem(title, '', None, None, isPlayable=False, isFolder=False, isAction=True) tools.closeDirectory(self.view_type)
def commonListBuilder(self, trakt_list, info_return=False): if len(trakt_list) == 0: return if 'movie' in trakt_list[0]: trakt_list = [i['movie'] for i in trakt_list] self.itemList = trakt_database.get_movie_list(trakt_list) self.itemList = [x for x in self.itemList if x is not None and 'info' in x] self.itemList = tools.sort_list_items(self.itemList, trakt_list) list_items = [] for item in self.itemList: try: name = tools.display_string(item['info']['title']) if not self.is_aired(item['info']): if tools.getSetting('general.hideUnAired') == 'true': continue name = tools.colorString(name, 'red') name = tools.italic_string(name) args = {'trakt_id': item['ids']['trakt'], 'item_type': 'movie'} args = tools.quote(json.dumps(args, sort_keys=True)) except: import traceback traceback.print_exc() continue if item is None: continue if 'trakt' in item['ids']: try: bookmark = bookmark_sync.get_bookmark(item['ids']['trakt']) item['info']['resumetime'] = bookmark['timeInSeconds'] if bookmark is not None else 0 item['info']['totaltime'] = item['info']['duration'] except: pass item['info']['title'] = item['info']['originaltitle'] = name list_items.append(tools.addDirectoryItem(name, 'getSources', item['info'], item['art'], item['cast'], isFolder=False, isPlayable=True, actionArgs=args, set_ids=item['ids'], bulk_add=True)) if info_return: return list_items tools.addMenuItems(syshandle, list_items, len(list_items))
def auth(self): self.ClientSecret = '' self.ClientID = 'X245A4XAIBGVM' url = ("client_id=%s&new_credentials=yes" % self.ClientID) url = self.OauthUrl + self.DeviceCodeUrl % url response = json.loads(requests.get(url).text) tools.copy2clip(response['user_code']) tools.progressDialog.create(tools.lang(32023).encode('utf-8')) tools.progressDialog.update( -1, tools.lang(32024).encode('utf-8') + ' %s' % tools.colorString('https://real-debrid.com/device'), tools.lang(32025).encode('utf-8') + ' %s' % tools.colorString(response['user_code']), 'This code has been copied to your clipboard') self.OauthTimeout = int(response['expires_in']) self.OauthTimeStep = int(response['interval']) self.DeviceCode = response['device_code'] while self.ClientSecret == '': self.auth_loop() self.token_request()
def list_RD_transfers(self): from resources.lib.debrid import real_debrid transfer_list = real_debrid.RealDebrid().list_torrents() if len(transfer_list) == 0: tools.closeDirectory(self.view_type) return for i in transfer_list: title = '%s - %s%% : %s' % \ (tools.colorString(i['status'].title()), str(i['progress']), i['filename'][:50] + "...") tools.addDirectoryItem(title, '', None, None, isPlayable=False, isFolder=False, isAction=True) tools.closeDirectory(self.view_type)
def get_assist_torrents(self): tools.addDirectoryItem('Clear Non Active...', 'nonActiveAssistClear', None, None) torrent_list = database.get_assist_torrents() if torrent_list is not None: for i in torrent_list: debrid = tools.shortened_debrid(i['provider']) title = tools.colorString('%s - %s - %s%% : %s' % (debrid, i['status'].title(), i['progress'], i['release_title'])) tools.addDirectoryItem(title, '', None, None) tools.closeDirectory('addons')
def user_select(self, folder_details, transfer_id): display_list = [tools.colorString(i['name']) for i in folder_details] selection = tools.showDialog.select(tools.addonName + ": Torrent File Picker", display_list) if selection == -1: return None selection = folder_details[selection] if selection['type'] != 'folder': streamlink = selection['link'] else: folder_details = self.list_folder(selection['id']) streamlink = self.user_select(folder_details, transfer_id) return streamlink
def auth(self): resp = self.get_json('pin/get') expiry = pin_ttl = int(resp['expires_in']) auth_complete = False tools.copy2clip(resp['pin']) tools.progressDialog.create( tools.addonName + ': AllDebrid Auth', line1=tools.getLangString(32024).format( tools.colorString(resp['base_url'])), line2=tools.getLangString(32025).format( tools.colorString(resp['pin'])), line3='This code has been copied to your clipboard') # Seems the All Debrid servers need some time do something with the pin before polling # Polling to early will cause an invalid pin error tools.kodi.sleep(5 * 1000) tools.progressDialog.update(100) while not auth_complete and not expiry <= 0 and not tools.progressDialog.iscanceled( ): auth_complete, expiry = self.poll_auth(check=resp['check'], pin=resp['pin']) progress_percent = 100 - int( (float(pin_ttl - expiry) / pin_ttl) * 100) tools.progressDialog.update(progress_percent) tools.kodi.sleep(1 * 1000) try: tools.progressDialog.close() except: pass self.store_user_info() if auth_complete: tools.showDialog.ok( tools.addonName, 'AllDebrid {}'.format(tools.getLangString(32026))) else: return
def wipe_install(): confirm = tools.showDialog.yesno(tools.addonName, tools.lang(33021).encode('utf-8')) if confirm == 0: return confirm = tools.showDialog.yesno(tools.addonName, tools.lang(32049).encode('utf-8') + '%s' % tools.colorString(tools.lang(32050).encode('utf-8'))) if confirm == 0: return import shutil, os if os.path.exists(tools.dataPath): shutil.rmtree(tools.dataPath) os.mkdir(tools.dataPath)
def update_properties(self): # Set Resolution count properties self.setProperty( '4k_sources', str(self.torrents_qual_len[0] + self.hosters_qual_len[0])) self.setProperty( '1080p_sources', str(self.torrents_qual_len[1] + self.hosters_qual_len[1])) self.setProperty( '720p_sources', str(self.torrents_qual_len[2] + self.hosters_qual_len[2])) self.setProperty( 'SD_sources', str(self.torrents_qual_len[3] + self.hosters_qual_len[3])) # Set total source type counts # self.setProperty('total_torrents', str(len([i for i in self.allTorrents]))) self.setProperty('total_torrents', str(len([i for i in self.allTorrents]))) self.setProperty('cached_torrents', str(len([i for i in self.torrentCacheSources]))) self.setProperty('hosters_sources', str(len([i for i in self.hosterSources]))) self.setProperty('cloud_sources', str(len([i for i in self.cloud_files]))) # Set remaining providers string self.setProperty("remaining_providers_count", str((len(self.remainingProviders)))) try: self.remaining_providers_list = self.getControl(2000) self.remaining_providers_list.reset() self.remaining_providers_list.addItems(self.remainingProviders) self.setProperty( "remaining_providers_list", tools.colorString(' | ').join( [i.upper() for i in self.remainingProviders])) except: pass
def wipe_install(): confirm = tools.showDialog.yesno( tools.addonName, 'This will completely wipe your addon settings.\n' 'Are you completely sure you want to do this?') if confirm == 0: return confirm = tools.showDialog.yesno( tools.addonName, 'Please be aware this will completely wipe the following:\n' 'Cached Data, Settings, Installed Providers\n' '%s' % tools.colorString('ARE YOU SURE?')) if confirm == 0: return import shutil, os if os.path.exists(tools.dataPath): shutil.rmtree(tools.dataPath) os.mkdir(tools.dataPath)
def update_properties(self): # Set Resolution count properties self.setProperty('4k_sources', str(self.torrents_qual_len[0] + self.hosters_qual_len[0])) self.setProperty('1080p_sources', str(self.torrents_qual_len[1] + self.hosters_qual_len[1])) self.setProperty('720p_sources', str(self.torrents_qual_len[2] + self.hosters_qual_len[2])) self.setProperty('SD_sources', str(self.torrents_qual_len[3] + self.hosters_qual_len[3])) # Set total source type counts # self.setProperty('total_torrents', str(len([i for i in self.allTorrents]))) self.setProperty('total_torrents', str(len([i for i in self.allTorrents]))) self.setProperty('cached_torrents', str(len([i for i in self.torrentCacheSources]))) self.setProperty('hosters_sources', str(len([i for i in self.hosterSources]))) self.setProperty('cloud_sources', str(len([i for i in self.cloud_files]))) # Set remaining providers string self.setProperty("remaining_providers_count", str((len(self.remainingProviders)))) self.setProperty("remaining_providers_list", ' | '.join([tools.colorString(i.upper()) for i in self.remainingProviders]))
def updateProgress(self): list1 = [ len([i for i in self.torrentCacheSources if i['quality'] == '4K']), len([ i for i in self.torrentCacheSources if i['quality'] == '1080p' ]), len([ i for i in self.torrentCacheSources if i['quality'] == '720p' ]), len([i for i in self.torrentCacheSources if i['quality'] == 'SD']), ] self.torrents_qual_len = list1 list2 = [ len([i for i in self.hosterSources if i['quality'] == '4K']), len([i for i in self.hosterSources if i['quality'] == '1080p']), len([i for i in self.hosterSources if i['quality'] == '720p']), len([i for i in self.hosterSources if i['quality'] == 'SD']), ] self.hosters_qual_len = list2 string1 = 'Torrents - 4K: %s | 1080: %s | 720: %s | SD: %s' % ( self.colorNumber(list1[0]), self.colorNumber(list1[1]), self.colorNumber(list1[2]), self.colorNumber(list1[3])) string2 = 'Hosters - 4k: %s | 1080: %s | 720: %s | SD: %s' % ( self.colorNumber(list2[0]), self.colorNumber(list2[1]), self.colorNumber(list2[2]), self.colorNumber(list2[3])) string4 = 'Free Hosters - 4k: 0 | 1080: 0 | 720: 0 | SD: 0' providerString = '' for i in self.remainingProviders: providerString += ', ' + tools.colorString(str(i)) string3 = 'Remaining Providers - %s' % providerString[2:] return [string1, string2, string3, string4]
def getSources(self, args): try: # Extract arguments from url self.args = json.loads(tools.unquote(args)) tools.log('Starting Scraping', 'debug') if 'showInfo' in self.args: background = self.args['showInfo']['art'].get('fanart', '') self.trakt_id = self.args['showInfo']['ids']['trakt'] else: self.trakt_id = self.args['ids']['trakt'] background = self.args['art'].get('fanart') self.setText(tools.lang(32081).encode('utf-8')) self.setBackground(background) try: self.getLocalTorrentResults() except: pass self.updateProgress() if not self.prem_terminate(): self.setText(tools.lang(32082).encode('utf-8')) self.initProviders() # Load threads for all sources for i in self.torrentProviders: self.torrent_threads.append( threading.Thread(target=self.getTorrent, args=(self.args, i))) for i in self.hosterProviders: self.hoster_threads.append( threading.Thread(target=self.getHosters, args=(self.args, i))) # Shuffle and start scraping threads random.shuffle(self.torrent_threads) random.shuffle(self.hoster_threads) for i in self.torrent_threads: i.start() time.sleep(2) for i in self.hoster_threads: i.start() self.setText(tools.lang(32083).encode('utf-8')) # Keep alive for gui display and threading timeout = int(tools.getSetting('general.timeout')) tools.log('Entering Keep Alive', 'info') runtime = 0 while self.progress < 100: tools.log('Remainin Providers %s' % self.remainingProviders) if self.prem_terminate() is True or len( self.remainingProviders) == 0: if runtime > 5: break if self.canceled: break self.updateProgress() # tools.progressDialog.update(progressPercent, line1, line2, line3) try: self.setProgress() self.setText("4K: %s | 1080: %s | 720: %s | SD: %s" % ( tools.colorString(self.torrents_qual_len[0] + self.hosters_qual_len[0]), tools.colorString(self.torrents_qual_len[1] + self.hosters_qual_len[1]), tools.colorString(self.torrents_qual_len[2] + self.hosters_qual_len[2]), tools.colorString(self.torrents_qual_len[3] + self.hosters_qual_len[3]), )) self.setText2( "Torrents: %s | Cached: %s | Hosters: %s" % (tools.colorString(len(self.allTorrents)), tools.colorString(len(self.torrentCacheSources)), tools.colorString(len(self.hosterSources)))) self.setText3( "Remaining Sources: %s" % tools.colorString(len(self.remainingProviders))) except: import traceback traceback.print_exc() # Update Progress time.sleep(1) runtime += 1 self.progress = int(100 - float(1 - (runtime / float(timeout))) * 100) tools.log('Exited Keep Alive', 'info') self.debridHosterDuplicates() ##### DUPLICATE REMOVAL ##### # Remove Duplicate Torrent Sources post_dup = [] check_list = [] for i in self.torrentCacheSources: if not [i['hash'].lower(), i['debrid_provider']] in check_list: post_dup.append(i) check_list.append( [i['hash'].lower(), i['debrid_provider']]) else: self.duplicates_amount += 1 self.torrentCacheSources = post_dup # Remove Duplicate Hoster Sources post_dup = [] check_list = [] debrid_hosts = copy.deepcopy(self.hosterSources) debrid_hosts = [i for i in debrid_hosts if 'debrid_provider' in i] non_debrid = copy.deepcopy(self.hosterSources) non_debrid = [i for i in non_debrid if 'debrid_provider' not in i] for i in debrid_hosts: if not [str(i['url']).lower(), i['debrid_provider'] ] in check_list: post_dup.append(i) check_list.append( [str(i['url']).lower(), i['debrid_provider']]) else: self.duplicates_amount += 1 check_list = [] for i in non_debrid: if not str(i['url']).lower() in check_list: post_dup.append(i) check_list.append(str(i['url']).lower()) else: self.duplicates_amount += 1 self.hosterSources = post_dup if not self.silent: if self.duplicates_amount > 0: try: tools.showDialog.notification( tools.addonName, '%s ' % str(self.duplicates_amount + tools.lang(32084).encode('utf-8')), sound=False) except: pass self.build_cache_assist(self.args) # Returns empty list if no sources are found, otherwise sort sources if len(self.torrentCacheSources) + len(self.hosterSources) == 0: try: tools.playList.clear() tools.closeOkDialog() except: pass if self.silent: tools.showDialog.notification( tools.addonName, tools.lang(32085).encode('utf-8')) self.return_data = ([], self.args) self.close() return sorted = self.sortSources(self.torrentCacheSources, self.hosterSources) self.return_data = [sorted, self.args] self.close() return except: self.close() import traceback traceback.print_exc()
def directToEpisodeBuilder(self, trakt_list, sort=None): self.threadList = [] traktWatched = trakt.json_response('sync/watched/shows') try: if len(trakt_list) == 0: return for item in trakt_list: # if tools.getSetting('general.metalocation') == '1': if 1 == 1: self.threadList.append(Thread(target=self.tvdbEpisodeWorker, args=(item['episode'], item['show']))) else: self.threadList.append(Thread(target=self.tmdbEpisodeWorker, args=(item[0], item[1]))) self.runThreads() self.itemList = [i for i in self.itemList if i is not None] if sort is not None: sorted_list = [] for sort_id in sort['id_list']: for menu_item in self.itemList: if menu_item[sort['type']]['ids']['trakt'] == sort_id: sorted_list.append(menu_item) self.itemList = sorted_list else: self.itemList = sorted(self.itemList, key=lambda i: tools.datetime_workaround(i['info']['premiered']), reverse=True) for item in self.itemList: if item is None: continue try: currentDate = datetime.datetime.today().date() airdate = item['info']['premiered'] if airdate == '': continue airdate = tools.datetime_workaround(airdate) if airdate > currentDate: continue except: import traceback traceback.print_exc() pass if item['info'].get('title', '') == '': continue cm = [] action = '' if tools.getSetting('trakt.auth') != '': try: item['info']['playcount'] = 0 for show in traktWatched: if str(show['show']['ids']['trakt']) == str(item['showInfo']['ids']['trakt']): for season in show['seasons']: if str(season['number']) == str(item['info']['season']): for episode in season['episodes']: if str(episode['number']) == str(item['info']['episode']): if episode['plays'] > 0: item['info']['playcount'] = 1 except: pass try: args = {'showInfo': {}, 'episodeInfo': {}} if tools.getSetting('smartplay.playlistcreate') == 'true': action = 'smartPlay' playable = False else: playable = True action = 'getSources' args['showInfo'] = item['showInfo'] args['episodeInfo']['info'] = item['info'] args['episodeInfo']['art'] = item['art'] args['episodeInfo']['ids'] = item['ids'] name = item['info']['title'] if self.title_appends == 'true': name = "%s: %sx%s %s" % (tools.colorString(args['showInfo']['info']['tvshowtitle']), str(item['info']['season']).zfill(2), str(item['info']['episode']).zfill(2), item['info']['title'].encode('utf-8')) args = tools.quote(json.dumps(args, sort_keys=True)) item['info']['title'] = item['info']['originaltitle'] = name cm.append((tools.lang(32069).encode('utf-8'), 'XBMC.Container.Update(%s?action=showSeasons&actionArgs=%s)' % (sysaddon, tools.quote(json.dumps(item['showInfo']))))) cm.append((tools.lang(32066).encode('utf-8'), 'PlayMedia(%s?action=getSources&source_select=true&actionArgs=%s)' % (sysaddon, args))) cm.append((tools.lang(33022).encode('utf-8'), 'PlayMedia(%s?action=getSources&seren_reload=true&actionArgs=%s)' % (sysaddon, args))) if tools.getSetting('trakt.auth') != '': cm.append(('Trakt Manager', 'RunPlugin(%s?action=traktManager&actionArgs=%s)' % (sysaddon, tools.quote(json.dumps(item['trakt_object']))))) if tools.context_addon(): cm = [] if tools.getSetting('premiumize.enabled') == 'true' and tools.getSetting('premiumize.pin') != '': cm.append((tools.lang(32068).encode('utf-8'), 'XBMC.RunPlugin(%s?action=filePicker&actionArgs=%s)' % (sysaddon, args))) except: import traceback traceback.print_exc() continue tools.addDirectoryItem(name, action, item['info'], item['art'], cm=cm, isFolder=False, isPlayable=playable, actionArgs=args, set_ids=item['ids']) except: import traceback traceback.print_exc()
def mixedEpisodeBuilder(self, trakt_list, sort=None, hide_watched=False, smartPlay=False, hide_unaired=True, prepend_date=False): self.threadList = [] try: if len(trakt_list) == 0: return self.itemList = TraktSyncDatabase().get_episode_list(trakt_list) self.itemList = [ x for x in self.itemList if x is not None and 'info' in x ] self.itemList = [ i for i in self.itemList if 'info' in i and i['info'].get('premiered', None) is not None ] if sort is None: self.itemList = sorted( self.itemList, key=lambda i: tools.datetime_workaround( i['info']['premiered'], tools.trakt_gmt_format, False), reverse=True) elif sort is not False: sort_list = [] for trakt_id in sort['id_list']: try: if not sort['type']: item = [ i for i in self.itemList if i['ids']['trakt'] == trakt_id ][0] else: item = [ i for i in self.itemList if i[sort['type']]['ids']['trakt'] == trakt_id ][0] sort_list.append(item) except IndexError: continue except: import traceback traceback.print_exc() self.itemList = sort_list item_list = [] for item in self.itemList: if item is None: continue if item['info'].get('title', '') == '': continue if hide_watched and item['info']['playcount'] != 0: continue cm = [] try: name = tools.display_string(item['info']['title']) if not self.is_aired( item['info']) and hide_unaired is True: continue elif not self.is_aired(item['info']): name = tools.colorString(name, 'red') name = tools.italic_string(name) item['info']['title'] = name item['info'] = tools.clean_air_dates(item['info']) args = {'showInfo': {}, 'episodeInfo': {}} if tools.getSetting('smartplay.playlistcreate' ) == 'true' and not smartPlay: action = 'smartPlay' playable = False else: playable = True action = 'getSources' args['showInfo'] = item['showInfo'] args['episodeInfo']['info'] = item['info'] args['episodeInfo']['art'] = item['art'] args['episodeInfo']['ids'] = item['ids'] if self.title_appends == 'true': name = "%s: %sx%s %s" % ( tools.colorString( args['showInfo']['info']['tvshowtitle']), tools.display_string( item['info']['season']).zfill(2), tools.display_string( item['info']['episode']).zfill(2), tools.display_string(item['info']['title'])) if prepend_date: release_day = tools.datetime_workaround( item['info']['aired']) release_day = release_day.strftime('%d %b') name = '[%s] %s' % (release_day, name) args = tools.quote(json.dumps(args, sort_keys=True)) cm.append((tools.lang( 32069 ), 'XBMC.Container.Update(%s?action=showSeasons&actionArgs=%s)' % (sysaddon, tools.quote(json.dumps(str( item['showInfo'])))))) cm.append((tools.lang( 32066 ), 'PlayMedia(%s?action=getSources&source_select=true&actionArgs=%s)' % (sysaddon, args))) cm.append((tools.lang( 33022 ), 'PlayMedia(%s?action=getSources&seren_reload=true&actionArgs=%s)' % (sysaddon, args))) if tools.getSetting('trakt.auth') != '': cm.append(( 'Trakt Manager', 'RunPlugin(%s?action=traktManager&actionArgs=%s)' % (sysaddon, tools.quote(json.dumps(str( item['trakt_object'])))))) if tools.context_addon(): cm = [] if tools.getSetting( 'premiumize.enabled' ) == 'true' and tools.getSetting('premiumize.pin') != '': cm.append((tools.lang( 32068 ), 'XBMC.RunPlugin(%s?action=filePicker&actionArgs=%s)' % (sysaddon, args))) item['info']['title'] = item['info'][ 'originaltitle'] = name item_list.append( tools.addDirectoryItem(name, action, item['info'], item['art'], isFolder=False, isPlayable=playable, actionArgs=args, bulk_add=True, set_ids=item['ids'], cm=cm)) except: import traceback traceback.print_exc() continue if smartPlay is True: return item_list else: tools.addMenuItems(syshandle, item_list, len(item_list)) except: import traceback traceback.print_exc()
def mixedEpisodeBuilder(self, trakt_list, sort=None, hide_watched=False, smartPlay=False, hide_unaired=True, prepend_date=False): try: if len(trakt_list) == 0: tools.log('We received no titles to build a list', 'error') return self.itemList = trakt_database.get_episode_list(trakt_list) self.itemList = [x for x in self.itemList if x is not None and 'info' in x] self.itemList = [i for i in self.itemList if 'info' in i and i['info'].get('premiered', None) is not None] self.itemList = [i for i in self.itemList if 'info' in i and i['info'].get('premiered', '') is not ''] if sort is None: self.itemList = sorted(self.itemList, key=lambda i: tools.datetime_workaround(i['info']['premiered'], tools.trakt_gmt_format, False), reverse=True) elif sort is not False: sort_list = [] for trakt_id in sort['id_list']: try: if not sort['type']: item = [i for i in self.itemList if i['ids']['trakt'] == trakt_id][0] else: item = [i for i in self.itemList if i[sort['type']]['ids']['trakt'] == trakt_id][0] sort_list.append(item) except IndexError: continue except: import traceback traceback.print_exc() self.itemList = sort_list item_list = [] for item in self.itemList: if item is None: continue if item['info'].get('title', '') == '': continue if hide_watched and item['info']['playcount'] != 0: continue try: name = tools.display_string(item['info']['title']) if not self.is_aired(item['info']) and hide_unaired is True: continue elif not self.is_aired(item['info']): name = tools.colorString(name, 'red') name = tools.italic_string(name) item['info']['title'] = name item['info'] = tools.clean_air_dates(item['info']) args = {'trakt_id': item['showInfo']['ids']['trakt'], 'season': item['info']['season'], 'episode': item['info']['episode'], 'item_type': 'episode'} args = tools.quote(json.dumps(args, sort_keys=True)) if self.title_appends == 'true': name = "%s: %sx%s %s" % (tools.colorString(item['showInfo']['info']['tvshowtitle']), tools.display_string(item['info']['season']).zfill(2), tools.display_string(item['info']['episode']).zfill(2), tools.display_string(item['info']['title'])) if prepend_date: release_day = tools.datetime_workaround(item['info']['aired']) if release_day: release_day = release_day.strftime('%d %b') name = '[%s] %s' % (release_day, name) item['info']['title'] = item['info']['originaltitle'] = name if 'trakt' in item['ids']: try: bookmark = bookmark_sync.get_bookmark(item['ids']['trakt']) item['info']['resumetime'] = bookmark['timeInSeconds'] if bookmark is not None else 0 item['info']['totaltime'] = item['info']['duration'] except: pass item_list.append(tools.addDirectoryItem(name, 'getSources', item['info'], item['art'], item['cast'], isFolder=False, isPlayable=True, actionArgs=args, bulk_add=True, set_ids=item['ids'])) except: import traceback traceback.print_exc() continue if smartPlay is True: return item_list else: tools.addMenuItems(syshandle, item_list, len(item_list)) except: import traceback traceback.print_exc()
def episodeListBuilder(self, show_id, season_number=None, smartPlay=False, hide_unaired=False): try: item_list = [] if season_number is not None: self.itemList = trakt_database.get_season_episodes(show_id, season_number) else: self.itemList = trakt_database.get_flat_episode_list(show_id) if tools.getSetting('general.hideSpecials') == 'true': self.itemList = [i for i in self.itemList if i['info']['season'] != 0] self.itemList = [x for x in self.itemList if x is not None and 'info' in x] if len(self.itemList) == 0: tools.log('We received no titles to build a list', 'error') return if season_number is not None: # Building a list of a season, sort by episode try: self.itemList = sorted(self.itemList, key=lambda k: k['info']['episode']) except: pass else: # Building a flat list of episodes, sort by season, then episode try: self.itemList = sorted(self.itemList, key=lambda k: (k['info']['season'], k['info']['episode'])) except: pass for item in self.itemList: try: args = {'trakt_id': item['showInfo']['ids']['trakt'], 'season': item['info']['season'], 'episode': item['info']['episode'], 'item_type': 'episode'} args = tools.quote(json.dumps(args, sort_keys=True)) name = item['info']['title'] if not self.is_aired(item['info']): if tools.getSetting('general.hideUnAired') == 'true' or hide_unaired: continue else: name = tools.colorString(name, 'red') name = tools.italic_string(name) item['info']['title'] = name item['info'] = tools.clean_air_dates(item['info']) item['info']['studio'] = item['showInfo']['info']['studio'] if 'trakt' in item['ids']: try: item['info']['resumetime'] = bookmark_sync.get_bookmark(item['ids']['trakt'])[ 'timeInSeconds'] item['info']['totaltime'] = item['info']['duration'] except: pass except: import traceback traceback.print_exc() continue item_list.append(tools.addDirectoryItem(name, 'getSources', item['info'], item['art'], item['cast'], isFolder=False, isPlayable=True, actionArgs=args, bulk_add=True, set_ids=item['ids'])) if smartPlay is True: return item_list else: tools.addMenuItems(syshandle, item_list, len(item_list)) except: import traceback traceback.print_exc()
def showListBuilder(self, trakt_list, forceResume=False, info_only=False): try: if len(trakt_list) == 0: return except: return if 'show' in trakt_list[0]: trakt_list = [i['show'] for i in trakt_list] show_ids = [i['ids']['trakt'] for i in trakt_list] self.itemList = TraktSyncDatabase().get_show_list(show_ids) self.itemList = [ x for x in self.itemList if x is not None and 'info' in x ] self.itemList = tools.sort_list_items(self.itemList, trakt_list) item_list = [] for item in self.itemList: try: args = {} cm = [] # Add Arguments to pass with items args['ids'] = item['ids'] args['info'] = item['info'] args['art'] = item['art'] name = tools.display_string(item['info']['tvshowtitle']) args = tools.quote(json.dumps(args, sort_keys=True)) if info_only == True: return args if not self.is_aired(item['info']): if tools.getSetting('general.hideUnAired') == 'true': continue name = tools.colorString(name, 'red') name = tools.italic_string(name) item['info'] = tools.clean_air_dates(item['info']) if 'setCast' in item: set_cast = item['setCast'] else: set_cast = False if tools.getSetting('smartplay.clickresume' ) == 'true' or forceResume is True: action = 'smartPlay' else: action = 'showSeasons' # Context Menu Items cm.append( (tools.lang(32070), 'XBMC.PlayMedia(%s?action=shufflePlay&actionArgs=%s)' % (sysaddon, args))) cm.append( (tools.lang(32020), 'Container.Update(%s?action=showsRelated&actionArgs=%s)' % (sysaddon, item['ids']['trakt']))) cm.append((tools.lang( 32069 ), 'XBMC.Container.Update(%s?action=showSeasons&actionArgs=%s)' % (sysaddon, args))) if tools.getSetting('trakt.auth') != '': cm.append( ('Trakt Manager', 'RunPlugin(%s?action=traktManager&actionArgs=%s)' % (sysaddon, tools.quote(json.dumps(item['trakt_object']))))) cm.append((tools.lang( 40153 ), 'XBMC.PlayMedia(%s?aciton=playFromRandomPoint&actionArgs=%s' % (sysaddon, args))) if tools.context_addon(): cm = [] except: import traceback traceback.print_exc() continue item_list.append( tools.addDirectoryItem(name, action, item['info'], item['art'], cm=cm, isFolder=True, isPlayable=False, actionArgs=args, bulk_add=True, set_cast=set_cast, set_ids=item['ids'])) tools.addMenuItems(syshandle, item_list, len(item_list))