diff --git a/core/autoplay.py b/core/autoplay.py index ec3f37b0..d7d9fdd1 100644 --- a/core/autoplay.py +++ b/core/autoplay.py @@ -273,7 +273,6 @@ def start(itemlist, item): if autoplay_elem == autoplay_list[-1]: platformtools.dialog_notification('AutoPlay', config.get_localized_string(60072) % name) - itemlist = [s['videoitem'] for s in autoplay_list] else: platformtools.dialog_notification(config.get_localized_string(60074), config.get_localized_string(60075)) diff --git a/core/tmdb.py b/core/tmdb.py index 2b1221eb..74c58e62 100644 --- a/core/tmdb.py +++ b/core/tmdb.py @@ -147,8 +147,8 @@ def cache_response(fn): # error getting data except Exception as ex: - message = "An exception of type %s occured. Arguments:\n%s" % (type(ex).__name__, repr(ex.args)) - logger.error("error in: %s" % message) + message = "An exception of type {} occured. Arguments:\n{}".format(type(ex).__name__, repr(ex.args)) + logger.error("error in:", message) return result @@ -175,10 +175,10 @@ def set_infoLabels(source, seekTmdb=True, search_language=def_lang, forced=False start_time = time.time() if type(source) == list: ret = set_infoLabels_itemlist(source, seekTmdb, search_language) - logger.debug("The data of %i links were obtained in %f seconds" % (len(source), time.time() - start_time)) + logger.debug("The data of {} links were obtained in {} seconds".format(len(source), time.time() - start_time)) else: ret = set_infoLabels_item(source, seekTmdb, search_language) - logger.debug("The data were obtained in %f seconds" % (time.time() - start_time)) + logger.debug("The data were obtained in {} seconds".format(time.time() - start_time)) return ret @@ -279,7 +279,7 @@ def set_infoLabels_item(item, seekTmdb=True, search_language=def_lang): try: ep = int(item.infoLabels['episode']) except ValueError: - logger.debug("The episode number (%s) is not valid" % repr(item.infoLabels['episode'])) + logger.debug("The episode number ({}) is not valid".format(repr(item.infoLabels['episode']))) return -1 * len(item.infoLabels) # We have valid season number and episode number... @@ -1524,7 +1524,7 @@ class Tmdb(object): seasons = [] if results and 'Error' not in results: for season in results: - url = '{host}/tv/{id}/season/{season}?api_key={api}&language={lang}'.format(host=host, id=self.search_id, season=season['season_number'], api=api, lang=self.search_language) + url = '{}/tv/{}/season/{}?api_key={}&language={}'.format(host, self.search_id, season['season_number'], api, self.search_language) try: start_from = requests.get(url).json()['episodes'][0]['episode_number'] except: start_from = 1 seasons.append({'season_number':season['season_number'], 'episode_count':season['episode_count'], 'start_from':start_from}) @@ -1567,7 +1567,7 @@ class Tmdb(object): for i in self.result['videos']: if i['site'] == "YouTube": ret.append({'name': i['name'], - 'url': "https://www.youtube.com/watch?v=%s" % i['key'], + 'url': "plugin://plugin.video.youtube/play/?video_id={}".format(i['key']), 'size': str(i['size']), 'type': i['type'], 'language': i['iso_639_1']}) @@ -1592,8 +1592,10 @@ class Tmdb(object): l_country = [i.strip() for i in ret_infoLabels['country'].split(',') if ret_infoLabels['country']] l_director = [i.strip() for i in ret_infoLabels['director'].split(',') if ret_infoLabels['director']] l_director_image = ret_infoLabels.get('director_image', []) + l_director_id = ret_infoLabels.get('director_id', []) l_writer = [i.strip() for i in ret_infoLabels['writer'].split(',') if ret_infoLabels['writer']] l_writer_image = ret_infoLabels.get('writer_image', []) + l_writer_id = ret_infoLabels.get('writer_id', []) l_castandrole = ret_infoLabels.get('castandrole', []) if not origen: @@ -1699,7 +1701,7 @@ class Tmdb(object): elif k == 'credits_cast' or k == 'season_cast' or k == 'episode_guest_stars': dic_aux = dict((name, [character, thumb, order, id]) for (name, character, thumb, order, id) in l_castandrole) - l_castandrole.extend([(p['name'], p.get('character', '') or p.get('character_name', ''), 'https://image.tmdb.org/t/p/original' + p.get('profile_path', '') if p.get('profile_path', '') else '', p.get('order'), p.get('credit_id')) \ + l_castandrole.extend([(p['name'], p.get('character', '') or p.get('character_name', ''), 'https://image.tmdb.org/t/p/original' + p.get('profile_path', '') if p.get('profile_path', '') else '', p.get('order'), p.get('id')) \ for p in v if 'name' in p and p['name'] not in list(dic_aux.keys())]) elif k == 'videos': @@ -1739,12 +1741,15 @@ class Tmdb(object): elif k == 'credits_crew' or k == 'episode_crew' or k == 'season_crew': for crew in v: if crew['job'].lower() == 'director': + # from core.support import dbg;dbg() l_director = list(set(l_director + [crew['name']])) l_director_image += ['https://image.tmdb.org/t/p/original' + crew['profile_path'] if crew['profile_path'] else ''] + l_director_id += [crew['id']] elif crew['job'].lower() in ('screenplay', 'writer'): l_writer = list(set(l_writer + [crew['name']])) l_writer_image += ['https://image.tmdb.org/t/p/original' + crew['profile_path'] if crew['profile_path'] else ''] + l_writer_id += [crew['id']] elif k == 'created_by': for crew in v: @@ -1766,9 +1771,11 @@ class Tmdb(object): if l_director: ret_infoLabels['director'] = ', '.join(l_director) ret_infoLabels['director_image'] = l_director_image + ret_infoLabels['director_id'] = l_director_id if l_writer: ret_infoLabels['writer'] = ', '.join(l_writer) ret_infoLabels['writer_image'] = l_writer_image + ret_infoLabels['writer_id'] = l_writer_id return ret_infoLabels diff --git a/platformcode/contextmenu/__init__.py b/platformcode/contextmenu/__init__.py new file mode 100644 index 00000000..7c68785e --- /dev/null +++ b/platformcode/contextmenu/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/platformcode/infoplus.py b/platformcode/infoplus.py index 51502a79..b49508fa 100644 --- a/platformcode/infoplus.py +++ b/platformcode/infoplus.py @@ -2,13 +2,17 @@ # ------------------------------------------------------------ # infoplus window with item information # ------------------------------------------------------------ + +from typing import List import xbmc, xbmcgui, sys, requests, re -from core import support, tmdb, filetools, channeltools, servertools +from core import httptools, support, tmdb, filetools, channeltools, servertools, jsontools from core.item import Item -from platformcode import config, platformtools +from platformcode import config, platformtools, logger, xbmc_videolibrary from platformcode.logger import log from core.scrapertools import decodeHtmlentities, htmlclean +from core.support import typo, dbg + PY3 = False if sys.version_info[0] >= 3: PY3 = True if PY3: from concurrent import futures @@ -19,23 +23,16 @@ SearchWindows = [] api = 'k_0tdb8a8y' # Control ID -FANART = 30000 -NUMBER = 30001 -TITLE = 30002 -TAGLINE = 30003 -PLOT = 30004 -RATING_ICON = 30005 -RATING = 30006 -TRAILER = 30007 -SEARCH = 30008 -NEXT = 30009 -PREVIOUS = 30010 -LOADING = 30011 -COMMANDS = 30012 -IMAGES = 30013 -RECOMANDED = TRAILERS = 30500 -ACTORS = 30501 -CAST = 30502 +LIST = 100 +CAST = 101 +RECOMANDED = 102 +TRAILERS = 103 +FANARTS = 104 + + +SEARCH = 200 +BACK = 201 +CLOSE = 202 # Actions LEFT = 1 @@ -46,527 +43,362 @@ EXIT = 10 BACKSPACE = 92 +def start(item): + xbmc.executebuiltin('Dialog.Close(all)') + InfoPlus('InfoPlus.xml', config.get_runtime_path(), item=item) -def Main(item): - if type(item) == Item: - item.channel = item.from_channel - global ITEM - ITEM = item - Info = xbmcgui.ListItem(item.infoLabels['title']) - for key, value in item.infoLabels.items(): - Info.setProperty(key, str(value)) - else: - Info = item - - main = MainWindow('InfoPlus.xml', config.get_runtime_path()) - add({'class':main, 'info':Info, 'id':RECOMANDED, RECOMANDED:0, ACTORS:0}) - modal() - -class MainWindow(xbmcgui.WindowXMLDialog): +class InfoPlus(xbmcgui.WindowXML): def __init__(self, *args, **kwargs): + self.item = kwargs.get('item') + self.info = self.item.infoLabels + self.type = 'movie' if self.info.get('mediatype') == 'movie' else 'tv' self.items = [] self.cast = [] self.actors = [] self.ids = {} self.tmdb = [] + self.recomanded = [] + self.trailers = [] + self.images = [] + self.fanarts = [] + if not self.item.focus: self.item.focus = {} + platformtools.dialog_busy(True) + if self.item: + # Find Video Info + tmdb.set_infoLabels_item(self.item) + self.info = self.item.infoLabels + title = typo(self.info.get('title'), 'bold') + tagline = self.info.get('tagline') + if tagline: title += '\n' + typo(tagline, 'italic') + + # Set Listitem + self.listitem = xbmcgui.ListItem(title) + # Set Image + if self.info['mediatype'] == 'episode': + self.listitem.setArt({'poster':self.info['thumbnail'], 'fanart':self.info['poster_path']}) + else: + self.listitem.setArt({'poster':self.item.thumbnail, 'fanart':self.item.fanart}) + # Set Rating + self.listitem.setProperty('rating',str(int(self.info.get('rating',10) * 10))) + rating = self.info.get('rating', 'N/A') + color = 'FFFFFFFF' if rating == 'N/A' else 'FFDB2360' if rating < 4 else 'FFD2D531' if rating < 7 else 'FF21D07A' + self.listitem.setProperty('color',color) + + # Set infoLabels + platformtools.set_infolabels(self.listitem, self.item) + + # Add Cast Info + for cast in self.info.get('castandrole',[]): + castitem = xbmcgui.ListItem(cast[0], cast[1]) + castitem.setArt({'poster':cast[2]}) + castitem.setProperties({'order':str(cast[3]), 'id':cast[4]}) + self.cast.append(castitem) + self.cast.sort(key=lambda c: c.getProperty('order')) + + directors = self.info.get('director') + if directors: + for i, director in enumerate(directors.split(',')): + directoritem = xbmcgui.ListItem(director, 'Regista') + directoritem.setArt({'poster':self.info.get('director_image')[i]}) + directoritem .setProperty('id', str(self.info.get('director_id')[i])) + self.cast.insert(i, directoritem) + + # Add Recomandations + self.get_recomendations() + + # Add Trailers + self.get_trailers() + + # Add Fanart + self.get_fanarts() + + platformtools.dialog_busy(False) + + self.doModal() def onInit(self): - #### Compatibility with Kodi 18 #### - if config.get_platform(True)['num_version'] < 18: - self.setCoordinateResolution(2) - if Info.getProperty('id'):self.items = get_movies(Info) - else: self.items = get_recomendations(Info) - self.cast, self.actors = get_cast(Info) - self.getControl(LOADING).setVisible(False) - self.getControl(RECOMANDED).addItems(self.items) - self.getControl(FANART).setImage(Info.getProperty('fanart')) - self.getControl(ACTORS).addItems(self.actors) - if self.cast: - self.getControl(CAST).setVisible(True) - self.getControl(CAST).addItems(self.cast) - else: - self.getControl(CAST).setVisible(False) - if Info.getProperty('rating'): rating = str(Info.getProperty('rating')) - else: rating = 'N/A' - self.getControl(RATING).setText(rating) - getFocus(self) + self.getControl(LIST).addItem(self.listitem) + + self.getControl(CAST).addItems(self.cast) + if self.item.cast: self.getControl(CAST).selectItem(self.item.cast) + + self.getControl(RECOMANDED).addItems(self.recomanded) + if self.item.recomanded: self.getControl(RECOMANDED).selectItem(self.item.recomanded) + + self.getControl(TRAILERS).addItems(self.trailers) + self.getControl(FANARTS).addItems(self.fanarts) + + # Set Focus + if self.item.focus: + for k, v in self.item.focus.items(): + self.getControl(k).selectItem(v) + xbmc.sleep(200) + self.setFocusId(self.item.setFocus) + else: self.setFocusId(LIST) - def onClick(self, control_id): - setFocus(self) - title = self.getControl(RECOMANDED).getSelectedItem().getProperty('title') - mode = self.getControl(RECOMANDED).getSelectedItem().getProperty('mediatype') - if control_id in [SEARCH]: - self.close() - if self.getControl(RECOMANDED).getSelectedPosition() > 0: - Search(ITEM.clone(action='search', search_text=title)) - else: - Search(ITEM.clone(channel='search', action='new_search', search_text=title, mode=mode)) - elif control_id in [TRAILER]: - info = self.getControl(RECOMANDED).getSelectedItem() - self.close() - Trailer(info) - elif control_id in [IMAGES]: - info = self.getControl(RECOMANDED).getSelectedItem() - images = tmdb.Tmdb(id_Tmdb=info.getProperty('tmdb_id'), search_type='movie' if mode == 'movie' else 'tv').result.get("images", {}) - for key, value in list(images.items()): - if not value: images.pop(key) - ImagesWindow(tmdb = images).doModal() - elif control_id in [ACTORS, CAST]: - self.close() - Main(self.getControl(self.getFocusId()).getSelectedItem()) - elif control_id in [RECOMANDED] and self.getControl(RECOMANDED).getSelectedPosition() > 0: - self.close() - Main(self.getControl(RECOMANDED).getSelectedItem()) def onAction(self, action): - if self.getFocusId() in [ACTORS, RECOMANDED]: - self.ids[self.getFocusId()] = self.getControl(self.getFocusId()).getSelectedPosition() - if self.getFocusId() in [ACTORS, CAST] and action not in [BACKSPACE, EXIT]: - actors_more_info(self.getControl(self.getFocusId()).getSelectedItem()) - if self.getFocusId() in [RECOMANDED]: - fanart = self.getControl(self.getFocusId()).getSelectedItem().getProperty('fanart') - rating = self.getControl(self.getFocusId()).getSelectedItem().getProperty('rating') - if not rating: rating = 'N/A' - self.getControl(FANART).setImage(fanart) - self.getControl(RATING).setText(rating) - cast, actors = get_cast(self.getControl(self.getFocusId()).getSelectedItem()) - self.getControl(ACTORS).reset() - self.getControl(ACTORS).addItems(actors) - self.getControl(CAST).reset() - self.getControl(CAST).addItems(cast) action = action.getId() - if action in [BACKSPACE]: - self.close() - remove() - modal() - elif action in [EXIT]: + focus = self.getFocusId() + if action in [EXIT]: self.close() + elif action in [BACKSPACE]: + back(self) + elif action in [UP, DOWN, LEFT, RIGHT] and focus not in [LIST, CAST, RECOMANDED, TRAILERS, FANARTS, SEARCH, BACK, CLOSE]: + self.setFocusId(LIST) + if focus > 0: + self.item.setFocus = focus + self.item.focus[focus] = self.getControl(focus).getSelectedPosition() -def Search(item): - if item.action == 'findvideos': XML = 'ServersWindow.xml' - else: XML = 'SearchWindow.xml' - global Info - Info = item - main = SearchWindow(XML, config.get_runtime_path()) - add({'class':main, 'info':item, 'id':RECOMANDED}) - modal() - -class SearchWindow(xbmcgui.WindowXMLDialog): - def __init__(self, *args, **kwargs): - self.items = [] - self.itemlist = [] - self.commands = [] - self.ids = {} - self.channel = None - - def onInit(self): - #### Compatibility with Kodi 18 #### - if config.get_platform(True)['num_version'] < 18: - self.setCoordinateResolution(2) - if len(self.items) == 0: - if Info.action == 'new_search' and Info.mode: - from specials.search import new_search - itemlist = new_search(Info) - elif Info.action == 'channel_search': - from specials.search import channel_search - itemlist = channel_search(Info) - else: - self.channel = __import__('channels.%s' % Info.channel, fromlist=["channels.%s" % Info.channel]) - if Info.action == 'search': itemlist = getattr(self.channel, 'search')(Info, Info.search_text) - else: itemlist = getattr(self.channel, Info.action)(Info) - if not itemlist: - if platformtools.dialog_yesno(config.get_localized_string(60473), config.get_localized_string(70820) % Info.channel): - remove() - self.close() - return Search(Info.clone(mode=Info.infoLabels['mediatype'])) - else: - remove() - self.close() - modal() - for item in itemlist: - if item.action not in ['save_download', 'add_movie_to_library', 'add_serie_to_library', ''] and item.infoLabels['title']: - if item.action == 'findvideos' and item.contentType in ['episode', 'tvshow']: - it = xbmcgui.ListItem(re.sub(r'\[[^\]]+\]', '', item.title)) - self.getControl(NUMBER).setText(support.typo(config.get_localized_string(70362),'uppercase bold')) - else: - it = xbmcgui.ListItem(item.infoLabels['title']) - it.setProperty('channelname', channeltools.get_channel_parameters(item.channel).get('title','')) - it.setProperty('channel', item.channel) - it.setProperty('action', item.action) - it.setProperty('server', servertools.get_server_parameters(item.server.lower()).get('name',item.server)) - it.setProperty('url', item.url) - for key, value in item.infoLabels.items(): - it.setProperty(key, str(value)) - if item.action == 'play': - it.setProperty('thumbnail', "https://raw.githubusercontent.com/kodiondemand/media/master/resources/servers/%s.png" % item.server.lower()) - self.items.append(it) - self.itemlist.append(item) - if itemlist[0].contentType == 'movie': - if not itemlist[0].server: - self.commands.append(itemlist[0].clone(action='add_movie_to_library', thumbnail=support.thumb('add_to_videolibrary'))) - self.commands.append(itemlist[0].clone(channel='downloads', action='save_download', from_channel=itemlist[0].channel, from_action=itemlist[0].action, thumbnail=support.thumb('downloads'))) - else: - self.commands.append(Info.clone(channel='downloads', action='save_download', from_channel=Info.channel, from_action=Info.action, thumbnail=support.thumb('downloads'))) - if itemlist[0].contentType in ['tvshow', 'episode']: - if not itemlist[0].server: - self.commands.append(itemlist[0].clone(action='add_serie_to_library', thumbnail=support.thumb('add_to_videolibrary'))) - self.commands.append(itemlist[0].clone(channel='downloads', action='save_download', from_channel=itemlist[0].channel, from_action=itemlist[0].action, thumbnail=support.thumb('downloads'))) - else: - self.commands.append(Info.clone(channel='downloads', action='save_download', from_channel=Info.channel, from_action=Info.action, thumbnail=support.thumb('downloads'))) - if self.commands: - commands = [] - for command in self.commands: - it = xbmcgui.ListItem(command.title) - path = filetools.join(config.get_runtime_path(),'resources','skins','Default','media','Infoplus',command.thumbnail.split('/')[-1].replace('thumb_','')) - it.setProperty('thumbnail',path) - commands.append(it) - self.getControl(COMMANDS).addItems(commands) - if self.items: - self.getControl(FANART).setImage(self.items[0].getProperty('fanart')) - - self.getControl(RECOMANDED).addItems(self.items) - self.getControl(LOADING).setVisible(False) - getFocus(self) - - def onClick(self, control_id): - setFocus(self) - if control_id == COMMANDS: - from platformcode.launcher import run - pos = self.getControl(COMMANDS).getSelectedPosition() - if self.commands[pos].action =='save_download' and self.commands[pos].contentType == 'tvshow': - actions = [self.commands[-1].clone(), self.commands[-1].clone(download='season')] - options = [config.get_localized_string(60355),config.get_localized_string(60357)] - run(actions[platformtools.dialog_select(config.get_localized_string(60498),options)]) - else: - run(self.commands[pos]) - else: - action = self.getControl(RECOMANDED).getSelectedItem().getProperty('action') - channel = self.getControl(RECOMANDED).getSelectedItem().getProperty('channel') - url = self.getControl(RECOMANDED).getSelectedItem().getProperty('url') - item = Item(channel=channel, action=action, url=url) - if action == 'play': - item.server = self.getControl(RECOMANDED).getSelectedItem().getProperty('server') - self.close() - from platformcode.launcher import run - run(item) - xbmc.sleep(500) - while xbmc.Player().isPlaying(): - xbmc.sleep(500) - modal() - elif config.get_setting('autoplay'): - item.quality = self.getControl(RECOMANDED).getSelectedItem().getProperty('quality') - getattr(self.channel, item.action)(item) - self.close() - xbmc.sleep(500) - while xbmc.Player().isPlaying(): - xbmc.sleep(500) - modal() - else: - pos = self.getControl(RECOMANDED).getSelectedPosition() - self.close() - if self.itemlist[pos].mode: remove() - Search(self.itemlist[pos]) - - def onAction(self, action): - if self.getFocusId() in [RECOMANDED]: - fanart = self.getControl(self.getFocusId()).getSelectedItem().getProperty('fanart') - self.getControl(FANART).setImage(fanart) - action = action.getId() - if action in [BACKSPACE]: - self.close() - remove() - modal() - elif action in [EXIT]: - self.close() - - -def Trailer(info): - global info_list, trailers - trailers = [] - trailers_list = [] - Type = info.getProperty('mediatype') - if Type != "movie": Type = "tv" - trailers_list = tmdb.Tmdb(id_Tmdb=info.getProperty('tmdb_id'), search_type=Type).get_videos() - if trailers_list: - for i, trailer in enumerate(trailers_list): - item = xbmcgui.ListItem(trailer['name']) - item.setProperties({'tile':trailer['name'], - 'url': trailer['url'], - 'thumbnail': 'http://img.youtube.com/vi/' + trailer['url'].split('=')[-1] + '/0.jpg', - 'fanart':info.getProperty('fanart'), - 'position':'%s/%s' % (i + 1, len(trailers_list))}) - trailers.append(item) - else: # TRY youtube search - patron = r'thumbnails":\[\{"url":"(https://i.ytimg.com/vi[^"]+).*?' - patron += r'text":"([^"]+).*?' - patron += r'simpleText":"[^"]+.*?simpleText":"([^"]+).*?' - patron += r'url":"([^"]+)' - matches = support.match('https://www.youtube.com/results?search_query=' + info.getProperty('title').replace(' ','+') + '+trailer+ita', patron = patron).matches - i = 0 - for thumb, title, text, url in matches: - i += 1 - item = xbmcgui.ListItem(title + ' - '+ text) - item.setProperties({'tile':title + ' - '+ text, 'url': url, 'thumbnail': thumb, 'fanart':info.getProperty('fanart'), 'position':'%s/%s' % (i, len(matches))}) - trailers.append(item) - main = TrailerWindow('TrailerWindow.xml', config.get_runtime_path()) - add({'class':main, 'info':trailers, 'id':RECOMANDED, TRAILERS:0}) - modal() - -class TrailerWindow(xbmcgui.WindowXMLDialog): - def __init__(self, *args, **kwargs): - self.ids = {} - - def onInit(self): - #### Compatibility with Kodi 18 #### - if config.get_platform(True)['num_version'] < 18: - self.setCoordinateResolution(2) - self.getControl(FANART).setImage(trailers[0].getProperty('fanart')) - self.getControl(NUMBER).setText(trailers[0].getProperty('position')) - self.getControl(TRAILERS).addItems(trailers) - self.setFocusId(TRAILERS) - getFocus(self) - - def onClick(self, control_id): - setFocus(self) - if control_id in [TRAILERS]: - selected = self.getControl(TRAILERS).getSelectedItem() - platformtools.play_video(Item(title=selected.getProperty('title'), action='play', url=selected.getProperty('url'), server='youtube')) - while not xbmc.Player().isPlaying(): - xbmc.sleep(100) - self.close() - while xbmc.Player().isPlaying(): - xbmc.sleep(100) - modal() - - def onAction(self, action): - if self.getFocusId() in [TRAILERS]: - self.ids[self.getFocusId()] = self.getControl(self.getFocusId()).getSelectedPosition() - fanart = self.getControl(TRAILERS).getSelectedItem().getProperty('fanart') - position = self.getControl(TRAILERS).getSelectedItem().getProperty('position') - self.getControl(FANART).setImage(fanart) - self.getControl(NUMBER).setText(position) - action = action.getId() + def onClick(self, control): global info_list - if action in [BACKSPACE]: - self.close() - remove() - modal() - elif action in [EXIT]: + + if control in [SEARCH]: + from specials.globalsearch import Search + if self.item.contentType == 'episode': + self.item.mode = 'tvshow' + self.item.text = self.item.contentSerieName + else: + self.item.mode = self.item.contentType + Search(self.item) + + elif control in [CLOSE]: self.close() -class ImagesWindow(xbmcgui.WindowDialog): + elif control in [BACK]: + back(self) + + elif control in [CAST]: + info_list.append(self.item) + listitem = self.getControl(CAST).getSelectedItem() + it = Item(id=listitem.getProperty('id'), poster=listitem.getArt('poster')) + self.close() + showCast(it) + + elif control in [RECOMANDED]: + info_list.append(self.item) + listitem = self.getControl(RECOMANDED).getSelectedItem() + it = Item(title=listitem.getLabel(), infoLabels={'tmdb_id':listitem.getProperty('id'), 'mediatype':listitem.getProperty('mediatype')}) + self.close() + start(it) + + elif control in [TRAILERS]: + listitem = self.getControl(TRAILERS).getSelectedItem() + xbmc.executebuiltin('RunPlugin({})'.format(listitem.getPath())) + + elif control in [FANARTS]: + position = showImages(self.images, self.getControl(FANARTS).getSelectedPosition()) + self.getControl(FANARTS).selectItem(position) + + + def get_recomendations(self): + # Function for recomanded + search = {'url': '{}/{}/recommendations'.format(self.type, self.info.get('tmdb_id')), 'language': 'it', 'page': 1} + tmdb_res = tmdb.Tmdb(discover=search, search_type=self.type, language_search='it').results + search = {'url': '{}/{}/recommendations'.format(self.type, self.info.get('tmdb_id')), 'language': 'it', 'page': 2} + tmdb_res += tmdb.Tmdb(discover=search, search_type=self.type, language_search='it').results[1:] + for result in tmdb_res: + title = result.get("title", result.get("name", '')) + original_title = result.get("original_title", result.get("original_name", '')) + thumbnail ='https://image.tmdb.org/t/p/w342' + result.get("poster_path", "") if result.get("poster_path", "") else '' + recomandationsitem = xbmcgui.ListItem(title, original_title) + recomandationsitem.setArt({'poster':thumbnail}) + recomandationsitem.setInfo("video",{'plot':result.get('overview', ''), 'rating':result.get('vote_average', 0)}) + rating = result.get('vote_average', 'N/A') + color = 'FFFFFFFF' if rating == 'N/A' else 'FFDB2360' if rating < 4 else 'FFD2D531' if rating < 7 else 'FF21D07A' + recomandationsitem.setProperties({'id': result.get('id', 0), 'mediatype': self.info.get('mediatype'), 'rating':str(int(result.get('vote_average',10) * 10)), 'color':color}) + + self.recomanded.append(recomandationsitem) + + def get_trailers(self): + trailers = tmdb.Tmdb(id_Tmdb=self.info.get('tmdb_id'), search_type=self.type).get_videos() + if trailers: + for trailer in trailers: + traileitem = xbmcgui.ListItem(trailer['name'], path=trailer['url']) + traileitem.setArt({'thumb':'http://img.youtube.com/vi/' + trailer['url'].split('=')[-1] + '/0.jpg'}) + self.trailers.append(traileitem) + + def get_fanarts(self): + _id = self.info.get('tmdb_id') + res = {} + fanarts = self.info.get('fanarts',[]) + if _id: + _type = self.item.contentType.replace('show','').replace('movie','movies') + host = 'http://webservice.fanart.tv/v3/{}/{}?api_key=cab16e262d72fea6a6843d679aa10300' + res = httptools.downloadpage(host.format(_type, _id)).json + + if res: fanarts += [k.get('url') for k in res.get('moviebackground', [])] if _type == 'movies' else [k.get('url') for k in res.get('showbackground', [])] + + if fanarts: + for i, fanart in enumerate(fanarts): + fanartitem = xbmcgui.ListItem(str(i)) + fanartitem.setArt({'fanart':fanart}) + self.images.append(fanart) + self.fanarts.append(fanartitem) + + +def showCast(item): + xbmc.executebuiltin('Dialog.Close(all)') + CastWindow('CastWindow.xml', config.get_runtime_path(), item=item) +class CastWindow(xbmcgui.WindowXML): def __init__(self, *args, **kwargs): - self.tmdb = kwargs.get("tmdb", {}) - self.imdb = kwargs.get("imdb", {}) - self.mal = kwargs.get("mal", {}) - self.fanartv = kwargs.get("fanartv", {}) + self.item = kwargs.get('item') + self.id = self.item.id + self.item.InfoWindow = 'cast' + self.host = tmdb.host + self.api = tmdb.api + self.movies = [] + self.tvshows = [] + self.movieItems = [] + self.tvshowItems = [] + if not self.item.focus: self.item.focus = {} + if self.item: + platformtools.dialog_busy(True) + self.get_person_info() + self.get_credits() + platformtools.dialog_busy(False) + self.doModal() - self.image_list = [] + def get_person_info(self): + # Function for Person Info + url = '{}/person/{}?api_key={}&language=en'.format(self.host, self.id, self.api) + translation_url = '{}/person/{}/translations?api_key={}'.format(self.host, self.id, self.api) + info = httptools.downloadpage(url).json - for key, value in self.tmdb.items(): - for detail in value: self.image_list.append('https://image.tmdb.org/t/p/original' + detail["file_path"]) - for image in self.imdb: self.image_list.append(image["src"]) - for image, title in self.mal: self.image_list.append(image) - for key, value in self.fanartv.items(): - for image in value: self.image_list.append(image["url"]) - #### Kodi 18 Compatibility #### - if config.get_platform(True)['num_version'] < 18: self.setCoordinateResolution(2) - log - self.background = xbmcgui.ControlImage(0, 0, 1280, 720, imagepath('white'), colorDiffuse='FF232323') - self.addControl(self.background) - main_image = self.image_list[0] if self.image_list else '' - self.main_image = xbmcgui.ControlImage(0, 0, 1280, 720, main_image, 2) - self.addControl(self.main_image) + biography = info.get('biography', '') + if not biography: + translation = httptools.downloadpage(translation_url).json + if translation: + for t in translation['translations']: + if t['iso_639_1'] == 'en': + biography = t['data']['biography'] + break - if self.image_list: - self.counter = xbmcgui.ControlTextBox(1180, 640, 60, 40, 'font13') - self.addControl(self.counter) - self.counter.setText('%s/%s' % (1,len(self.image_list))) - else: - self.text = xbmcgui.ControlLabel(0, 0, 1280, 720, 'NESSUNA IMMAGINE', 'font13', alignment=2|4) - self.addControl(self.text) + born = info.get('birthday').split('-')[0] if info.get('birthday') else '' + dead = info.get('deathday').split('-')[0] if info.get('deathday') else '' + place = info.get('place_of_birth') + self.castitem = xbmcgui.ListItem(info.get('name')) + birth = born + (' - ' + dead if dead else '') + (' [B]•[/B] ' + place if place else '') + self.castitem.setArt({'poster':self.item.poster}) + self.castitem.setProperties({'birth':birth, 'plot':biography}) - self.close_btn = xbmcgui.ControlButton(0, 0, 1280, 720, '' ,'', '') - self.addControl(self.close_btn) + def onInit(self): + self.getControl(LIST).addItem(self.castitem) + self.getControl(CAST).addItems(self.movies) + self.getControl(RECOMANDED).addItems(self.tvshows) - if len(self.image_list) > 1: - # BUTTON LEFT - self.btn_left = xbmcgui.ControlButton(0, 330, 60, 60, '', imagepath('previous_focus'), imagepath('previous_nofocus')) - self.addControl(self.btn_left) - self.btn_left.setAnimations([('WindowOpen', 'effect=slide start=-60,0 end=0,0 delay=100 time=200'),('WindowClose', 'effect=slide start=0,0 end=-60,0 delay=100 time=200')]) - - # BUTTON RIGHT - self.btn_right = xbmcgui.ControlButton(1220, 330, 60, 60, '', imagepath('next_focus'), imagepath('next_nofocus')) - self.addControl(self.btn_right) - self.btn_right.setAnimations([('WindowOpen', 'effect=slide start=60,0 end=0,0 delay=100 time=200'),('WindowClose', 'effect=slide start=0,0 end=60,0 delay=100 time=200')]) - - self.count = 0 + # Set Focus + xbmc.sleep(200) + if self.item.focus: + for k, v in self.item.focus.items(): + self.getControl(k).selectItem(v) + self.setFocusId(self.item.setFocus) + else: self.setFocusId(LIST) def onAction(self, action): + action = action.getId() + focus = self.getFocusId() + if action in [EXIT]: + self.close() + elif action in [BACKSPACE]: + back(self) + elif action in [UP, DOWN, LEFT, RIGHT] and focus not in [LIST, CAST, RECOMANDED, TRAILERS, FANARTS, SEARCH, BACK, CLOSE]: + self.setFocusId(LIST) + if focus > 0: + self.item.setFocus = focus + self.item.focus[focus] = self.getControl(focus).getSelectedPosition() + + + def onClick(self, control): + global info_list + + if control in [CLOSE]: + self.close() + + elif control in [BACK]: + back(self) + + elif control in [CAST]: + info_list.append(self.item) + self.close() + start(self.movieItems[self.getControl(CAST).getSelectedPosition()]) + + elif control in [RECOMANDED]: + info_list.append(self.item) + self.close() + start(self.tvshowItems[self.getControl(RECOMANDED).getSelectedPosition()]) + + + def get_credits(self): + # Function for Credits Info + url = '{}/person/{}/combined_credits?api_key={}&language=it'.format(self.host, self.id, self.api) + info = httptools.downloadpage(url).json + + for video in info.get('cast',[]) + info.get('crew',[]): + year = video.get('release_date', video.get('first_air_date')) + poster = 'https://image.tmdb.org/t/p/original/' + video.get('poster_path') if video.get('poster_path') else '' + infoLabels = { + 'rating':video.get('vote_average', 0), + 'plot':video.get('overview',''), + 'mediatype':video.get('media_type','').replace('tv','tvshow'), + 'thumbnail': poster, + 'tmdb_id':video.get('id'), + 'title':video.get('title',video.get('name','')), + 'year':year.split('-')[0] if year else '' + } + item = Item(infoLabels=infoLabels) + videoitem = xbmcgui.ListItem(video.get('title',video.get('name','')), video.get('character', video.get('job'))) + videoitem.setArt({'poster':infoLabels['thumbnail']}) + rating = video.get('vote_average', 'N/A') + color = 'FFFFFFFF' if rating == 'N/A' else 'FFDB2360' if rating < 4 else 'FFD2D531' if rating < 7 else 'FF21D07A' + videoitem.setProperties({'rating':str(int(video.get('vote_average',10) * 10)), 'color':color}) + platformtools.set_infolabels(videoitem, item) + if video.get('media_type') == 'movie': + self.movies.append(videoitem) + self.movieItems.append(item) + else: + self.tvshows.append(videoitem) + self.tvshowItems.append(item) + + +def showImages(images, position): + xbmc.executebuiltin('Dialog.Close(all)') + ImagesWindow('imageWindow.xml', config.get_runtime_path(), images=images, position=position) +class ImagesWindow(xbmcgui.WindowXMLDialog): + def __init__(self, *args, **kwargs): + self.images = [] + self.position = kwargs.get('position') + for i, image in enumerate(kwargs.get('images', [])): + listitem = xbmcgui.ListItem(str(i+1), str(len(kwargs.get('images', [])))) + listitem.setArt({'fanart':image}) + self.images.append(listitem) + self.doModal() + return self.position + + def onInit(self): + self.getControl(LIST).addItems(self.images) + self.setFocusId(LIST) + self.getControl(LIST).selectItem(self.position) + + def onAction(self, action): + action = action.getId() + self.position = self.getControl(LIST).getSelectedPosition() if action in [BACKSPACE, EXIT]: self.close() - if len(self.image_list) > 1: - if action in [RIGHT, DOWN]: - self.count += 1 - if self.count > len(self.image_list) -1: self.count = 0 - self.main_image.setImage(self.image_list[self.count]) - self.counter.setText('%s/%s' % (self.count,len(self.image_list))) - - if action in [LEFT, UP]: - self.count -= 1 - if self.count < 0: self.count = len(self.image_list) -1 - self.main_image.setImage(self.image_list[self.count]) - self.counter.setText('%s/%s' % (self.count,len(self.image_list))) - def onControl(self, control): - if len(self.image_list) > 1: - if control.getId() == self.btn_right.getId(): - self.count += 1 - if self.count > len(self.image_list) -1: self.count = 0 - self.main_image.setImage(self.image_list[self.count]) - elif control.getId() == self.btn_left.getId(): - self.count -= 1 - if self.count < 0: self.count = len(self.image_list) -1 - self.main_image.setImage(self.image_list[self.count]) - - else: - self.close() - else: - self.close() - - -def get_recomendations(info): - recommendations = [info] - Type = info.getProperty('mediatype') - if Type != "movie": Type = "tv" - search = {'url': '%s/%s/recommendations' % (Type, info.getProperty('tmdb_id')), 'language': 'it', 'page': 1} - tmdb_res = tmdb.Tmdb(discover=search, search_type=Type, idioma_Search='it').results - for result in tmdb_res: - if Type == 'movie': - title = result.get("title", '') - original_title = result.get("original_title", "") - else: - title = result.get("name", '') - original_title = result.get("original_name", '') - thumbnail ='https://image.tmdb.org/t/p/w342' + result.get("poster_path", "") if result.get("poster_path", "") else '' - fanart = 'https://image.tmdb.org/t/p/original' + result.get("backdrop_path", "") if result.get("backdrop_path", "") else '' - item = xbmcgui.ListItem(title) - item.setProperties({'title': title, - 'original_title': original_title, - 'mediatype': info.getProperty('mediatype'), - 'tmdb_id': result.get('id', 0), - 'imdb_id': info.getProperty('imdb_id'), - 'rating': result.get('vote_average', 0), - 'plot': result.get('overview', ''), - 'year': result.get('release_date', '').split('-')[0], - 'thumbnail': thumbnail, - 'fanart': fanart}) - recommendations.append(item) - return recommendations - - -def get_cast(info): - cast_list = [] - actors_list = [] - Type = "movie" if info.getProperty('mediatype') == 'movie' else 'tv' - otmdb = tmdb.Tmdb(id_Tmdb=info.getProperty('tmdb_id'), search_type=Type) - actors = otmdb.result.get("credits", {}).get("cast", []) - cast = otmdb.result.get("credits", {}).get("crew", []) if Type == 'movie' else otmdb.result.get("created_by", []) - for i, crew in enumerate(cast): - if crew.get('job', '') == 'Director' or Type!= "movie": - actors.insert(0, crew) - else: - res = xbmcgui.ListItem(crew.get('name', '')) - res.setProperties({'title': crew.get('name', ''), - 'job': crew.get('job', '') if crew.get('job', '') else crew.get('character',''), - 'thumbnail': "https://image.tmdb.org/t/p/w342" + crew.get('profile_path', '') if crew.get('profile_path', '') else '', - 'department': crew.get('department', ''), - 'type': Type, - 'id': crew.get('id', ''), - 'mediatype': info.getProperty('mediatype')}) - cast_list.append(res) - for actor in actors: - res = xbmcgui.ListItem(actor.get('name', '')) - res.setProperties({'title': actor.get('name', ''), - 'job': actor.get('job', '') if actor.get('job', '') else actor.get('character',''), - 'thumbnail': "https://image.tmdb.org/t/p/w342" + actor.get('profile_path', '') if actor.get('profile_path', '') else imagepath('no_photo'), - 'type': Type, - 'id': actor.get('id', ''), - 'mediatype': info.getProperty('mediatype')}) - actors_list.append(res) - return cast_list, actors_list - -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 actors_more_info(ListItem): - Type = ListItem.getProperty('type') - actor_id = ListItem.getProperty('id') - more = tmdb.Tmdb(discover={'url': 'person/' + str(actor_id), 'language': 'en'}).results - if more['biography']: ListItem.setProperty('bio', more['biography']) - -def get_movies(info): - Type = info.getProperty('mediatype') if info.getProperty('mediatype') == 'movie' else 'tv' - more = tmdb.Tmdb(discover={'url': 'person/' + str(info.getProperty('id')), 'language': 'it', 'append_to_response': Type + '_credits'}).results - movies = [] - for movie in more.get(Type + '_credits', {}).get('cast',[]) + more.get(Type + '_credits', {}).get('crew',[]): - ret = {} - ret['mediatype'] = info.getProperty('mediatype') - thumbnail = movie.get('poster_path','') - ret['thumbnail'] = "https://image.tmdb.org/t/p/w342" + thumbnail if thumbnail else imagepath(Type) - ret['title'] = movie.get('title','') if Type == 'movie' else movie.get('name','') - ret['original_title'] = movie.get('original_title','') if Type == 'movie' else movie.get("original_name", '') - ret['tmdb_id'] = movie.get('id',0) - if ret not in movies: movies.append(ret) - itemlist = [] - with futures.ThreadPoolExecutor() as executor: - List = [executor.submit(add_infoLabels, movie) for movie in movies] - for res in futures.as_completed(List): - if res.result(): - itemlist.append(res.result()) - itemlist = sorted(itemlist, key=lambda it: (it.getProperty('year'),it.getProperty('title'))) - return itemlist - -def add_infoLabels(movie): - it = Item(title=movie['title'], infoLabels=movie, contentType=movie['mediatype']) - tmdb.set_infoLabels_item(it, True) - movie=it.infoLabels - item = xbmcgui.ListItem(movie['title']) - for key, value in movie.items(): - item.setProperty(key, str(value)) - return item - - -def add(Dict): - global info_list - info_list.append(Dict) - -def remove(): - global info_list - info_list = info_list[:-1] - -def modal(): - global Info +def back(self): global info_list if info_list: - Info = info_list[-1]['info'] - info_list[-1]['class'].doModal() - -def getFocus(self): - global info_list - for key, value in info_list[-1].items(): - if key not in ['class', 'info', 'id']: - self.getControl(int(key)).selectItem(value) - self.setFocusId(info_list[-1]['id']) - -def setFocus(self): - global info_list - info_list[-1]['id'] = self.getFocusId() - for key, values in self.ids.items(): - info_list[-1][key] = values \ No newline at end of file + self.close() + it = info_list[-1] + info_list = info_list[:-1] + if it.InfoWindow == 'cast': + showCast(it) + else: + start(it) + else: + self.close() \ No newline at end of file diff --git a/platformcode/launcher.py b/platformcode/launcher.py index 40dfc885..2c854949 100644 --- a/platformcode/launcher.py +++ b/platformcode/launcher.py @@ -111,7 +111,7 @@ def run(item=None): elif item.channel == "infoplus": from platformcode import infoplus - return infoplus.Main(item) + return infoplus.start(item) elif item.channel == "backup": from platformcode import backup diff --git a/platformcode/platformtools.py b/platformcode/platformtools.py index 5c66607c..f91bbf4b 100644 --- a/platformcode/platformtools.py +++ b/platformcode/platformtools.py @@ -289,6 +289,11 @@ def dialog_select_group(heading, _list, preselect=0): return dialog +def dialog_busy(state): + if state: xbmc.executebuiltin('ActivateWindow(busydialognocancel)') + else: xbmc.executebuiltin('Dialog.Close(busydialognocancel)') + + def itemlist_refresh(offset=0): try: _id = xbmcgui.getCurrentWindowId() @@ -349,11 +354,8 @@ def render_items(itemlist, parent_item): if not item.title: item.title = '' # If there is no action or it is findvideos / play, folder = False because no listing will be returned - if item.folder == "": # not set - if item.action in ['play', '']: - item.folder = False - else: - item.folder = True + if item.action in ['play', '']: + item.folder = False if item.fanart == "": item.fanart = parent_item.fanart if item.action == 'play' and thumb_type == 1 and not item.forcethumb: @@ -403,7 +405,8 @@ def render_items(itemlist, parent_item): if item.infoLabels.get('disc'): art['banner'] = item.infoLabels['disc'] listitem.setArt(art) - listitem.setProperty('IsPlayable', str(config.get_setting("player_mode") == 1 and item.action == "play" and not item.nfo).lower()) + if config.get_setting("player_mode") == 1 and item.action == "play" and not item.nfo: + listitem.setProperty('IsPlayable', 'true') if item.infoLabels.get('castandrole'): cast = [{'name':c[0], 'role':c[1], 'thumbnail':c[2], 'order':c[3]} for c in item.infoLabels.get("castandrole", [])] @@ -649,11 +652,12 @@ def set_context_commands(item, item_url, parent_item, **kwargs): # context_commands.append((config.get_localized_string(60348), "Action(Info)")) # InfoPlus - if config.get_setting("infoplus"): + # from core.support import dbg;dbg() + # if config.get_setting("infoplus"): #if item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.infoLabels['tvdb_id'] or \ # (item.contentTitle and item.infoLabels["year"]) or item.contentSerieName: - if item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.infoLabels['tvdb_id']: - context_commands.append(("InfoPlus", "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=infoplus&action=Main&from_channel=' + item.channel))) + if item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.infoLabels['tvdb_id']: + context_commands.append(("InfoPlus", "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=infoplus&action=start&from_channel=' + item.channel))) # Open in browser and previous menu if parent_item.channel not in ["news", "channelselector", "downloads", "search"] and item.action != "mainlist" and not parent_item.noMainMenu: diff --git a/platformcode/xbmc_config_menu.py b/platformcode/xbmc_config_menu.py index 1f4eb411..6354ae20 100644 --- a/platformcode/xbmc_config_menu.py +++ b/platformcode/xbmc_config_menu.py @@ -5,6 +5,7 @@ from __future__ import division import sys, os, inspect, xbmcgui, xbmc +from core import support PY3 = False if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int from builtins import range @@ -363,6 +364,7 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): control.setVisible(False) label.setVisible(False) + logger.debug('VALUES',c["lvalues"][self.values[c["id"]]]) label.setLabel(c["lvalues"][self.values[c["id"]]]) c["control"] = control diff --git a/resources/settings.xml b/resources/settings.xml index 592fd6bd..9225df64 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -156,7 +156,7 @@ - + diff --git a/resources/skins/Default/720p/CastWindow.xml b/resources/skins/Default/720p/CastWindow.xml new file mode 100644 index 00000000..2d51af29 --- /dev/null +++ b/resources/skins/Default/720p/CastWindow.xml @@ -0,0 +1,420 @@ + + + 0.52 + + 0 + 0 + + FF232323 + + + + + + + + + Fanart + 0 + 0 + 1280 + 720 + $INFO[Container(100).ListItem.Art(fanart)] + scale + + + Poster + 0 + 0 + 480 + 720 + $INFO[Container(100).ListItem.Art(poster)] + scale + + + + + + + + + + + + 30 + 510 + 720 + + + + + + + + + + Name + 0 + 0 + 60 + font13 + FFFFFFFF + 00000000 + + left + center + + + Separator + 80 + 0 + 0.5 + white.png + + + + + 130 + 510 + 720 + 40 + + + + + + + + + + + Cast Info + Integer.IsGreater(Container(100).NumItems, 0) + 0 + 261 + + Control List + horizontal + + + 201 + 101 + + + Birth + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Description + 50 + 0 + 200 + font13 + ffFFFFFF + 00000000 + + left + top + True + + + Separator + 260 + 0 + 0.5 + white.png + + + + + Movie Group + + 241 + + Movie Title + 10 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Movie List + 30 + 100 + 102 + 200 + horizontal + 10 + + + Infoplus/no_photo.png + 10 + scale + + + $INFO[ListItem.Art(poster)] + 10 + scale + + + + + white.png + 5 + scale + Control.HasFocus(101) + + + Infoplus/no_photo.png + 10 + scale + + + $INFO[ListItem.Art(poster)] + 10 + scale + + + + + 30 + 133 + 200 + Control.HasFocus(101) + Conditional + Conditional + + white.png + + + Title + 50 + 40 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Year + 90 + 40 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + As + !String.IsEmpty(Container(101).ListItem.Label2) + 130 + 40 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Rating + 20 + 50 + 40 + 30 + font13 + ffFFFFFF + 00000000 + + right + center + + + Rating Circle + 20 + 15 + 30 + 30 + Circular/$INFO[Container(101).ListItem.Property(rating)].png + scale + + + + Separator + 240 + 0 + 0.5 + white.pngù + + + + + Show Group + + 241 + + Show Title + 10 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Show List + 30 + 101 + 200 + horizontal + 10 + + + Infoplus/no_photo.png + 10 + scale + + + $INFO[ListItem.Art(poster)] + 10 + scale + + + + + white.png + 5 + scale + Control.HasFocus(102) + + + Infoplus/no_photo.png + 10 + scale + + + $INFO[ListItem.Art(poster)] + 10 + scale + + + + + 30 + 133 + 200 + Control.HasFocus(102) + Conditional + Conditional + + white.png + + + Title + 50 + 40 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Year + 90 + 40 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + As + !String.IsEmpty(Container(102).ListItem.Label2) + 130 + 40 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Rating + 20 + 50 + 40 + 30 + font13 + ffFFFFFF + 00000000 + + right + center + + + Rating Circle + 20 + 15 + 30 + 30 + Circular/$INFO[Container(102).ListItem.Property(rating)].png + scale + + + + + + + 100 + 30 + 30 + 40 + 80 + + horizontal + + + Back + 40 + 40 + left.png + left.png + + + + Close + 40 + 40 + close.png + close.png + + + + \ No newline at end of file diff --git a/resources/skins/Default/720p/ImageWindow.xml b/resources/skins/Default/720p/ImageWindow.xml new file mode 100644 index 00000000..937a582b --- /dev/null +++ b/resources/skins/Default/720p/ImageWindow.xml @@ -0,0 +1,68 @@ + + + 0.52 + + 0 + 0 + + FF232323 + + + + + + + + + Fanart + 0 + 0 + 1280 + 720 + white.png + scale + + + Fanart List + 0 + 202 + horizontal + 10 + + + $INFO[ListItem.Art(fanart)] + scale + + + + + $INFO[ListItem.Art(fanart)] + scale + + + + + Count + 70 + 30 + 40 + font13 + ffFFFFFF + 00000000 + + right + center + + + Close + 30 + 20 + 100 + 40 + 40 + close.png + close.png + Action(close) + + + \ No newline at end of file diff --git a/resources/skins/Default/720p/InfoPlus.xml b/resources/skins/Default/720p/InfoPlus.xml index e83e52d0..37b197a4 100644 --- a/resources/skins/Default/720p/InfoPlus.xml +++ b/resources/skins/Default/720p/InfoPlus.xml @@ -1,364 +1,591 @@ - + - 0.52 - - 0 - 0 - - - - - 0 - 0 - 100% - 100% - white.png - white.png - WindowOpen - WindowClose - Action(close) - - - - 0 - 0 - - - - - - - - + 0.52 + + 0 + 0 + + FF232323 + + + + + + + + + Fanart + 0 + 0 + 1280 + 720 + $INFO[Container(100).ListItem.Art(fanart)] + scale + + + Poster + 0 + 0 + 480 + 720 + $INFO[Container(100).ListItem.Art(poster)] + scale + + + + + + + + + + + + 30 + 510 + 720 + + + + + + + + + + Rating Circle + 0 + 0 + 60 + 60 + Circular/$INFO[Container(100).ListItem.Property(rating)].png + scale + + + Rating + 15 + 10 + 30 + 40 + font13 + FFFFFFFF + 00000000 + + center + center + + + Title + 0 + 80 + 60 + font13 + FFFFFFFF + 00000000 + + left + center + + + Separator + 80 + 0 + 0.5 + white.png + + + + + 130 + 510 + 720 + 40 + + + + + + + + + + + Video Info + Integer.IsGreater(Container(100).NumItems, 0) + 0 + 261 + + 0 + 30 + 300 + 10 + horizontal + left + + Year + 30 + 45 + font13 + ffFFFFFF + 00000000 + + left + center + + + Separator + 30 + 10 + font13 + ffFFFFFF + 00000000 + !String.IsEmpty(Container(100).ListItem.Duration()) + + center + center + + + Year + 30 + 50 + font13 + ffFFFFFF + 00000000 + + left + center + + + Separator + 30 + 10 + font13 + ffFFFFFF + 00000000 + !String.IsEmpty(Container(100).ListItem.Mpaa) + + center + center + + + Year + 30 + 60 + font13 + ffFFFFFF + 00000000 + + left + center + + + + Plot + 50 + 0 + 200 + font13 + ffFFFFFF + 00000000 + + left + top + True + + + Separator + 260 + 0 + 0.5 + white.png + + + + + Cast Group + Integer.IsGreater(Container(101).NumItems, 0) + 241 + + Control List + horizontal + + + 200 + 101 + + + Cast Title + 10 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Cast List + 30 + 100 + 102 + 200 + horizontal + 10 + + + Infoplus/no_photo.png + 10 + scale + + + $INFO[ListItem.Art(poster)] + 10 + scale + + + + + white.png + 5 + scale + Control.HasFocus(101) + + + Infoplus/no_photo.png + 10 + scale + + + $INFO[ListItem.Art(poster)] + 10 + scale + + + + + 30 + 133 + 200 + Control.HasFocus(101) + Conditional + Conditional + + white.png + + + Name + 50 + 40 + 50 + font13 + ffFFFFFF + 00000000 + + left + center + + + Name + 100 + 40 + 50 + font13 + ffFFFFFF + 00000000 + + left + center + + + + Separator + 240 + 0 + 0.5 + white.pngù + + + + + Recomanded Group + + 241 + + Cast Title + 10 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Recomanded List + 30 + 101 + 103 + 200 + horizontal + 10 + + + Infoplus/no_photo.png + 10 + scale + + + $INFO[ListItem.Art(poster)] + 10 + scale + + + + + white.png + 5 + scale + Control.HasFocus(102) + + + Infoplus/no_photo.png + 10 + scale + + + $INFO[ListItem.Art(poster)] + 10 + scale + + + + + 30 + 133 + 200 + Control.HasFocus(102) + Conditional + Conditional + + white.png + + + Name + 20 + 40 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Name + 20 + 50 + 40 + 30 + font13 + ffFFFFFF + 00000000 + + right + center + + + Rating Circle + 20 + 15 + 30 + 30 + Circular/$INFO[Container(102).ListItem.Property(rating)].png + scale + + + Plot + 60 + 40 + 100 + 520 + font13 + ffFFFFFF + 00000000 + + True + left + center + + + + Separator + 240 + 0 + 0.5 + white.pngù + + + + + Trailers Group + Integer.IsGreater(Container(103).NumItems, 0) + 241 + + + Cast Title + 10 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Trailers List + 30 + 102 + 104 + 200 + horizontal + 10 + + + $INFO[ListItem.Art(thumb)] + 10 + scale + + + + + white.png + 5 + scale + Control.HasFocus(103) + + + $INFO[ListItem.Art(thumb)] + 10 + scale + + + + + 30 + 340 + 200 + Control.HasFocus(103) + Conditional + Conditional + + white.png + + + Name + 20 + 40 + 160 + 320 + font13 + ffFFFFFF + 00000000 + + True + left + center + + + + Separator + 240 + 0 + 0.5 + white.png + + + + + Fanart Group + Integer.IsGreater(Container(104).NumItems, 0) + 241 + + + Cast Title + 10 + 30 + font13 + ffFFFFFF + 00000000 + + left + center + + + Fanart List + 30 + 103 + 200 + horizontal + 10 + + + $INFO[ListItem.Art(fanart)] + 10 + scale + + + + + white.png + 5 + scale + Control.HasFocus(104) + + + $INFO[ListItem.Art(fanart)] + 10 + scale + + + + + - - - 1280 - 720 - - + + 100 + 30 + 30 + 40 + 120 + + horizontal + + search + 40 + 40 + search.png + search.png + - - - 355 - 490 - 300 - 10 - white.png - Conditional - + + Back + 40 + 40 + left.png + left.png + - - 75 - vertical - 30500 - 1280 - 570 - 30007 - 300 - - - - 100% - 570 - wrap - horizontal - 300 - - - - 300 - 0 - 180 - 270 - $INFO[ListItem.Property(thumbnail)] - scale - 10 - - - - - - 400 - 10 - 840 - 30 - font13 - FFFFFFFF - 00000000 - - left - center - - - - 400 - 70 - 840 - 190 - font13 - FFFFFFFF - 00000000 - - True - left - - - - 0 - 0 - 380 - 570 - $INFO[ListItem.Property(thumbnail)] - scale - 10 - - - - - - 1280 - 570 - wrap - horizontal - 300 - - - - 300 - 0 - 180 - 270 - $INFO[ListItem.Property(thumbnail)] - scale - 10 - - - - - - 400 - 10 - 840 - 30 - font13 - FFFFFFFF - 00000000 - - left - center - - - - 400 - 50 - 840 - 30 - font13 - FFFFFFFF - 00000000 - - left - - - - 400 - 90 - 830 - 180 - font13 - FFFFFFFF - 00000000 - - - left - - - - 0 - 0 - 380 - 570 - $INFO[ListItem.Property(thumbnail)] - scale - 10 - - - - - - 1280 - 570 - wrap - horizontal - 300 - - - - 300 - 0 - 180 - 270 - white.png - scale - 10 - - - - 300 - 0 - 180 - 270 - $INFO[ListItem.Property(thumbnail)] - scale - 10 - - - - String.IsEmpty(ListItem.Property(thumbnail)) - 10 - 300 - 160 - 270 - font13 - FFFFFFFF - - - center - center - - - - - - 400 - 10 - 840 - 30 - font13 - FFFFFFFF - 00000000 - - left - center - - - - 400 - 50 - 840 - 30 - font13 - FFFFFFFF - 00000000 - - left - - - - 400 - 90 - 830 - 180 - font13 - FFFFFFFF - 00000000 - - - left - - - - 0 - 0 - 380 - 570 - white.png - scale - 10 - - - - 0 - 0 - 380 - 570 - $INFO[ListItem.Property(thumbnail)] - scale - 10 - - - - String.IsEmpty(ListItem.Property(thumbnail)) - 0 - 0 - 380 - 570 - font13 - FFFFFFFF - - - center - center - - - - - - - 25 - 25 - 50 - 300 - Control.HasFocus(30500) | Control.HasFocus(30006) | Control.HasFocus(30007) | Control.HasFocus(30008) | Control.HasFocus(30013) - - 50 - 50 - Infoplus/tmdb.png - - - 0 - 60 - 40 - 50 - FFFFFFFF - 00000000 - font13 - - left - center - - - 120 - 50 - 50 - Infoplus/trailer.png - Infoplus/trailer.png - 30500 - 30008 - 30013 - - - 180 - 50 - 50 - Infoplus/fanart.png - Infoplus/fanart.png - 30500 - 30007 - 30008 - - - 240 - 50 - 50 - Infoplus/search.png - Infoplus/search.png - 30500 - 30013 - 30007 - - - - - + + Close + 40 + 40 + close.png + close.png + + + + \ No newline at end of file diff --git a/resources/skins/Default/media/Circular/1.png b/resources/skins/Default/media/Circular/1.png new file mode 100644 index 00000000..975d637d Binary files /dev/null and b/resources/skins/Default/media/Circular/1.png differ diff --git a/resources/skins/Default/media/Circular/10.png b/resources/skins/Default/media/Circular/10.png new file mode 100644 index 00000000..5c50f7ca Binary files /dev/null and b/resources/skins/Default/media/Circular/10.png differ diff --git a/resources/skins/Default/media/Circular/100.png b/resources/skins/Default/media/Circular/100.png new file mode 100644 index 00000000..941d77a9 Binary files /dev/null and b/resources/skins/Default/media/Circular/100.png differ diff --git a/resources/skins/Default/media/Circular/11.png b/resources/skins/Default/media/Circular/11.png new file mode 100644 index 00000000..2ca2cec1 Binary files /dev/null and b/resources/skins/Default/media/Circular/11.png differ diff --git a/resources/skins/Default/media/Circular/12.png b/resources/skins/Default/media/Circular/12.png new file mode 100644 index 00000000..d325efdd Binary files /dev/null and b/resources/skins/Default/media/Circular/12.png differ diff --git a/resources/skins/Default/media/Circular/13.png b/resources/skins/Default/media/Circular/13.png new file mode 100644 index 00000000..1bc802b0 Binary files /dev/null and b/resources/skins/Default/media/Circular/13.png differ diff --git a/resources/skins/Default/media/Circular/14.png b/resources/skins/Default/media/Circular/14.png new file mode 100644 index 00000000..423cd1dd Binary files /dev/null and b/resources/skins/Default/media/Circular/14.png differ diff --git a/resources/skins/Default/media/Circular/15.png b/resources/skins/Default/media/Circular/15.png new file mode 100644 index 00000000..b6f1d384 Binary files /dev/null and b/resources/skins/Default/media/Circular/15.png differ diff --git a/resources/skins/Default/media/Circular/16.png b/resources/skins/Default/media/Circular/16.png new file mode 100644 index 00000000..7d9b3c46 Binary files /dev/null and b/resources/skins/Default/media/Circular/16.png differ diff --git a/resources/skins/Default/media/Circular/17.png b/resources/skins/Default/media/Circular/17.png new file mode 100644 index 00000000..8c7544c9 Binary files /dev/null and b/resources/skins/Default/media/Circular/17.png differ diff --git a/resources/skins/Default/media/Circular/18.png b/resources/skins/Default/media/Circular/18.png new file mode 100644 index 00000000..f38452c9 Binary files /dev/null and b/resources/skins/Default/media/Circular/18.png differ diff --git a/resources/skins/Default/media/Circular/19.png b/resources/skins/Default/media/Circular/19.png new file mode 100644 index 00000000..51181aeb Binary files /dev/null and b/resources/skins/Default/media/Circular/19.png differ diff --git a/resources/skins/Default/media/Circular/2.png b/resources/skins/Default/media/Circular/2.png new file mode 100644 index 00000000..81f8d23f Binary files /dev/null and b/resources/skins/Default/media/Circular/2.png differ diff --git a/resources/skins/Default/media/Circular/20.png b/resources/skins/Default/media/Circular/20.png new file mode 100644 index 00000000..1757e268 Binary files /dev/null and b/resources/skins/Default/media/Circular/20.png differ diff --git a/resources/skins/Default/media/Circular/21.png b/resources/skins/Default/media/Circular/21.png new file mode 100644 index 00000000..10fa9de2 Binary files /dev/null and b/resources/skins/Default/media/Circular/21.png differ diff --git a/resources/skins/Default/media/Circular/22.png b/resources/skins/Default/media/Circular/22.png new file mode 100644 index 00000000..d7b4ebd8 Binary files /dev/null and b/resources/skins/Default/media/Circular/22.png differ diff --git a/resources/skins/Default/media/Circular/23.png b/resources/skins/Default/media/Circular/23.png new file mode 100644 index 00000000..f484e3f6 Binary files /dev/null and b/resources/skins/Default/media/Circular/23.png differ diff --git a/resources/skins/Default/media/Circular/24.png b/resources/skins/Default/media/Circular/24.png new file mode 100644 index 00000000..5dcef6fd Binary files /dev/null and b/resources/skins/Default/media/Circular/24.png differ diff --git a/resources/skins/Default/media/Circular/25.png b/resources/skins/Default/media/Circular/25.png new file mode 100644 index 00000000..34d9f13c Binary files /dev/null and b/resources/skins/Default/media/Circular/25.png differ diff --git a/resources/skins/Default/media/Circular/26.png b/resources/skins/Default/media/Circular/26.png new file mode 100644 index 00000000..5f49cead Binary files /dev/null and b/resources/skins/Default/media/Circular/26.png differ diff --git a/resources/skins/Default/media/Circular/27.png b/resources/skins/Default/media/Circular/27.png new file mode 100644 index 00000000..feafa8b5 Binary files /dev/null and b/resources/skins/Default/media/Circular/27.png differ diff --git a/resources/skins/Default/media/Circular/28.png b/resources/skins/Default/media/Circular/28.png new file mode 100644 index 00000000..f81f4296 Binary files /dev/null and b/resources/skins/Default/media/Circular/28.png differ diff --git a/resources/skins/Default/media/Circular/29.png b/resources/skins/Default/media/Circular/29.png new file mode 100644 index 00000000..2a806928 Binary files /dev/null and b/resources/skins/Default/media/Circular/29.png differ diff --git a/resources/skins/Default/media/Circular/3.png b/resources/skins/Default/media/Circular/3.png new file mode 100644 index 00000000..8d734a8a Binary files /dev/null and b/resources/skins/Default/media/Circular/3.png differ diff --git a/resources/skins/Default/media/Circular/30.png b/resources/skins/Default/media/Circular/30.png new file mode 100644 index 00000000..993915c2 Binary files /dev/null and b/resources/skins/Default/media/Circular/30.png differ diff --git a/resources/skins/Default/media/Circular/31.png b/resources/skins/Default/media/Circular/31.png new file mode 100644 index 00000000..09669834 Binary files /dev/null and b/resources/skins/Default/media/Circular/31.png differ diff --git a/resources/skins/Default/media/Circular/32.png b/resources/skins/Default/media/Circular/32.png new file mode 100644 index 00000000..dac564ec Binary files /dev/null and b/resources/skins/Default/media/Circular/32.png differ diff --git a/resources/skins/Default/media/Circular/33.png b/resources/skins/Default/media/Circular/33.png new file mode 100644 index 00000000..47fecd72 Binary files /dev/null and b/resources/skins/Default/media/Circular/33.png differ diff --git a/resources/skins/Default/media/Circular/34.png b/resources/skins/Default/media/Circular/34.png new file mode 100644 index 00000000..7af8c661 Binary files /dev/null and b/resources/skins/Default/media/Circular/34.png differ diff --git a/resources/skins/Default/media/Circular/35.png b/resources/skins/Default/media/Circular/35.png new file mode 100644 index 00000000..628ec7f3 Binary files /dev/null and b/resources/skins/Default/media/Circular/35.png differ diff --git a/resources/skins/Default/media/Circular/36.png b/resources/skins/Default/media/Circular/36.png new file mode 100644 index 00000000..c71065c8 Binary files /dev/null and b/resources/skins/Default/media/Circular/36.png differ diff --git a/resources/skins/Default/media/Circular/37.png b/resources/skins/Default/media/Circular/37.png new file mode 100644 index 00000000..14be5b06 Binary files /dev/null and b/resources/skins/Default/media/Circular/37.png differ diff --git a/resources/skins/Default/media/Circular/38.png b/resources/skins/Default/media/Circular/38.png new file mode 100644 index 00000000..dddf5722 Binary files /dev/null and b/resources/skins/Default/media/Circular/38.png differ diff --git a/resources/skins/Default/media/Circular/39.png b/resources/skins/Default/media/Circular/39.png new file mode 100644 index 00000000..acff4182 Binary files /dev/null and b/resources/skins/Default/media/Circular/39.png differ diff --git a/resources/skins/Default/media/Circular/4.png b/resources/skins/Default/media/Circular/4.png new file mode 100644 index 00000000..afbd48a3 Binary files /dev/null and b/resources/skins/Default/media/Circular/4.png differ diff --git a/resources/skins/Default/media/Circular/40.png b/resources/skins/Default/media/Circular/40.png new file mode 100644 index 00000000..aceca23a Binary files /dev/null and b/resources/skins/Default/media/Circular/40.png differ diff --git a/resources/skins/Default/media/Circular/41.png b/resources/skins/Default/media/Circular/41.png new file mode 100644 index 00000000..8bb84fc6 Binary files /dev/null and b/resources/skins/Default/media/Circular/41.png differ diff --git a/resources/skins/Default/media/Circular/42.png b/resources/skins/Default/media/Circular/42.png new file mode 100644 index 00000000..e36b13fe Binary files /dev/null and b/resources/skins/Default/media/Circular/42.png differ diff --git a/resources/skins/Default/media/Circular/43.png b/resources/skins/Default/media/Circular/43.png new file mode 100644 index 00000000..9e2e5172 Binary files /dev/null and b/resources/skins/Default/media/Circular/43.png differ diff --git a/resources/skins/Default/media/Circular/44.png b/resources/skins/Default/media/Circular/44.png new file mode 100644 index 00000000..0f525edf Binary files /dev/null and b/resources/skins/Default/media/Circular/44.png differ diff --git a/resources/skins/Default/media/Circular/45.png b/resources/skins/Default/media/Circular/45.png new file mode 100644 index 00000000..49c9f4b7 Binary files /dev/null and b/resources/skins/Default/media/Circular/45.png differ diff --git a/resources/skins/Default/media/Circular/46.png b/resources/skins/Default/media/Circular/46.png new file mode 100644 index 00000000..a3906f9a Binary files /dev/null and b/resources/skins/Default/media/Circular/46.png differ diff --git a/resources/skins/Default/media/Circular/47.png b/resources/skins/Default/media/Circular/47.png new file mode 100644 index 00000000..0cfa1b43 Binary files /dev/null and b/resources/skins/Default/media/Circular/47.png differ diff --git a/resources/skins/Default/media/Circular/48.png b/resources/skins/Default/media/Circular/48.png new file mode 100644 index 00000000..c03ae7e4 Binary files /dev/null and b/resources/skins/Default/media/Circular/48.png differ diff --git a/resources/skins/Default/media/Circular/49.png b/resources/skins/Default/media/Circular/49.png new file mode 100644 index 00000000..1fa73e24 Binary files /dev/null and b/resources/skins/Default/media/Circular/49.png differ diff --git a/resources/skins/Default/media/Circular/5.png b/resources/skins/Default/media/Circular/5.png new file mode 100644 index 00000000..50a05488 Binary files /dev/null and b/resources/skins/Default/media/Circular/5.png differ diff --git a/resources/skins/Default/media/Circular/50.png b/resources/skins/Default/media/Circular/50.png new file mode 100644 index 00000000..e9b015f7 Binary files /dev/null and b/resources/skins/Default/media/Circular/50.png differ diff --git a/resources/skins/Default/media/Circular/51.png b/resources/skins/Default/media/Circular/51.png new file mode 100644 index 00000000..df87425f Binary files /dev/null and b/resources/skins/Default/media/Circular/51.png differ diff --git a/resources/skins/Default/media/Circular/52.png b/resources/skins/Default/media/Circular/52.png new file mode 100644 index 00000000..50bfc359 Binary files /dev/null and b/resources/skins/Default/media/Circular/52.png differ diff --git a/resources/skins/Default/media/Circular/53.png b/resources/skins/Default/media/Circular/53.png new file mode 100644 index 00000000..9a745473 Binary files /dev/null and b/resources/skins/Default/media/Circular/53.png differ diff --git a/resources/skins/Default/media/Circular/54.png b/resources/skins/Default/media/Circular/54.png new file mode 100644 index 00000000..4abcd52d Binary files /dev/null and b/resources/skins/Default/media/Circular/54.png differ diff --git a/resources/skins/Default/media/Circular/55.png b/resources/skins/Default/media/Circular/55.png new file mode 100644 index 00000000..2e543917 Binary files /dev/null and b/resources/skins/Default/media/Circular/55.png differ diff --git a/resources/skins/Default/media/Circular/56.png b/resources/skins/Default/media/Circular/56.png new file mode 100644 index 00000000..5ff05960 Binary files /dev/null and b/resources/skins/Default/media/Circular/56.png differ diff --git a/resources/skins/Default/media/Circular/57.png b/resources/skins/Default/media/Circular/57.png new file mode 100644 index 00000000..7faab7d7 Binary files /dev/null and b/resources/skins/Default/media/Circular/57.png differ diff --git a/resources/skins/Default/media/Circular/58.png b/resources/skins/Default/media/Circular/58.png new file mode 100644 index 00000000..55852ef9 Binary files /dev/null and b/resources/skins/Default/media/Circular/58.png differ diff --git a/resources/skins/Default/media/Circular/59.png b/resources/skins/Default/media/Circular/59.png new file mode 100644 index 00000000..0d6d4ad8 Binary files /dev/null and b/resources/skins/Default/media/Circular/59.png differ diff --git a/resources/skins/Default/media/Circular/6.png b/resources/skins/Default/media/Circular/6.png new file mode 100644 index 00000000..6a7b8501 Binary files /dev/null and b/resources/skins/Default/media/Circular/6.png differ diff --git a/resources/skins/Default/media/Circular/60.png b/resources/skins/Default/media/Circular/60.png new file mode 100644 index 00000000..f83cb5e8 Binary files /dev/null and b/resources/skins/Default/media/Circular/60.png differ diff --git a/resources/skins/Default/media/Circular/61.png b/resources/skins/Default/media/Circular/61.png new file mode 100644 index 00000000..fa5953df Binary files /dev/null and b/resources/skins/Default/media/Circular/61.png differ diff --git a/resources/skins/Default/media/Circular/62.png b/resources/skins/Default/media/Circular/62.png new file mode 100644 index 00000000..da35efd7 Binary files /dev/null and b/resources/skins/Default/media/Circular/62.png differ diff --git a/resources/skins/Default/media/Circular/63.png b/resources/skins/Default/media/Circular/63.png new file mode 100644 index 00000000..606432d5 Binary files /dev/null and b/resources/skins/Default/media/Circular/63.png differ diff --git a/resources/skins/Default/media/Circular/64.png b/resources/skins/Default/media/Circular/64.png new file mode 100644 index 00000000..48040470 Binary files /dev/null and b/resources/skins/Default/media/Circular/64.png differ diff --git a/resources/skins/Default/media/Circular/65.png b/resources/skins/Default/media/Circular/65.png new file mode 100644 index 00000000..2ccd3da4 Binary files /dev/null and b/resources/skins/Default/media/Circular/65.png differ diff --git a/resources/skins/Default/media/Circular/66.png b/resources/skins/Default/media/Circular/66.png new file mode 100644 index 00000000..70e37910 Binary files /dev/null and b/resources/skins/Default/media/Circular/66.png differ diff --git a/resources/skins/Default/media/Circular/67.png b/resources/skins/Default/media/Circular/67.png new file mode 100644 index 00000000..5e1e61bb Binary files /dev/null and b/resources/skins/Default/media/Circular/67.png differ diff --git a/resources/skins/Default/media/Circular/68.png b/resources/skins/Default/media/Circular/68.png new file mode 100644 index 00000000..8c9b3706 Binary files /dev/null and b/resources/skins/Default/media/Circular/68.png differ diff --git a/resources/skins/Default/media/Circular/69.png b/resources/skins/Default/media/Circular/69.png new file mode 100644 index 00000000..439eaa64 Binary files /dev/null and b/resources/skins/Default/media/Circular/69.png differ diff --git a/resources/skins/Default/media/Circular/7.png b/resources/skins/Default/media/Circular/7.png new file mode 100644 index 00000000..47762ffe Binary files /dev/null and b/resources/skins/Default/media/Circular/7.png differ diff --git a/resources/skins/Default/media/Circular/70.png b/resources/skins/Default/media/Circular/70.png new file mode 100644 index 00000000..249eee6d Binary files /dev/null and b/resources/skins/Default/media/Circular/70.png differ diff --git a/resources/skins/Default/media/Circular/71.png b/resources/skins/Default/media/Circular/71.png new file mode 100644 index 00000000..cc4eb906 Binary files /dev/null and b/resources/skins/Default/media/Circular/71.png differ diff --git a/resources/skins/Default/media/Circular/72.png b/resources/skins/Default/media/Circular/72.png new file mode 100644 index 00000000..b276cef7 Binary files /dev/null and b/resources/skins/Default/media/Circular/72.png differ diff --git a/resources/skins/Default/media/Circular/73.png b/resources/skins/Default/media/Circular/73.png new file mode 100644 index 00000000..d73e0a8f Binary files /dev/null and b/resources/skins/Default/media/Circular/73.png differ diff --git a/resources/skins/Default/media/Circular/74.png b/resources/skins/Default/media/Circular/74.png new file mode 100644 index 00000000..4dfe679c Binary files /dev/null and b/resources/skins/Default/media/Circular/74.png differ diff --git a/resources/skins/Default/media/Circular/75.png b/resources/skins/Default/media/Circular/75.png new file mode 100644 index 00000000..b927fe21 Binary files /dev/null and b/resources/skins/Default/media/Circular/75.png differ diff --git a/resources/skins/Default/media/Circular/76.png b/resources/skins/Default/media/Circular/76.png new file mode 100644 index 00000000..1beb5b96 Binary files /dev/null and b/resources/skins/Default/media/Circular/76.png differ diff --git a/resources/skins/Default/media/Circular/77.png b/resources/skins/Default/media/Circular/77.png new file mode 100644 index 00000000..313dfa06 Binary files /dev/null and b/resources/skins/Default/media/Circular/77.png differ diff --git a/resources/skins/Default/media/Circular/78.png b/resources/skins/Default/media/Circular/78.png new file mode 100644 index 00000000..c226beb5 Binary files /dev/null and b/resources/skins/Default/media/Circular/78.png differ diff --git a/resources/skins/Default/media/Circular/79.png b/resources/skins/Default/media/Circular/79.png new file mode 100644 index 00000000..493c697b Binary files /dev/null and b/resources/skins/Default/media/Circular/79.png differ diff --git a/resources/skins/Default/media/Circular/8.png b/resources/skins/Default/media/Circular/8.png new file mode 100644 index 00000000..ee4516fc Binary files /dev/null and b/resources/skins/Default/media/Circular/8.png differ diff --git a/resources/skins/Default/media/Circular/80.png b/resources/skins/Default/media/Circular/80.png new file mode 100644 index 00000000..21a3f64c Binary files /dev/null and b/resources/skins/Default/media/Circular/80.png differ diff --git a/resources/skins/Default/media/Circular/81.png b/resources/skins/Default/media/Circular/81.png new file mode 100644 index 00000000..03872d32 Binary files /dev/null and b/resources/skins/Default/media/Circular/81.png differ diff --git a/resources/skins/Default/media/Circular/82.png b/resources/skins/Default/media/Circular/82.png new file mode 100644 index 00000000..acfb5c79 Binary files /dev/null and b/resources/skins/Default/media/Circular/82.png differ diff --git a/resources/skins/Default/media/Circular/83.png b/resources/skins/Default/media/Circular/83.png new file mode 100644 index 00000000..7700d696 Binary files /dev/null and b/resources/skins/Default/media/Circular/83.png differ diff --git a/resources/skins/Default/media/Circular/84.png b/resources/skins/Default/media/Circular/84.png new file mode 100644 index 00000000..587892c1 Binary files /dev/null and b/resources/skins/Default/media/Circular/84.png differ diff --git a/resources/skins/Default/media/Circular/85.png b/resources/skins/Default/media/Circular/85.png new file mode 100644 index 00000000..a2455b84 Binary files /dev/null and b/resources/skins/Default/media/Circular/85.png differ diff --git a/resources/skins/Default/media/Circular/86.png b/resources/skins/Default/media/Circular/86.png new file mode 100644 index 00000000..137071ed Binary files /dev/null and b/resources/skins/Default/media/Circular/86.png differ diff --git a/resources/skins/Default/media/Circular/87.png b/resources/skins/Default/media/Circular/87.png new file mode 100644 index 00000000..8c3248bb Binary files /dev/null and b/resources/skins/Default/media/Circular/87.png differ diff --git a/resources/skins/Default/media/Circular/88.png b/resources/skins/Default/media/Circular/88.png new file mode 100644 index 00000000..c56f7afe Binary files /dev/null and b/resources/skins/Default/media/Circular/88.png differ diff --git a/resources/skins/Default/media/Circular/89.png b/resources/skins/Default/media/Circular/89.png new file mode 100644 index 00000000..d1e59c87 Binary files /dev/null and b/resources/skins/Default/media/Circular/89.png differ diff --git a/resources/skins/Default/media/Circular/9.png b/resources/skins/Default/media/Circular/9.png new file mode 100644 index 00000000..54096f1a Binary files /dev/null and b/resources/skins/Default/media/Circular/9.png differ diff --git a/resources/skins/Default/media/Circular/90.png b/resources/skins/Default/media/Circular/90.png new file mode 100644 index 00000000..8bf4f27d Binary files /dev/null and b/resources/skins/Default/media/Circular/90.png differ diff --git a/resources/skins/Default/media/Circular/91.png b/resources/skins/Default/media/Circular/91.png new file mode 100644 index 00000000..e4218cd3 Binary files /dev/null and b/resources/skins/Default/media/Circular/91.png differ diff --git a/resources/skins/Default/media/Circular/92.png b/resources/skins/Default/media/Circular/92.png new file mode 100644 index 00000000..775f8b2d Binary files /dev/null and b/resources/skins/Default/media/Circular/92.png differ diff --git a/resources/skins/Default/media/Circular/93.png b/resources/skins/Default/media/Circular/93.png new file mode 100644 index 00000000..7d25d7c2 Binary files /dev/null and b/resources/skins/Default/media/Circular/93.png differ diff --git a/resources/skins/Default/media/Circular/94.png b/resources/skins/Default/media/Circular/94.png new file mode 100644 index 00000000..49b6cb9f Binary files /dev/null and b/resources/skins/Default/media/Circular/94.png differ diff --git a/resources/skins/Default/media/Circular/95.png b/resources/skins/Default/media/Circular/95.png new file mode 100644 index 00000000..9f3dc5a4 Binary files /dev/null and b/resources/skins/Default/media/Circular/95.png differ diff --git a/resources/skins/Default/media/Circular/96.png b/resources/skins/Default/media/Circular/96.png new file mode 100644 index 00000000..b02606c5 Binary files /dev/null and b/resources/skins/Default/media/Circular/96.png differ diff --git a/resources/skins/Default/media/Circular/97.png b/resources/skins/Default/media/Circular/97.png new file mode 100644 index 00000000..79710e8f Binary files /dev/null and b/resources/skins/Default/media/Circular/97.png differ diff --git a/resources/skins/Default/media/Circular/98.png b/resources/skins/Default/media/Circular/98.png new file mode 100644 index 00000000..ff90e197 Binary files /dev/null and b/resources/skins/Default/media/Circular/98.png differ diff --git a/resources/skins/Default/media/Circular/99.png b/resources/skins/Default/media/Circular/99.png new file mode 100644 index 00000000..a6a1ce71 Binary files /dev/null and b/resources/skins/Default/media/Circular/99.png differ diff --git a/resources/skins/Default/media/search.png b/resources/skins/Default/media/search.png new file mode 100644 index 00000000..c84aae76 Binary files /dev/null and b/resources/skins/Default/media/search.png differ diff --git a/specials/globalsearch.py b/specials/globalsearch.py index 3aa5eb15..1ed1d897 100644 --- a/specials/globalsearch.py +++ b/specials/globalsearch.py @@ -22,9 +22,7 @@ close_action = False update_lock = threading.Lock() -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 @@ -150,7 +148,7 @@ class SearchWindow(xbmcgui.WindowXML): if not self.thActions.is_alive(): return time.sleep(0.1) - yield self.searchActions[lastLen] + yield self.searchActions[lastLen-1] lastLen = len(self.searchActions) def select(self): @@ -632,7 +630,7 @@ class SearchWindow(xbmcgui.WindowXML): self.close() elif control_id in [RESULTS, EPISODESLIST]: - busy(True) + platformtools.dialog_busy(True) if control_id in [RESULTS]: name = self.CHANNELS.getSelectedItem().getLabel() self.pos = self.RESULTS.getSelectedPosition() @@ -642,12 +640,12 @@ class SearchWindow(xbmcgui.WindowXML): if item_url: item = Item().fromurl(item_url) else: # no results item - busy(False) + platformtools.dialog_busy(False) return if item.action in ['add_movie_to_library', 'add_serie_to_library','save_download']: # special items (add to videolibrary, download ecc.) xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?" + item_url + ")") - busy(False) + platformtools.dialog_busy(False) return try: @@ -713,7 +711,7 @@ class SearchWindow(xbmcgui.WindowXML): self.setFocusId(SERVERLIST) if config.get_setting('autoplay'): - busy(False) + platformtools.dialog_busy(False) else: self.episodes = self.itemsResult if self.itemsResult else [] @@ -737,7 +735,7 @@ class SearchWindow(xbmcgui.WindowXML): self.EPISODESLIST.addItems(ep) self.setFocusId(EPISODESLIST) - busy(False) + platformtools.dialog_busy(False) elif control_id in [SERVERLIST]: server = Item().fromurl(self.getControl(control_id).getSelectedItem().getProperty('item')) @@ -764,11 +762,11 @@ class SearchWindow(xbmcgui.WindowXML): def Close(self): self.exit = True if self.thread: - busy(True) + platformtools.dialog_busy(True) for th in self.search_threads: th.cancel() self.thread.join() - busy(False) + platformtools.dialog_busy(False) self.close() @@ -793,7 +791,7 @@ class SearchWindow(xbmcgui.WindowXML): def play(self, server=None): - platformtools.prevent_busy(server) + platformtools.prevent_platformtools.dialog_busy(server) server.window = True server.globalsearch = True return run(server)