Nuovo Autorenumber

+ Migliorie TVDB
 + Migliorie TMDB
This commit is contained in:
Alhaziel01
2020-11-06 19:41:28 +01:00
parent 8caad5f96c
commit 9bd8764805
32 changed files with 1800 additions and 783 deletions
+1 -1
View File
@@ -85,7 +85,7 @@ def peliculas(item):
typeContentDict = {'movie':['movie']}
typeActionDict = {'findvideos':['movie']}
def ItemItemlistHook(item, itemlist):
def itemlistHook(itemlist):
if item.search:
itemlist = [ it for it in itemlist if ' Episodio ' not in it.title ]
if len(itemlist) == int(perpage):
+3 -3
View File
@@ -84,12 +84,12 @@ def peliculas(item):
if not item.pag: item.pag = 1
anime=True
blacklist=['Altri Hentai']
# blacklist=['Altri Hentai']
data = support.match(host + '/wp-content/themes/animeuniverse/functions/ajax.php', post='sorter=recent&location=&loop=main+loop&action=sort&numarticles='+perpage+'&paginated='+str(item.pag)+'&currentquery%5B'+query+'%5D='+searchtext+'&thumbnail=1').data.replace('\\','')
patron=r'<a href="(?P<url>[^"]+)"><img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)" class="[^"]+" alt="" title="(?P<title>.*?)\s*(?P<lang>Sub ITA|ITA)?(?:"| \[)'
def ItemItemlistHook(item, itemlist):
if len(itemlist) == int(perpage) - len(blacklist):
def itemlistHook(itemlist):
if len(itemlist) == int(perpage):
item.pag += 1
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), action='peliculas'))
return itemlist
+2 -2
View File
@@ -88,7 +88,7 @@ def menu(item):
action = 'submenu'
# data = get_data(item)
patronMenu=r'<button[^>]+>\s*(?P<title>[A-Za-z0-9]+)\s*<span.[^>]+>(?P<other>.*?)</ul>'
def ItemItemlistHook(item, itemlist):
def itemlistHook(itemlist):
itemlist.insert(0, item.clone(title=support.typo('Tutti','bold'), action='peliculas'))
itemlist.append(item.clone(title=support.typo('Cerca...','bold'), action='search', search=True, thumbnail=support.thumb('search.png')))
return itemlist
@@ -174,7 +174,7 @@ def peliculas(item):
@support.scrape
def episodios(item):
anime=True
pagination = 50
pagination = 25
# data = get_data(item)
patronBlock= r'<div class="server\s*active\s*"(?P<block>.*?)(?:<div class="server|<link)'
patron = r'<li[^>]*>\s*<a.*?href="(?P<url>[^"]+)"[^>]*>(?P<episode>[^<]+)<'
+20 -19
View File
@@ -73,27 +73,28 @@ def peliculas(item):
pagination = pagination_values[support.config.get_setting('pagination','paramount')]
item.url = host + '/api/search?activeTab=' + Type + '&searchFilter=site&pageNumber=0&rowsPerPage=10000'
data = jsontools.load(support.match(item).data)['response']['items']
titles = []
for it in data:
title = it['meta']['header']['title']
support.info(title, it)
d = it['meta']['date'].split('/') if it['meta']['date'] else ['0000','00','00']
date = int(d[2] + d[1] + d[0])
if item.search.lower() in title.lower() \
and 'stagione' not in it['url'] \
and 'season' not in it['url'] \
and title not in ['Serie TV']:
itemlist.append(
item.clone(title=support.typo(title,'bold'),
action=action,
fulltitle=title,
show=title,
contentTitle=title if it['type'] == 'movie' else '',
contentSerieName=title if it['type'] != 'movie' else '',
plot= it['meta']['description'] if 'description' in it['meta'] else '',
url=host + it['url'],
date=date,
thumbnail='https:' + it['media']['image']['url'] if 'url' in it['media']['image'] else item.thumbnail))
if title not in titles:
titles.append(title)
d = it['meta']['date'].split('/') if it['meta']['date'] else ['0000','00','00']
date = int(d[2] + d[1] + d[0])
if item.search.lower() in title.lower() \
and 'stagione' not in it['url'] \
and 'season' not in it['url'] \
and title not in ['Serie TV']:
itemlist.append(
item.clone(title=support.typo(title,'bold'),
action=action,
fulltitle=title,
show=title,
contentTitle=title if it['type'] == 'movie' else '',
contentSerieName=title if it['type'] != 'movie' else '',
plot= it['meta']['description'] if 'description' in it['meta'] else '',
url=host + it['url'],
date=date,
thumbnail='https:' + it['media']['image']['url'] if 'url' in it['media']['image'] else item.thumbnail))
itemlist.sort(key=lambda item: item.fulltitle)
if not item.search:
itlist = []
+14 -64
View File
@@ -54,70 +54,20 @@ def find_and_set_infoLabels(item):
import traceback
logger.error(traceback.format_exc())
while scraper:
# We call the find_and_set_infoLabels function of the selected scraper
scraper_result = scraper.find_and_set_infoLabels(item)
# Check if there is a 'code'
if scraper_result and item.infoLabels['code']:
# correct code
logger.info("Identificador encontrado: %s" % item.infoLabels['code'])
scraper.completar_codigos(item)
return True
elif scraper_result:
# Content found but no 'code'
msg = config.get_localized_string(60227) % title
else:
# Content not found
msg = config.get_localized_string(60228) % title
logger.info(msg)
# Show box with other options:
if scrapers_disponibles[scraper_actual] in list_opciones_cuadro:
list_opciones_cuadro.remove(scrapers_disponibles[scraper_actual])
index = platformtools.dialog_select(msg, list_opciones_cuadro)
if index < 0:
logger.debug("You have clicked 'cancel' in the window '%s'" % msg)
return False
elif index == 0:
# Ask the title
title = platformtools.dialog_input(title, config.get_localized_string(60229) % tipo_contenido)
if title:
if item.contentType == "movie":
item.contentTitle = title
else:
item.contentSerieName = title
else:
logger.debug("I clicked 'cancel' in the window 'Enter the correct name'")
return False
elif index == 1:
# You have to create a dialog box to enter the data
logger.info("Complete information")
if cuadro_completar(item):
# correct code
logger.info("Identifier found: %s" % str(item.infoLabels['code']))
return True
# raise
elif list_opciones_cuadro[index] in list(scrapers_disponibles.values()):
# Get the name of the scraper module
for k, v in list(scrapers_disponibles.items()):
if list_opciones_cuadro[index] == v:
if scrapers_disponibles[scraper_actual] not in list_opciones_cuadro:
list_opciones_cuadro.append(scrapers_disponibles[scraper_actual])
# We import the scraper k
scraper_actual = k
try:
scraper = None
scraper = __import__('core.%s' % scraper_actual, fromlist=["core.%s" % scraper_actual])
except ImportError:
exec("import core." + scraper_actual + " as scraper_module")
break
logger.error("Error importing the scraper module %s" % scraper_actual)
# while scraper:
# We call the find_and_set_infoLabels function of the selected scraper
scraper_result = scraper.find_and_set_infoLabels(item)
# from core.support import dbg; dbg()
# Check if there is a 'code'
if scraper_result and item.infoLabels['code']:
# correct code
logger.info("Identifier found: %s " % item.infoLabels['code'])
scraper.completar_codigos(item)
return True
else:
# Content not found
logger.info(logger.info("Identifier not found for: %s " % title))
return
def cuadro_completar(item):
+13 -13
View File
@@ -351,7 +351,7 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t
quality=quality,
url=scraped["url"],
infoLabels=infolabels,
thumbnail=item.thumbnail if not scraped["thumb"] else scraped["thumb"],
thumbnail=item.prevthumb if item.prevthumb else item.thumbnail if not scraped["thumb"] else scraped["thumb"],
args=item.args,
contentSerieName= title if 'movie' not in [contentType] and function != 'episodios' else item.contentSerieName,
contentTitle= title if 'movie' in [contentType] and function == 'peliculas' else item.contentTitle,
@@ -473,9 +473,6 @@ def scrape(func):
if 'itemlistHook' in args:
itemlist = args['itemlistHook'](itemlist)
if 'ItemItemlistHook' in args:
itemlist = args['ItemItemlistHook'](item, itemlist)
# if url may be changed and channel has findhost to update
if 'findhost' in func.__globals__ and not itemlist:
info('running findhost ' + func.__module__)
@@ -511,20 +508,23 @@ def scrape(func):
url=item.url,
args=item.args,
page=pag + 1,
thumbnail=thumb()))
thumbnail=thumb(),
prevthumb=item.prevthumb if item.prevthumb else item.thumbnail))
if anime:
if anime and inspect.stack()[1][3] not in ['find_episodes']:
from platformcode import autorenumber
if function == 'episodios' or item.action == 'episodios': autorenumber.renumber(itemlist, item, 'bold')
else: autorenumber.renumber(itemlist)
if (function == 'episodios' or item.action == 'episodios'): autorenumber.start(itemlist, item)
else: autorenumber.start(itemlist)
# if anime and autorenumber.check(item) == False and len(itemlist)>0 and not scrapertools.find_single_match(itemlist[0].title, r'(\d+.\d+)'):
# pass
# else:
if addVideolibrary and (item.infoLabels["title"] or item.fulltitle):
# item.fulltitle = item.infoLabels["title"]
videolibrary(itemlist, item, function=function)
if function == 'episodios' or function == 'findvideos':
download(itemlist, item, function=function)
if inspect.stack()[1][3] not in ['find_episodes']:
if addVideolibrary and (item.infoLabels["title"] or item.fulltitle):
# item.fulltitle = item.infoLabels["title"]
videolibrary(itemlist, item, function=function)
if function == 'episodios' or function == 'findvideos':
download(itemlist, item, function=function)
if 'patronMenu' in args and itemlist:
itemlist = thumb(itemlist, genre=True)
+3
View File
@@ -528,6 +528,9 @@ def find_and_set_infoLabels(item):
if len(results) > 1:
from platformcode import platformtools
tmdb_result = platformtools.show_video_info(results, item=item, caption= tipo_contenido % title)
if not tmdb_result:
res = platformtools.dialog_info(item, 'tmdb')
if res: return find_and_set_infoLabels(res)
elif len(results) > 0:
tmdb_result = results[0]
+80 -116
View File
@@ -89,7 +89,7 @@ def find_and_set_infoLabels(item):
title = item.contentSerieName
# If the title includes the (year) we will remove it
year = scrapertools.find_single_match(title, "^.+?\s*(\(\d{4}\))$")
year = scrapertools.find_single_match(title, r"^.+?\s*(\(\d{4}\))$")
if year:
title = title.replace(year, "").strip()
item.infoLabels['year'] = year[1:-1]
@@ -114,6 +114,9 @@ def find_and_set_infoLabels(item):
if len(results) > 1:
tvdb_result = platformtools.show_video_info(results, item=item, scraper=Tvdb, caption=config.get_localized_string(60298) % title)
if not tvdb_result:
res = platformtools.dialog_info(item, 'tvdb')
if res: return find_and_set_infoLabels(res)
elif len(results) > 0:
tvdb_result = results[0]
@@ -398,19 +401,13 @@ class Tvdb(object):
else: params = jsontools.dump(params)
try:
req = urllib.request.Request(url, data=params, headers=DEFAULT_HEADERS)
response = urllib.request.urlopen(req)
html = response.read()
response.close()
dict_html = requests.post(url, data=params, headers=DEFAULT_HEADERS).json()
except Exception as ex:
message = "An exception of type %s occured. Arguments:\n%s" % (type(ex).__name__, repr(ex.args))
logger.error("error: %s" % message)
else:
dict_html = jsontools.load(html)
# logger.debug("dict_html %s" % dict_html)
if "token" in dict_html:
token = dict_html["token"]
DEFAULT_HEADERS["Authorization"] = "Bearer " + token
@@ -424,17 +421,14 @@ class Tvdb(object):
is_success = False
url = HOST + "/refresh_token"
try:
req = urllib.request.Request(url, headers=DEFAULT_HEADERS)
response = urllib.request.urlopen(req)
html = response.read()
response.close()
req = requests.get(url, headers=DEFAULT_HEADERS)
except urllib.error.HTTPError as err:
logger.error("err.code %s" % err.code)
except req as err:
logger.error("err.code %s" % err.status_code)
# if there is error 401 it is that the token has passed the time and we have to call login again
if err.code == 401:
if err.status_code == 401:
cls.__login()
else:
raise
@@ -444,13 +438,15 @@ class Tvdb(object):
logger.error("error: %s" % message)
else:
dict_html = jsontools.load(html)
dict_html = req.json()
# logger.error("tokencito %s" % dict_html)
if "token" in dict_html:
token = dict_html["token"]
DEFAULT_HEADERS["Authorization"] = "Bearer " + token
TOKEN = config.set_setting("tvdb_token", token)
is_success = True
else:
cls.__login()
return is_success
@@ -531,18 +527,16 @@ class Tvdb(object):
DEFAULT_HEADERS["Accept-Language"] = lang
logger.debug("url: %s, \nheaders: %s" % (url, DEFAULT_HEADERS))
req = urllib.request.Request(url, headers=DEFAULT_HEADERS)
response = urllib.request.urlopen(req)
html = response.read()
response.close()
req = requests.get(url, headers=DEFAULT_HEADERS)
except Exception as ex:
message = "An exception of type %s occured. Arguments:\n%s" % (type(ex).__name__, repr(ex.args))
logger.error("error: %s" % message)
else:
dict_html = jsontools.load(html)
dict_html = req.json()
if 'Error' in dict_html:
logger.debug("code %s " % dict_html['Error'])
if "data" in dict_html and "id" in dict_html["data"][0]:
self.get_episode_by_id(dict_html["data"][0]["id"], lang)
return dict_html["data"]
@@ -590,25 +584,12 @@ class Tvdb(object):
"""
logger.info()
try:
url = HOST + "/series/%s/episodes?page=%s" % (_id, page)
logger.debug("url: %s, \nheaders: %s" % (url, DEFAULT_HEADERS))
req = urllib.request.Request(url, headers=DEFAULT_HEADERS)
response = urllib.request.urlopen(req)
html = response.read()
response.close()
except Exception as ex:
message = "An exception of type %s occured. Arguments:\n%s" % (type(ex).__name__, repr(ex.args))
logger.error("error: %s" % message)
else:
self.list_episodes[page] = jsontools.load(html)
# logger.info("dict_html %s" % self.list_episodes)
return self.list_episodes[page]
url = HOST + "/series/%s/episodes?page=%s" % (_id, page)
logger.debug("url: %s, \nheaders: %s" % (url, DEFAULT_HEADERS))
js = requests.get(url, headers=DEFAULT_HEADERS).json()
self.list_episodes[page] = js if 'Error' not in js else {}
return self.list_episodes[page]
def get_episode_by_id(self, _id, lang=DEFAULT_LANG, semaforo=None):
"""
@@ -681,24 +662,17 @@ class Tvdb(object):
try:
DEFAULT_HEADERS["Accept-Language"] = lang
logger.debug("url: %s, \nheaders: %s" % (url, DEFAULT_HEADERS))
req = urllib.request.Request(url, headers=DEFAULT_HEADERS)
response = urllib.request.urlopen(req)
html = response.read()
response.close()
dict_html = requests.get(url, headers=DEFAULT_HEADERS).json
except Exception as ex:
# if isinstance(ex, urllib).HTTPError:
logger.debug("code %s " % ex.code)
logger.debug("code %s " % ex)
message = "An exception of type %s occured. Arguments:\n%s" % (type(ex).__name__, repr(ex.args))
logger.error("error en: %s" % message)
else:
dict_html = jsontools.load(html)
dict_html = dict_html.pop("data")
logger.info("dict_html %s" % dict_html)
self.episodes[_id] = dict_html
# logger.info("dict_html %s" % dict_html)
self.episodes[_id] = dict_html.pop("data") if 'Error' not in dict_html else {}
if semaforo:
semaforo.release()
@@ -730,37 +704,28 @@ class Tvdb(object):
"""
logger.info()
try:
params = {}
if name:
params["name"] = name
elif imdb_id:
params["imdbId"] = imdb_id
elif zap2it_id:
params["zap2itId"] = zap2it_id
params = {}
if name:
params["name"] = name
elif imdb_id:
params["imdbId"] = imdb_id
elif zap2it_id:
params["zap2itId"] = zap2it_id
params = urllib.parse.urlencode(params)
params = urllib.parse.urlencode(params)
DEFAULT_HEADERS["Accept-Language"] = lang
url = HOST + "/search/series?%s" % params
logger.debug("url: %s, \nheaders: %s" % (url, DEFAULT_HEADERS))
DEFAULT_HEADERS["Accept-Language"] = lang
url = HOST + "/search/series?%s" % params
logger.debug("url: %s, \nheaders: %s" % (url, DEFAULT_HEADERS))
dict_html = requests.get(url, headers=DEFAULT_HEADERS).json()
req = urllib.request.Request(url, headers=DEFAULT_HEADERS)
response = urllib.request.urlopen(req)
html = response.read()
logger.info(html)
response.close()
except Exception as ex:
if 'Error' in dict_html:
# if isinstance(ex, urllib.parse).HTTPError:
logger.debug("code %s " % ex.code)
message = "An exception of type %s occured. Arguments:\n%s" % (type(ex).__name__, repr(ex.args))
logger.error("error: %s" % message)
logger.debug("code %s " % dict_html['Error'])
else:
dict_html = jsontools.load(html)
if "errors" in dict_html and "invalidLanguage" in dict_html["errors"]:
# no hay información en idioma por defecto
@@ -834,13 +799,9 @@ class Tvdb(object):
try:
DEFAULT_HEADERS["Accept-Language"] = lang
req = urllib.request.Request(url, headers=DEFAULT_HEADERS)
req = requests.get(url, headers=DEFAULT_HEADERS)
logger.debug("url: %s, \nheaders: %s" % (url, DEFAULT_HEADERS))
response = urllib.request.urlopen(req)
html = response.read()
response.close()
except Exception as ex:
# if isinstance(ex, urllib).HTTPError:
logger.debug("code %s " % ex)
@@ -849,26 +810,24 @@ class Tvdb(object):
logger.error("error: %s" % message)
else:
dict_html = jsontools.load(html)
dict_html = req.json()
if "errors" in dict_html and "invalidLanguage" in dict_html["errors"]:
return {}
else:
resultado1 = dict_html["data"]
if not resultado1 and from_get_list:
return self.__get_by_id(_id, "en")
resultado1 = dict_html["data"]
if not resultado1 and from_get_list:
return self.__get_by_id(_id, "en")
logger.debug("Result %s" % dict_html)
resultado2 = {"image_poster": [{'keyType': 'poster', 'fileName': 'posters/%s-1.jpg' % _id}]}
resultado3 = {"image_fanart": [{'keyType': 'fanart', 'fileName': 'fanart/original/%s-1.jpg' % _id}]}
logger.debug("Result %s" % dict_html)
resultado2 = {"image_poster": [{'keyType': 'poster', 'fileName': 'posters/%s-1.jpg' % _id}]}
resultado3 = {"image_fanart": [{'keyType': 'fanart', 'fileName': 'fanart/original/%s-1.jpg' % _id}]}
resultado = resultado1.copy()
resultado.update(resultado2)
resultado.update(resultado3)
resultado = resultado1.copy()
resultado.update(resultado2)
resultado.update(resultado3)
logger.debug("total result %s" % resultado)
self.list_results = [resultado]
self.result = resultado
logger.debug("total result %s" % resultado)
self.list_results = [resultado]
self.result = resultado
return resultado
@@ -909,24 +868,26 @@ class Tvdb(object):
url = HOST + "/series/%s/images/query?%s" % (_id, params)
logger.debug("url: %s, \nheaders: %s" % (url, DEFAULT_HEADERS))
req = urllib.request.Request(url, headers=DEFAULT_HEADERS)
response = urllib.request.urlopen(req)
html = response.read()
response.close()
res = requests.get(url, headers=DEFAULT_HEADERS)
except Exception as ex:
# if isinstance(ex, urllib).HTTPError:
logger.debug("code %s " % ex)
message = "An exception of type %s occured. Arguments:\n%s" % (type(ex).__name__, repr(ex.args))
logger.error("error: %s" % message)
return {}
else:
dict_html = jsontools.load(html)
dict_html = res.json()
if 'Error' in dict_html:
# if isinstance(ex, urllib.parse).HTTPError:
logger.debug("code %s " % dict_html['Error'])
else:
dict_html["image_" + image] = dict_html.pop("data")
self.result.update(dict_html)
dict_html["image_" + image] = dict_html.pop("data")
self.result.update(dict_html)
return dict_html
return dict_html
def get_tvshow_cast(self, _id, lang=DEFAULT_LANG):
"""
@@ -943,15 +904,18 @@ class Tvdb(object):
url = HOST + "/series/%s/actors" % _id
DEFAULT_HEADERS["Accept-Language"] = lang
logger.debug("url: %s, \nheaders: %s" % (url, DEFAULT_HEADERS))
req = urllib.request.Request(url, headers=DEFAULT_HEADERS)
response = urllib.request.urlopen(req)
html = response.read()
response.close()
dict_html = jsontools.load(html)
dict_html["cast"] = dict_html.pop("data")
try:
req = requests.get(url, headers=DEFAULT_HEADERS)
except Exception as ex:
logger.debug("code %s " % ex)
message = "An exception of type %s occured. Arguments:\n%s" % (type(ex).__name__, repr(ex.args))
logger.error("error en: %s" % message)
else:
dict_html = req.json()
if 'Error' in dict_html:
logger.debug("code %s " % dict_html['Error'])
else:
dict_html["cast"] = dict_html.pop("data")
self.result.update(dict_html)
def get_id(self):
@@ -1034,12 +998,12 @@ class Tvdb(object):
if 'data' in thumbs:
ret_infoLabels['thumbnail'] = HOST_IMAGE + thumbs['data'][0]['fileName']
elif 'poster' in origen and origen['poster']:
ret_infoLabels['thumbnail'] = origen['poster']
ret_infoLabels['thumbnail'] = HOST_IMAGE + origen['poster']
fanarts = requests.get(HOST + '/series/' + str(origen['id']) + '/images/query?keyType=fanart').json()
if 'data' in fanarts:
ret_infoLabels['fanart'] = HOST_IMAGE + fanarts['data'][0]['fileName']
elif 'fanart' in origen and origen['fanart']:
ret_infoLabels['thumbnail'] = origen['fanart']
ret_infoLabels['fanart'] = HOST_IMAGE + origen['fanart']
if 'overview' in origen and origen['overview']:
ret_infoLabels['plot'] = origen['overview']
if 'duration' in origen and origen['duration']:
+16 -13
View File
@@ -1000,17 +1000,17 @@ def add_movie(item):
item = generictools.update_title(item) # We call the method that updates the title with tmdb.find_and_set_infoLabels
#if item.tmdb_stat:
# del item.tmdb_stat # We clean the status so that it is not recorded in the Video Library
if item:
new_item = item.clone(action="findvideos")
insertados, sobreescritos, fallidos, path = save_movie(new_item)
new_item = item.clone(action="findvideos")
insertados, sobreescritos, fallidos, path = save_movie(new_item)
if fallidos == 0:
platformtools.dialog_ok(config.get_localized_string(30131),
config.get_localized_string(30135) % new_item.contentTitle) # 'has been added to the video library'
else:
filetools.rmdirtree(path)
platformtools.dialog_ok(config.get_localized_string(30131),
config.get_localized_string(60066) % new_item.contentTitle) # "ERROR, the movie has NOT been added to the video library")
if fallidos == 0:
platformtools.dialog_ok(config.get_localized_string(30131),
config.get_localized_string(30135) % new_item.contentTitle) # 'has been added to the video library'
else:
filetools.rmdirtree(path)
platformtools.dialog_ok(config.get_localized_string(30131),
config.get_localized_string(60066) % new_item.contentTitle) # "ERROR, the movie has NOT been added to the video library")
def add_tvshow(item, channel=None):
@@ -1071,16 +1071,19 @@ def add_tvshow(item, channel=None):
# del item.tmdb_stat # We clean the status so that it is not recorded in the Video Library
# Get the episode list
# from core.support import dbg;dbg()
itemlist = getattr(channel, item.action)(item)
if itemlist and not scrapertools.find_single_match(itemlist[0].title, r'(\d+x\d+)'):
from platformcode.autorenumber import select_type, renumber, check
from platformcode.autorenumber import start, check
if not check(item):
action = item.action
select_type(item)
item.renumber = True
start(item)
item.renumber = False
item.action = action
return add_tvshow(item, channel)
else:
itemlist = renumber(itemlist)
itemlist = getattr(channel, item.action)(item)
global magnet_caching
magnet_caching = False
File diff suppressed because it is too large Load Diff
+109
View File
@@ -178,6 +178,10 @@ def dialog_register(heading, user=False, email=False, password=False, user_defau
dialog = Register('Register.xml', config.get_runtime_path()).Start(heading, user, email, password, user_default, email_default, password_default, captcha_img)
return dialog
def dialog_info(item, scraper):
dialog = TitleOrIDWindow('TitleOrIDWindow.xml', config.get_runtime_path()).Start(item, scraper)
return dialog
def itemlist_refresh():
# pos = Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition
@@ -1338,3 +1342,108 @@ def get_platform():
ret["arch"] = "arm"
return ret
class Register(xbmcgui.WindowXMLDialog):
def Start(self, heading, user, email, password, user_default, email_default, password_default, captcha_img):
self.result = {}
self.heading = heading
self.user = user
self.email = email
self.password = password
self.user_default = user_default
self.email_default = email_default
self.password_default = password_default
self.captcha_img = captcha_img
self.doModal()
return self.result
def __init__(self, *args, **kwargs):
self.mensaje = kwargs.get("mensaje")
self.imagen = kwargs.get("imagen")
def onInit(self):
#### Kodi 18 compatibility ####
if config.get_platform(True)['num_version'] < 18:
self.setCoordinateResolution(2)
height = 90
self.getControl(10002).setText(self.heading)
if self.user:
self.getControl(10003).setText(self.user_default)
height+=70
else:
self.getControl(10003).setVisible(False)
if self.email:
self.getControl(10004).setText(self.email_default)
height+=70
else:
self.getControl(10004).setVisible(False)
if self.password:
self.getControl(10005).setText(self.password_default)
height+=70
else:
self.getControl(10005).setVisible(False)
if self.captcha_img:
self.getControl(10007).setImage(self.captcha_img)
height+=240
else:
self.getControl(10005).setVisible(False)
height +=40
if height < 250: height = 250
self.getControl(10000).setHeight(height)
self.getControl(10001).setHeight(height)
self.getControl(10000).setPosition(255, (720-height)/2)
self.setFocusId(30000)
def onClick(self, control):
if control in [10010]:
self.close()
elif control in [10009]:
if self.user: self.result['user'] = self.getControl(10003).getText()
if self.email: self.result['email'] = self.getControl(10004).getText()
if self.password: self.result['password'] = self.getControl(10005).getText()
if self.captcha_img: self.result['captcha'] = self.getControl(10006).getText()
self.close()
class TitleOrIDWindow(xbmcgui.WindowXMLDialog):
def Start(self, item, scraper):
self.item = item
self.title = item.show if item.show else item.fulltitle
self.id = item.infoLabels.get('tmdb_id','') if scraper == 'tmdb' else item.infoLabels.get('tvdb_id','')
self.scraper = scraper
self.label = 'TMDB ID:' if scraper == 'tmdb' else 'TVDB ID:'
self.doModal()
return self.item
def onInit(self):
#### Kodi 18 compatibility ####
if config.get_platform(True)['num_version'] < 18:
self.setCoordinateResolution(2)
self.getControl(10000).setText(config.get_localized_string(60228) % self.title)
self.getControl(10001).setText(self.title)
self.getControl(10002).setLabel(self.label)
self.getControl(10002).setText(self.id)
self.getControl(10002).setType(1, self.label)
self.setFocusId(10001)
def onClick(self, control):
if control in [10003]:
if self.getControl(10001).getText():
self.item.contentTitle = self.getControl(10001).getText()
if self.scraper == 'tmdb' and self.getControl(10002).getText():
self.item.infoLabels['tmdb_id'] = self.getControl(10002).getText()
elif self.scraper == 'tvdb' and self.getControl(10002).getText():
self.item.infoLabels['tvdb_id'] = self.getControl(10002).getText()
self.close()
elif control in [10004, 10005]:
self.item = None
self.close()
def onAction(self, action):
if (action in [92] and self.getFocusId() not in [10001, 10002]) or action in [10]:
self.item = None
self.close()
+34 -12
View File
@@ -1,14 +1,20 @@
# -*- coding: utf-8 -*-
import xbmcgui
import xbmcgui, sys
from core.tmdb import Tmdb
from platformcode import config, logger
from core import filetools
if sys.version_info[0] >= 3:
from concurrent import futures
else:
from concurrent_py2 import futures
BACKGROUND = 30000
LOADING = 30001
SELECT = 30002
EXIT = 10
BACKSPACE = 92
def imagepath(image):
if len(image.split('.')) == 1: image += '.png'
@@ -28,20 +34,27 @@ class InfoWindow(xbmcgui.WindowXMLDialog):
logger.info('RESPONSE',self.response)
return self.response
def make_items(self, i, result):
infoLabels = self.scraper().get_infoLabels(origen=result)
it = xbmcgui.ListItem(infoLabels['title'])
it.setProperty('fanart', infoLabels.get('fanart', ''))
it.setProperty('thumbnail', infoLabels.get('thumbnail', imagepath('movie' if infoLabels['mediatype'] == 'movie' else 'tv')))
it.setProperty('genre', infoLabels.get('genre', 'N/A'))
it.setProperty('rating', str(infoLabels.get('rating', 'N/A')))
it.setProperty('plot', str(infoLabels.get('plot', '')))
it.setProperty('year', str(infoLabels.get('year', '')))
it.setProperty('position', str(i))
return it
def onInit(self):
if config.get_platform(True)['num_version'] < 18:
self.setCoordinateResolution(2)
for result in self.results:
infoLabels = self.scraper().get_infoLabels(origen=result)
it = xbmcgui.ListItem(infoLabels['title'])
it.setProperty('fanart', infoLabels.get('fanart', ''))
it.setProperty('thumbnail', infoLabels.get('thumbnail', imagepath('movie' if infoLabels['mediatype'] == 'movie' else 'tv')))
it.setProperty('genre', infoLabels.get('genre', 'N/A'))
it.setProperty('rating', str(infoLabels.get('rating', 'N/A')))
it.setProperty('plot', str(infoLabels.get('plot', '')))
it.setProperty('year', str(infoLabels.get('year', '')))
self.items.append(it)
with futures.ThreadPoolExecutor() as executor:
for i, result in enumerate(self.results):
logger.info(result)
if ('seriesName' in result and result['seriesName']) or ('name' in result and result['name']) or ('title' in result and result['title']):
self.items += [executor.submit(self.make_items, i, result).result()]
self.items.sort(key=lambda it: int(it.getProperty('position')))
self.getControl(SELECT).addItems(self.items)
self.getControl(BACKGROUND).setImage(self.items[0].getProperty('fanart'))
@@ -53,3 +66,12 @@ class InfoWindow(xbmcgui.WindowXMLDialog):
self.response = self.results[self.getControl(SELECT).getSelectedPosition()]
self.close()
def onAction(self, action):
if self.getFocusId() in [SELECT]:
fanart = self.getControl(self.getFocusId()).getSelectedItem().getProperty('fanart')
self.getControl(BACKGROUND).setImage(fanart)
if action in [BACKSPACE]:
self.close()
elif action in [EXIT]:
self.close()
@@ -6086,6 +6086,44 @@ msgctxt "#70821"
msgid "Search results"
msgstr ""
# RENUMBER
msgctxt "#70822"
msgid "Renumber new episodes of: "
msgstr ""
msgctxt "#70823"
msgid "Renumber episodes of: "
msgstr ""
msgctxt "#70824"
msgid "Select the specials of: "
msgstr ""
msgctxt "#70825"
msgid "Select Season"
msgstr ""
msgctxt "#70826"
msgid "Select Episode"
msgstr ""
msgctxt "#70827"
msgid "Select Specials"
msgstr ""
msgctxt "#70828"
msgid "Manual renumbering"
msgstr ""
msgctxt "#70829"
msgid "Delete Numbering for: "
msgstr ""
msgctxt "#70830"
msgid "The series / episode number should only be changed if the series has relative numbering."
msgstr ""
# DNS start [ settings and declaration ]
msgctxt "#707401"
msgid "Enable DNS check alert"
@@ -6087,6 +6087,43 @@ msgctxt "#70821"
msgid "Search results"
msgstr "Risultati della ricerca"
# RENUMBER
msgctxt "#70822"
msgid "Renumber new episodes of: "
msgstr "Rinumera i nuovi episodi di: "
msgctxt "#70823"
msgid "Renumber episodes of: "
msgstr "Rinumera gli episodi di: "
msgctxt "#70824"
msgid "Select the specials of: "
msgstr "Seleziona gli speciali di: "
msgctxt "#70825"
msgid "Select Season"
msgstr "Seleziona Stagione"
msgctxt "#70826"
msgid "Select Episode"
msgstr "Seleziona Episodio"
msgctxt "#70827"
msgid "Select Specials"
msgstr "Seleziona Speciali"
msgctxt "#70828"
msgid "Manual renumbering"
msgstr "Rinumerazione Manuale"
msgctxt "#70829"
msgid "Delete Numbering for: "
msgstr "Elimina Numerazione per: "
msgctxt "#70830"
msgid "The series / episode number should only be changed if the series has relative numbering."
msgstr "Il numero della serie / episodio deve essere modificato solo se la serie ha una numerazione relativa."
# DNS start [ settings and declaration ]
msgctxt "#707401"
msgid "Enable DNS check alert"
+9 -9
View File
@@ -56,7 +56,7 @@
<viewtype>wrap</viewtype>
<orientation>horizontal</orientation>
<scrolltime tween="cubic" easing="out">300</scrolltime>
<itemlayout height="640" width="180">
<itemlayout width="180">
<!-- Poster -->
<control type="image">
<bottom>0</bottom>
@@ -68,12 +68,12 @@
<bordersize>10</bordersize>
</control>
</itemlayout>
<focusedlayout height="640" width="480">
<focusedlayout width="427">
<!-- Title -->
<control type="textbox">
<left>500</left>
<left>447</left>
<top>10</top>
<width>730</width>
<width>783</width>
<height>30</height>
<font>font30_title</font>
<textcolor>FFFFFFFF</textcolor>
@@ -84,9 +84,9 @@
</control>
<!-- info -->
<control type="textbox">
<left>500</left>
<left>447</left>
<top>50</top>
<width>730</width>
<width>783</width>
<height>30</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
@@ -96,9 +96,9 @@
</control>
<!-- Plot -->
<control type="textbox">
<left>500</left>
<left>447</left>
<top>90</top>
<width>730</width>
<width>783</width>
<height>250</height>
<font>font13</font>
<textcolor>FFFFFFFF</textcolor>
@@ -111,7 +111,7 @@
<control type="image">
<bottom>0</bottom>
<left>0</left>
<width>480</width>
<width>427</width>
<height>640</height>
<texture>$INFO[ListItem.Property(thumbnail)]</texture>
<aspectratio>scale</aspectratio>
+631
View File
@@ -0,0 +1,631 @@
<?xml version="1.0" encoding="utf-8"?>
<window>
<allowoverlays>false</allowoverlays>
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="300" />
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="300" />
</animation>
<controls>
<!-- MAIN SELECTION -->
<control type='group' id='100'>
<height>100%</height>
<width>100%</width>
<!-- Background -->
<control type="image">
<height>100%</height>
<width>100%</width>
<texture colordiffuse="CC232323">white.png</texture>
</control>
<control type="textbox">
<top>60</top>
<left>370</left>
<height>140</height>
<width>540</width>
<align>center</align>
<aligny>center</aligny>
<textcolor>80FFFFFF</textcolor>
<label>$ADDON[plugin.video.kod 70830]</label>
</control>
<!-- main selection window -->
<control type="group">
<top>288.5</top>
<left>370</left>
<height>140</height>
<width>540</width>
<!-- Beckground -->
<control type="image">
<height>100%</height>
<width>100%</width>
<texture colordiffuse="FF232323">white.png</texture>
</control>
<control type="button" id="101">
<top>30</top>
<left>20</left>
<height>60</height>
<width>100</width>
<align>center</align>
<aligny>center</aligny>
<textcolor>FFFFFFFF</textcolor>
<focusedcolor>FFFFFFFF</focusedcolor>
<texturefocus colordiffuse="FFFFFFFF" border="-20,0,-20,0">updn.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF" border="-20,0,-20,0">updn.png</texturenofocus>
</control>
<!-- divider -->
<control type="textbox">
<top>30</top>
<left>120</left>
<height>60</height>
<width>20</width>
<textcolor>FFFFFFFF</textcolor>
<align>center</align>
<aligny>center</aligny>
<label>[B]X[/B]</label>
</control>
<control type="button" id="102">
<top>30</top>
<left>140</left>
<height>60</height>
<width>100</width>
<align>center</align>
<aligny>center</aligny>
<textcolor>FFFFFFFF</textcolor>
<focusedcolor>FFFFFFFF</focusedcolor>
<texturefocus colordiffuse="FFFFFFFF" border="-20,0,-20,0">updn.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF" border="-20,0,-20,0">updn.png</texturenofocus>
</control>
<!-- ok -->
<control type="button" id="103">
<top>35</top>
<left>260</left>
<height>50</height>
<width>50</width>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
<align>center</align>
<texturefocus colordiffuse="FFFFFFFF">ok.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">ok.png</texturenofocus>
</control>
<!-- Select Specials -->
<control type="button" id="104">
<top>35</top>
<left>310</left>
<height>50</height>
<width>50</width>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
<align>center</align>
<texturefocus colordiffuse="FFFFFFFF">specials.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">specials.png</texturenofocus>
</control>
<!-- Manual renumeration -->
<control type="button" id="105">
<top>35</top>
<left>360</left>
<height>50</height>
<width>50</width>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
<align>center</align>
<texturefocus colordiffuse="FFFFFFFF">manual.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">manual.png</texturenofocus>
</control>
<!-- delete -->
<control type="button" id="106">
<top>35</top>
<left>410</left>
<height>50</height>
<width>50</width>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
<align>center</align>
<texturefocus colordiffuse="FFFFFFFF">delete.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">delete.png</texturenofocus>
</control>
<!-- annulla -->
<control type="button" id="107">
<top>35</top>
<left>460</left>
<height>50</height>
<width>50</width>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
<align>center</align>
<texturefocus colordiffuse="FFFFFFFF">close.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">close.png</texturenofocus>
</control>
<control type="label" id="108">
<bottom>5</bottom>
<width>100%</width>
<height>30</height>
<textcolor>FFFFFFFF</textcolor>
<align>center</align>
<aligny>center</aligny>
</control>
</control>
</control>
<!-- END MAIN SELECTION -->
<!-- SPECIALS -->
<control type='group' id='200'>
<height>100%</height>
<width>100%</width>
<!-- BACKGROUND -->
<control type="image" id="208">
<top>0</top>
<left>0</left>
<height>100%</height>
<width>100%</width>
<texture colordiffuse="FF232323">white.png</texture>
</control>
<!-- POSTER -->
<control type="image" id="201">
<top>0</top>
<left>0</left>
<height>720</height>
<width>480</width>
<texture/>
</control>
<!-- EPISODES LIST -->
<control type="list" id="202">
<top>140</top>
<left>520</left>
<height>540</height>
<width>340</width>
<onleft>10002</onleft>
<onright>203</onright>
<itemlayout width="340" height="60">
<control type="label">
<height>100%</height>
<width>300</width>
<left>20</left>
<textcolor>FFFFFFFF</textcolor>
<label>[B]Episodio $INFO[ListItem.Label()][/B]</label>
<aligny>center</aligny>
</control>
</itemlayout>
<focusedlayout width="340" height="60">
<control type="image">
<height>100%</height>
<width>100%</width>
<texture colordiffuse="22FFFFFF">white.png</texture>
<visible allowhiddenfocus="true">Control.HasFocus(202)</visible>
</control>
<control type="image">
<top>10</top>
<right>10</right>
<height>40</height>
<width>40</width>
<texture colordiffuse="FFFFFFFF">add.png</texture>
<visible allowhiddenfocus="true">Control.HasFocus(202)</visible>
</control>
<control type="label">
<height>100%</height>
<width>300</width>
<left>20</left>
<textcolor>FFFFFFFF</textcolor>
<label>[B]Episodio $INFO[ListItem.Label()][/B]</label>
<aligny>center</aligny>
</control>
</focusedlayout>
</control>
<!-- SPECIALS LIST -->
<control type='group'>
<top>140</top>
<left>900</left>
<height>540</height>
<width>340</width>
<control type="list" id="203">
<height>540</height>
<width>340</width>
<onleft>202</onleft>
<onright>204</onright>
<itemlayout width="340" height="60">
<!-- EP NUMBER -->
<control type="label">
<left>20</left>
<height>60</height>
<width>140</width>
<textcolor>80FFFFFF</textcolor>
<aligny>center</aligny>
<label>[B]0x$INFO[ListItem.Label()] - Ep. $INFO[ListItem.Property(title)][/B]</label>
</control>
</itemlayout>
<focusedlayout width="340" height="60">
<control type="image">
<height>100%</height>
<width>100%</width>
<texture colordiffuse="22FFFFFF">white.png</texture>
<visible allowhiddenfocus="true">!Control.HasFocus(202)</visible>
</control>
<!-- EP NUMBER -->
<control type="label">
<left>20</left>
<height>60</height>
<width>140</width>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
<label>[B]0x$INFO[ListItem.Label()] - Ep. $INFO[ListItem.Property(title)][/B]</label>
</control>
</focusedlayout>
</control>
<!-- ITEM ACTIONS -->
<control type="group" id='204'>
<visible allowhiddenfocus="true">Integer.IsGreater(Container(203).Position,-1)</visible>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(203).Position,0)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(203).Position,1)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(203).Position,2)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(203).Position,3)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(203).Position,4)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(203).Position,5)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(203).Position,6)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(203).Position,7)">Conditional</animation>
<!-- move up -->
<control type="button" id="205">
<top>10</top>
<right>90</right>
<height>40</height>
<width>40</width>
<onleft>203</onleft>
<onright>206</onright>
<onup>Control.Move(203,-1)</onup>
<ondown>Control.Move(203,1)</ondown>
<texturefocus colordiffuse="FFFFFFFF">up.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">up.png</texturenofocus>
</control>
<!-- move down -->
<control type="button" id="206">
<top>10</top>
<right>50</right>
<height>40</height>
<width>40</width>
<onleft>205</onleft>
<onright>207</onright>
<onup>Control.Move(203,-1)</onup>
<ondown>Control.Move(203,1)</ondown>
<texturefocus colordiffuse="FFFFFFFF">down.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">down.png</texturenofocus>
</control>
<!-- remove -->
<control type="button" id="207">
<top>10</top>
<right>10</right>
<height>40</height>
<width>40</width>
<onleft>206</onleft>
<onright>10002</onright>
<onup>Control.Move(203,-1)</onup>
<ondown>Control.Move(203,1)</ondown>
<texturefocus colordiffuse="FFFFFFFF">delete.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">delete.png</texturenofocus>
</control>
</control>
</control>
</control>
<!-- END SPECIALS -->
<!-- MANUAL -->
<control type='group' id='300'>
<height>100%</height>
<width>100%</width>
<!-- BACKGROUND -->
<control type="image" id="310">
<top>0</top>
<left>0</left>
<height>100%</height>
<width>100%</width>
<texture colordiffuse="FF232323">white.png</texture>
</control>
<!-- POSTER -->
<control type="image" id="301">
<top>0</top>
<left>0</left>
<height>720</height>
<width>480</width>
</control>
<!-- EPISODES LIST -->
<control type='group'>
<top>140</top>
<left>520</left>
<height>540</height>
<width>340</width>
<onleft>10002</onleft>
<onright>306</onright>
<control type="list" id="302">
<height>100%</height>
<width>100%</width>
<onleft>10002</onleft>
<onright>306</onright>
<itemlayout width="340" height="60">
<control type="label">
<height>100%</height>
<width>120</width>
<left>20</left>
<textcolor>FFFFFFFF</textcolor>
<label>[B]Episodio $INFO[ListItem.Label()][/B]</label>
<aligny>center</aligny>
</control>
<!-- first season number -->
<control type="textbox">
<right>100</right>
<height>60</height>
<width>60</width>
<onleft>302</onleft>
<onright>307</onright>
<align>center</align>
<aligny>center</aligny>
<textcolor>80FFFFFF</textcolor>
<label>[B]$INFO[ListItem.Property(season)][/B]</label>
</control>
<!-- divider -->
<control type="textbox">
<right>80</right>
<height>60</height>
<width>20</width>
<textcolor>80FFFFFF</textcolor>
<align>center</align>
<aligny>center</aligny>
<label>[B]X[/B]</label>
</control>
<!-- first episode number -->
<control type="textbox">
<right>20</right>
<height>60</height>
<width>60</width>
<onleft>306</onleft>
<onright>308</onright>
<align>center</align>
<aligny>center</aligny>
<textcolor>80FFFFFF</textcolor>
<label>[B]$INFO[ListItem.Property(episode)][/B]</label>
</control>
</itemlayout>
<focusedlayout width="340" height="60">
<control type="image">
<height>100%</height>
<width>100%</width>
<texture colordiffuse="22FFFFFF">white.png</texture>
<visible allowhiddenfocus="true">Control.HasFocus(302)</visible>
</control>
<control type="label">
<height>100%</height>
<width>120</width>
<left>20</left>
<textcolor>FFFFFFFF</textcolor>
<label>[B]Episodio $INFO[ListItem.Label()][/B]</label>
<aligny>center</aligny>
</control>
<!-- first season number -->
<control type="textbox">
<right>100</right>
<height>60</height>
<width>60</width>
<onleft>302</onleft>
<onright>307</onright>
<align>center</align>
<aligny>center</aligny>
<textcolor>FFFFFFFF</textcolor>
<label>[B]$INFO[ListItem.Property(season)][/B]</label>
</control>
<!-- divider -->
<control type="textbox">
<right>80</right>
<height>60</height>
<width>20</width>
<textcolor>FFFFFFFF</textcolor>
<align>center</align>
<aligny>center</aligny>
<label>[B]X[/B]</label>
</control>
<!-- first episode number -->
<control type="textbox">
<right>20</right>
<height>60</height>
<width>60</width>
<onleft>306</onleft>
<onright>308</onright>
<align>center</align>
<aligny>center</aligny>
<textcolor>FFFFFFFF</textcolor>
<label>[B]$INFO[ListItem.Property(episode)][/B]</label>
</control>
</focusedlayout>
</control>
<!-- MANUAL EPISODE CONTROL -->
<control type='group' id='305'>
<visible allowhiddenfocus="true">Integer.IsGreater(Container(302).Position,-1)</visible>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(302).Position,0)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(302).Position,1)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(302).Position,2)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(302).Position,3)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(302).Position,4)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(302).Position,5)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(302).Position,6)">Conditional</animation>
<animation effect="slide" end="0,60" condition="Integer.IsGreater(Container(302).Position,7)">Conditional</animation>
<!-- first season number -->
<control type="button" id="306">
<right>100</right>
<height>60</height>
<width>60</width>
<onleft>302</onleft>
<onright>307</onright>
<align>center</align>
<aligny>center</aligny>
<textcolor>FFFFFFFF</textcolor>
<texturefocus colordiffuse="FFFFFFFF">updn.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">updn.png</texturenofocus>
</control>
<!-- first episode number -->
<control type="button" id="307">
<right>20</right>
<height>60</height>
<width>60</width>
<onleft>306</onleft>
<onright>303</onright>
<align>center</align>
<aligny>center</aligny>
<textcolor>FFFFFFFF</textcolor>
<texturefocus colordiffuse="FFFFFFFF">updn.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">updn.png</texturenofocus>
</control>
</control>
</control>
<!-- SEASONS LIST -->
<control type='list' id='303'>
<top>140</top>
<left>880</left>
<height>540</height>
<width>80</width>
<onleft>302</onleft>
<onright>304</onright>
<itemlayout width="80" height="60">
<control type="label">
<height>100%</height>
<width>100%</width>
<textcolor>80FFFFFF</textcolor>
<label>[B]$INFO[ListItem.Label()][/B]</label>
<align>center</align>
<aligny>center</aligny>
</control>
</itemlayout>
<focusedlayout width="80" height="60">
<control type="image">
<height>100%</height>
<width>100%</width>
<texture colordiffuse="22FFFFFF">white.png</texture>
<visible allowhiddenfocus="true">Control.HasFocus(303)</visible>
</control>
<control type="label">
<height>100%</height>
<width>100%</width>
<textcolor>FFFFFFFF</textcolor>
<label>[B]$INFO[ListItem.Label()][/B]</label>
<align>center</align>
<aligny>center</aligny>
<visible allowhiddenfocus="true">Control.HasFocus(303)</visible>
</control>
<control type="image">
<height>100%</height>
<width>100%</width>
<texture colordiffuse="11FFFFFF">white.png</texture>
<visible allowhiddenfocus="true">!Control.HasFocus(303)</visible>
</control>
<control type="label">
<height>100%</height>
<width>100%</width>
<textcolor>80FFFFFF</textcolor>
<label>[B]$INFO[ListItem.Label()][/B]</label>
<align>center</align>
<aligny>center</aligny>
<visible allowhiddenfocus="true">!Control.HasFocus(303)</visible>
</control>
</focusedlayout>
</control>
<control type="image">
<top>140</top>
<left>960</left>
<height>540</height>
<height>100%</height>
<width>290</width>
<texture colordiffuse="11FFFFFF">white.png</texture>
</control>
<!-- EPISODES LIST -->
<control type='list' id='304'>
<top>140</top>
<left>970</left>
<height>540</height>
<width>270</width>
<onleft>303</onleft>
<onright>10002</onright>
<itemlayout width="270" height="60">
<control type="label">
<height>100%</height>
<width>200</width>
<left>40</left>
<textcolor>FFFFFFFF</textcolor>
<label>[B]$INFO[ListItem.Label()][/B]</label>
<aligny>center</aligny>
</control>
</itemlayout>
<focusedlayout width="270" height="60">
<control type="image">
<height>100%</height>
<width>100%</width>
<texture colordiffuse="22FFFFFF">white.png</texture>
<visible allowhiddenfocus="true">Control.HasFocus(304)</visible>
</control>
<control type="label">
<height>100%</height>
<width>200</width>
<left>40</left>
<textcolor>FFFFFFFF</textcolor>
<label>[B]$INFO[ListItem.Label()][/B]</label>
<aligny>center</aligny>
</control>
</focusedlayout>
</control>
</control>
<!-- END MANUAL -->
<!-- MAIN ACTIONS -->
<control type='group' id='10000'>
<visible allowhiddenfocus="true">Control.IsVisible(200) | Control.IsVisible(300)</visible>
<!-- info -->
<control type="label" id="10001">
<top>40</top>
<left>540</left>
<height>50</height>
<width>560</width>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
</control>
<!-- ok -->
<control type="button" id="10002">
<top>40</top>
<right>90</right>
<height>50</height>
<width>50</width>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
<align>center</align>
<texturefocus colordiffuse="FFFFFFFF">ok.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">ok.png</texturenofocus>
<ondown condition="Control.IsVisible(200)">202</ondown>
<ondown condition="Control.IsVisible(300)">302</ondown>
<onleft>10003</onleft>
<onright>10003</onright>
</control>
<!-- annulla -->
<control type="button" id="10003">
<top>40</top>
<right>40</right>
<height>50</height>
<width>50</width>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
<align>center</align>
<texturefocus colordiffuse="FFFFFFFF">close.png</texturefocus>
<texturenofocus colordiffuse="80FFFFFF">close.png</texturenofocus>
<ondown condition="Control.IsVisible(200)">202</ondown>
<ondown condition="Control.IsVisible(300)">302</ondown>
<onleft>10002</onleft>
<onright>10002</onright>
</control>
</control>
<!-- END MAIN ACTIONS -->
</controls>
</window>
@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<window>
<allowoverlays>false</allowoverlays>
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="300" />
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="300" />
</animation>
<controls>
<control type="button" id="10005">
<top>0</top>
<left>0</left>
<height>100%</height>
<width>100%</width>
<texturefocus colordiffuse="80232323">white.png</texturefocus>
<texturenofocus colordiffuse="80232323">white.png</texturenofocus>
</control>
<control type="group">
<top>210</top>
<left>175</left>
<height>300</height>
<width>930</width>
<!-- Beckground -->
<control type="image">
<height>100%</height>
<width>100%</width>
<texture colordiffuse="FF232323">white.png</texture>
</control>
<!-- Header -->
<control type="textbox" id="10000">
<top>40</top>
<left>40</left>
<height>40</height>
<width>850</width>
<font>font30_title</font>
<textcolor>FFFFFFFF</textcolor>
<label></label>
</control>
<!-- divisor -->
<control type="image">
<top>90</top>
<left>40</left>
<height>1</height>
<width>850</width>
<texture colordiffuse="FFFFFFFF">white.png</texture>
</control>
<!-- titolo -->
<control type="edit" id="10001">
<top>120</top>
<left>40</left>
<height>60</height>
<width>630</width>
<textcolor>FFFFFFFF</textcolor>
<texturefocus colordiffuse="FF0082C2">white.png</texturefocus>
<texturenofocus colordiffuse="FF232323">white.png</texturenofocus>
<aligny>center</aligny>
<label>$ADDON[plugin.video.kod 60230]</label>
<ondown>10002</ondown>
<onright>10003</onright>
</control>
<!-- id -->
<control type="edit" id="10002">
<top>200</top>
<left>40</left>
<height>60</height>
<width>630</width>
<textcolor>FFFFFFFF</textcolor>
<texturefocus colordiffuse="FF0082C2">white.png</texturefocus>
<texturenofocus colordiffuse="FF232323">white.png</texturenofocus>
<aligny>center</aligny>
<label></label>
<onup>10001</onup>
<onright>10003</onright>
</control>
<!-- ok -->
<control type="button" id="10003">
<top>120</top>
<left>690</left>
<label>$ADDON[plugin.video.kod 70001]</label>
<height>60</height>
<width>200</width>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
<align>center</align>
<texturefocus border="10" colordiffuse="FF0082C2">white.png</texturefocus>
<texturenofocus border="10" colordiffuse="FF232323">white.png</texturenofocus>
<ondown>10004</ondown>
<onleft>10001</onleft>
</control>
<!-- annulla -->
<control type="button" id="10004">
<top>200</top>
<left>690</left>
<label>$ADDON[plugin.video.kod 70002]</label>
<height>60</height>
<width>200</width>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
<align>center</align>
<texturefocus border="10" colordiffuse="FF0082C2">white.png</texturefocus>
<texturenofocus border="10" colordiffuse="FF232323">white.png</texturenofocus>
<onup>10003</onup>
<onleft>10001</onleft>
</control>
</control>
</controls>
</window>
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B