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)