- Nuovo InfoPlus

- Piccole Migliorie
This commit is contained in:
Alhaziel01
2021-06-16 18:42:31 +02:00
parent 3d61f5dc54
commit e6c09ab8bb
113 changed files with 1458 additions and 900 deletions

View File

@@ -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))

View File

@@ -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

View File

@@ -0,0 +1 @@
# -*- coding: utf-8 -*-

View File

@@ -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
self.close()
it = info_list[-1]
info_list = info_list[:-1]
if it.InfoWindow == 'cast':
showCast(it)
else:
start(it)
else:
self.close()

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -156,7 +156,7 @@
<!-- <setting id="kod_menu" type="bool" label="60026" default="true"/>-->
<setting id="infoplus" type="bool" label="70151" default="false"/>
<!-- <setting id="infoplus_set" type="bool" label="70128" visible="eq(-1,true)" default="false" subsetting="true"/> -->
<setting id="extended_info" type="bool" label="70152" default="false"/>
<!-- <setting id="extended_info" type="bool" label="70152" default="false"/> -->
<!-- Shortcut -->
<setting label="30998" type="lsep"/>
<setting id="shortcut_key" type="action" label="30999" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAia2V5bWFwIg0KfQ==)"/>

View File

@@ -0,0 +1,420 @@
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<window>
<depth>0.52</depth>
<coordinates>
<left>0</left>
<top>0</top>
</coordinates>
<backgroundcolor>FF232323</backgroundcolor>
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="100" />
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="100" delay='100'/>
</animation>
<controls>
<control type='image'>
<description>Fanart</description>
<top>0</top>
<left>0</left>
<width>1280</width>
<height>720</height>
<texture colordiffuse='FF555555'>$INFO[Container(100).ListItem.Art(fanart)]</texture>
<aspectratio>scale</aspectratio>
</control>
<control type='image'>
<description>Poster</description>
<top>0</top>
<left>0</left>
<width>480</width>
<height>720</height>
<texture>$INFO[Container(100).ListItem.Art(poster)]</texture>
<aspectratio>scale</aspectratio>
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="100" delay='100'/>
<effect type="slide" start="-200,0" end='0,0' time="200" delay='100'/>
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="200" />
<effect type="slide" start="0,0" end='-200,0' time="200" />
</animation>
</control>
<!-- Header Group -->
<control type='group'>
<top>30</top>
<left>510</left>
<width>720</width>
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="100" delay='100'/>
<effect type="slide" start="0,-80" end='0,0' time="200" delay='100'/>
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="200" />
<effect type="slide" start="0,0" end='0,-80' time="300" />
</animation>
<control type='textbox'>
<description>Name</description>
<top>0</top>
<left>0</left>
<height>60</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(100).ListItem.Label]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='image'>
<description>Separator</description>
<top>80</top>
<left>0</left>
<height>0.5</height>
<texture>white.png</texture>
</control>
</control>
<!-- Info Group -->
<control type='grouplist'>
<top>130</top>
<left>510</left>
<width>720</width>
<itemgap>40</itemgap>
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="100" delay='100'/>
<effect type="slide" start="300,0" end='0,0' time="200" delay='100'/>
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="200" />
<effect type="slide" start="0,0" end='300,0' time="200" />
</animation>
<!-- Cast Info -->
<control type='group'>
<description>Cast Info</description>
<visible>Integer.IsGreater(Container(100).NumItems, 0)</visible>
<top>0</top>
<height>261</height>
<control type='list' id='100'>
<description>Control List</description>
<orientation>horizontal</orientation>
<itemlayout/>
<focusedlayout/>
<onup>201</onup>
<ondown>101</ondown>
</control>
<control type='textbox'>
<description>Birth</description>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(100).ListItem.Property(birth)]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Description</description>
<top>50</top>
<left>0</left>
<height>200</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(100).ListItem.Property(plot)]</label>
<align>left</align>
<aligny>top</aligny>
<autoscroll time='3000' delay='3000' repeat='3000'>True</autoscroll>
</control>
<control type='image'>
<description>Separator</description>
<top>260</top>
<left>0</left>
<height>0.5</height>
<texture>white.png</texture>
</control>
</control>
<!-- Movie -->
<control type='group'>
<description>Movie Group</description>
<!-- <visible>Integer.IsGreater(Container(102).NumItems, 0)</visible> -->
<height>241</height>
<control type='textbox'>
<description>Movie Title</description>
<left>10</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>Movie</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='fixedlist' id='101'>
<description>Movie List</description>
<top>30</top>
<onup>100</onup>
<ondown>102</ondown>
<height>200</height>
<orientation>horizontal</orientation>
<itemgap>10</itemgap>
<itemlayout width='133' height='200'>
<control type='image'>
<texture>Infoplus/no_photo.png</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type='image'>
<texture>$INFO[ListItem.Art(poster)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</itemlayout>
<focusedlayout width='133' height='200'>
<control type='image'>
<texture colordiffuse='FF0082C2'>white.png</texture>
<bordersize>5</bordersize>
<aspectratio>scale</aspectratio>
<visible>Control.HasFocus(101)</visible>
</control>
<control type='image'>
<texture>Infoplus/no_photo.png</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type='image'>
<texture>$INFO[ListItem.Art(poster)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</focusedlayout>
</control>
<control type='group'>
<top>30</top>
<left>133</left>
<height>200</height>
<visible>Control.HasFocus(101)</visible>
<animation effect='zoom' start='0,100' center='720,0' reversible='true' time='160' condition='Control.HasFocus(101)'>Conditional</animation>
<animation effect='fade' start='0' reversible='true' time='100' condition='Control.HasFocus(101)'>Conditional</animation>
<control type='image'>
<texture colordiffuse='CC000000'>white.png</texture>
</control>
<control type='textbox'>
<description>Title</description>
<top>50</top>
<left>40</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(101).ListItem.Year]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Year</description>
<top>90</top>
<left>40</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[Container(101).ListItem.Label][/B]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>As</description>
<visible>!String.IsEmpty(Container(101).ListItem.Label2)</visible>
<top>130</top>
<left>40</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>as: $INFO[Container(101).ListItem.Label2]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Rating</description>
<top>20</top>
<right>50</right>
<width>40</width>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[Container(101).ListItem.Rating][/B]</label>
<align>right</align>
<aligny>center</aligny>
</control>
<control type='image'>
<description>Rating Circle</description>
<top>20</top>
<right>15</right>
<width>30</width>
<height>30</height>
<texture colordiffuse='$INFO[Container(101).ListItem.Property(color)]'>Circular/$INFO[Container(101).ListItem.Property(rating)].png</texture>
<aspectratio>scale</aspectratio>
</control>
</control>
<control type='image'>
<description>Separator</description>
<top>240</top>
<left>0</left>
<height>0.5</height>
<texture>white.png</texture>ù
</control>
</control>
<!-- Show -->
<control type='group'>
<description>Show Group</description>
<!-- <visible>Integer.IsGreater(Container(102).NumItems, 0)</visible> -->
<height>241</height>
<control type='textbox'>
<description>Show Title</description>
<left>10</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>Show</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='fixedlist' id='102'>
<description>Show List</description>
<top>30</top>
<onup>101</onup>
<height>200</height>
<orientation>horizontal</orientation>
<itemgap>10</itemgap>
<itemlayout width='133' height='200'>
<control type='image'>
<texture>Infoplus/no_photo.png</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type='image'>
<texture>$INFO[ListItem.Art(poster)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</itemlayout>
<focusedlayout width='133' height='200'>
<control type='image'>
<texture colordiffuse='FF0082C2'>white.png</texture>
<bordersize>5</bordersize>
<aspectratio>scale</aspectratio>
<visible>Control.HasFocus(102)</visible>
</control>
<control type='image'>
<texture>Infoplus/no_photo.png</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type='image'>
<texture>$INFO[ListItem.Art(poster)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</focusedlayout>
</control>
<control type='group'>
<top>30</top>
<left>133</left>
<height>200</height>
<visible>Control.HasFocus(102)</visible>
<animation effect='zoom' start='0,100' center='720,0' reversible='true' time='160' condition='Control.HasFocus(102)'>Conditional</animation>
<animation effect='fade' start='0' reversible='true' time='100' condition='Control.HasFocus(102)'>Conditional</animation>
<control type='image'>
<texture colordiffuse='CC000000'>white.png</texture>
</control>
<control type='textbox'>
<description>Title</description>
<top>50</top>
<left>40</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(102).ListItem.Year]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Year</description>
<top>90</top>
<left>40</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[Container(102).ListItem.Label][/B]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>As</description>
<visible>!String.IsEmpty(Container(102).ListItem.Label2)</visible>
<top>130</top>
<left>40</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>as: $INFO[Container(102).ListItem.Label2]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Rating</description>
<top>20</top>
<right>50</right>
<width>40</width>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[Container(102).ListItem.Rating][/B]</label>
<align>right</align>
<aligny>center</aligny>
</control>
<control type='image'>
<description>Rating Circle</description>
<top>20</top>
<right>15</right>
<width>30</width>
<height>30</height>
<texture colordiffuse='$INFO[Container(102).ListItem.Property(color)]'>Circular/$INFO[Container(102).ListItem.Property(rating)].png</texture>
<aspectratio>scale</aspectratio>
</control>
</control>
</control>
</control>
<control type='grouplist'>
<ondown>100</ondown>
<top>30</top>
<right>30</right>
<height>40</height>
<width>80</width>
<!-- <itemgap>10</itemgap> -->
<orientation>horizontal</orientation>
<control type="button" id="201">
<description>Back</description>
<height>40</height>
<width>40</width>
<texturefocus colordiffuse="FFFFFFFF">left.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">left.png</texturenofocus>
</control>
<control type="button" id="202">
<description>Close</description>
<height>40</height>
<width>40</width>
<texturefocus colordiffuse="FFFFFFFF">close.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">close.png</texturenofocus>
</control>
</control>
</controls>
</window>

View File

@@ -0,0 +1,68 @@
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<window>
<depth>0.52</depth>
<coordinates>
<left>0</left>
<top>0</top>
</coordinates>
<backgroundcolor>FF232323</backgroundcolor>
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="100" />
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="100" delay='100'/>
</animation>
<controls>
<control type='image'>
<description>Fanart</description>
<top>0</top>
<left>0</left>
<width>1280</width>
<height>720</height>
<texture colordiffuse='FF232323'>white.png</texture>
<aspectratio>scale</aspectratio>
</control>
<control type='fixedlist' id='100'>
<description>Fanart List</description>
<top>0</top>
<onup>202</onup>
<orientation>horizontal</orientation>
<itemgap>10</itemgap>
<itemlayout width='1280' height='720'>
<control type='image'>
<texture>$INFO[ListItem.Art(fanart)]</texture>
<aspectratio>scale</aspectratio>
</control>
</itemlayout>
<focusedlayout width='1280' height='720'>
<control type='image'>
<texture>$INFO[ListItem.Art(fanart)]</texture>
<aspectratio>scale</aspectratio>
</control>
</focusedlayout>
</control>
<control type='textbox'>
<description>Count</description>
<right>70</right>
<top>30</top>
<height>40</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(100).ListItem.Label]/$INFO[Container(100).ListItem.Label2]</label>
<align>right</align>
<aligny>center</aligny>
</control>
<control type="button" id="202">
<description>Close</description>
<top>30</top>
<right>20</right>
<ondown>100</ondown>
<height>40</height>
<width>40</width>
<texturefocus colordiffuse="FFFFFFFF">close.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">close.png</texturenofocus>
<onclick>Action(close)</onclick>
</control>
</controls>
</window>

View File

@@ -1,364 +1,591 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<window>
<depth>0.52</depth>
<coordinates>
<left>0</left>
<top>0</top>
</coordinates>
<controls>
<!-- CLOSE BUTTON / BACKGROUND -->
<control type="button">
<left>0</left>
<top>0</top>
<width>100%</width>
<height>100%</height>
<texturefocus colordiffuse="FF232323">white.png</texturefocus>
<texturenofocus colordiffuse="FF232323">white.png</texturenofocus>
<animation effect="fade" time="200">WindowOpen</animation>
<animation effect="fade" time="200">WindowClose</animation>
<onclick>Action(close)</onclick>
</control>
<!-- GROUP CONTROLS -->
<control type="group">
<left>0</left>
<top>0</top>
<animation type="WindowOpen" reversible="false">
<effect type="slide" start="0,100" end="0,0" delay="160" time="160" />
<effect type="fade" delay="160" end="100" time="100" />
</animation>
<animation type="WindowClose" reversible="false">
<effect type="slide" start="0,0" end="0,100" delay="160" time="160" />
<effect type="fade" delay="160" start="100" end="0" time="100" />
</animation>
<depth>0.52</depth>
<coordinates>
<left>0</left>
<top>0</top>
</coordinates>
<backgroundcolor>FF232323</backgroundcolor>
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="100" />
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="100" delay='100'/>
</animation>
<controls>
<control type='image'>
<description>Fanart</description>
<top>0</top>
<left>0</left>
<width>1280</width>
<height>720</height>
<texture colordiffuse='FF555555'>$INFO[Container(100).ListItem.Art(fanart)]</texture>
<aspectratio>scale</aspectratio>
</control>
<control type='image'>
<description>Poster</description>
<top>0</top>
<left>0</left>
<width>480</width>
<height>720</height>
<texture>$INFO[Container(100).ListItem.Art(poster)]</texture>
<aspectratio>scale</aspectratio>
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="100" delay='100'/>
<effect type="slide" start="-200,0" end='0,0' time="200" delay='100'/>
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="200" />
<effect type="slide" start="0,0" end='-200,0' time="200" />
</animation>
</control>
<!-- Header Group -->
<control type='group'>
<top>30</top>
<left>510</left>
<width>720</width>
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="100" delay='100'/>
<effect type="slide" start="0,-80" end='0,0' time="200" delay='100'/>
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="200" />
<effect type="slide" start="0,0" end='0,-80' time="300" />
</animation>
<control type='image'>
<description>Rating Circle</description>
<top>0</top>
<left>0</left>
<width>60</width>
<height>60</height>
<texture colordiffuse='$INFO[Container(100).ListItem.Property(color)]'>Circular/$INFO[Container(100).ListItem.Property(rating)].png</texture>
<aspectratio>scale</aspectratio>
</control>
<control type='textbox'>
<description>Rating</description>
<top>15</top>
<left>10</left>
<height>30</height>
<width>40</width>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(100).ListItem.Rating()]</label>
<align>center</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Title</description>
<top>0</top>
<left>80</left>
<height>60</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(100).ListItem.Label]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='image'>
<description>Separator</description>
<top>80</top>
<left>0</left>
<height>0.5</height>
<texture>white.png</texture>
</control>
</control>
<!-- Info Group -->
<control type='grouplist'>
<top>130</top>
<left>510</left>
<width>720</width>
<itemgap>40</itemgap>
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="100" delay='100'/>
<effect type="slide" start="300,0" end='0,0' time="200" delay='100'/>
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="200" />
<effect type="slide" start="0,0" end='300,0' time="200" />
</animation>
<!-- Video Info -->
<control type='group'>
<description>Video Info</description>
<visible>Integer.IsGreater(Container(100).NumItems, 0)</visible>
<top>0</top>
<height>261</height>
<control type='grouplist'>
<top>0</top>
<height>30</height>
<width>300</width>
<itemgap>10</itemgap>
<orientation>horizontal</orientation>
<align>left</align>
<control type='textbox'>
<description>Year</description>
<height>30</height>
<width>45</width>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(100).ListItem.Year]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Separator</description>
<height>30</height>
<width>10</width>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<visible>!String.IsEmpty(Container(100).ListItem.Duration())</visible>
<label>[B]•[/B]</label>
<align>center</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Year</description>
<height>30</height>
<width>50</width>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(100).ListItem.Duration(hh:mm)]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Separator</description>
<height>30</height>
<width>10</width>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<visible>!String.IsEmpty(Container(100).ListItem.Mpaa)</visible>
<label>[B]•[/B]</label>
<align>center</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Year</description>
<height>30</height>
<width>60</width>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(100).ListItem.Mpaa]</label>
<align>left</align>
<aligny>center</aligny>
</control>
</control>
<control type='textbox'>
<description>Plot</description>
<top>50</top>
<left>0</left>
<height>200</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(100).ListItem.Plot]</label>
<align>left</align>
<aligny>top</aligny>
<autoscroll time='3000' delay='3000' repeat='3000'>True</autoscroll>
</control>
<control type='image'>
<description>Separator</description>
<top>260</top>
<left>0</left>
<height>0.5</height>
<texture>white.png</texture>
</control>
</control>
<!-- Cast -->
<control type='group'>
<description>Cast Group</description>
<visible>Integer.IsGreater(Container(101).NumItems, 0)</visible>
<height>241</height>
<control type='list' id='100'>
<description>Control List</description>
<orientation>horizontal</orientation>
<itemlayout/>
<focusedlayout/>
<onup>200</onup>
<ondown>101</ondown>
</control>
<control type='textbox'>
<description>Cast Title</description>
<left>10</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>Cast</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='fixedlist' id='101'>
<description>Cast List</description>
<top>30</top>
<onup>100</onup>
<ondown>102</ondown>
<height>200</height>
<orientation>horizontal</orientation>
<itemgap>10</itemgap>
<itemlayout width='133' height='200'>
<control type='image'>
<texture>Infoplus/no_photo.png</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type='image'>
<texture>$INFO[ListItem.Art(poster)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</itemlayout>
<focusedlayout width='133' height='200'>
<control type='image'>
<texture colordiffuse='FF0082C2'>white.png</texture>
<bordersize>5</bordersize>
<aspectratio>scale</aspectratio>
<visible>Control.HasFocus(101)</visible>
</control>
<control type='image'>
<texture>Infoplus/no_photo.png</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type='image'>
<texture>$INFO[ListItem.Art(poster)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</focusedlayout>
</control>
<control type='group'>
<top>30</top>
<left>133</left>
<height>200</height>
<visible>Control.HasFocus(101)</visible>
<animation effect='zoom' start='0,100' center='720,0' reversible='true' time='160' condition='Control.HasFocus(101)'>Conditional</animation>
<animation effect='fade' start='0' reversible='true' time='100' condition='Control.HasFocus(101)'>Conditional</animation>
<control type='image'>
<texture colordiffuse='CC000000'>white.png</texture>
</control>
<control type='textbox'>
<description>Name</description>
<top>50</top>
<left>40</left>
<height>50</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[Container(101).ListItem.Label][/B]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Name</description>
<top>100</top>
<left>40</left>
<height>50</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(101).ListItem.Label2]</label>
<align>left</align>
<aligny>center</aligny>
</control>
</control>
<control type='image'>
<description>Separator</description>
<top>240</top>
<left>0</left>
<height>0.5</height>
<texture>white.png</texture>ù
</control>
</control>
<!-- Recomended -->
<control type='group'>
<description>Recomanded Group</description>
<!-- <visible>Integer.IsGreater(Container(102).NumItems, 0)</visible> -->
<height>241</height>
<control type='textbox'>
<description>Cast Title</description>
<left>10</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>Recomanded</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='fixedlist' id='102'>
<description>Recomanded List</description>
<top>30</top>
<onup>101</onup>
<ondown>103</ondown>
<height>200</height>
<orientation>horizontal</orientation>
<itemgap>10</itemgap>
<itemlayout width='133' height='200'>
<control type='image'>
<texture>Infoplus/no_photo.png</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type='image'>
<texture>$INFO[ListItem.Art(poster)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</itemlayout>
<focusedlayout width='133' height='200'>
<control type='image'>
<texture colordiffuse='FF0082C2'>white.png</texture>
<bordersize>5</bordersize>
<aspectratio>scale</aspectratio>
<visible>Control.HasFocus(102)</visible>
</control>
<control type='image'>
<texture>Infoplus/no_photo.png</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type='image'>
<texture>$INFO[ListItem.Art(poster)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</focusedlayout>
</control>
<control type='group'>
<top>30</top>
<left>133</left>
<height>200</height>
<visible>Control.HasFocus(102)</visible>
<animation effect='zoom' start='0,100' center='720,0' reversible='true' time='160' condition='Control.HasFocus(102)'>Conditional</animation>
<animation effect='fade' start='0' reversible='true' time='100' condition='Control.HasFocus(102)'>Conditional</animation>
<control type='image'>
<texture colordiffuse='CC000000'>white.png</texture>
</control>
<control type='textbox'>
<description>Name</description>
<top>20</top>
<left>40</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[Container(102).ListItem.Label][/B]</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='textbox'>
<description>Name</description>
<top>20</top>
<right>50</right>
<width>40</width>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[Container(102).ListItem.Rating][/B]</label>
<align>right</align>
<aligny>center</aligny>
</control>
<control type='image'>
<description>Rating Circle</description>
<top>20</top>
<right>15</right>
<width>30</width>
<height>30</height>
<texture colordiffuse='$INFO[Container(102).ListItem.Property(color)]'>Circular/$INFO[Container(102).ListItem.Property(rating)].png</texture>
<aspectratio>scale</aspectratio>
</control>
<control type='textbox'>
<description>Plot</description>
<top>60</top>
<left>40</left>
<height>100</height>
<width>520</width>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(102).ListItem.Plot]</label>
<autoscroll time='3000' delay='3000' repeat='3000'>True</autoscroll>
<align>left</align>
<aligny>center</aligny>
</control>
</control>
<control type='image'>
<description>Separator</description>
<top>240</top>
<left>0</left>
<height>0.5</height>
<texture>white.png</texture>ù
</control>
</control>
<!-- Trailers -->
<control type='group'>
<description>Trailers Group</description>
<visible>Integer.IsGreater(Container(103).NumItems, 0)</visible>
<height>241</height>
<visible></visible>
<control type='textbox'>
<description>Cast Title</description>
<left>10</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>Trailers</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='fixedlist' id='103'>
<description>Trailers List</description>
<top>30</top>
<onup>102</onup>
<ondown>104</ondown>
<height>200</height>
<orientation>horizontal</orientation>
<itemgap>10</itemgap>
<itemlayout width='340' height='200'>
<control type='image'>
<texture>$INFO[ListItem.Art(thumb)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</itemlayout>
<focusedlayout width='340' height='200'>
<control type='image'>
<texture colordiffuse='FF0082C2'>white.png</texture>
<bordersize>5</bordersize>
<aspectratio>scale</aspectratio>
<visible>Control.HasFocus(103)</visible>
</control>
<control type='image'>
<texture>$INFO[ListItem.Art(thumb)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</focusedlayout>
</control>
<control type='group'>
<top>30</top>
<left>340</left>
<height>200</height>
<visible>Control.HasFocus(103)</visible>
<animation effect='zoom' start='0,100' center='720,0' reversible='true' time='160' condition='Control.HasFocus(103)'>Conditional</animation>
<animation effect='fade' start='0' reversible='true' time='100' condition='Control.HasFocus(103)'>Conditional</animation>
<control type='image'>
<texture colordiffuse='CC000000'>white.png</texture>
</control>
<control type='textbox'>
<description>Name</description>
<top>20</top>
<left>40</left>
<height>160</height>
<width>320</width>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[Container(103).ListItem.Label][/B]</label>
<autoscroll time='1000' delay='1000' repeat='1000'>True</autoscroll>
<align>left</align>
<aligny>center</aligny>
</control>
</control>
<control type='image'>
<description>Separator</description>
<top>240</top>
<left>0</left>
<height>0.5</height>
<texture>white.png</texture>
</control>
</control>
<!-- Fanart Group -->
<control type='group'>
<description>Fanart Group</description>
<visible>Integer.IsGreater(Container(104).NumItems, 0)</visible>
<height>241</height>
<visible></visible>
<control type='textbox'>
<description>Cast Title</description>
<left>10</left>
<height>30</height>
<font>font13</font>
<textcolor>ffFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>FANARTS</label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type='fixedlist' id='104'>
<description>Fanart List</description>
<top>30</top>
<onup>103</onup>
<height>200</height>
<orientation>horizontal</orientation>
<itemgap>10</itemgap>
<itemlayout width='340' height='200'>
<control type='image'>
<texture>$INFO[ListItem.Art(fanart)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</itemlayout>
<focusedlayout width='340' height='200'>
<control type='image'>
<texture colordiffuse='FF0082C2'>white.png</texture>
<bordersize>5</bordersize>
<aspectratio>scale</aspectratio>
<visible>Control.HasFocus(104)</visible>
</control>
<control type='image'>
<texture>$INFO[ListItem.Art(fanart)]</texture>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</focusedlayout>
</control>
</control>
</control>
<!-- BACKGROUND -->
<control type="image" id='30000'>
<width>1280</width>
<height>720</height>
<texture colordiffuse="FF555555"></texture>
</control>
<control type='grouplist'>
<ondown>100</ondown>
<top>30</top>
<right>30</right>
<height>40</height>
<width>120</width>
<!-- <itemgap>10</itemgap> -->
<orientation>horizontal</orientation>
<control type="button" id="200">
<description>search</description>
<height>40</height>
<width>40</width>
<texturefocus colordiffuse="FFFFFFFF">search.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">search.png</texturenofocus>
</control>
<!-- LOADING -->
<control type="image" id='30011'>
<top>355</top>
<left>490</left>
<width>300</width>
<height>10</height>
<texture>white.png</texture>
<animation effect="zoom" pulse ="true" center="auto" start="0,100" end="100,100" time="1000" condition="Control.IsVisible(30011)">Conditional</animation>
</control>
<control type="button" id="201">
<description>Back</description>
<height>40</height>
<width>40</width>
<texturefocus colordiffuse="FFFFFFFF">left.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">left.png</texturenofocus>
</control>
<control type="grouplist">
<top>75</top>
<orientation>vertical</orientation>
<defaultcontrol>30500</defaultcontrol>
<width>1280</width>
<height>570</height>
<onup>30007</onup>
<scrolltime tween="cubic" easing="out">300</scrolltime>
<!-- RECOMMENDATIONS -->
<control type="wraplist" id="30500">
<width>100%</width>
<height>570</height>
<viewtype>wrap</viewtype>
<orientation>horizontal</orientation>
<scrolltime tween="cubic" easing="out">300</scrolltime>
<itemlayout height="570" width="180">
<!-- Poster -->
<control type="image">
<top>300</top>
<left>0</left>
<width>180</width>
<height>270</height>
<texture>$INFO[ListItem.Property(thumbnail)]</texture>
<aspectratio>scale</aspectratio>
<bordersize>10</bordersize>
</control>
</itemlayout>
<focusedlayout height="570" width="380">
<!-- Title -->
<control type="textbox">
<left>400</left>
<top>10</top>
<width>840</width>
<height>30</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[ListItem.Label] [COLOR FFAAAAAA] $INFO[ListItem.Property(year)][/COLOR][/B] </label>
<align>left</align>
<aligny>center</aligny>
</control>
<!-- Plot -->
<control type="textbox">
<left>400</left>
<top>70</top>
<width>840</width>
<height>190</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[ListItem.Property(plot)]</label>
<autoscroll time="3000" delay="3000" repeat="3000">True</autoscroll>
<align>left</align>
</control>
<!-- Poster -->
<control type="image">
<top>0</top>
<left>0</left>
<width>380</width>
<height>570</height>
<texture>$INFO[ListItem.Property(thumbnail)]</texture>
<aspectratio>scale</aspectratio>
<bordersize>10</bordersize>
</control>
</focusedlayout>
</control>
<!-- Actors -->
<control type="wraplist" id="30501">
<width>1280</width>
<height>570</height>
<viewtype>wrap</viewtype>
<orientation>horizontal</orientation>
<scrolltime tween="cubic" easing="out">300</scrolltime>
<itemlayout height="570" width="180">
<!-- Poster -->
<control type="image">
<top>300</top>
<left>0</left>
<width>180</width>
<height>270</height>
<texture>$INFO[ListItem.Property(thumbnail)]</texture>
<aspectratio>scale</aspectratio>
<bordersize>10</bordersize>
</control>
</itemlayout>
<focusedlayout height="570" width="380">
<!-- Title -->
<control type="textbox">
<left>400</left>
<top>10</top>
<width>840</width>
<height>30</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[ListItem.Property(title)][/B] </label>
<align>left</align>
<aligny>center</aligny>
</control>
<!-- Tagline -->
<control type="textbox">
<left>400</left>
<top>50</top>
<width>840</width>
<height>30</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[ListItem.Property(job)][/B]</label>
<align>left</align>
</control>
<!-- Plot -->
<control type="textbox">
<left>400</left>
<top>90</top>
<width>830</width>
<height>180</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[ListItem.Property(bio)]</label>
<autoscroll delay="3000" time="2000" repeat="3000"></autoscroll>
<align>left</align>
</control>
<!-- Poster -->
<control type="image">
<top>0</top>
<left>0</left>
<width>380</width>
<height>570</height>
<texture>$INFO[ListItem.Property(thumbnail)]</texture>
<aspectratio>scale</aspectratio>
<bordersize>10</bordersize>
</control>
</focusedlayout>
</control>
<!-- CAST -->
<control type="wraplist" id="30502">
<width>1280</width>
<height>570</height>
<viewtype>wrap</viewtype>
<orientation>horizontal</orientation>
<scrolltime tween="cubic" easing="out">300</scrolltime>
<itemlayout height="570" width="180">
<!-- Background -->
<control type="image">
<top>300</top>
<left>0</left>
<width>180</width>
<height>270</height>
<texture colordiffuse="FF232323">white.png</texture>
<aspectratio>scale</aspectratio>
<bordersize>10</bordersize>
</control>
<!-- Poster -->
<control type="image">
<top>300</top>
<left>0</left>
<width>180</width>
<height>270</height>
<texture>$INFO[ListItem.Property(thumbnail)]</texture>
<aspectratio>scale</aspectratio>
<bordersize>10</bordersize>
</control>
<!-- DEPARTMENT -->
<control type="textbox">
<visible>String.IsEmpty(ListItem.Property(thumbnail))</visible>
<left>10</left>
<top>300</top>
<width>160</width>
<height>270</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<label>[B]$INFO[ListItem.Property(department)][/B]</label>
<autoscroll delay="3000" time="2000" repeat="3000"></autoscroll>
<align>center</align>
<aligny>center</aligny>
</control>
</itemlayout>
<focusedlayout height="570" width="380">
<!-- Title -->
<control type="textbox">
<left>400</left>
<top>10</top>
<width>840</width>
<height>30</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[ListItem.Property(title)][/B] </label>
<align>left</align>
<aligny>center</aligny>
</control>
<!-- Tagline -->
<control type="textbox">
<left>400</left>
<top>50</top>
<width>840</width>
<height>30</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[ListItem.Property(job)][/B]</label>
<align>left</align>
</control>
<!-- Plot -->
<control type="textbox">
<left>400</left>
<top>90</top>
<width>830</width>
<height>180</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[ListItem.Property(bio)]</label>
<autoscroll delay="3000" time="2000" repeat="3000"></autoscroll>
<align>left</align>
</control>
<!-- Background -->
<control type="image">
<top>0</top>
<left>0</left>
<width>380</width>
<height>570</height>
<texture colordiffuse="FF232323">white.png</texture>
<aspectratio>scale</aspectratio>
<bordersize>10</bordersize>
</control>
<!-- Poster -->
<control type="image">
<top>0</top>
<left>0</left>
<width>380</width>
<height>570</height>
<texture>$INFO[ListItem.Property(thumbnail)]</texture>
<aspectratio>scale</aspectratio>
<bordersize>10</bordersize>
</control>
<!-- Department -->
<control type="textbox">
<visible>String.IsEmpty(ListItem.Property(thumbnail))</visible>
<left>0</left>
<top>0</top>
<width>380</width>
<height>570</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
<label>$INFO[ListItem.Property(department)]</label>
<autoscroll delay="3000" time="2000" repeat="3000"></autoscroll>
<align>center</align>
<aligny>center</aligny>
</control>
</focusedlayout>
</control>
</control>
<control type="group">
<top>25</top>
<right>25</right>
<height>50</height>
<width>300</width>
<visible allowhiddenfocus="true">Control.HasFocus(30500) | Control.HasFocus(30006) | Control.HasFocus(30007) | Control.HasFocus(30008) | Control.HasFocus(30013)</visible>
<control type="image">
<width>50</width>
<height>50</height>
<texture >Infoplus/tmdb.png</texture>
</control>
<control type="textbox" id="30006">
<top>0</top>
<left>60</left>
<width>40</width>
<height>50</height>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<font>font13</font>
<label></label>
<align>left</align>
<aligny>center</aligny>
</control>
<control type="button" id="30007">
<left>120</left>
<width>50</width>
<height>50</height>
<texturenofocus colordiffuse="AAFFFFFF">Infoplus/trailer.png</texturenofocus>
<texturefocus colordiffuse="FFFFFFFF">Infoplus/trailer.png</texturefocus>
<ondown>30500</ondown>
<onleft>30008</onleft>
<onright>30013</onright>
</control>
<control type="button" id="30013">
<left>180</left>
<width>50</width>
<height>50</height>
<texturenofocus colordiffuse="AAFFFFFF">Infoplus/fanart.png</texturenofocus>
<texturefocus colordiffuse="FFFFFFFF">Infoplus/fanart.png</texturefocus>
<ondown>30500</ondown>
<onleft>30007</onleft>
<onright>30008</onright>
</control>
<control type="button" id="30008">
<left>240</left>
<width>50</width>
<height>50</height>
<texturenofocus colordiffuse="AAFFFFFF">Infoplus/search.png</texturenofocus>
<texturefocus colordiffuse="FFFFFFFF">Infoplus/search.png</texturefocus>
<ondown>30500</ondown>
<onleft>30013</onleft>
<onright>30007</onright>
</control>
</control>
</control> <!-- GROUP CONTROLS END -->
</controls>
</window>
<control type="button" id="202">
<description>Close</description>
<height>40</height>
<width>40</width>
<texturefocus colordiffuse="FFFFFFFF">close.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">close.png</texturenofocus>
</control>
</control>
</controls>
</window>

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 897 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 898 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 943 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 985 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1005 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 652 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 720 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 780 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 838 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Some files were not shown because too many files have changed in this diff Show More