def doModal(self, sources, args, pack_select): if tools.getSetting('general.tempSilent') == 'true': self.silent = True self.sources = sources self.args = args self.pack_select = pack_select self.setProperty( 'release_title', tools.display_string(self.sources[0]['release_title'])) self.setProperty( 'debrid_provider', self.sources[0].get('debrid_provider', 'None').replace('_', ' ')) self.setProperty('source_provider', self.sources[0]['provider']) self.setProperty('source_resolution', self.sources[0]['quality']) self.setProperty('source_info', " ".join(self.sources[0]['info'])) self.setProperty('source_type', self.sources[0]['type']) if 'size' in self.sources[0]: self.setProperty( 'source_size', tools.source_size_display(self.sources[0]['size'])) if not self.silent: super(Resolver, self).doModal() else: self.resolve(sources, args, pack_select) if not self.canceled: return self.return_data else: return None
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 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' or source['type'] == 'cloud': 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, tools.display_string(release_title)) if source['type'] == 'hoster': title = "%s |%s %s | %s %s\n%s" % ( quality, debrid_provider, source['provider'].upper(), source['source'], info, tools.display_string(release_title), ) if tools.getSetting('general.sourceselectlines') == 'false': title = title.replace('\n', ' | ') return title
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 moviesSearch(self, actionArgs=None): if actionArgs == None: k = tools.showKeyboard('', tools.lang(32016)) k.doModal() query = (k.getText() if k.isConfirmed() else None) if query == None or query == '': return else: query = actionArgs database.addSearchHistory(query, 'movie') query = tools.deaccentString(tools.display_string(query)) tools.quote(query) tools.closeAllDialogs() tools.closeDirectory('movies') tools.execute("Container.Update(%s?action=moviesSearchResults&actionArgs=%s, replace)'" % (sysaddon, query))
def showsSearch(self, actionArgs=None): if actionArgs == None: k = tools.showKeyboard('', tools.lang(32016)) k.doModal() query = (k.getText() if k.isConfirmed() else None) if query == None or query == '': tools.cancel_directory() return else: query = actionArgs query = query.decode('utf-8') database.addSearchHistory(query, 'show') query = tools.deaccentString(tools.display_string(query)) query = tools.quote(query) self.showsSearchResults(query)
def moviesSearch(self, actionArgs=None): if actionArgs == None: k = tools.showKeyboard('', tools.lang(32016)) k.doModal() query = (k.getText() if k.isConfirmed() else None) if query == None or query == '': return else: query = actionArgs database.addSearchHistory(query, 'movie') query = tools.deaccentString(tools.display_string(query)) query = tools.quote_plus(query) trakt_list = trakt.json_response('search/movie?query=%s' % query) if trakt_list is None: return self.commonListBuilder(trakt_list) tools.closeDirectory('movies')
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 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))
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 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)) # Begin Building Context Menu Items cm = [] cm.append((tools.lang(32020), 'Container.Update(%s?action=moviesRelated&actionArgs=%s)' % ( sysaddon, item['ids']['trakt']))) cm.append((tools.lang(32066), 'PlayMedia(%s?action=getSourcesWorkaround&source_select=true&actionArgs=%s)' % (sysaddon, args))) cm.append((tools.lang(33022), 'PlayMedia(%s?action=getSourcesWorkaround&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 = [] except: import traceback traceback.print_exc() continue if item is None: continue item['info']['title'] = item['info']['originaltitle'] = name list_items.append(tools.addDirectoryItem(name, 'getSources', item['info'], item['art'], cm=cm, 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 resolve(self, sources, args, pack_select=False): try: if 'showInfo' in args: background = args['showInfo']['art']['fanart'] else: background = args['fanart'] self.setText(tools.lang(33000)) self.setBackground(background) stream_link = None loop_count = 0 # Begin resolving links tools.log('Attempting to Resolve file link', 'info') for i in sources: debrid_provider = i.get('debrid_provider', 'None').replace('_', ' ') loop_count += 1 try: if self.is_canceled(): self.close() return if 'size' in i: i['info'].append(tools.source_size_display(i['size'])) loop_count_string = "(" + str(loop_count) + " of " + str( len(sources)) + ")" line1 = "%s %s - %s" % (tools.lang(32036), tools.colorString( tools.display_string( i['release_title'])), loop_count_string) line2 = "%s %s | Source: %s" % ( tools.lang(32037), tools.colorString(debrid_provider.upper()), tools.colorString(i['source'])) line3 = '%s %s | Info: %s' % ( tools.lang(32038), tools.colorString(i['quality']), tools.colorString(" ".join(i['info']))) self.setText(line1) self.setText2(line2) self.setText3(line3) if i['type'] == 'torrent': if i['debrid_provider'] == 'premiumize': stream_link = self.premiumizeResolve( i, args, pack_select) elif i['debrid_provider'] == 'real_debrid': stream_link = self.realdebridResolve(i, args) if stream_link is None: tools.log('Failed to resolve for torrent %s' % i['release_title']) continue else: self.return_data = stream_link self.close() return elif i['type'] == 'hoster' or i['type'] == 'cloud': # Quick fallback to speed up resolving while direct and free hosters are not supported if 'provider_imports' in i: provider = i['provider_imports'] providerModule = __import__( '%s.%s' % (provider[0], provider[1]), fromlist=['']) providerModule = providerModule.source() try: i['url'] = providerModule.resolve(i['url']) except: import traceback traceback.print_exc() pass if i['url'] is None: continue if 'debrid_provider' in i: if i['debrid_provider'] == 'premiumize' and tools.premiumize_enabled( ): stream_link = self.premiumizeResolve(i, args) if stream_link is None: continue if i['debrid_provider'] == 'real_debrid' and tools.real_debrid_enabled( ): stream_link = self.realdebridResolve(i, args) if stream_link is None: continue else: # Currently not supporting free hosters at this point in time # ResolveURL and Direct link testing needs to be tested first try: ext = i['url'].split('?')[0].split( '&')[0].split('|')[0].rsplit( '.')[-1].replace('/', '').lower() if ext == 'rar': raise Exception() try: headers = i['url'].rsplit('|', 1)[1] except: headers = '' try: headers = i['url'].rsplit('|', 1)[1] except: headers = '' headers = tools.quote_plus(headers).replace( '%3D', '=') if ' ' in headers else headers headers = dict(tools.parse_qsl(headers)) live_check = requests.head(i['url'], headers=headers, timeout=10) if not live_check.status_code == 200: continue stream_link = i['url'] except: stream_link = None if stream_link is None: continue else: if stream_link.endswith('.rar'): continue self.return_data = stream_link self.close() return continue except: import traceback traceback.print_exc() continue self.close() if tools.getSetting('premiumize.enabled') == 'true': tools.execute( 'RunPlugin("plugin://plugin.video.%s/?action=premiumizeCleanup")' % tools.addonName.lower()) return except: import traceback traceback.print_exc() self.close() return
def __str__(self): from resources.lib.common.tools import display_string return display_string(self._label)
def resolve(self, sources, args, pack_select=False): try: stream_link = None loop_count = 0 # Begin resolving links for i in sources: debrid_provider = i.get('debrid_provider', 'None').replace('_', ' ') loop_count += 1 try: if self.is_canceled(): self.close() return if 'size' in i: i['info'].append(tools.source_size_display(i['size'])) self.setProperty('release_title', tools.display_string(i['release_title'])) self.setProperty('debrid_provider', debrid_provider) self.setProperty('source_provider', i['provider']) self.setProperty('source_resolution', i['quality']) self.setProperty('source_info', " ".join(i['info'])) if i['type'] == 'torrent': stream_link = self.resolve_source( self.resolvers[i['debrid_provider']], i, args, pack_select) if stream_link is None: tools.log('Failed to resolve for torrent %s' % i['release_title']) continue else: self.return_data = stream_link self.close() return elif i['type'] == 'hoster' or i['type'] == 'cloud': if i['url'] is None: continue if i['type'] == 'cloud' and i[ 'debrid_provider'] == 'premiumize': selected_file = Premiumize.Premiumize( ).item_details(i['url']) if tools.getSetting( 'premiumize.transcoded') == 'true': url = selected_file['stream_link'] else: url = selected_file['link'] self.return_data = url self.close() return if 'provider_imports' in i: provider = i['provider_imports'] providerModule = __import__( '%s.%s' % (provider[0], provider[1]), fromlist=['']) providerModule = providerModule.source() try: i['url'] = providerModule.resolve(i['url']) except: import traceback traceback.print_exc() pass if 'debrid_provider' in i: stream_link = self.resolve_source( self.resolvers[i['debrid_provider']], i, args, pack_select) if stream_link is None: continue else: try: requests.head(stream_link, timeout=1) except requests.exceptions.RequestException: tools.log( 'Head Request failed link likely dead, skipping' ) continue elif i['url'].startswith('http'): try: ext = i['url'].split('?')[0] ext = ext.split('&')[0] ext = ext.split('|')[0] ext = ext.rsplit('.')[-1] ext = ext.replace('/', '').lower() if ext == 'rar': raise Exception() try: headers = i['url'].rsplit('|', 1)[1] except: headers = '' headers = tools.quote_plus(headers).replace( '%3D', '=') if ' ' in headers else headers headers = dict(tools.parse_qsl(headers)) live_check = requests.head(i['url'], headers=headers, timeout=10) if not live_check.status_code == 200: tools.log( 'Head Request failed link likely dead, skipping' ) continue stream_link = i['url'] except: import traceback traceback.print_exc() stream_link = None elif tools.file_exists(i['url']): stream_link = i['url'] if stream_link is None: continue else: if stream_link.endswith('.rar'): continue self.return_data = stream_link self.close() return continue except: import traceback traceback.print_exc() continue self.close() return except: import traceback traceback.print_exc() self.close() return
def resolve(self, sources, args, pack_select=False): try: if 'showInfo' in args: background = args['showInfo']['art']['fanart'] else: background = args['art']['fanart'] stream_link = None loop_count = 0 # Begin resolving links tools.log('Attempting to Resolve file link', 'info') for i in sources: debrid_provider = i.get('debrid_provider', 'None').replace('_', ' ') loop_count += 1 try: if self.is_canceled(): self.close() return if 'size' in i: i['info'].append(tools.source_size_display(i['size'])) self.setProperty('release_title', tools.display_string(i['release_title'])) self.setProperty('debrid_provider', debrid_provider) self.setProperty('source_provider', i['source']) self.setProperty('source_resolution', i['quality']) self.setProperty('source_info', " ".join(i['info'])) if i['type'] == 'torrent': if i['debrid_provider'] == 'premiumize': stream_link = self.premiumizeResolve( i, args, pack_select) elif i['debrid_provider'] == 'real_debrid': stream_link = self.realdebridResolve(i, args) if stream_link is None: tools.log('Failed to resolve for torrent %s' % i['release_title']) continue else: self.return_data = stream_link self.close() return elif i['type'] == 'hoster' or i['type'] == 'cloud': # Quick fallback to speed up resolving while direct and free hosters are not supported if 'provider_imports' in i: provider = i['provider_imports'] providerModule = __import__( '%s.%s' % (provider[0], provider[1]), fromlist=['']) providerModule = providerModule.source() try: i['url'] = providerModule.resolve(i['url']) except: import traceback traceback.print_exc() pass if i['url'] is None: continue if 'debrid_provider' in i: if i['debrid_provider'] == 'premiumize' and tools.premiumize_enabled( ): stream_link = self.premiumizeResolve(i, args) if stream_link is None: continue else: try: requests.head(stream_link, timeout=1) except: tools.log( 'Head Request failed link might be dead, skipping' ) continue if i['debrid_provider'] == 'real_debrid' and tools.real_debrid_enabled( ): stream_link = self.realdebridResolve(i, args) if stream_link is None: continue try: requests.head(stream_link, timeout=1) except: tools.log( 'Head Request failed link might be dead, skipping' ) continue else: # Currently not supporting free hosters at this point in time # ResolveURL and Direct link testing needs to be tested first try: ext = i['url'].split('?')[0].split( '&')[0].split('|')[0].rsplit( '.')[-1].replace('/', '').lower() if ext == 'rar': raise Exception() try: headers = i['url'].rsplit('|', 1)[1] except: headers = '' try: headers = i['url'].rsplit('|', 1)[1] except: headers = '' headers = tools.quote_plus(headers).replace( '%3D', '=') if ' ' in headers else headers headers = dict(tools.parse_qsl(headers)) live_check = requests.head(i['url'], headers=headers, timeout=10) if not live_check.status_code == 200: continue stream_link = i['url'] except: stream_link = None if stream_link is None: continue else: if stream_link.endswith('.rar'): continue self.return_data = stream_link self.close() return continue except: import traceback traceback.print_exc() continue self.close() return except: import traceback traceback.print_exc() self.close() return