diff --git a/platformcode/globalsearch.py b/platformcode/globalsearch.py index fff9e1fa..a1b66495 100644 --- a/platformcode/globalsearch.py +++ b/platformcode/globalsearch.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import xbmc, xbmcgui, xbmcplugin, sys, channelselector, time -from core.support import dbg, typo +from core.support import dbg, typo, tmdb from core.item import Item from core import channeltools, servertools, scrapertools from platformcode import platformtools, config, logger @@ -13,14 +13,26 @@ if sys.version_info[0] >= 3: else: from concurrent_py2 import futures +info_language = ["de", "en", "es", "fr", "it", "pt"] # from videolibrary.json +def_lang = info_language[config.get_setting("info_language", "videolibrary")] + + +def busy(state): + if state: xbmc.executebuiltin('ActivateWindow(busydialognocancel)') + else: xbmc.executebuiltin('Dialog.Close(busydialognocancel)') def set_workers(): workers = config.get_setting('thread_number') if config.get_setting('thread_number') > 0 else None return workers +def imagepath(image): + if len(image.split('.')) == 1: image += '.png' + path = filetools.join(config.get_runtime_path(), 'resources', 'skins' , 'Default', 'media', 'Infoplus', image) + return path def Search(item): SearchWindow('GlobalSearch.xml', config.get_runtime_path()).start(item) + xbmc.sleep(700) # Actions LEFT = 1 @@ -34,42 +46,145 @@ BACKSPACE = 92 SEARCH = 1 EPISODES = 2 SERVERS = 3 +NORESULTS = 4 +LOADING = 5 # Search -PROGRESS = 100 -MAINTITLE = 101 -CHANNELS = 102 -RESULTS = 103 -COUNT = 104 +MAINTITLE = 100 +CHANNELS = 101 +RESULTS = 102 + +PROGRESS = 500 +COUNT = 501 +CLOSE = 502 +BACK = 503 # Servers EPISODESLIST = 200 SERVERLIST = 300 +SELECTLIST = 400 class SearchWindow(xbmcgui.WindowXML): def start(self, item): + logger.info() xbmc.executebuiltin('Dialog.Close(all,true)') self.exit = False self.item = item - self.item.mode = 'all' - if config.get_setting('last_search'): - last_search = channeltools.get_channel_setting('Last_searched', 'search', '') - else: - last_search = '' - if not item.text: - item.text = platformtools.dialog_input(default=last_search, heading='') - if not item.text: - return - channeltools.set_channel_setting('Last_searched', item.text, 'search') + self.lastSearch() + if not self.item.text: return + self.type = self.item.mode self.channels = [] + self.find = [] + self.persons = [] + self.episodes = [] + self.servers = [] self.results = {} self.channelsList = self.get_channels() self.focus = SEARCH - self.episodes = [] - self.servers = [] + self.process = True + self.page = 1 + self.moduleDict = {} + self.searchActions = [] self.doModal() + def lastSearch(self): + logger.info() + if not self.item.text: + if config.get_setting('last_search'): last_search = channeltools.get_channel_setting('Last_searched', 'search', '') + else: last_search = '' + if not self.item.text: self.item.text = platformtools.dialog_input(default=last_search, heading='') + if self.item.text: channeltools.set_channel_setting('Last_searched', self.item.text, 'search') + + def select(self): + logger.info() + self.PROGRESS.setVisible(False) + items = [] + if self.persons: + tmdb_info = tmdb.discovery(self.item, dict_=self.item.discovery) + results = tmdb_info.results.get('cast',[]) + else: + tmdb_info = tmdb.Tmdb(texto_buscado=self.item.text, tipo=self.item.mode.replace('show', '')) + results = tmdb_info.results + + for result in results: + result = tmdb_info.get_infoLabels(result, origen=result) + self.find.append(result) + movie = result.get('title','') + tvshow = result.get('name','') + title = movie if movie else name + result.mode = 'movie' if movie else 'tvshow' + thumb = 'Infoplus/' + ('movie' if movie else 'tv') + '.png' + it = xbmcgui.ListItem(title) + it.setProperty('thumb', result.get('thumbnail', thumb)) + it.setProperty('fanart', result.get('fanart','')) + it.setProperty('plot', result.get('overview', '')) + it.setProperty('search','search') + items.append(it) + + if items: + self.RESULTS.reset() + self.RESULTS.addItems(items) + self.setFocusId(RESULTS) + else: + self.NORESULTS.setVisible(True) + + def actors(self): + logger.info() + self.PROGRESS.setVisible(False) + items = [] + + dict_ = {'url': 'search/person', 'language': def_lang, 'query': self.item.text, 'page':self.page} + prof = {'Acting': 'Actor', 'Directing': 'Director', 'Production': 'Productor'} + plot = '' + self.item.search_type = 'person' + tmdb_inf = tmdb.discovery(self.item, dict_=dict_) + results = tmdb_inf.results + + if not results: + return results + + for elem in results: + name = elem.get('name', '') + if not name: continue + rol = elem.get('known_for_department', '') + rol = prof.get(rol, rol) + know_for = elem.get('known_for', '') + cast_id = elem.get('id', '') + if know_for: + t_k = know_for[0].get('title', '') + if t_k: plot = '%s in %s' % (rol, t_k) + + t = elem.get('profile_path', '') + if t: thumb = 'https://image.tmdb.org/t/p/original' + t + else : thumb = 'Infoplus/no_photo.png' + + discovery = {'url': 'person/%s/combined_credits' % cast_id, 'page': '1', 'sort_by': 'primary_release_date.desc', 'language': def_lang} + self.persons.append(discovery) + it = xbmcgui.ListItem(name) + it.setProperty('thumb', thumb) + it.setProperty('plot', plot) + it.setProperty('search','persons') + items.append(it) + if len(results) > 19: + it = xbmcgui.ListItem(config.get_localized_string(70006)) + it.setProperty('thumb', 'Infoplus/next_focus.png') + it.setProperty('search','next') + items.append(it) + if self.page > 1: + it = xbmcgui.ListItem(config.get_localized_string(70005)) + it.setProperty('thumb', 'Infoplus/previous_focus.png') + it.setProperty('search','previous') + items.insert(0, it) + + if items: + self.RESULTS.reset() + self.RESULTS.addItems(items) + self.setFocusId(RESULTS) + else: + self.NORESULTS.setVisible(True) + def get_channels(self): + logger.info() channels_list = [] all_channels = channelselector.filterchannels('all') @@ -87,13 +202,14 @@ class SearchWindow(xbmcgui.WindowXML): n = list_cat.index('anime') list_cat[n] = 'tvshow' - if self.item.mode == 'all' or (self.item.mode in list_cat): + if self.item.mode in ['all', 'search'] or (self.item.type in list_cat): if config.get_setting("include_in_global_search", channel) and ch_param.get("active", False): channels_list.append(channel) return channels_list def getModule(self, channel): + logger.info() try: module = __import__('channels.%s' % channel, fromlist=["channels.%s" % channel]) mainlist = getattr(module, 'mainlist')(Item(channel=channel, global_search=True)) @@ -105,42 +221,77 @@ class SearchWindow(xbmcgui.WindowXML): logger.error(traceback.format_exc()) def search(self): - self.time = time.time() + count = 0 self.count = 0 - self.executor = futures.ThreadPoolExecutor(max_workers=set_workers()) - for searchAction in self.searchActions: - if self.exit: break - self.executor.submit(self.get_channel_results, self.item, self.moduleDict, searchAction) + self.LOADING.setVisible(True) + with futures.ThreadPoolExecutor() as executor: + for channel in self.channelsList: + if self.exit: break + module, action = executor.submit(self.getModule, channel).result() + self.moduleDict[channel] = module + self.searchActions += action + count += 1 + percent = (float(count) / len(self.channelsList)) * 100 + self.PROGRESS.setPercent(percent) + self.COUNT.setText('%s/%s' % (count, len(self.channelsList))) + + with futures.ThreadPoolExecutor(max_workers=set_workers()) as executor: + for searchAction in self.searchActions: + if self.exit: break + executor.submit(self.get_channel_results, self.item, self.moduleDict, searchAction) def get_channel_results(self, item, module_dict, search_action): + logger.info() channel = search_action.channel results = [] valid = [] + other = [] module = module_dict[channel] searched_id = item.infoLabels['tmdb_id'] + verified = False try: results.extend(module.search(search_action, item.text)) if len(results) == 1: if not results[0].action or config.get_localized_string(70006).lower() in results[0].title.lower(): results.clear() - if item.mode != 'all': + + if self.item.mode != 'all': for elem in results: if not elem.infoLabels.get('year', ""): elem.infoLabels['year'] = '-' tmdb.set_infoLabels_item(elem) if elem.infoLabels['tmdb_id'] == searched_id: elem.from_channel = channel - if not config.get_setting('unify'): - elem.title += ' [%s]' % channel + elem.verified ='ok.png' valid.append(elem) + else: + other.append(elem) except: pass self.count += 1 - self.update(channel, results) + if self.item.mode == 'search': self.update(channel, valid + other) + elif self.item.mode == 'all': self.update(channel, results) + else: self.channels.remove(channel) + + def makeItem(self, item): + logger.info() + it = xbmcgui.ListItem(item.title) + it.setProperty('thumb', item.thumbnail) + it.setProperty('fanart', item.fanart) + it.setProperty('plot', item.plot) + it.setProperty('verified', item.verified) + if item.server: + color = scrapertools.find_single_match(item.alive, r'(FF[^\]]+)') + it.setProperty('channel', channeltools.get_channel_parameters(item.channel).get('title','')) + it.setProperty('thumb', "https://raw.githubusercontent.com/kodiondemand/media/master/resources/servers/%s.png" % item.server.lower()) + it.setProperty('servername', servertools.get_server_parameters(item.server.lower()).get('name',item.server)) + it.setProperty('color', color if color else 'FF0082C2') + return it def update(self, channel, results): + logger.info('Search on channel', channel) if results: channelParams = channeltools.get_channel_parameters(channel) name = channelParams['title'] @@ -150,6 +301,7 @@ class SearchWindow(xbmcgui.WindowXML): item.setProperty('thumb', channelParams['thumbnail']) item.setProperty('position', '0') item.setProperty('results', str(len(results))) + item.setProperty('verified', results[0].verified) self.channels.append(item) else: self.results[name].append([results, len(self.channels)]) @@ -162,18 +314,21 @@ class SearchWindow(xbmcgui.WindowXML): self.setFocusId(CHANNELS) items = [] for result in self.results[name][0]: - item = xbmcgui.ListItem(result.title) - item.setProperty('thumb', result.thumbnail) - item.setProperty('fanart', result.fanart) - item.setProperty('plot', result.plot) - items.append(item) + items.append(self.makeItem(result)) + self.RESULTS.reset() self.RESULTS.addItems(items) percent = (float(self.count) / len(self.searchActions)) * 100 + self.LOADING.setVisible(False) self.PROGRESS.setPercent(percent) self.COUNT.setText('%s/%s [%s"]' % (self.count, len(self.searchActions), int(time.time() - self.time) )) - xbmcplugin.endOfDirectory() + if percent == 100 and not self.results: + self.PROGRESS.setVisible(False) + self.NORESULTS.setVisible(True) def onInit(self): + self.time = time.time() + + # collect controls self.CHANNELS = self.getControl(CHANNELS) self.RESULTS = self.getControl(RESULTS) self.PROGRESS = self.getControl(PROGRESS) @@ -185,22 +340,22 @@ class SearchWindow(xbmcgui.WindowXML): self.EPISODESLIST = self.getControl(EPISODESLIST) self.SERVERS = self.getControl(SERVERS) self.SERVERLIST = self.getControl(SERVERLIST) - - self.moduleDict = {} - self.searchActions = [] + self.NORESULTS = self.getControl(NORESULTS) + self.NORESULTS.setVisible(False) + self.LOADING = self.getControl(LOADING) + self.LOADING.setVisible(False) self.Focus(self.focus) - if not self.channels: - with futures.ThreadPoolExecutor() as executor: - for channel in self.channelsList: - if self.exit: break - module, action = executor.submit(self.getModule, channel).result() - self.moduleDict[channel] = module - self.searchActions += action - - self.thread = Thread(target=self.search) - self.thread.start() + if self.type: + self.type = None + if self.item.mode in ['all', 'search']: + self.thread = Thread(target=self.search) + self.thread.start() + elif self.item.mode in ['movie', 'tvshow']: + self.select() + elif self.item.mode in ['person']: + self.actors() def Focus(self, focusid): if focusid in [SEARCH]: @@ -222,26 +377,42 @@ class SearchWindow(xbmcgui.WindowXML): def onAction(self, action): action = action.getId() focus = self.getFocusId() - # if action in [117]: - # xbmc.executebuiltin('ActivateWindow(10106)') - if action in [LEFT, RIGHT] and focus in [CHANNELS]: + if action in [117] and focus in [RESULTS]: + pos = self.RESULTS.getSelectedPosition() + name = self.CHANNELS.getSelectedItem().getLabel() + item = self.results[name][0][pos] + context = [config.get_localized_string(70739), config.get_localized_string(70557), config.get_localized_string(60359)] + context_commands = ["RunPlugin(%s?%s)" % (sys.argv[0], 'action=open_browser&url=' + item.url), + "RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'channel=kodfavorites&action=addFavourite&from_channel=' + item.channel + '&from_action=' + item.action), + "RunPlugin(%s?%s)" % (sys.argv[0], 'channel=trailertools&action=buscartrailer&contextual=True&search_title=' + item.contentTitle if item.contentTitle else item.fulltitle)] + if item.contentType == 'movie': + context += [config.get_localized_string(60353), config.get_localized_string(60354)] + context_commands += ["RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'action=add_pelicula_to_library&from_action=' + item.action), + "RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' +item.action)] + + else: + context += [config.get_localized_string(60352), config.get_localized_string(60355), config.get_localized_string(60357)] + context_commands += ["RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'action=add_serie_to_library&from_action=' + item.action), + "RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action), + "RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel +'&from_action=' + item.action)] + index = xbmcgui.Dialog().contextmenu(context) + if index > 0: xbmc.executebuiltin(context_commands[index]) + elif action in [LEFT, RIGHT] and focus in [CHANNELS]: items = [] name = self.CHANNELS.getSelectedItem().getLabel() subpos = int(self.CHANNELS.getSelectedItem().getProperty('position')) for result in self.results[name][0]: - item = xbmcgui.ListItem(result.title) - item.setProperty('thumb', result.thumbnail) - item.setProperty('fanart', result.fanart) - item.setProperty('plot', result.plot) - items.append(item) + items.append(self.makeItem(result)) self.RESULTS.reset() self.RESULTS.addItems(items) self.RESULTS.selectItem(subpos) - if focus in [RESULTS]: + + elif focus in [RESULTS] and self.item.mode == 'all': pos = self.RESULTS.getSelectedPosition() self.CHANNELS.getSelectedItem().setProperty('position', str(pos)) - if action in [BACKSPACE]: + elif action in [BACKSPACE]: + logger.info('ACTION',self.item.mode,self.persons) if self.SERVERS.isVisible(): if self.episodes: self.Focus(EPISODES) @@ -254,36 +425,61 @@ class SearchWindow(xbmcgui.WindowXML): self.Focus(SEARCH) self.setFocusId(RESULTS) self.RESULTS.selectItem(self.pos) + elif self.item.mode in ['person'] and self.find: + self.find = [] + self.actors() else: self.exit = True + if self.item.mode in ['all', 'search']: + busy(True) + while self.thread.is_alive(): xbmc.sleep(200) + busy(False) self.close() - xbmc.sleep(600) - platformtools.itemlist_refresh() elif action in [EXIT]: self.exit = True + if self.item.mode in ['all', 'search']: + busy(True) + while self.thread.is_alive(): xbmc.sleep(200) + busy(False) self.close() - xbmc.sleep(600) - platformtools.itemlist_refresh() def onClick(self, control_id): + search = self.RESULTS.getSelectedItem().getProperty('search') if control_id in [CHANNELS]: items = [] name = self.CHANNELS.getSelectedItem().getLabel() subpos = int(self.CHANNELS.getSelectedItem().getProperty('position')) for result in self.results[name][0]: - logger.info(result) - item = xbmcgui.ListItem(result.title) - item.setProperty('thumb', result.thumbnail) - item.setProperty('fanart', result.fanart) - item.setProperty('plot', result.plot) - items.append(item) + items.append(self.makeItem(result)) self.RESULTS.reset() self.RESULTS.addItems(items) self.RESULTS.selectItem(subpos) self.CHANNELS.getSelectedItem().setProperty('position', str(subpos)) - if control_id in [RESULTS, EPISODESLIST]: + elif search: + pos = self.RESULTS.getSelectedPosition() + if search == 'next': + self.page += 1 + self.actors() + elif search == 'previous': + self.page -= 1 + self.actors() + elif search == 'persons': + self.item.discovery = self.persons[pos] + self.select() + else: + result = self.find[pos] + name = self.RESULTS.getSelectedItem().getLabel() + item = Item(mode='search', type=result.mode, contentType=result.mode, infoLabels=result, selected = True, text=name) + if self.item.mode == 'movie': + item.contentTitle = self.RESULTS.getSelectedItem().getLabel() + else: + item.contentSerieName = self.RESULTS.getSelectedItem().getLabel() + return Search(item) + + elif control_id in [RESULTS, EPISODESLIST]: + busy(True) if control_id in [RESULTS]: name = self.CHANNELS.getSelectedItem().getLabel() self.pos = self.RESULTS.getSelectedPosition() @@ -296,10 +492,10 @@ class SearchWindow(xbmcgui.WindowXML): self.itemsResult = getattr(self.channel, item.action)(item) if item.action in ['findvideos']: + if config.get_setting('checklinks') and not config.get_setting('autoplay'): - checklinks_number = config.get_setting('checklinks_number') - self.itemsResult = servertools.check_list_links(self.itemsResult, checklinks_number) - self.servers = self.itemsResult + self.itemsResult = servertools.check_list_links(self.itemsResult, config.get_setting('checklinks_number')) + self.servers = self.itemsResult self.itemsResult = [] uhd = [] fhd = [] @@ -308,13 +504,7 @@ class SearchWindow(xbmcgui.WindowXML): unknown = [] for i, item in enumerate(self.servers): if item.server: - color = scrapertools.find_single_match(item.alive, r'(FF[^\]]+)') - it = xbmcgui.ListItem(item.infoLabels['title']) - it.setProperty('channel', channeltools.get_channel_parameters(item.channel).get('title','')) - it.setProperty('thumb', "https://raw.githubusercontent.com/kodiondemand/media/master/resources/servers/%s.png" % item.server.lower()) - it.setProperty('servername', servertools.get_server_parameters(item.server.lower()).get('name',item.server)) - it.setProperty('color', color if color else 'FF0082C2') - + it = self.makeItem(item) it.setProperty('index', str(i)) if item.quality in ['4k', '2160p', '2160', '4k2160p', '4k2160', '4k 2160p', '4k 2160', '2k']: it.setProperty('quality', 'uhd.png') @@ -353,14 +543,15 @@ class SearchWindow(xbmcgui.WindowXML): if item.action == 'findvideos': it = xbmcgui.ListItem(item.title) episodes.append(it) - + self.Focus(EPISODES) self.EPISODESLIST.reset() self.EPISODESLIST.addItems(episodes) self.setFocusId(EPISODESLIST) - - if control_id in [SERVERLIST]: + busy(False) + + elif control_id in [SERVERLIST]: index = int(self.getControl(control_id).getSelectedItem().getProperty('index')) server = self.servers[index] run(server) \ No newline at end of file diff --git a/platformcode/launcher.py b/platformcode/launcher.py index ab93d66f..bd30e037 100644 --- a/platformcode/launcher.py +++ b/platformcode/launcher.py @@ -137,6 +137,7 @@ def run(item=None): elif config.get_setting('new_search') and item.channel == "search" and item.action == 'new_search': from platformcode.globalsearch import Search + item.contextual = True Search(item) return diff --git a/platformcode/platformtools.py b/platformcode/platformtools.py index 78b0f943..138ff25c 100644 --- a/platformcode/platformtools.py +++ b/platformcode/platformtools.py @@ -1416,7 +1416,7 @@ class TitleOrIDWindow(xbmcgui.WindowXMLDialog): def Start(self, item, scraper): self.item = item self.item.exit = False - self.title = item.show if item.show else item.fulltitle + self.title = item.contentTitle if item.contentType == 'movie' else item.contentSerieName self.id = item.infoLabels.get('tmdb_id','') if scraper == 'tmdb' else item.infoLabels.get('tvdb_id','') self.scraper = scraper self.label = 'TMDB ID:' if scraper == 'tmdb' else 'TVDB ID:' @@ -1437,7 +1437,7 @@ class TitleOrIDWindow(xbmcgui.WindowXMLDialog): def onClick(self, control): if control in [10003]: if self.getControl(10001).getText(): - if self.scraper == 'tmdb': self.item.contentTitle = self.getControl(10001).getText() + if self.item.contentType == 'movie': self.item.contentTitle = self.getControl(10001).getText() else: self.item.contentSerieName = self.getControl(10001).getText() if self.scraper == 'tmdb' and self.getControl(10002).getText(): self.item.infoLabels['tmdb_id'] = self.getControl(10002).getText() diff --git a/resources/skins/Default/720p/GlobalSearch.xml b/resources/skins/Default/720p/GlobalSearch.xml index 96fdb9f0..103f1a78 100644 --- a/resources/skins/Default/720p/GlobalSearch.xml +++ b/resources/skins/Default/720p/GlobalSearch.xml @@ -1,30 +1,28 @@ - 0.52 - - 0 - 0 - + 0.52 + + 0 + 0 + - - - 0 - 0 + + + + + Window Background 100% 100% - white.png - white.png - WindowOpen - WindowClose - Action(close) + white.png - - + + + Main Group 0 0 @@ -35,29 +33,21 @@ - - - + Fanart 100% 100% - center - $INFO[Container(103).ListItem.Property(fanart)] + scale + $INFO[Container(102).ListItem.Property(fanart)] - - - Control.IsVisible(1) - - + + + Search Group + Control.IsVisible(1) + + + Title 30 30 1000 @@ -65,16 +55,18 @@ font30_title FFFFFFFF 00000000 - Integer.IsGreater(Container(102).NumItems, 0) + Integer.IsGreater(Container(101).NumItems, 0) left center - - - Integer.IsGreater(Container(102).NumItems, 0) + + + Search Result Group + Integer.IsGreater(Container(102).NumItems, 0) Visible - + + Item Title 400 90 840 @@ -82,12 +74,13 @@ font30_title FFFFFFFF 00000000 - + left center - + + Item Plot 400 150 840 @@ -95,20 +88,22 @@ font13 FFFFFFFF 00000000 - + left - + + + Search Results list 70 0 100% 570 - 102 + 101 horizontal 300 - + Item Poster 0 0 180 @@ -117,10 +112,19 @@ 10 scale + + Item Verified + 235 + 155 + 20 + 20 + $INFO[ListItem.Property(verified)] + scale + - + Item Poster 0 0 380 @@ -129,37 +133,55 @@ 10 scale + + Item Verified + 10 + 330 + 40 + 40 + $INFO[ListItem.Property(verified)] + scale + - + - - + + + Chennels Group -100 100% 150 - Conditional - Conditional + Conditional + Conditional + Integer.IsGreater(Container(101).NumItems, 0) + + Chennels Bar Background Opacity on hover 100% 100% - Conditional + Conditional white.png + + Chennels Bar Background 100% 100% white.png - + + + Channels list 100% 150 - 103 + 102 horizontal 300 + - + Channel Icon 0 0 150 @@ -167,8 +189,8 @@ $INFO[ListItem.Property(thumb)] scale - + Results Count Background 0 0 40 @@ -176,8 +198,8 @@ white.png scale - + Results Count 5 5 30 @@ -189,10 +211,19 @@ center center + + Verified + 5 + 5 + 30 + 30 + $INFO[ListItem.Property(verified)] + scale + - + Channel Icon 0 0 150 @@ -200,8 +231,8 @@ $INFO[ListItem.Property(thumb)] scale - + Results Count Background 0 0 40 @@ -209,8 +240,17 @@ white.png scale - + + Results Count + 5 + 5 + 30 + 30 + $INFO[ListItem.Property(verified)] + scale + + Verified 5 5 30 @@ -222,37 +262,28 @@ center center - - - - - + + + + + + + Episodes Group + Control.IsVisible(2) - - - Control.IsVisible(2) Poster 0 0 480 720 - $INFO[Container(103).ListItem.Property(thumb)] + $INFO[Container(102).ListItem.Property(thumb)] - - Title + + + Main Title 520 40 1150 @@ -262,19 +293,19 @@ 00000000 left center - + - + + Episodes List 40 520 700 570 - 300 - Title + Episode Title 20 660 60 @@ -288,13 +319,14 @@ + Selected Background 700 60 white.png scale - Title + Episode Title 20 660 60 @@ -306,22 +338,25 @@ - - + + + + + + Servers Group + Control.IsVisible(3) - - - Control.IsVisible(3) Poster 0 0 480 720 - $INFO[Container(103).ListItem.Property(thumb)] + $INFO[Container(102).ListItem.Property(thumb)] - - Title + + + Main Title 520 40 1150 @@ -331,20 +366,19 @@ 00000000 left center - + - - + + Servers List 40 520 700 570 - 300 - + Servers Icon 5 5 120 @@ -353,6 +387,7 @@ scale + Servers Quality 35 150 60 @@ -360,8 +395,8 @@ $INFO[ListItem.Property(quality)] scale - - Title + + Server Name 220 35 450 @@ -376,13 +411,14 @@ + Selection Background 700 130 white.png scale - + Servers Color 0 0 130 @@ -392,6 +428,7 @@ scale + Servers Icon 5 5 120 @@ -400,6 +437,7 @@ scale + Servers Title 35 150 60 @@ -407,8 +445,8 @@ $INFO[ListItem.Property(quality)] scale - - Title + + Server Title 220 35 450 @@ -421,11 +459,12 @@ - - - + + + - + + Progress Bar 350 240 800 @@ -437,9 +476,10 @@ progress.png Conditional Conditional - - + + + Progress Count 340 130 200 @@ -449,9 +489,39 @@ 00000000 right center - Conditional - Control.IsVisible(1) + Conditional + Control.IsVisible(500) - + + + No Results + 340 + 0 + 100% + 40 + font30_title + FFFFFFFF + 00000000 + center + center + + Control.IsVisible(4) + + + + Load Channels + 300 + 0 + 100% + 40 + font30_title + FFFFFFFF + 00000000 + center + center + + Control.IsVisible(5) + +