- Nuovo InfoPlus
- Piccole Migliorie
@@ -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))
|
||||
|
||||
|
||||
23
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
|
||||
|
||||
|
||||
1
platformcode/contextmenu/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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==)"/>
|
||||
|
||||
420
resources/skins/Default/720p/CastWindow.xml
Normal 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>
|
||||
68
resources/skins/Default/720p/ImageWindow.xml
Normal 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>
|
||||
@@ -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>
|
||||
BIN
resources/skins/Default/media/Circular/1.png
Normal file
|
After Width: | Height: | Size: 640 B |
BIN
resources/skins/Default/media/Circular/10.png
Normal file
|
After Width: | Height: | Size: 897 B |
BIN
resources/skins/Default/media/Circular/100.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
resources/skins/Default/media/Circular/11.png
Normal file
|
After Width: | Height: | Size: 898 B |
BIN
resources/skins/Default/media/Circular/12.png
Normal file
|
After Width: | Height: | Size: 910 B |
BIN
resources/skins/Default/media/Circular/13.png
Normal file
|
After Width: | Height: | Size: 943 B |
BIN
resources/skins/Default/media/Circular/14.png
Normal file
|
After Width: | Height: | Size: 985 B |
BIN
resources/skins/Default/media/Circular/15.png
Normal file
|
After Width: | Height: | Size: 1005 B |
BIN
resources/skins/Default/media/Circular/16.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
resources/skins/Default/media/Circular/17.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
resources/skins/Default/media/Circular/18.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
resources/skins/Default/media/Circular/19.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
resources/skins/Default/media/Circular/2.png
Normal file
|
After Width: | Height: | Size: 652 B |
BIN
resources/skins/Default/media/Circular/20.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
resources/skins/Default/media/Circular/21.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
resources/skins/Default/media/Circular/22.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/skins/Default/media/Circular/23.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/skins/Default/media/Circular/24.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/skins/Default/media/Circular/25.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/skins/Default/media/Circular/26.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/skins/Default/media/Circular/27.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/skins/Default/media/Circular/28.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/skins/Default/media/Circular/29.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
resources/skins/Default/media/Circular/3.png
Normal file
|
After Width: | Height: | Size: 663 B |
BIN
resources/skins/Default/media/Circular/30.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
resources/skins/Default/media/Circular/31.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
resources/skins/Default/media/Circular/32.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
resources/skins/Default/media/Circular/33.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
resources/skins/Default/media/Circular/34.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
resources/skins/Default/media/Circular/35.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
resources/skins/Default/media/Circular/36.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
resources/skins/Default/media/Circular/37.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
resources/skins/Default/media/Circular/38.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
resources/skins/Default/media/Circular/39.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
resources/skins/Default/media/Circular/4.png
Normal file
|
After Width: | Height: | Size: 720 B |
BIN
resources/skins/Default/media/Circular/40.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
resources/skins/Default/media/Circular/41.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
resources/skins/Default/media/Circular/42.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
resources/skins/Default/media/Circular/43.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
resources/skins/Default/media/Circular/44.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
resources/skins/Default/media/Circular/45.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
resources/skins/Default/media/Circular/46.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
resources/skins/Default/media/Circular/47.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
resources/skins/Default/media/Circular/48.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
resources/skins/Default/media/Circular/49.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
resources/skins/Default/media/Circular/5.png
Normal file
|
After Width: | Height: | Size: 747 B |
BIN
resources/skins/Default/media/Circular/50.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
resources/skins/Default/media/Circular/51.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
resources/skins/Default/media/Circular/52.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
resources/skins/Default/media/Circular/53.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
resources/skins/Default/media/Circular/54.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
resources/skins/Default/media/Circular/55.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
resources/skins/Default/media/Circular/56.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
resources/skins/Default/media/Circular/57.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
resources/skins/Default/media/Circular/58.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
resources/skins/Default/media/Circular/59.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
resources/skins/Default/media/Circular/6.png
Normal file
|
After Width: | Height: | Size: 780 B |
BIN
resources/skins/Default/media/Circular/60.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
resources/skins/Default/media/Circular/61.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
resources/skins/Default/media/Circular/62.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
resources/skins/Default/media/Circular/63.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
resources/skins/Default/media/Circular/64.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
resources/skins/Default/media/Circular/65.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
resources/skins/Default/media/Circular/66.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
resources/skins/Default/media/Circular/67.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
resources/skins/Default/media/Circular/68.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
resources/skins/Default/media/Circular/69.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
resources/skins/Default/media/Circular/7.png
Normal file
|
After Width: | Height: | Size: 813 B |
BIN
resources/skins/Default/media/Circular/70.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
resources/skins/Default/media/Circular/71.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
resources/skins/Default/media/Circular/72.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
resources/skins/Default/media/Circular/73.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
resources/skins/Default/media/Circular/74.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
resources/skins/Default/media/Circular/75.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
resources/skins/Default/media/Circular/76.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
resources/skins/Default/media/Circular/77.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
resources/skins/Default/media/Circular/78.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
resources/skins/Default/media/Circular/79.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
resources/skins/Default/media/Circular/8.png
Normal file
|
After Width: | Height: | Size: 838 B |
BIN
resources/skins/Default/media/Circular/80.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
resources/skins/Default/media/Circular/81.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
resources/skins/Default/media/Circular/82.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
resources/skins/Default/media/Circular/83.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
resources/skins/Default/media/Circular/84.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
resources/skins/Default/media/Circular/85.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
resources/skins/Default/media/Circular/86.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
resources/skins/Default/media/Circular/87.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
resources/skins/Default/media/Circular/88.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
resources/skins/Default/media/Circular/89.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |