Nuovo Autorenumber
+ Migliorie TVDB + Migliorie TMDB
@@ -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):
|
||||
|
||||
@@ -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)+'¤tquery%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
|
||||
|
||||
@@ -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>[^<]+)<'
|
||||
|
||||
@@ -73,10 +73,11 @@ 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)
|
||||
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() \
|
||||
|
||||
@@ -54,70 +54,20 @@ def find_and_set_infoLabels(item):
|
||||
import traceback
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
while scraper:
|
||||
# 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("Identificador encontrado: %s" % item.infoLabels['code'])
|
||||
logger.info("Identifier found: %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)
|
||||
logger.info(logger.info("Identifier not found for: %s " % title))
|
||||
return
|
||||
|
||||
|
||||
def cuadro_completar(item):
|
||||
|
||||
@@ -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 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)
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
@@ -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,24 +584,11 @@ 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)
|
||||
|
||||
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,8 +704,6 @@ class Tvdb(object):
|
||||
"""
|
||||
logger.info()
|
||||
|
||||
try:
|
||||
|
||||
params = {}
|
||||
if name:
|
||||
params["name"] = name
|
||||
@@ -746,21 +718,14 @@ class Tvdb(object):
|
||||
url = HOST + "/search/series?%s" % 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()
|
||||
logger.info(html)
|
||||
response.close()
|
||||
dict_html = requests.get(url, headers=DEFAULT_HEADERS).json()
|
||||
|
||||
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,11 +810,9 @@ 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")
|
||||
@@ -909,20 +868,22 @@ 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)
|
||||
|
||||
@@ -943,14 +904,17 @@ 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)
|
||||
|
||||
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)
|
||||
|
||||
@@ -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']:
|
||||
|
||||
@@ -1000,7 +1000,7 @@ 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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,11 +34,7 @@ class InfoWindow(xbmcgui.WindowXMLDialog):
|
||||
logger.info('RESPONSE',self.response)
|
||||
return self.response
|
||||
|
||||
def onInit(self):
|
||||
if config.get_platform(True)['num_version'] < 18:
|
||||
self.setCoordinateResolution(2)
|
||||
|
||||
for result in self.results:
|
||||
def make_items(self, i, result):
|
||||
infoLabels = self.scraper().get_infoLabels(origen=result)
|
||||
it = xbmcgui.ListItem(infoLabels['title'])
|
||||
it.setProperty('fanart', infoLabels.get('fanart', ''))
|
||||
@@ -41,7 +43,18 @@ class InfoWindow(xbmcgui.WindowXMLDialog):
|
||||
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)
|
||||
it.setProperty('position', str(i))
|
||||
return it
|
||||
|
||||
def onInit(self):
|
||||
if config.get_platform(True)['num_version'] < 18:
|
||||
self.setCoordinateResolution(2)
|
||||
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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 684 B |