def showsSearchResults(self, query): query = tools.quote_plus(tools.unquote(query)) trakt_list = trakt.json_response( 'search/show?query=%s&extended=full&type=show&field=title' % query) if trakt_list is None: tools.cancel_directory() return self.showListBuilder( [show for show in trakt_list if float(show['score']) > 0]) tools.closeAllDialogs() tools.closeDirectory('tvshows')
def moviesSearch(self): k = tools.showKeyboard('', tools.lang(32016).encode('utf-8')) k.doModal() query = (k.getText() if k.isConfirmed() else None) if query == None or query == '': return query = tools.deaccentString(query.encode('utf-8')) query = tools.quote_plus(query) traktList = trakt.json_response('search/movie?query=%s' % query) self.commonListBuilder(traktList) tools.closeDirectory('movies', viewType=self.viewType)
def showsSearch(self): k = tools.showKeyboard('', tools.lang(32016)) k.doModal() query = (k.getText() if k.isConfirmed() else None) if query == None or query == '': return query = tools.deaccentString(query) query = tools.quote_plus(query) traktList = trakt.json_response('search/show?query=%s&extended=full' % query, limit=True) self.showListBuilder(traktList) tools.closeDirectory('tvshows')
def getListItems(self, arguments, page): from resources.lib.modules import database arguments = json.loads(tools.unquote(arguments)) media_type = arguments['type'] username = tools.quote_plus(arguments['username']) url = 'users/%s/lists/%s/items/%s?extended=full' % ( username, arguments['trakt_id'], media_type) list_items = database.get(self.json_response, 12, url, None, False) if list_items is None or len(list_items) == 0: return if media_type == 'movies': media_type = 'movie' if media_type == 'shows': media_type = 'show' list_items = self.sort_list(arguments['sort_by'], arguments['sort_how'], list_items, media_type) if media_type == 'show': list_items = [ i['show'] for i in list_items if i['type'] == 'show' and i is not None ] from resources.lib.gui import tvshowMenus tvshowMenus.Menus().showListBuilder(list_items) if media_type == 'movie': list_items = [ i['movie'] for i in list_items if i['type'] == 'movie' and i is not None ] from resources.lib.gui import movieMenus movieMenus.Menus().commonListBuilder(list_items) content_type = 'tvshows' if media_type == 'movie': content_type = 'movies' tools.closeDirectory(content_type) return
def _sync_lists(self, lists_to_sync): trakt_api = Trakt.TraktAPI() media_types = ['movie', 'show'] update_time = str(datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S')) total_lists = len(lists_to_sync) * len(media_types) processed_lists = 0 list_sync = lists.TraktSyncDatabase() for media_type in media_types: for trakt_list in lists_to_sync: if not self.silent: processed_lists += 1 self.progress_dialog.update( int(float(processed_lists) / float(total_lists) * 100), 'Syncing lists') url = 'users/%s/lists/%s/items/%s?extended=full' % ( trakt_list['user']['ids']['slug'], trakt_list['ids']['trakt'], media_type) list_items = trakt_api.json_response(url, limit=False) if list_items is None or len(list_items) == 0: list_sync.remove_list(trakt_list['ids']['trakt'], media_type) continue list_items = trakt_api.sort_list(trakt_list['sort_by'], trakt_list['sort_how'], list_items, media_type) list_items = [ i[media_type] for i in list_items if i['type'] == media_type and i is not None ] list_sync.add_list( trakt_list['ids']['trakt'], list_items, trakt_list['name'], tools.quote_plus(trakt_list['user']['ids']['slug']), 'myLists', media_type, trakt_list['updated_at'], len(list_items), trakt_list['sort_by'], trakt_list['sort_how'], trakt_list['ids']['slug']) if not self.silent: self.progress_dialog.update(100, 'Syncing lists') self._update_activity_record('lists_sync', update_time)
def moviesSearch(self, actionArgs=None): if actionArgs == None: k = tools.showKeyboard('', tools.lang(32016).encode('utf-8')) 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(query.encode('utf-8')) 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', viewType=self.viewType)
def showsSearch(self, actionArgs): if actionArgs == None: k = tools.showKeyboard('', tools.lang(32016).encode('utf-8')) k.doModal() query = (k.getText() if k.isConfirmed() else None) if query == None or query == '': return else: query = actionArgs database.addSearchHistory(query, 'show') query = tools.deaccentString(query) query = tools.quote_plus(query) trakt_list = trakt.json_response('search/show?query=%s&extended=full' % query, limit=True) if trakt_list is None: return self.showListBuilder(trakt_list) tools.closeDirectory('tvshows')
def shows_by_actor(self, query): if not query: query = g.get_keyboard_input(g.get_language_string(30013)) if not query: g.cancel_directory() return if g.get_bool_setting("searchHistory"): self.search_history.add_search_history("showActor", query) query = g.transliterate_string(query) # Try to deal with transliterated chinese actor names as some character -> word transliterations can be joined # I have no idea of the rules and it could well be arbitrary # This approach will only work if only one pair of adjoining transliterated chars are joined name_parts = query.split() for i in range(len(name_parts), 0, -1): query = "-".join(name_parts[:i]) + "-".join(name_parts[i:i + 1]) query = tools.quote_plus(query) trakt_list = self.shows_database.extract_trakt_page( "people/{}/shows".format(query), extended="full", page=g.PAGE, hide_watched=False, hide_unaired=False, ) if not trakt_list: continue else: break try: if not trakt_list or 'trakt_id' not in trakt_list[0]: raise KeyError except KeyError: g.cancel_directory() return self.list_builder.show_list_builder(trakt_list, hide_watched=False, hide_unaired=False)
def movies_by_actor(self, actor): if actor is None: k = xbmc.Keyboard("", g.get_language_string(30013)) k.doModal() query = k.getText() if k.isConfirmed() else None if not query: g.cancel_directory() return else: query = tools.unquote(actor) if g.get_bool_setting("searchHistory"): SearchHistory().add_search_history("movieActor", query) query = g.deaccent_string(query) query = query.replace(" ", "-") query = tools.quote_plus(query) self.list_builder.movie_menu_builder( self.trakt.get_json_paged( "people/{}/movies".format(query), extended="full", page=g.PAGE ), hide_watched=False, hide_unaired=False, )
def movie(self, title, year): url = self.search_link % quote_plus('%s %s' % (title, year)) url = self.base_link + url try: search_results = self.searchResults(serenRequests().get(url)) except: return for i in search_results: release = i.findAll('a')[1] url = release['href'] release_title = release.text if source_utils.filterMovieTitle(release_title, title, year): self.threads.append( threading.Thread(target=self.info_thread, args=(release_title, url, 'single'))) for i in self.threads: i.start() for i in self.threads: i.join() return self.torrent_list
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).encode('utf-8')) 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', '') 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).encode('utf-8'), tools.colorString( tools.deaccentString( i['release_title']).encode('utf-8')), loop_count_string) line2 = "%s %s | Source: %s" % ( tools.lang(32037).encode('utf-8'), tools.colorString(debrid_provider.upper()), tools.colorString(i['source'])) line3 = '%s %s | Info: %s' % ( tools.lang(32038).encode('utf-8'), 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': # Quick fallback to speed up resolving while direct and free hosters are not supported if 'debrid_provider' not in i: continue 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.getSetting( 'premiumize.enabled') == 'true': stream_link = self.premiumizeResolve(i, args) if stream_link is None: continue if i['debrid_provider'] == 'real_debrid': 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 continue try: 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) 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 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