Merge pull request #332 from lopezvg/master
Newpct1: nuevo canal virtual con Alta Disponibilidad
This commit is contained in:
@@ -12,40 +12,53 @@ from core import httptools
|
|||||||
from core import scrapertools
|
from core import scrapertools
|
||||||
from core import servertools
|
from core import servertools
|
||||||
from core.item import Item
|
from core.item import Item
|
||||||
from platformcode import config, logger
|
from platformcode import config, logger, platformtools
|
||||||
from core import tmdb
|
from core import tmdb
|
||||||
from lib import generictools
|
from lib import generictools
|
||||||
|
|
||||||
host = 'http://descargas2020.com/'
|
channel_py = 'newpct1'
|
||||||
|
|
||||||
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
||||||
clone_list = config.get_setting('clonenewpct1_channels_list', "torrentrapid") #Carga lista de clones
|
clone_list = config.get_setting('clonenewpct1_channels_list', channel_py) #Carga lista de clones
|
||||||
clone_list = ast.literal_eval(clone_list) #la convierte a lista de tuplas
|
clone_list = ast.literal_eval(clone_list) #la convierte en array
|
||||||
host_index = 0
|
host_index = 0
|
||||||
host_index = config.get_setting('clonenewpct1_channel_default', "torrentrapid") #Clone por defecto
|
host_index = config.get_setting('clonenewpct1_channel_default', channel_py) #Clone por defecto
|
||||||
i = 0
|
i = 0
|
||||||
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
||||||
if i == host_index:
|
if i == host_index:
|
||||||
#channel_clone_name = channel_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
channel_clone_name = channel_clone #Nombre del Canal elegido
|
||||||
#host = 'http://%s/' % host_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
host = host_clone #URL del Canal elegido
|
||||||
i += 1
|
break
|
||||||
|
i += 1
|
||||||
|
item = Item()
|
||||||
|
item.channel_host = host
|
||||||
|
if item.channel != channel_py:
|
||||||
|
item.channel = channel_py
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
|
||||||
#Carga de opciones del canal
|
#Carga de opciones del canal
|
||||||
item = Item()
|
__modo_grafico__ = config.get_setting('modo_grafico', channel_py) #TMDB?
|
||||||
if not item.channel:
|
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', channel_py) #Actualización sólo últ. Temporada?
|
||||||
item.channel = scrapertools.find_single_match(host, r'(\w+)\.com\/')
|
timeout = config.get_setting('clonenewpct1_timeout_downloadpage', channel_py) #Timeout downloadpage
|
||||||
channel_clone_name = scrapertools.find_single_match(host, r'(\w+)\.com\/') #QUITAR CUANDO SE PASE A NEWPCT1
|
if timeout == 0: timeout = None
|
||||||
__modo_grafico__ = config.get_setting('modo_grafico', item.channel)
|
|
||||||
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', item.channel)
|
platformtools.dialog_ok("NewPct1, ¡¡¡he vuelto como canal VIRTUAL!!!", "Hemos centralizado la gestión de los clones de NewPct1 en el canal virtual NewPct1. Los clones desaparecerán en breve.", "Para más información lee el tutorial: https://alfa-addon.com /threads/newpct1-implantando-alta-disponibilidad.1200/")
|
||||||
|
|
||||||
|
#Vayamos a la siguiente acción en el canal Newpct1
|
||||||
|
from platformcode import launcher
|
||||||
|
channel_clone_name = "descargas2020" #Nombre del Canal elegido
|
||||||
|
host = "http://descargas2020.com/"
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
item.action = "mainlist"
|
||||||
|
item.channel_host = host
|
||||||
|
launcher.run(item)
|
||||||
|
|
||||||
|
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
if item.channel != channel_py:
|
||||||
|
return
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
thumb_pelis = get_thumb("channels_movie.png")
|
thumb_pelis = get_thumb("channels_movie.png")
|
||||||
@@ -58,20 +71,20 @@ def mainlist(item):
|
|||||||
thumb_settings = get_thumb("setting_0.png")
|
thumb_settings = get_thumb("setting_0.png")
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
||||||
extra="peliculas", thumbnail=thumb_pelis ))
|
extra="peliculas", thumbnail=thumb_pelis, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
||||||
thumbnail=thumb_series))
|
thumbnail=thumb_series, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
||||||
thumbnail=thumb_docus))
|
thumbnail=thumb_docus, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar))
|
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar, category=item.category))
|
||||||
|
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -85,68 +98,60 @@ def submenu(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
host_alt = host
|
patron = '<li><a\s?class="[^"]+"\s?href="http:[^"]+"><i\s?class=.*><\/i>.*Inicio<\/a><\/li>(.+)<\/ul>\s?<\/nav>'
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
||||||
if not data or not scrapertools.find_single_match(data, patron):
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url)
|
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR] [ALT ] en uso'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] caído'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
host_alt = host.replace(item.channel_alt, item.channel)
|
|
||||||
del item.channel_alt
|
|
||||||
if item.url_alt: del item.url_alt
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
#data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
#data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
||||||
|
if "pelisyseries.com" in item.channel_host and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
||||||
host_dom = host_alt.replace("https://", "").replace("http://", "").replace("www.", "")
|
data = '<li><a href="' + item.channel_host + 'varios/" title="Documentales">Documentales</a></li>'
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
if "pelisyseries.com" in host_alt and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
|
||||||
data = '<a href="' + host_alt + 'varios/" title="Documentales"><i class="icon-rocket"></i> Documentales</a>'
|
|
||||||
else:
|
else:
|
||||||
if data:
|
data = scrapertools.get_match(data, patron) #Seleccionamos el trozo que nos interesa
|
||||||
data = scrapertools.get_match(data, patron)
|
if not data:
|
||||||
if not data:
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
else:
|
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
|
|
||||||
patron = '<.*?href="([^"]+)".*?>([^>]+)</a>'
|
patron = '<li><a.*?href="([^"]+)"\s?.itle="[^"]+"\s?>([^>]+)<\/a><\/li>'
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
|
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.strip()
|
title = scrapedtitle.strip()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
#Preguntamos por las entradas que no corresponden al "extra"
|
||||||
itemlist.append(
|
if item.extra in scrapedtitle.lower() or (item.extra == "peliculas" and ("cine" in scrapedurl or "anime" in scrapedurl)) or (item.extra == "varios" and ("documentales" in scrapedurl or "varios" in scrapedurl)):
|
||||||
Item(channel=item.channel, action="alfabeto", title=title + " [A-Z]", url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
itemlist.append(item.clone(action="alfabeto", title=title + " [A-Z]", url=scrapedurl))
|
||||||
|
|
||||||
if item.extra == "peliculas":
|
if item.extra == "peliculas":
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title="Películas 4K", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
itemlist.append(item.clone(action="listado", title="Películas 4K", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="alfabeto", title="Películas 4K" + " [A-Z]", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
Item(channel=item.channel, action="alfabeto", title="Películas 4K" + " [A-Z]", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -155,28 +160,41 @@ def alfabeto(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = ''
|
||||||
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
|
|
||||||
patron = '<ul class="alfabeto">(.*?)</ul>'
|
patron = '<ul class="alfabeto">(.*?)</ul>'
|
||||||
if data:
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
data = scrapertools.get_match(data, patron)
|
logger.error("ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
else:
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
return itemlist
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
|
data = scrapertools.get_match(data, patron)
|
||||||
|
|
||||||
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
||||||
|
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: ALFABETO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: ALFABETO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.upper()
|
title = scrapedtitle.upper()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -191,11 +209,21 @@ def listado(item):
|
|||||||
if item.totalItems:
|
if item.totalItems:
|
||||||
del item.totalItems
|
del item.totalItems
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
patron = '<ul class="' + clase + '">(.*?)</ul>' #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, patron) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Establecemos los valores básicos en función del tipo de contenido
|
#Establecemos los valores básicos en función del tipo de contenido
|
||||||
@@ -218,7 +246,7 @@ def listado(item):
|
|||||||
fichas = scrapertools.get_match(data, patron)
|
fichas = scrapertools.get_match(data, patron)
|
||||||
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -235,7 +263,7 @@ def listado(item):
|
|||||||
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("MATCHES: " + str(len(matches)))
|
#logger.debug("MATCHES: " + str(len(matches)))
|
||||||
@@ -460,13 +488,21 @@ def listado(item):
|
|||||||
|
|
||||||
def listado_busqueda(item):
|
def listado_busqueda(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
host = 'http://%s/' % scrapertools.find_single_match(item.url, '(\w+\.com)\/')
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
if item.category and item.category != "newest":
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
||||||
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
||||||
cnt_pag = 0 # Contador de líneas leídas de Matches
|
cnt_pag = 0 # Contador de líneas leídas de Matches
|
||||||
|
timeout_search = 5 # Timeout un poco más largo para las búsquedas
|
||||||
|
if timeout > 5:
|
||||||
|
timeout_search = timeout # Timeout un poco más largo para las búsquedas
|
||||||
|
data = ''
|
||||||
|
|
||||||
if item.cnt_pag:
|
if item.cnt_pag:
|
||||||
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
||||||
@@ -493,21 +529,21 @@ def listado_busqueda(item):
|
|||||||
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
||||||
while cnt_title <= cnt_tot and cnt_next < 5:
|
while cnt_title <= cnt_tot and cnt_next < 5:
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post, timeout=timeout_search).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
cnt_next += 1
|
cnt_next += 1
|
||||||
if not data or not scrapertools.find_single_match(data, pattern):
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, pattern) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, pattern)
|
item, data = generictools.fail_over_newpct1(item, pattern)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
host = host.replace(item.channel_alt, item.channel)
|
host = host.replace(item.channel_alt, item.channel)
|
||||||
@@ -531,7 +567,6 @@ def listado_busqueda(item):
|
|||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
data_alt = data
|
data_alt = data
|
||||||
data = scrapertools.get_match(data, pattern)
|
data = scrapertools.get_match(data, pattern)
|
||||||
#pattern = '<li[^>]*><a href="(?P<url>[^"]+).*?<img.*?src="(?P<thumb>[^"]+)?".*?<h2.*?>(?P<title>.*?)?<\/h2>'
|
|
||||||
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
||||||
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
||||||
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
||||||
@@ -541,7 +576,8 @@ def listado_busqueda(item):
|
|||||||
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
||||||
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
|
item, itemlist = generictools.post_tmdb_listado(item, itemlist) #Pintamos los datos de fail-over, si los hay
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
||||||
@@ -830,14 +866,14 @@ def listado_busqueda(item):
|
|||||||
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
||||||
|
|
||||||
#Leemos la página, a ver si es una página de episodios
|
#Leemos la página, a ver si es una página de episodios
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
||||||
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
||||||
#intentarlo con la otra url
|
#intentarlo con la otra url
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
@@ -876,9 +912,10 @@ def findvideos(item):
|
|||||||
from core import channeltools
|
from core import channeltools
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -987,8 +1024,9 @@ def findvideos(item):
|
|||||||
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
||||||
|
|
||||||
# Descarga la página
|
# Descarga la página
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -1001,7 +1039,7 @@ def findvideos(item):
|
|||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
@@ -1029,7 +1067,7 @@ def findvideos(item):
|
|||||||
item_local.url = scrapertools.find_single_match(data, patron)
|
item_local.url = scrapertools.find_single_match(data, patron)
|
||||||
if not item_local.url: #error
|
if not item_local.url: #error
|
||||||
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
||||||
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
||||||
@@ -1054,6 +1092,8 @@ def findvideos(item):
|
|||||||
#logger.debug(item_local)
|
#logger.debug(item_local)
|
||||||
|
|
||||||
# VER vídeos, descargar vídeos un link, o múltiples links
|
# VER vídeos, descargar vídeos un link, o múltiples links
|
||||||
|
data = scrapertools.find_single_match(data, '<div id="tab1" class="tab_content"(.*?<\/ul>(?:<div.*?>)?<\/div><\/div><\/div>)') #Seleccionar el bloque para evitar duplicados
|
||||||
|
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
||||||
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
||||||
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
||||||
@@ -1066,7 +1106,7 @@ def findvideos(item):
|
|||||||
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
||||||
enlaces_descargar = enlaces_ver
|
enlaces_descargar = enlaces_ver
|
||||||
#logger.debug(enlaces_ver)
|
#logger.debug(enlaces_ver)
|
||||||
|
|
||||||
#Recorre todos los links de VER, si está permitido
|
#Recorre todos los links de VER, si está permitido
|
||||||
cnt_enl_ver = 1
|
cnt_enl_ver = 1
|
||||||
cnt_enl_verif = 1
|
cnt_enl_verif = 1
|
||||||
@@ -1100,7 +1140,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1190,7 +1230,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1232,9 +1272,10 @@ def findvideos(item):
|
|||||||
def episodios(item):
|
def episodios(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -1255,7 +1296,7 @@ def episodios(item):
|
|||||||
|
|
||||||
data = ''
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
data_alt = ''
|
data_alt = ''
|
||||||
if data: data_alt = scrapertools.get_match(data, patron)
|
if data: data_alt = scrapertools.get_match(data, patron)
|
||||||
@@ -1276,7 +1317,7 @@ def episodios(item):
|
|||||||
|
|
||||||
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
||||||
@@ -1312,7 +1353,7 @@ def episodios(item):
|
|||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
if not data:
|
if not data:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
@@ -1321,7 +1362,7 @@ def episodios(item):
|
|||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if "pelisyseries.com" in item.url:
|
if "pelisyseries.com" in item.url:
|
||||||
@@ -1331,7 +1372,7 @@ def episodios(item):
|
|||||||
matches = re.compile(pattern, re.DOTALL).findall(data)
|
matches = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("patron: " + pattern)
|
#logger.debug("patron: " + pattern)
|
||||||
@@ -1399,7 +1440,7 @@ def episodios(item):
|
|||||||
match = [m.groupdict() for m in r.finditer(info)][0]
|
match = [m.groupdict() for m in r.finditer(info)][0]
|
||||||
if not match: #error
|
if not match: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
||||||
@@ -1449,8 +1490,6 @@ def episodios(item):
|
|||||||
|
|
||||||
if item_local.active:
|
if item_local.active:
|
||||||
del item_local.active
|
del item_local.active
|
||||||
if item_local.category:
|
|
||||||
del item_local.category
|
|
||||||
if item_local.infoLabels['title']:
|
if item_local.infoLabels['title']:
|
||||||
del item_local.infoLabels['title']
|
del item_local.infoLabels['title']
|
||||||
item_local.context = "['buscar_trailer']"
|
item_local.context = "['buscar_trailer']"
|
||||||
@@ -1467,6 +1506,8 @@ def episodios(item):
|
|||||||
del item_local.update_last
|
del item_local.update_last
|
||||||
if item_local.update_next:
|
if item_local.update_next:
|
||||||
del item_local.update_next
|
del item_local.update_next
|
||||||
|
if item_local.channel_host:
|
||||||
|
del item_local.channel_host
|
||||||
|
|
||||||
itemlist.append(item_local.clone())
|
itemlist.append(item_local.clone())
|
||||||
|
|
||||||
@@ -1501,9 +1542,6 @@ def actualizar_titulos(item):
|
|||||||
def search(item, texto):
|
def search(item, texto):
|
||||||
logger.info("search:" + texto)
|
logger.info("search:" + texto)
|
||||||
# texto = texto.replace(" ", "+")
|
# texto = texto.replace(" ", "+")
|
||||||
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
item.post = "q=%s" % texto
|
item.post = "q=%s" % texto
|
||||||
|
|||||||
@@ -680,6 +680,8 @@ def episodios(item):
|
|||||||
del item_local.update_last
|
del item_local.update_last
|
||||||
if item_local.update_next:
|
if item_local.update_next:
|
||||||
del item_local.update_next
|
del item_local.update_next
|
||||||
|
if item_local.channel_host:
|
||||||
|
del item_local.channel_host
|
||||||
|
|
||||||
#Verificamos el idioma por si encontramos algo
|
#Verificamos el idioma por si encontramos algo
|
||||||
if not item_local.language:
|
if not item_local.language:
|
||||||
|
|||||||
@@ -495,7 +495,7 @@ def listado_busqueda(item):
|
|||||||
matches += re.compile(patron, re.DOTALL).findall(data)
|
matches += re.compile(patron, re.DOTALL).findall(data)
|
||||||
matches_cnt = len(matches)
|
matches_cnt = len(matches)
|
||||||
|
|
||||||
if not matches and not 'Se han encontrado <b>0</b> resultados.' in data: #error
|
if not matches and not 'Se han encontrado <b>0</b> resultados.' and not "href='/juego-descargar-torrent" in data: #error
|
||||||
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
@@ -828,6 +828,21 @@ def episodios(item):
|
|||||||
item_local.action = "findvideos"
|
item_local.action = "findvideos"
|
||||||
item_local.contentType = "episode"
|
item_local.contentType = "episode"
|
||||||
item_local.extra = "episodios"
|
item_local.extra = "episodios"
|
||||||
|
if item_local.library_playcounts:
|
||||||
|
del item_local.library_playcounts
|
||||||
|
if item_local.library_urls:
|
||||||
|
del item_local.library_urls
|
||||||
|
if item_local.path:
|
||||||
|
del item_local.path
|
||||||
|
if item_local.update_last:
|
||||||
|
del item_local.update_last
|
||||||
|
if item_local.update_next:
|
||||||
|
del item_local.update_next
|
||||||
|
if item_local.channel_host:
|
||||||
|
del item_local.channel_host
|
||||||
|
|
||||||
|
item_local.title = ''
|
||||||
|
item_local.context = "['buscar_trailer']"
|
||||||
|
|
||||||
item_local.url = urlparse.urljoin(host, scrapedurl)
|
item_local.url = urlparse.urljoin(host, scrapedurl)
|
||||||
|
|
||||||
|
|||||||
@@ -12,40 +12,53 @@ from core import httptools
|
|||||||
from core import scrapertools
|
from core import scrapertools
|
||||||
from core import servertools
|
from core import servertools
|
||||||
from core.item import Item
|
from core.item import Item
|
||||||
from platformcode import config, logger
|
from platformcode import config, logger, platformtools
|
||||||
from core import tmdb
|
from core import tmdb
|
||||||
from lib import generictools
|
from lib import generictools
|
||||||
|
|
||||||
host = 'http://mispelisyseries.com/'
|
channel_py = 'newpct1'
|
||||||
|
|
||||||
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
||||||
clone_list = config.get_setting('clonenewpct1_channels_list', "torrentrapid") #Carga lista de clones
|
clone_list = config.get_setting('clonenewpct1_channels_list', channel_py) #Carga lista de clones
|
||||||
clone_list = ast.literal_eval(clone_list) #la convierte a lista de tuplas
|
clone_list = ast.literal_eval(clone_list) #la convierte en array
|
||||||
host_index = 0
|
host_index = 0
|
||||||
host_index = config.get_setting('clonenewpct1_channel_default', "torrentrapid") #Clone por defecto
|
host_index = config.get_setting('clonenewpct1_channel_default', channel_py) #Clone por defecto
|
||||||
i = 0
|
i = 0
|
||||||
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
||||||
if i == host_index:
|
if i == host_index:
|
||||||
#channel_clone_name = channel_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
channel_clone_name = channel_clone #Nombre del Canal elegido
|
||||||
#host = 'http://%s/' % host_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
host = host_clone #URL del Canal elegido
|
||||||
i += 1
|
break
|
||||||
|
i += 1
|
||||||
|
item = Item()
|
||||||
|
item.channel_host = host
|
||||||
|
if item.channel != channel_py:
|
||||||
|
item.channel = channel_py
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
|
||||||
#Carga de opciones del canal
|
#Carga de opciones del canal
|
||||||
item = Item()
|
__modo_grafico__ = config.get_setting('modo_grafico', channel_py) #TMDB?
|
||||||
if not item.channel:
|
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', channel_py) #Actualización sólo últ. Temporada?
|
||||||
item.channel = scrapertools.find_single_match(host, r'(\w+)\.com\/')
|
timeout = config.get_setting('clonenewpct1_timeout_downloadpage', channel_py) #Timeout downloadpage
|
||||||
channel_clone_name = scrapertools.find_single_match(host, r'(\w+)\.com\/') #QUITAR CUANDO SE PASE A NEWPCT1
|
if timeout == 0: timeout = None
|
||||||
__modo_grafico__ = config.get_setting('modo_grafico', item.channel)
|
|
||||||
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', item.channel)
|
platformtools.dialog_ok("NewPct1, ¡¡¡he vuelto como canal VIRTUAL!!!", "Hemos centralizado la gestión de los clones de NewPct1 en el canal virtual NewPct1. Los clones desaparecerán en breve.", "Para más información lee el tutorial: https://alfa-addon.com /threads/newpct1-implantando-alta-disponibilidad.1200/")
|
||||||
|
|
||||||
|
#Vayamos a la siguiente acción en el canal Newpct1
|
||||||
|
from platformcode import launcher
|
||||||
|
channel_clone_name = "mispelisyseries" #Nombre del Canal elegido
|
||||||
|
host = "http://mispelisyseries.com/"
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
item.action = "mainlist"
|
||||||
|
item.channel_host = host
|
||||||
|
launcher.run(item)
|
||||||
|
|
||||||
|
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
if item.channel != channel_py:
|
||||||
|
return
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
thumb_pelis = get_thumb("channels_movie.png")
|
thumb_pelis = get_thumb("channels_movie.png")
|
||||||
@@ -58,20 +71,20 @@ def mainlist(item):
|
|||||||
thumb_settings = get_thumb("setting_0.png")
|
thumb_settings = get_thumb("setting_0.png")
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
||||||
extra="peliculas", thumbnail=thumb_pelis ))
|
extra="peliculas", thumbnail=thumb_pelis, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
||||||
thumbnail=thumb_series))
|
thumbnail=thumb_series, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
||||||
thumbnail=thumb_docus))
|
thumbnail=thumb_docus, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar))
|
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar, category=item.category))
|
||||||
|
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -85,68 +98,60 @@ def submenu(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
host_alt = host
|
patron = '<li><a\s?class="[^"]+"\s?href="http:[^"]+"><i\s?class=.*><\/i>.*Inicio<\/a><\/li>(.+)<\/ul>\s?<\/nav>'
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
||||||
if not data or not scrapertools.find_single_match(data, patron):
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url)
|
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR] [ALT ] en uso'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] caído'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
host_alt = host.replace(item.channel_alt, item.channel)
|
|
||||||
del item.channel_alt
|
|
||||||
if item.url_alt: del item.url_alt
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
#data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
#data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
||||||
|
if "pelisyseries.com" in item.channel_host and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
||||||
host_dom = host_alt.replace("https://", "").replace("http://", "").replace("www.", "")
|
data = '<li><a href="' + item.channel_host + 'varios/" title="Documentales">Documentales</a></li>'
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
if "pelisyseries.com" in host_alt and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
|
||||||
data = '<a href="' + host_alt + 'varios/" title="Documentales"><i class="icon-rocket"></i> Documentales</a>'
|
|
||||||
else:
|
else:
|
||||||
if data:
|
data = scrapertools.get_match(data, patron) #Seleccionamos el trozo que nos interesa
|
||||||
data = scrapertools.get_match(data, patron)
|
if not data:
|
||||||
if not data:
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
else:
|
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
|
|
||||||
patron = '<.*?href="([^"]+)".*?>([^>]+)</a>'
|
patron = '<li><a.*?href="([^"]+)"\s?.itle="[^"]+"\s?>([^>]+)<\/a><\/li>'
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
|
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.strip()
|
title = scrapedtitle.strip()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
#Preguntamos por las entradas que no corresponden al "extra"
|
||||||
itemlist.append(
|
if item.extra in scrapedtitle.lower() or (item.extra == "peliculas" and ("cine" in scrapedurl or "anime" in scrapedurl)) or (item.extra == "varios" and ("documentales" in scrapedurl or "varios" in scrapedurl)):
|
||||||
Item(channel=item.channel, action="alfabeto", title=title + " [A-Z]", url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
itemlist.append(item.clone(action="alfabeto", title=title + " [A-Z]", url=scrapedurl))
|
||||||
|
|
||||||
if item.extra == "peliculas":
|
if item.extra == "peliculas":
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title="Películas 4K", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
itemlist.append(item.clone(action="listado", title="Películas 4K", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="alfabeto", title="Películas 4K" + " [A-Z]", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
Item(channel=item.channel, action="alfabeto", title="Películas 4K" + " [A-Z]", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -155,28 +160,41 @@ def alfabeto(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = ''
|
||||||
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
|
|
||||||
patron = '<ul class="alfabeto">(.*?)</ul>'
|
patron = '<ul class="alfabeto">(.*?)</ul>'
|
||||||
if data:
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
data = scrapertools.get_match(data, patron)
|
logger.error("ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
else:
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
return itemlist
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
|
data = scrapertools.get_match(data, patron)
|
||||||
|
|
||||||
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
||||||
|
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: ALFABETO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: ALFABETO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.upper()
|
title = scrapedtitle.upper()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -191,11 +209,21 @@ def listado(item):
|
|||||||
if item.totalItems:
|
if item.totalItems:
|
||||||
del item.totalItems
|
del item.totalItems
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
patron = '<ul class="' + clase + '">(.*?)</ul>' #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, patron) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Establecemos los valores básicos en función del tipo de contenido
|
#Establecemos los valores básicos en función del tipo de contenido
|
||||||
@@ -218,7 +246,7 @@ def listado(item):
|
|||||||
fichas = scrapertools.get_match(data, patron)
|
fichas = scrapertools.get_match(data, patron)
|
||||||
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -235,7 +263,7 @@ def listado(item):
|
|||||||
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("MATCHES: " + str(len(matches)))
|
#logger.debug("MATCHES: " + str(len(matches)))
|
||||||
@@ -460,13 +488,21 @@ def listado(item):
|
|||||||
|
|
||||||
def listado_busqueda(item):
|
def listado_busqueda(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
host = 'http://%s/' % scrapertools.find_single_match(item.url, '(\w+\.com)\/')
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
if item.category and item.category != "newest":
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
||||||
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
||||||
cnt_pag = 0 # Contador de líneas leídas de Matches
|
cnt_pag = 0 # Contador de líneas leídas de Matches
|
||||||
|
timeout_search = 5 # Timeout un poco más largo para las búsquedas
|
||||||
|
if timeout > 5:
|
||||||
|
timeout_search = timeout # Timeout un poco más largo para las búsquedas
|
||||||
|
data = ''
|
||||||
|
|
||||||
if item.cnt_pag:
|
if item.cnt_pag:
|
||||||
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
||||||
@@ -493,21 +529,21 @@ def listado_busqueda(item):
|
|||||||
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
||||||
while cnt_title <= cnt_tot and cnt_next < 5:
|
while cnt_title <= cnt_tot and cnt_next < 5:
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post, timeout=timeout_search).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
cnt_next += 1
|
cnt_next += 1
|
||||||
if not data or not scrapertools.find_single_match(data, pattern):
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, pattern) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, pattern)
|
item, data = generictools.fail_over_newpct1(item, pattern)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
host = host.replace(item.channel_alt, item.channel)
|
host = host.replace(item.channel_alt, item.channel)
|
||||||
@@ -531,7 +567,6 @@ def listado_busqueda(item):
|
|||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
data_alt = data
|
data_alt = data
|
||||||
data = scrapertools.get_match(data, pattern)
|
data = scrapertools.get_match(data, pattern)
|
||||||
#pattern = '<li[^>]*><a href="(?P<url>[^"]+).*?<img.*?src="(?P<thumb>[^"]+)?".*?<h2.*?>(?P<title>.*?)?<\/h2>'
|
|
||||||
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
||||||
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
||||||
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
||||||
@@ -541,7 +576,8 @@ def listado_busqueda(item):
|
|||||||
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
||||||
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
|
item, itemlist = generictools.post_tmdb_listado(item, itemlist) #Pintamos los datos de fail-over, si los hay
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
||||||
@@ -830,14 +866,14 @@ def listado_busqueda(item):
|
|||||||
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
||||||
|
|
||||||
#Leemos la página, a ver si es una página de episodios
|
#Leemos la página, a ver si es una página de episodios
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
||||||
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
||||||
#intentarlo con la otra url
|
#intentarlo con la otra url
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
@@ -876,9 +912,10 @@ def findvideos(item):
|
|||||||
from core import channeltools
|
from core import channeltools
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -987,8 +1024,9 @@ def findvideos(item):
|
|||||||
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
||||||
|
|
||||||
# Descarga la página
|
# Descarga la página
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -1001,7 +1039,7 @@ def findvideos(item):
|
|||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
@@ -1029,7 +1067,7 @@ def findvideos(item):
|
|||||||
item_local.url = scrapertools.find_single_match(data, patron)
|
item_local.url = scrapertools.find_single_match(data, patron)
|
||||||
if not item_local.url: #error
|
if not item_local.url: #error
|
||||||
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
||||||
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
||||||
@@ -1054,6 +1092,8 @@ def findvideos(item):
|
|||||||
#logger.debug(item_local)
|
#logger.debug(item_local)
|
||||||
|
|
||||||
# VER vídeos, descargar vídeos un link, o múltiples links
|
# VER vídeos, descargar vídeos un link, o múltiples links
|
||||||
|
data = scrapertools.find_single_match(data, '<div id="tab1" class="tab_content"(.*?<\/ul>(?:<div.*?>)?<\/div><\/div><\/div>)') #Seleccionar el bloque para evitar duplicados
|
||||||
|
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
||||||
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
||||||
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
||||||
@@ -1066,7 +1106,7 @@ def findvideos(item):
|
|||||||
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
||||||
enlaces_descargar = enlaces_ver
|
enlaces_descargar = enlaces_ver
|
||||||
#logger.debug(enlaces_ver)
|
#logger.debug(enlaces_ver)
|
||||||
|
|
||||||
#Recorre todos los links de VER, si está permitido
|
#Recorre todos los links de VER, si está permitido
|
||||||
cnt_enl_ver = 1
|
cnt_enl_ver = 1
|
||||||
cnt_enl_verif = 1
|
cnt_enl_verif = 1
|
||||||
@@ -1100,7 +1140,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1190,7 +1230,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1232,9 +1272,10 @@ def findvideos(item):
|
|||||||
def episodios(item):
|
def episodios(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -1255,7 +1296,7 @@ def episodios(item):
|
|||||||
|
|
||||||
data = ''
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
data_alt = ''
|
data_alt = ''
|
||||||
if data: data_alt = scrapertools.get_match(data, patron)
|
if data: data_alt = scrapertools.get_match(data, patron)
|
||||||
@@ -1276,7 +1317,7 @@ def episodios(item):
|
|||||||
|
|
||||||
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
||||||
@@ -1312,7 +1353,7 @@ def episodios(item):
|
|||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
if not data:
|
if not data:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
@@ -1321,7 +1362,7 @@ def episodios(item):
|
|||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if "pelisyseries.com" in item.url:
|
if "pelisyseries.com" in item.url:
|
||||||
@@ -1331,7 +1372,7 @@ def episodios(item):
|
|||||||
matches = re.compile(pattern, re.DOTALL).findall(data)
|
matches = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("patron: " + pattern)
|
#logger.debug("patron: " + pattern)
|
||||||
@@ -1399,7 +1440,7 @@ def episodios(item):
|
|||||||
match = [m.groupdict() for m in r.finditer(info)][0]
|
match = [m.groupdict() for m in r.finditer(info)][0]
|
||||||
if not match: #error
|
if not match: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
||||||
@@ -1449,8 +1490,6 @@ def episodios(item):
|
|||||||
|
|
||||||
if item_local.active:
|
if item_local.active:
|
||||||
del item_local.active
|
del item_local.active
|
||||||
if item_local.category:
|
|
||||||
del item_local.category
|
|
||||||
if item_local.infoLabels['title']:
|
if item_local.infoLabels['title']:
|
||||||
del item_local.infoLabels['title']
|
del item_local.infoLabels['title']
|
||||||
item_local.context = "['buscar_trailer']"
|
item_local.context = "['buscar_trailer']"
|
||||||
@@ -1467,6 +1506,8 @@ def episodios(item):
|
|||||||
del item_local.update_last
|
del item_local.update_last
|
||||||
if item_local.update_next:
|
if item_local.update_next:
|
||||||
del item_local.update_next
|
del item_local.update_next
|
||||||
|
if item_local.channel_host:
|
||||||
|
del item_local.channel_host
|
||||||
|
|
||||||
itemlist.append(item_local.clone())
|
itemlist.append(item_local.clone())
|
||||||
|
|
||||||
@@ -1501,9 +1542,6 @@ def actualizar_titulos(item):
|
|||||||
def search(item, texto):
|
def search(item, texto):
|
||||||
logger.info("search:" + texto)
|
logger.info("search:" + texto)
|
||||||
# texto = texto.replace(" ", "+")
|
# texto = texto.replace(" ", "+")
|
||||||
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
item.post = "q=%s" % texto
|
item.post = "q=%s" % texto
|
||||||
|
|||||||
@@ -0,0 +1,565 @@
|
|||||||
|
{
|
||||||
|
"id": "newpct1",
|
||||||
|
"name": "Newpct1",
|
||||||
|
"active": true,
|
||||||
|
"adult": false,
|
||||||
|
"language": ["*"],
|
||||||
|
"thumbnail": "newpct1.png",
|
||||||
|
"banner": "newpct1.png",
|
||||||
|
"categories": [
|
||||||
|
"movie",
|
||||||
|
"tvshow",
|
||||||
|
"anime",
|
||||||
|
"torrent",
|
||||||
|
"latino",
|
||||||
|
"documentary",
|
||||||
|
"vos",
|
||||||
|
"direct"
|
||||||
|
],
|
||||||
|
"settings": [
|
||||||
|
{
|
||||||
|
"id": "include_in_global_search",
|
||||||
|
"type": "bool",
|
||||||
|
"label": "Incluir en busqueda global",
|
||||||
|
"default": true,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "modo_grafico",
|
||||||
|
"type": "bool",
|
||||||
|
"label": "Buscar información extra (TMDB)",
|
||||||
|
"default": true,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_channel_default",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Clone de NewPct1 por defecto",
|
||||||
|
"default": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": true,
|
||||||
|
"lvalues": [
|
||||||
|
"Torrentrapid",
|
||||||
|
"Torrentlocura",
|
||||||
|
"Tumejortorrent",
|
||||||
|
"Tvsinpagar",
|
||||||
|
"Descargas2020",
|
||||||
|
"Mispelisyseries"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_channels_list",
|
||||||
|
"type": "text",
|
||||||
|
"label": "Lista de clones de NewPct1 y orden de uso",
|
||||||
|
"default": "('1', 'torrentrapid', 'http://torrentrapid.com/', 'movie, tvshow, season, episode', ''), ('1', 'torrentlocura', 'http://torrentlocura.com/', 'movie, tvshow, season, episode', ''), ('1', 'tumejortorrent', 'http://tumejortorrent.com/', 'movie, tvshow, season, episode', ''), ('1', 'tvsinpagar', 'http://www.tvsinpagar.com/', 'tvshow, season, episode', ''), ('1', 'descargas2020', 'http://descargas2020.com/', 'movie, tvshow, season, episode', ''), ('1', 'mispelisyseries', 'http://mispelisyseries.com/', 'movie', 'search')",
|
||||||
|
"enabled": true,
|
||||||
|
"visible": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "seleccionar_ult_temporadda_activa",
|
||||||
|
"type": "bool",
|
||||||
|
"label": "Seleccionar para Videoteca si estará activa solo la última Temporada",
|
||||||
|
"default": true,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_ver_enlaces_veronline",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Mostrar enlaces Ver Online",
|
||||||
|
"default": 1,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": true,
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Todos",
|
||||||
|
"1",
|
||||||
|
"5",
|
||||||
|
"10",
|
||||||
|
"20"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_verificar_enlaces_veronline",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Verificar enlaces Ver Online",
|
||||||
|
"default": 1,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Todos",
|
||||||
|
"1",
|
||||||
|
"5",
|
||||||
|
"10",
|
||||||
|
"20"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_verificar_enlaces_veronline_validos",
|
||||||
|
"type": "bool",
|
||||||
|
"label": "¿Contar sólo enlaces 'verificados' en Ver Online?",
|
||||||
|
"default": true,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No') + !eq(-2,'No')"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_excluir1_enlaces_veronline",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Excluir Servidores para Ver Online",
|
||||||
|
"default": 9,
|
||||||
|
"max_excl": 5,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-3,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Bankupload",
|
||||||
|
"Clipwatching",
|
||||||
|
"Flashx",
|
||||||
|
"Katfile",
|
||||||
|
"Mega",
|
||||||
|
"Mexashare",
|
||||||
|
"Movshare",
|
||||||
|
"Mowvideo",
|
||||||
|
"Openload",
|
||||||
|
"Powvideo",
|
||||||
|
"Rapidgator",
|
||||||
|
"Streamango",
|
||||||
|
"Streamcloud",
|
||||||
|
"Streame",
|
||||||
|
"Streaminto",
|
||||||
|
"Streamplay",
|
||||||
|
"Thevideo",
|
||||||
|
"Turbobit",
|
||||||
|
"Uploadedto",
|
||||||
|
"Uptobox",
|
||||||
|
"Userscloud",
|
||||||
|
"Vidabc",
|
||||||
|
"Vidspot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_excluir2_enlaces_veronline",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Excluir Servidores para Ver Online",
|
||||||
|
"default": 12,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Bankupload",
|
||||||
|
"Clipwatching",
|
||||||
|
"Flashx",
|
||||||
|
"Katfile",
|
||||||
|
"Mega",
|
||||||
|
"Mexashare",
|
||||||
|
"Movshare",
|
||||||
|
"Mowvideo",
|
||||||
|
"Openload",
|
||||||
|
"Powvideo",
|
||||||
|
"Rapidgator",
|
||||||
|
"Streamango",
|
||||||
|
"Streamcloud",
|
||||||
|
"Streame",
|
||||||
|
"Streaminto",
|
||||||
|
"Streamplay",
|
||||||
|
"Thevideo",
|
||||||
|
"Turbobit",
|
||||||
|
"Uploadedto",
|
||||||
|
"Uptobox",
|
||||||
|
"Userscloud",
|
||||||
|
"Vidabc",
|
||||||
|
"Vidspot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_excluir3_enlaces_veronline",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Excluir Servidores para Ver Online",
|
||||||
|
"default": 20,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Bankupload",
|
||||||
|
"Clipwatching",
|
||||||
|
"Flashx",
|
||||||
|
"Katfile",
|
||||||
|
"Mega",
|
||||||
|
"Mexashare",
|
||||||
|
"Movshare",
|
||||||
|
"Mowvideo",
|
||||||
|
"Openload",
|
||||||
|
"Powvideo",
|
||||||
|
"Rapidgator",
|
||||||
|
"Streamango",
|
||||||
|
"Streamcloud",
|
||||||
|
"Streame",
|
||||||
|
"Streaminto",
|
||||||
|
"Streamplay",
|
||||||
|
"Thevideo",
|
||||||
|
"Turbobit",
|
||||||
|
"Uploadedto",
|
||||||
|
"Uptobox",
|
||||||
|
"Userscloud",
|
||||||
|
"Vidabc",
|
||||||
|
"Vidspot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_excluir4_enlaces_veronline",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Excluir Servidores para Ver Online",
|
||||||
|
"default": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Bankupload",
|
||||||
|
"Clipwatching",
|
||||||
|
"Flashx",
|
||||||
|
"Katfile",
|
||||||
|
"Mega",
|
||||||
|
"Mexashare",
|
||||||
|
"Movshare",
|
||||||
|
"Mowvideo",
|
||||||
|
"Openload",
|
||||||
|
"Powvideo",
|
||||||
|
"Rapidgator",
|
||||||
|
"Streamango",
|
||||||
|
"Streamcloud",
|
||||||
|
"Streame",
|
||||||
|
"Streaminto",
|
||||||
|
"Streamplay",
|
||||||
|
"Thevideo",
|
||||||
|
"Turbobit",
|
||||||
|
"Uploadedto",
|
||||||
|
"Uptobox",
|
||||||
|
"Userscloud",
|
||||||
|
"Vidabc",
|
||||||
|
"Vidspot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_excluir5_enlaces_veronline",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Excluir Servidores para Ver Online",
|
||||||
|
"default": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Bankupload",
|
||||||
|
"Clipwatching",
|
||||||
|
"Flashx",
|
||||||
|
"Katfile",
|
||||||
|
"Mega",
|
||||||
|
"Mexashare",
|
||||||
|
"Movshare",
|
||||||
|
"Mowvideo",
|
||||||
|
"Openload",
|
||||||
|
"Powvideo",
|
||||||
|
"Rapidgator",
|
||||||
|
"Streamango",
|
||||||
|
"Streamcloud",
|
||||||
|
"Streame",
|
||||||
|
"Streaminto",
|
||||||
|
"Streamplay",
|
||||||
|
"Thevideo",
|
||||||
|
"Turbobit",
|
||||||
|
"Uploadedto",
|
||||||
|
"Uptobox",
|
||||||
|
"Userscloud",
|
||||||
|
"Vidabc",
|
||||||
|
"Vidspot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_ver_enlaces_descargas",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Mostrar enlaces Descargas",
|
||||||
|
"default": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": true,
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Todos",
|
||||||
|
"1",
|
||||||
|
"5",
|
||||||
|
"10",
|
||||||
|
"20",
|
||||||
|
"30",
|
||||||
|
"50",
|
||||||
|
"100"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_verificar_enlaces_descargas",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Verificar enlaces Descargas",
|
||||||
|
"default": 1,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Todos",
|
||||||
|
"1",
|
||||||
|
"5",
|
||||||
|
"10",
|
||||||
|
"20",
|
||||||
|
"30",
|
||||||
|
"50",
|
||||||
|
"100"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_verificar_enlaces_descargas_validos",
|
||||||
|
"type": "bool",
|
||||||
|
"label": "¿Contar sólo enlaces 'verificados' en Descargar?",
|
||||||
|
"default": true,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No') + !eq(-2,'No')"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_excluir1_enlaces_descargas",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Excluir Servidores para Ver Descargas",
|
||||||
|
"default": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-3,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Bankupload",
|
||||||
|
"Clipwatching",
|
||||||
|
"Flashx",
|
||||||
|
"Katfile",
|
||||||
|
"Mega",
|
||||||
|
"Mexashare",
|
||||||
|
"Movshare",
|
||||||
|
"Mowvideo",
|
||||||
|
"Openload",
|
||||||
|
"Powvideo",
|
||||||
|
"Rapidgator",
|
||||||
|
"Streamango",
|
||||||
|
"Streamcloud",
|
||||||
|
"Streame",
|
||||||
|
"Streaminto",
|
||||||
|
"Streamplay",
|
||||||
|
"Thevideo",
|
||||||
|
"Turbobit",
|
||||||
|
"Uploadedto",
|
||||||
|
"Uptobox",
|
||||||
|
"Userscloud",
|
||||||
|
"Vidabc",
|
||||||
|
"Vidspot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_excluir2_enlaces_descargas",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Excluir Servidores para Ver Descargas",
|
||||||
|
"default": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Bankupload",
|
||||||
|
"Clipwatching",
|
||||||
|
"Flashx",
|
||||||
|
"Katfile",
|
||||||
|
"Mega",
|
||||||
|
"Mexashare",
|
||||||
|
"Movshare",
|
||||||
|
"Mowvideo",
|
||||||
|
"Openload",
|
||||||
|
"Powvideo",
|
||||||
|
"Rapidgator",
|
||||||
|
"Streamango",
|
||||||
|
"Streamcloud",
|
||||||
|
"Streame",
|
||||||
|
"Streaminto",
|
||||||
|
"Streamplay",
|
||||||
|
"Thevideo",
|
||||||
|
"Turbobit",
|
||||||
|
"Uploadedto",
|
||||||
|
"Uptobox",
|
||||||
|
"Userscloud",
|
||||||
|
"Vidabc",
|
||||||
|
"Vidspot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_excluir3_enlaces_descargas",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Excluir Servidores para Descargas",
|
||||||
|
"default": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Bankupload",
|
||||||
|
"Clipwatching",
|
||||||
|
"Flashx",
|
||||||
|
"Katfile",
|
||||||
|
"Mega",
|
||||||
|
"Mexashare",
|
||||||
|
"Movshare",
|
||||||
|
"Mowvideo",
|
||||||
|
"Openload",
|
||||||
|
"Powvideo",
|
||||||
|
"Rapidgator",
|
||||||
|
"Streamango",
|
||||||
|
"Streamcloud",
|
||||||
|
"Streame",
|
||||||
|
"Streaminto",
|
||||||
|
"Streamplay",
|
||||||
|
"Thevideo",
|
||||||
|
"Turbobit",
|
||||||
|
"Uploadedto",
|
||||||
|
"Uptobox",
|
||||||
|
"Userscloud",
|
||||||
|
"Vidabc",
|
||||||
|
"Vidspot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_excluir4_enlaces_descargas",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Excluir Servidores para Descargas",
|
||||||
|
"default": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Bankupload",
|
||||||
|
"Clipwatching",
|
||||||
|
"Flashx",
|
||||||
|
"Katfile",
|
||||||
|
"Mega",
|
||||||
|
"Mexashare",
|
||||||
|
"Movshare",
|
||||||
|
"Mowvideo",
|
||||||
|
"Openload",
|
||||||
|
"Powvideo",
|
||||||
|
"Rapidgator",
|
||||||
|
"Streamango",
|
||||||
|
"Streamcloud",
|
||||||
|
"Streame",
|
||||||
|
"Streaminto",
|
||||||
|
"Streamplay",
|
||||||
|
"Thevideo",
|
||||||
|
"Turbobit",
|
||||||
|
"Uploadedto",
|
||||||
|
"Uptobox",
|
||||||
|
"Userscloud",
|
||||||
|
"Vidabc",
|
||||||
|
"Vidspot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_excluir5_enlaces_descargas",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Excluir Servidores para Descargas",
|
||||||
|
"default": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": "!eq(-1,'No')",
|
||||||
|
"lvalues": [
|
||||||
|
"No",
|
||||||
|
"Bankupload",
|
||||||
|
"Clipwatching",
|
||||||
|
"Flashx",
|
||||||
|
"Katfile",
|
||||||
|
"Mega",
|
||||||
|
"Mexashare",
|
||||||
|
"Movshare",
|
||||||
|
"Mowvideo",
|
||||||
|
"Openload",
|
||||||
|
"Powvideo",
|
||||||
|
"Rapidgator",
|
||||||
|
"Streamango",
|
||||||
|
"Streamcloud",
|
||||||
|
"Streame",
|
||||||
|
"Streaminto",
|
||||||
|
"Streamplay",
|
||||||
|
"Thevideo",
|
||||||
|
"Turbobit",
|
||||||
|
"Uploadedto",
|
||||||
|
"Uptobox",
|
||||||
|
"Userscloud",
|
||||||
|
"Vidabc",
|
||||||
|
"Vidspot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "include_in_newest_peliculas",
|
||||||
|
"type": "bool",
|
||||||
|
"label": "Incluir en Novedades - Peliculas",
|
||||||
|
"default": true,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "include_in_newest_series",
|
||||||
|
"type": "bool",
|
||||||
|
"label": "Incluir en Novedades - Episodios de series",
|
||||||
|
"default": true,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "include_in_newest_anime",
|
||||||
|
"type": "bool",
|
||||||
|
"label": "Incluir en Novedades - Anime",
|
||||||
|
"default": true,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "include_in_newest_documentales",
|
||||||
|
"type": "bool",
|
||||||
|
"label": "Incluir en Novedades - Documentales",
|
||||||
|
"default": true,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "include_in_newest_latino",
|
||||||
|
"type": "bool",
|
||||||
|
"label": "Incluir en Novedades - Documentales",
|
||||||
|
"default": true,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "include_in_newest_4k",
|
||||||
|
"type": "bool",
|
||||||
|
"label": "Incluir en Novedades - 4K",
|
||||||
|
"default": true,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_timeout_downloadpage",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Timeout (segs.) en descarga de páginas o verificación de servidores",
|
||||||
|
"default": 5,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": true,
|
||||||
|
"lvalues": [
|
||||||
|
"None",
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"3",
|
||||||
|
"4",
|
||||||
|
"5",
|
||||||
|
"6",
|
||||||
|
"7",
|
||||||
|
"8",
|
||||||
|
"9",
|
||||||
|
"10"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -12,40 +12,53 @@ from core import httptools
|
|||||||
from core import scrapertools
|
from core import scrapertools
|
||||||
from core import servertools
|
from core import servertools
|
||||||
from core.item import Item
|
from core.item import Item
|
||||||
from platformcode import config, logger
|
from platformcode import config, logger, platformtools
|
||||||
from core import tmdb
|
from core import tmdb
|
||||||
from lib import generictools
|
from lib import generictools
|
||||||
|
|
||||||
host = 'http://torrentlocura.com/'
|
channel_py = 'newpct1'
|
||||||
|
|
||||||
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
||||||
clone_list = config.get_setting('clonenewpct1_channels_list', "torrentrapid") #Carga lista de clones
|
clone_list = config.get_setting('clonenewpct1_channels_list', channel_py) #Carga lista de clones
|
||||||
clone_list = ast.literal_eval(clone_list) #la convierte a lista de tuplas
|
clone_list = ast.literal_eval(clone_list) #la convierte en array
|
||||||
host_index = 0
|
host_index = 0
|
||||||
host_index = config.get_setting('clonenewpct1_channel_default', "torrentrapid") #Clone por defecto
|
host_index = config.get_setting('clonenewpct1_channel_default', channel_py) #Clone por defecto
|
||||||
i = 0
|
i = 0
|
||||||
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
||||||
if i == host_index:
|
if i == host_index:
|
||||||
#channel_clone_name = channel_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
channel_clone_name = channel_clone #Nombre del Canal elegido
|
||||||
#host = 'http://%s/' % host_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
host = host_clone #URL del Canal elegido
|
||||||
i += 1
|
break
|
||||||
|
i += 1
|
||||||
|
item = Item()
|
||||||
|
item.channel_host = host
|
||||||
|
if item.channel != channel_py:
|
||||||
|
item.channel = channel_py
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
|
||||||
#Carga de opciones del canal
|
#Carga de opciones del canal
|
||||||
item = Item()
|
__modo_grafico__ = config.get_setting('modo_grafico', channel_py) #TMDB?
|
||||||
if not item.channel:
|
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', channel_py) #Actualización sólo últ. Temporada?
|
||||||
item.channel = scrapertools.find_single_match(host, r'(\w+)\.com\/')
|
timeout = config.get_setting('clonenewpct1_timeout_downloadpage', channel_py) #Timeout downloadpage
|
||||||
channel_clone_name = scrapertools.find_single_match(host, r'(\w+)\.com\/') #QUITAR CUANDO SE PASE A NEWPCT1
|
if timeout == 0: timeout = None
|
||||||
__modo_grafico__ = config.get_setting('modo_grafico', item.channel)
|
|
||||||
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', item.channel)
|
platformtools.dialog_ok("NewPct1, ¡¡¡he vuelto como canal VIRTUAL!!!", "Hemos centralizado la gestión de los clones de NewPct1 en el canal virtual NewPct1. Los clones desaparecerán en breve.", "Para más información lee el tutorial: https://alfa-addon.com /threads/newpct1-implantando-alta-disponibilidad.1200/")
|
||||||
|
|
||||||
|
#Vayamos a la siguiente acción en el canal Newpct1
|
||||||
|
from platformcode import launcher
|
||||||
|
channel_clone_name = "torrentlocura" #Nombre del Canal elegido
|
||||||
|
host = "http://torrentlocura.com/"
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
item.action = "mainlist"
|
||||||
|
item.channel_host = host
|
||||||
|
launcher.run(item)
|
||||||
|
|
||||||
|
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
if item.channel != channel_py:
|
||||||
|
return
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
thumb_pelis = get_thumb("channels_movie.png")
|
thumb_pelis = get_thumb("channels_movie.png")
|
||||||
@@ -58,20 +71,20 @@ def mainlist(item):
|
|||||||
thumb_settings = get_thumb("setting_0.png")
|
thumb_settings = get_thumb("setting_0.png")
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
||||||
extra="peliculas", thumbnail=thumb_pelis ))
|
extra="peliculas", thumbnail=thumb_pelis, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
||||||
thumbnail=thumb_series))
|
thumbnail=thumb_series, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
||||||
thumbnail=thumb_docus))
|
thumbnail=thumb_docus, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar))
|
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar, category=item.category))
|
||||||
|
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -85,68 +98,60 @@ def submenu(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
host_alt = host
|
patron = '<li><a\s?class="[^"]+"\s?href="http:[^"]+"><i\s?class=.*><\/i>.*Inicio<\/a><\/li>(.+)<\/ul>\s?<\/nav>'
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
||||||
if not data or not scrapertools.find_single_match(data, patron):
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url)
|
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR] [ALT ] en uso'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] caído'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
host_alt = host.replace(item.channel_alt, item.channel)
|
|
||||||
del item.channel_alt
|
|
||||||
if item.url_alt: del item.url_alt
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
#data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
#data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
||||||
|
if "pelisyseries.com" in item.channel_host and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
||||||
host_dom = host_alt.replace("https://", "").replace("http://", "").replace("www.", "")
|
data = '<li><a href="' + item.channel_host + 'varios/" title="Documentales">Documentales</a></li>'
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
if "pelisyseries.com" in host_alt and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
|
||||||
data = '<a href="' + host_alt + 'varios/" title="Documentales"><i class="icon-rocket"></i> Documentales</a>'
|
|
||||||
else:
|
else:
|
||||||
if data:
|
data = scrapertools.get_match(data, patron) #Seleccionamos el trozo que nos interesa
|
||||||
data = scrapertools.get_match(data, patron)
|
if not data:
|
||||||
if not data:
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
else:
|
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
|
|
||||||
patron = '<.*?href="([^"]+)".*?>([^>]+)</a>'
|
patron = '<li><a.*?href="([^"]+)"\s?.itle="[^"]+"\s?>([^>]+)<\/a><\/li>'
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
|
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.strip()
|
title = scrapedtitle.strip()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
#Preguntamos por las entradas que no corresponden al "extra"
|
||||||
itemlist.append(
|
if item.extra in scrapedtitle.lower() or (item.extra == "peliculas" and ("cine" in scrapedurl or "anime" in scrapedurl)) or (item.extra == "varios" and ("documentales" in scrapedurl or "varios" in scrapedurl)):
|
||||||
Item(channel=item.channel, action="alfabeto", title=title + " [A-Z]", url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
itemlist.append(item.clone(action="alfabeto", title=title + " [A-Z]", url=scrapedurl))
|
||||||
|
|
||||||
if item.extra == "peliculas":
|
if item.extra == "peliculas":
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title="Películas 4K", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
itemlist.append(item.clone(action="listado", title="Películas 4K", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="alfabeto", title="Películas 4K" + " [A-Z]", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
Item(channel=item.channel, action="alfabeto", title="Películas 4K" + " [A-Z]", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -155,28 +160,41 @@ def alfabeto(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = ''
|
||||||
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
|
|
||||||
patron = '<ul class="alfabeto">(.*?)</ul>'
|
patron = '<ul class="alfabeto">(.*?)</ul>'
|
||||||
if data:
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
data = scrapertools.get_match(data, patron)
|
logger.error("ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
else:
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
return itemlist
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
|
data = scrapertools.get_match(data, patron)
|
||||||
|
|
||||||
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
||||||
|
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: ALFABETO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: ALFABETO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.upper()
|
title = scrapedtitle.upper()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -191,11 +209,21 @@ def listado(item):
|
|||||||
if item.totalItems:
|
if item.totalItems:
|
||||||
del item.totalItems
|
del item.totalItems
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
patron = '<ul class="' + clase + '">(.*?)</ul>' #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, patron) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Establecemos los valores básicos en función del tipo de contenido
|
#Establecemos los valores básicos en función del tipo de contenido
|
||||||
@@ -218,7 +246,7 @@ def listado(item):
|
|||||||
fichas = scrapertools.get_match(data, patron)
|
fichas = scrapertools.get_match(data, patron)
|
||||||
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -235,7 +263,7 @@ def listado(item):
|
|||||||
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("MATCHES: " + str(len(matches)))
|
#logger.debug("MATCHES: " + str(len(matches)))
|
||||||
@@ -460,13 +488,21 @@ def listado(item):
|
|||||||
|
|
||||||
def listado_busqueda(item):
|
def listado_busqueda(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
host = 'http://%s/' % scrapertools.find_single_match(item.url, '(\w+\.com)\/')
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
if item.category and item.category != "newest":
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
||||||
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
||||||
cnt_pag = 0 # Contador de líneas leídas de Matches
|
cnt_pag = 0 # Contador de líneas leídas de Matches
|
||||||
|
timeout_search = 5 # Timeout un poco más largo para las búsquedas
|
||||||
|
if timeout > 5:
|
||||||
|
timeout_search = timeout # Timeout un poco más largo para las búsquedas
|
||||||
|
data = ''
|
||||||
|
|
||||||
if item.cnt_pag:
|
if item.cnt_pag:
|
||||||
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
||||||
@@ -493,21 +529,21 @@ def listado_busqueda(item):
|
|||||||
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
||||||
while cnt_title <= cnt_tot and cnt_next < 5:
|
while cnt_title <= cnt_tot and cnt_next < 5:
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post, timeout=timeout_search).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
cnt_next += 1
|
cnt_next += 1
|
||||||
if not data or not scrapertools.find_single_match(data, pattern):
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, pattern) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, pattern)
|
item, data = generictools.fail_over_newpct1(item, pattern)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
host = host.replace(item.channel_alt, item.channel)
|
host = host.replace(item.channel_alt, item.channel)
|
||||||
@@ -531,7 +567,6 @@ def listado_busqueda(item):
|
|||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
data_alt = data
|
data_alt = data
|
||||||
data = scrapertools.get_match(data, pattern)
|
data = scrapertools.get_match(data, pattern)
|
||||||
#pattern = '<li[^>]*><a href="(?P<url>[^"]+).*?<img.*?src="(?P<thumb>[^"]+)?".*?<h2.*?>(?P<title>.*?)?<\/h2>'
|
|
||||||
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
||||||
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
||||||
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
||||||
@@ -541,7 +576,8 @@ def listado_busqueda(item):
|
|||||||
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
||||||
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
|
item, itemlist = generictools.post_tmdb_listado(item, itemlist) #Pintamos los datos de fail-over, si los hay
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
||||||
@@ -830,14 +866,14 @@ def listado_busqueda(item):
|
|||||||
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
||||||
|
|
||||||
#Leemos la página, a ver si es una página de episodios
|
#Leemos la página, a ver si es una página de episodios
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
||||||
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
||||||
#intentarlo con la otra url
|
#intentarlo con la otra url
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
@@ -876,9 +912,10 @@ def findvideos(item):
|
|||||||
from core import channeltools
|
from core import channeltools
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -987,8 +1024,9 @@ def findvideos(item):
|
|||||||
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
||||||
|
|
||||||
# Descarga la página
|
# Descarga la página
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -1001,7 +1039,7 @@ def findvideos(item):
|
|||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
@@ -1029,7 +1067,7 @@ def findvideos(item):
|
|||||||
item_local.url = scrapertools.find_single_match(data, patron)
|
item_local.url = scrapertools.find_single_match(data, patron)
|
||||||
if not item_local.url: #error
|
if not item_local.url: #error
|
||||||
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
||||||
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
||||||
@@ -1054,6 +1092,8 @@ def findvideos(item):
|
|||||||
#logger.debug(item_local)
|
#logger.debug(item_local)
|
||||||
|
|
||||||
# VER vídeos, descargar vídeos un link, o múltiples links
|
# VER vídeos, descargar vídeos un link, o múltiples links
|
||||||
|
data = scrapertools.find_single_match(data, '<div id="tab1" class="tab_content"(.*?<\/ul>(?:<div.*?>)?<\/div><\/div><\/div>)') #Seleccionar el bloque para evitar duplicados
|
||||||
|
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
||||||
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
||||||
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
||||||
@@ -1066,7 +1106,7 @@ def findvideos(item):
|
|||||||
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
||||||
enlaces_descargar = enlaces_ver
|
enlaces_descargar = enlaces_ver
|
||||||
#logger.debug(enlaces_ver)
|
#logger.debug(enlaces_ver)
|
||||||
|
|
||||||
#Recorre todos los links de VER, si está permitido
|
#Recorre todos los links de VER, si está permitido
|
||||||
cnt_enl_ver = 1
|
cnt_enl_ver = 1
|
||||||
cnt_enl_verif = 1
|
cnt_enl_verif = 1
|
||||||
@@ -1100,7 +1140,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1190,7 +1230,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1232,9 +1272,10 @@ def findvideos(item):
|
|||||||
def episodios(item):
|
def episodios(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -1255,7 +1296,7 @@ def episodios(item):
|
|||||||
|
|
||||||
data = ''
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
data_alt = ''
|
data_alt = ''
|
||||||
if data: data_alt = scrapertools.get_match(data, patron)
|
if data: data_alt = scrapertools.get_match(data, patron)
|
||||||
@@ -1276,7 +1317,7 @@ def episodios(item):
|
|||||||
|
|
||||||
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
||||||
@@ -1312,7 +1353,7 @@ def episodios(item):
|
|||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
if not data:
|
if not data:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
@@ -1321,7 +1362,7 @@ def episodios(item):
|
|||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if "pelisyseries.com" in item.url:
|
if "pelisyseries.com" in item.url:
|
||||||
@@ -1331,7 +1372,7 @@ def episodios(item):
|
|||||||
matches = re.compile(pattern, re.DOTALL).findall(data)
|
matches = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("patron: " + pattern)
|
#logger.debug("patron: " + pattern)
|
||||||
@@ -1399,7 +1440,7 @@ def episodios(item):
|
|||||||
match = [m.groupdict() for m in r.finditer(info)][0]
|
match = [m.groupdict() for m in r.finditer(info)][0]
|
||||||
if not match: #error
|
if not match: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
||||||
@@ -1449,8 +1490,6 @@ def episodios(item):
|
|||||||
|
|
||||||
if item_local.active:
|
if item_local.active:
|
||||||
del item_local.active
|
del item_local.active
|
||||||
if item_local.category:
|
|
||||||
del item_local.category
|
|
||||||
if item_local.infoLabels['title']:
|
if item_local.infoLabels['title']:
|
||||||
del item_local.infoLabels['title']
|
del item_local.infoLabels['title']
|
||||||
item_local.context = "['buscar_trailer']"
|
item_local.context = "['buscar_trailer']"
|
||||||
@@ -1467,6 +1506,8 @@ def episodios(item):
|
|||||||
del item_local.update_last
|
del item_local.update_last
|
||||||
if item_local.update_next:
|
if item_local.update_next:
|
||||||
del item_local.update_next
|
del item_local.update_next
|
||||||
|
if item_local.channel_host:
|
||||||
|
del item_local.channel_host
|
||||||
|
|
||||||
itemlist.append(item_local.clone())
|
itemlist.append(item_local.clone())
|
||||||
|
|
||||||
@@ -1501,9 +1542,6 @@ def actualizar_titulos(item):
|
|||||||
def search(item, texto):
|
def search(item, texto):
|
||||||
logger.info("search:" + texto)
|
logger.info("search:" + texto)
|
||||||
# texto = texto.replace(" ", "+")
|
# texto = texto.replace(" ", "+")
|
||||||
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
item.post = "q=%s" % texto
|
item.post = "q=%s" % texto
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
"id": "clonenewpct1_channels_list",
|
"id": "clonenewpct1_channels_list",
|
||||||
"type": "text",
|
"type": "text",
|
||||||
"label": "Lista de clones de NewPct1 y orden de uso",
|
"label": "Lista de clones de NewPct1 y orden de uso",
|
||||||
"default": "('1', 'torrentrapid', 'torrentrapid.com', 'movie, tvshow, season, episode', ''), ('1', 'torrentlocura', 'torrentlocura.com', 'movie, tvshow, season, episode', ''), ('1', 'tumejortorrent', 'tumejortorrent.com', 'movie, tvshow, season, episode', ''), ('1', 'tvsinpagar', 'www.tvsinpagar.com', 'tvshow, season, episode', ''), ('1', 'descargas2020', 'descargas2020.com', 'movie, tvshow, season, episode', ''), ('1', 'mispelisyseries', 'mispelisyseries.com', 'movie, tvshow, season, episode', '')",
|
"default": "('1', 'torrentrapid', 'http://torrentrapid.com/', 'movie, tvshow, season, episode', ''), ('1', 'torrentlocura', 'http://torrentlocura.com/', 'movie, tvshow, season, episode', ''), ('1', 'tumejortorrent', 'http://tumejortorrent.com/', 'movie, tvshow, season, episode', ''), ('1', 'tvsinpagar', 'http://www.tvsinpagar.com/', 'tvshow, season, episode', ''), ('1', 'descargas2020', 'http://descargas2020.com/', 'movie, tvshow, season, episode', ''), ('1', 'mispelisyseries', 'http://mispelisyseries.com/', 'movie', 'search')",
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"visible": false
|
"visible": false
|
||||||
},
|
},
|
||||||
@@ -539,6 +539,27 @@
|
|||||||
"default": true,
|
"default": true,
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"visible": false
|
"visible": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clonenewpct1_timeout_downloadpage",
|
||||||
|
"type": "list",
|
||||||
|
"label": "Timeout (segs.) en descarga de páginas o verificación de servidores",
|
||||||
|
"default": 5,
|
||||||
|
"enabled": true,
|
||||||
|
"visible": true,
|
||||||
|
"lvalues": [
|
||||||
|
"None",
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"3",
|
||||||
|
"4",
|
||||||
|
"5",
|
||||||
|
"6",
|
||||||
|
"7",
|
||||||
|
"8",
|
||||||
|
"9",
|
||||||
|
"10"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -12,40 +12,53 @@ from core import httptools
|
|||||||
from core import scrapertools
|
from core import scrapertools
|
||||||
from core import servertools
|
from core import servertools
|
||||||
from core.item import Item
|
from core.item import Item
|
||||||
from platformcode import config, logger
|
from platformcode import config, logger, platformtools
|
||||||
from core import tmdb
|
from core import tmdb
|
||||||
from lib import generictools
|
from lib import generictools
|
||||||
|
|
||||||
host = 'http://torrentrapid.com/'
|
channel_py = 'newpct1'
|
||||||
|
|
||||||
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
||||||
clone_list = config.get_setting('clonenewpct1_channels_list', "torrentrapid") #Carga lista de clones
|
clone_list = config.get_setting('clonenewpct1_channels_list', channel_py) #Carga lista de clones
|
||||||
clone_list = ast.literal_eval(clone_list) #la convierte a lista de tuplas
|
clone_list = ast.literal_eval(clone_list) #la convierte en array
|
||||||
host_index = 0
|
host_index = 0
|
||||||
host_index = config.get_setting('clonenewpct1_channel_default', "torrentrapid") #Clone por defecto
|
host_index = config.get_setting('clonenewpct1_channel_default', channel_py) #Clone por defecto
|
||||||
i = 0
|
i = 0
|
||||||
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
||||||
if i == host_index:
|
if i == host_index:
|
||||||
#channel_clone_name = channel_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
channel_clone_name = channel_clone #Nombre del Canal elegido
|
||||||
#host = 'http://%s/' % host_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
host = host_clone #URL del Canal elegido
|
||||||
i += 1
|
break
|
||||||
|
i += 1
|
||||||
|
item = Item()
|
||||||
|
item.channel_host = host
|
||||||
|
if item.channel != channel_py:
|
||||||
|
item.channel = channel_py
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
|
||||||
#Carga de opciones del canal
|
#Carga de opciones del canal
|
||||||
item = Item()
|
__modo_grafico__ = config.get_setting('modo_grafico', channel_py) #TMDB?
|
||||||
if not item.channel:
|
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', channel_py) #Actualización sólo últ. Temporada?
|
||||||
item.channel = scrapertools.find_single_match(host, r'(\w+)\.com\/')
|
timeout = config.get_setting('clonenewpct1_timeout_downloadpage', channel_py) #Timeout downloadpage
|
||||||
channel_clone_name = scrapertools.find_single_match(host, r'(\w+)\.com\/') #QUITAR CUANDO SE PASE A NEWPCT1
|
if timeout == 0: timeout = None
|
||||||
__modo_grafico__ = config.get_setting('modo_grafico', item.channel)
|
|
||||||
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', item.channel)
|
platformtools.dialog_ok("NewPct1, ¡¡¡he vuelto como canal VIRTUAL!!!", "Hemos centralizado la gestión de los clones de NewPct1 en el canal virtual NewPct1. Los clones desaparecerán en breve.", "Para más información lee el tutorial: https://alfa-addon.com /threads/newpct1-implantando-alta-disponibilidad.1200/")
|
||||||
|
|
||||||
|
#Vayamos a la siguiente acción en el canal Newpct1
|
||||||
|
from platformcode import launcher
|
||||||
|
channel_clone_name = "torrentrapid" #Nombre del Canal elegido
|
||||||
|
host = "http://torrentrapid.com/"
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
item.action = "mainlist"
|
||||||
|
item.channel_host = host
|
||||||
|
launcher.run(item)
|
||||||
|
|
||||||
|
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
if item.channel != channel_py:
|
||||||
|
return
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
thumb_pelis = get_thumb("channels_movie.png")
|
thumb_pelis = get_thumb("channels_movie.png")
|
||||||
@@ -58,20 +71,20 @@ def mainlist(item):
|
|||||||
thumb_settings = get_thumb("setting_0.png")
|
thumb_settings = get_thumb("setting_0.png")
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
||||||
extra="peliculas", thumbnail=thumb_pelis ))
|
extra="peliculas", thumbnail=thumb_pelis, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
||||||
thumbnail=thumb_series))
|
thumbnail=thumb_series, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
||||||
thumbnail=thumb_docus))
|
thumbnail=thumb_docus, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar))
|
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar, category=item.category))
|
||||||
|
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -85,68 +98,60 @@ def submenu(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
host_alt = host
|
patron = '<li><a\s?class="[^"]+"\s?href="http:[^"]+"><i\s?class=.*><\/i>.*Inicio<\/a><\/li>(.+)<\/ul>\s?<\/nav>'
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
||||||
if not data or not scrapertools.find_single_match(data, patron):
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url)
|
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR] [ALT ] en uso'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] caído'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
host_alt = host.replace(item.channel_alt, item.channel)
|
|
||||||
del item.channel_alt
|
|
||||||
if item.url_alt: del item.url_alt
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
#data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
#data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
||||||
|
if "pelisyseries.com" in item.channel_host and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
||||||
host_dom = host_alt.replace("https://", "").replace("http://", "").replace("www.", "")
|
data = '<li><a href="' + item.channel_host + 'varios/" title="Documentales">Documentales</a></li>'
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
if "pelisyseries.com" in host_alt and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
|
||||||
data = '<a href="' + host_alt + 'varios/" title="Documentales"><i class="icon-rocket"></i> Documentales</a>'
|
|
||||||
else:
|
else:
|
||||||
if data:
|
data = scrapertools.get_match(data, patron) #Seleccionamos el trozo que nos interesa
|
||||||
data = scrapertools.get_match(data, patron)
|
if not data:
|
||||||
if not data:
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
else:
|
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
|
|
||||||
patron = '<.*?href="([^"]+)".*?>([^>]+)</a>'
|
patron = '<li><a.*?href="([^"]+)"\s?.itle="[^"]+"\s?>([^>]+)<\/a><\/li>'
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
|
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.strip()
|
title = scrapedtitle.strip()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
#Preguntamos por las entradas que no corresponden al "extra"
|
||||||
itemlist.append(
|
if item.extra in scrapedtitle.lower() or (item.extra == "peliculas" and ("cine" in scrapedurl or "anime" in scrapedurl)) or (item.extra == "varios" and ("documentales" in scrapedurl or "varios" in scrapedurl)):
|
||||||
Item(channel=item.channel, action="alfabeto", title=title + " [A-Z]", url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
itemlist.append(item.clone(action="alfabeto", title=title + " [A-Z]", url=scrapedurl))
|
||||||
|
|
||||||
if item.extra == "peliculas":
|
if item.extra == "peliculas":
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title="Películas 4K", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
itemlist.append(item.clone(action="listado", title="Películas 4K", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="alfabeto", title="Películas 4K" + " [A-Z]", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
Item(channel=item.channel, action="alfabeto", title="Películas 4K" + " [A-Z]", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -155,28 +160,41 @@ def alfabeto(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = ''
|
||||||
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
|
|
||||||
patron = '<ul class="alfabeto">(.*?)</ul>'
|
patron = '<ul class="alfabeto">(.*?)</ul>'
|
||||||
if data:
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
data = scrapertools.get_match(data, patron)
|
logger.error("ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
else:
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
return itemlist
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
|
data = scrapertools.get_match(data, patron)
|
||||||
|
|
||||||
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
||||||
|
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: ALFABETO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: ALFABETO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.upper()
|
title = scrapedtitle.upper()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -191,11 +209,21 @@ def listado(item):
|
|||||||
if item.totalItems:
|
if item.totalItems:
|
||||||
del item.totalItems
|
del item.totalItems
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
patron = '<ul class="' + clase + '">(.*?)</ul>' #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, patron) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Establecemos los valores básicos en función del tipo de contenido
|
#Establecemos los valores básicos en función del tipo de contenido
|
||||||
@@ -218,7 +246,7 @@ def listado(item):
|
|||||||
fichas = scrapertools.get_match(data, patron)
|
fichas = scrapertools.get_match(data, patron)
|
||||||
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -235,7 +263,7 @@ def listado(item):
|
|||||||
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("MATCHES: " + str(len(matches)))
|
#logger.debug("MATCHES: " + str(len(matches)))
|
||||||
@@ -460,13 +488,21 @@ def listado(item):
|
|||||||
|
|
||||||
def listado_busqueda(item):
|
def listado_busqueda(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
host = 'http://%s/' % scrapertools.find_single_match(item.url, '(\w+\.com)\/')
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
if item.category and item.category != "newest":
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
||||||
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
||||||
cnt_pag = 0 # Contador de líneas leídas de Matches
|
cnt_pag = 0 # Contador de líneas leídas de Matches
|
||||||
|
timeout_search = 5 # Timeout un poco más largo para las búsquedas
|
||||||
|
if timeout > 5:
|
||||||
|
timeout_search = timeout # Timeout un poco más largo para las búsquedas
|
||||||
|
data = ''
|
||||||
|
|
||||||
if item.cnt_pag:
|
if item.cnt_pag:
|
||||||
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
||||||
@@ -493,21 +529,21 @@ def listado_busqueda(item):
|
|||||||
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
||||||
while cnt_title <= cnt_tot and cnt_next < 5:
|
while cnt_title <= cnt_tot and cnt_next < 5:
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post, timeout=timeout_search).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
cnt_next += 1
|
cnt_next += 1
|
||||||
if not data or not scrapertools.find_single_match(data, pattern):
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, pattern) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, pattern)
|
item, data = generictools.fail_over_newpct1(item, pattern)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
host = host.replace(item.channel_alt, item.channel)
|
host = host.replace(item.channel_alt, item.channel)
|
||||||
@@ -531,7 +567,6 @@ def listado_busqueda(item):
|
|||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
data_alt = data
|
data_alt = data
|
||||||
data = scrapertools.get_match(data, pattern)
|
data = scrapertools.get_match(data, pattern)
|
||||||
#pattern = '<li[^>]*><a href="(?P<url>[^"]+).*?<img.*?src="(?P<thumb>[^"]+)?".*?<h2.*?>(?P<title>.*?)?<\/h2>'
|
|
||||||
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
||||||
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
||||||
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
||||||
@@ -541,7 +576,8 @@ def listado_busqueda(item):
|
|||||||
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
||||||
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
|
item, itemlist = generictools.post_tmdb_listado(item, itemlist) #Pintamos los datos de fail-over, si los hay
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
||||||
@@ -830,14 +866,14 @@ def listado_busqueda(item):
|
|||||||
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
||||||
|
|
||||||
#Leemos la página, a ver si es una página de episodios
|
#Leemos la página, a ver si es una página de episodios
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
||||||
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
||||||
#intentarlo con la otra url
|
#intentarlo con la otra url
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
@@ -876,9 +912,10 @@ def findvideos(item):
|
|||||||
from core import channeltools
|
from core import channeltools
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -987,8 +1024,9 @@ def findvideos(item):
|
|||||||
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
||||||
|
|
||||||
# Descarga la página
|
# Descarga la página
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -1001,7 +1039,7 @@ def findvideos(item):
|
|||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
@@ -1029,7 +1067,7 @@ def findvideos(item):
|
|||||||
item_local.url = scrapertools.find_single_match(data, patron)
|
item_local.url = scrapertools.find_single_match(data, patron)
|
||||||
if not item_local.url: #error
|
if not item_local.url: #error
|
||||||
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
||||||
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
||||||
@@ -1054,6 +1092,8 @@ def findvideos(item):
|
|||||||
#logger.debug(item_local)
|
#logger.debug(item_local)
|
||||||
|
|
||||||
# VER vídeos, descargar vídeos un link, o múltiples links
|
# VER vídeos, descargar vídeos un link, o múltiples links
|
||||||
|
data = scrapertools.find_single_match(data, '<div id="tab1" class="tab_content"(.*?<\/ul>(?:<div.*?>)?<\/div><\/div><\/div>)') #Seleccionar el bloque para evitar duplicados
|
||||||
|
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
||||||
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
||||||
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
||||||
@@ -1066,7 +1106,7 @@ def findvideos(item):
|
|||||||
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
||||||
enlaces_descargar = enlaces_ver
|
enlaces_descargar = enlaces_ver
|
||||||
#logger.debug(enlaces_ver)
|
#logger.debug(enlaces_ver)
|
||||||
|
|
||||||
#Recorre todos los links de VER, si está permitido
|
#Recorre todos los links de VER, si está permitido
|
||||||
cnt_enl_ver = 1
|
cnt_enl_ver = 1
|
||||||
cnt_enl_verif = 1
|
cnt_enl_verif = 1
|
||||||
@@ -1100,7 +1140,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1190,7 +1230,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1232,9 +1272,10 @@ def findvideos(item):
|
|||||||
def episodios(item):
|
def episodios(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -1255,7 +1296,7 @@ def episodios(item):
|
|||||||
|
|
||||||
data = ''
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
data_alt = ''
|
data_alt = ''
|
||||||
if data: data_alt = scrapertools.get_match(data, patron)
|
if data: data_alt = scrapertools.get_match(data, patron)
|
||||||
@@ -1276,7 +1317,7 @@ def episodios(item):
|
|||||||
|
|
||||||
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
||||||
@@ -1312,7 +1353,7 @@ def episodios(item):
|
|||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
if not data:
|
if not data:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
@@ -1321,7 +1362,7 @@ def episodios(item):
|
|||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if "pelisyseries.com" in item.url:
|
if "pelisyseries.com" in item.url:
|
||||||
@@ -1331,7 +1372,7 @@ def episodios(item):
|
|||||||
matches = re.compile(pattern, re.DOTALL).findall(data)
|
matches = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("patron: " + pattern)
|
#logger.debug("patron: " + pattern)
|
||||||
@@ -1399,7 +1440,7 @@ def episodios(item):
|
|||||||
match = [m.groupdict() for m in r.finditer(info)][0]
|
match = [m.groupdict() for m in r.finditer(info)][0]
|
||||||
if not match: #error
|
if not match: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
||||||
@@ -1449,8 +1490,6 @@ def episodios(item):
|
|||||||
|
|
||||||
if item_local.active:
|
if item_local.active:
|
||||||
del item_local.active
|
del item_local.active
|
||||||
if item_local.category:
|
|
||||||
del item_local.category
|
|
||||||
if item_local.infoLabels['title']:
|
if item_local.infoLabels['title']:
|
||||||
del item_local.infoLabels['title']
|
del item_local.infoLabels['title']
|
||||||
item_local.context = "['buscar_trailer']"
|
item_local.context = "['buscar_trailer']"
|
||||||
@@ -1467,6 +1506,8 @@ def episodios(item):
|
|||||||
del item_local.update_last
|
del item_local.update_last
|
||||||
if item_local.update_next:
|
if item_local.update_next:
|
||||||
del item_local.update_next
|
del item_local.update_next
|
||||||
|
if item_local.channel_host:
|
||||||
|
del item_local.channel_host
|
||||||
|
|
||||||
itemlist.append(item_local.clone())
|
itemlist.append(item_local.clone())
|
||||||
|
|
||||||
@@ -1501,9 +1542,6 @@ def actualizar_titulos(item):
|
|||||||
def search(item, texto):
|
def search(item, texto):
|
||||||
logger.info("search:" + texto)
|
logger.info("search:" + texto)
|
||||||
# texto = texto.replace(" ", "+")
|
# texto = texto.replace(" ", "+")
|
||||||
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
item.post = "q=%s" % texto
|
item.post = "q=%s" % texto
|
||||||
|
|||||||
@@ -12,40 +12,53 @@ from core import httptools
|
|||||||
from core import scrapertools
|
from core import scrapertools
|
||||||
from core import servertools
|
from core import servertools
|
||||||
from core.item import Item
|
from core.item import Item
|
||||||
from platformcode import config, logger
|
from platformcode import config, logger, platformtools
|
||||||
from core import tmdb
|
from core import tmdb
|
||||||
from lib import generictools
|
from lib import generictools
|
||||||
|
|
||||||
host = 'http://tumejortorrent.com/'
|
channel_py = 'newpct1'
|
||||||
|
|
||||||
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
||||||
clone_list = config.get_setting('clonenewpct1_channels_list', "torrentrapid") #Carga lista de clones
|
clone_list = config.get_setting('clonenewpct1_channels_list', channel_py) #Carga lista de clones
|
||||||
clone_list = ast.literal_eval(clone_list) #la convierte a lista de tuplas
|
clone_list = ast.literal_eval(clone_list) #la convierte en array
|
||||||
host_index = 0
|
host_index = 0
|
||||||
host_index = config.get_setting('clonenewpct1_channel_default', "torrentrapid") #Clone por defecto
|
host_index = config.get_setting('clonenewpct1_channel_default', channel_py) #Clone por defecto
|
||||||
i = 0
|
i = 0
|
||||||
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
||||||
if i == host_index:
|
if i == host_index:
|
||||||
#channel_clone_name = channel_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
channel_clone_name = channel_clone #Nombre del Canal elegido
|
||||||
#host = 'http://%s/' % host_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
host = host_clone #URL del Canal elegido
|
||||||
i += 1
|
break
|
||||||
|
i += 1
|
||||||
|
item = Item()
|
||||||
|
item.channel_host = host
|
||||||
|
if item.channel != channel_py:
|
||||||
|
item.channel = channel_py
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
|
||||||
#Carga de opciones del canal
|
#Carga de opciones del canal
|
||||||
item = Item()
|
__modo_grafico__ = config.get_setting('modo_grafico', channel_py) #TMDB?
|
||||||
if not item.channel:
|
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', channel_py) #Actualización sólo últ. Temporada?
|
||||||
item.channel = scrapertools.find_single_match(host, r'(\w+)\.com\/')
|
timeout = config.get_setting('clonenewpct1_timeout_downloadpage', channel_py) #Timeout downloadpage
|
||||||
channel_clone_name = scrapertools.find_single_match(host, r'(\w+)\.com\/') #QUITAR CUANDO SE PASE A NEWPCT1
|
if timeout == 0: timeout = None
|
||||||
__modo_grafico__ = config.get_setting('modo_grafico', item.channel)
|
|
||||||
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', item.channel)
|
platformtools.dialog_ok("NewPct1, ¡¡¡he vuelto como canal VIRTUAL!!!", "Hemos centralizado la gestión de los clones de NewPct1 en el canal virtual NewPct1. Los clones desaparecerán en breve.", "Para más información lee el tutorial: https://alfa-addon.com /threads/newpct1-implantando-alta-disponibilidad.1200/")
|
||||||
|
|
||||||
|
#Vayamos a la siguiente acción en el canal Newpct1
|
||||||
|
from platformcode import launcher
|
||||||
|
channel_clone_name = "tumejortorrent" #Nombre del Canal elegido
|
||||||
|
host = "http://tumejortorrent.com/"
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
item.action = "mainlist"
|
||||||
|
item.channel_host = host
|
||||||
|
launcher.run(item)
|
||||||
|
|
||||||
|
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
if item.channel != channel_py:
|
||||||
|
return
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
thumb_pelis = get_thumb("channels_movie.png")
|
thumb_pelis = get_thumb("channels_movie.png")
|
||||||
@@ -58,20 +71,20 @@ def mainlist(item):
|
|||||||
thumb_settings = get_thumb("setting_0.png")
|
thumb_settings = get_thumb("setting_0.png")
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
||||||
extra="peliculas", thumbnail=thumb_pelis ))
|
extra="peliculas", thumbnail=thumb_pelis, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
||||||
thumbnail=thumb_series))
|
thumbnail=thumb_series, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
||||||
thumbnail=thumb_docus))
|
thumbnail=thumb_docus, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar))
|
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar, category=item.category))
|
||||||
|
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -85,68 +98,60 @@ def submenu(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
host_alt = host
|
patron = '<li><a\s?class="[^"]+"\s?href="http:[^"]+"><i\s?class=.*><\/i>.*Inicio<\/a><\/li>(.+)<\/ul>\s?<\/nav>'
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
||||||
if not data or not scrapertools.find_single_match(data, patron):
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url)
|
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR] [ALT ] en uso'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] caído'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
host_alt = host.replace(item.channel_alt, item.channel)
|
|
||||||
del item.channel_alt
|
|
||||||
if item.url_alt: del item.url_alt
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
#data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
#data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
||||||
|
if "pelisyseries.com" in item.channel_host and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
||||||
host_dom = host_alt.replace("https://", "").replace("http://", "").replace("www.", "")
|
data = '<li><a href="' + item.channel_host + 'varios/" title="Documentales">Documentales</a></li>'
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
if "pelisyseries.com" in host_alt and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
|
||||||
data = '<a href="' + host_alt + 'varios/" title="Documentales"><i class="icon-rocket"></i> Documentales</a>'
|
|
||||||
else:
|
else:
|
||||||
if data:
|
data = scrapertools.get_match(data, patron) #Seleccionamos el trozo que nos interesa
|
||||||
data = scrapertools.get_match(data, patron)
|
if not data:
|
||||||
if not data:
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
else:
|
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
|
|
||||||
patron = '<.*?href="([^"]+)".*?>([^>]+)</a>'
|
patron = '<li><a.*?href="([^"]+)"\s?.itle="[^"]+"\s?>([^>]+)<\/a><\/li>'
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
|
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.strip()
|
title = scrapedtitle.strip()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
#Preguntamos por las entradas que no corresponden al "extra"
|
||||||
itemlist.append(
|
if item.extra in scrapedtitle.lower() or (item.extra == "peliculas" and ("cine" in scrapedurl or "anime" in scrapedurl)) or (item.extra == "varios" and ("documentales" in scrapedurl or "varios" in scrapedurl)):
|
||||||
Item(channel=item.channel, action="alfabeto", title=title + " [A-Z]", url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
itemlist.append(item.clone(action="alfabeto", title=title + " [A-Z]", url=scrapedurl))
|
||||||
|
|
||||||
if item.extra == "peliculas":
|
if item.extra == "peliculas":
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title="Películas 4K", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
itemlist.append(item.clone(action="listado", title="Películas 4K", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="alfabeto", title="Películas 4K" + " [A-Z]", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
Item(channel=item.channel, action="alfabeto", title="Películas 4K" + " [A-Z]", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -155,28 +160,41 @@ def alfabeto(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = ''
|
||||||
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
|
|
||||||
patron = '<ul class="alfabeto">(.*?)</ul>'
|
patron = '<ul class="alfabeto">(.*?)</ul>'
|
||||||
if data:
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
data = scrapertools.get_match(data, patron)
|
logger.error("ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
else:
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
return itemlist
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
|
data = scrapertools.get_match(data, patron)
|
||||||
|
|
||||||
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
||||||
|
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: ALFABETO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: ALFABETO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.upper()
|
title = scrapedtitle.upper()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -191,11 +209,21 @@ def listado(item):
|
|||||||
if item.totalItems:
|
if item.totalItems:
|
||||||
del item.totalItems
|
del item.totalItems
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
patron = '<ul class="' + clase + '">(.*?)</ul>' #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, patron) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Establecemos los valores básicos en función del tipo de contenido
|
#Establecemos los valores básicos en función del tipo de contenido
|
||||||
@@ -218,7 +246,7 @@ def listado(item):
|
|||||||
fichas = scrapertools.get_match(data, patron)
|
fichas = scrapertools.get_match(data, patron)
|
||||||
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -235,7 +263,7 @@ def listado(item):
|
|||||||
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("MATCHES: " + str(len(matches)))
|
#logger.debug("MATCHES: " + str(len(matches)))
|
||||||
@@ -460,13 +488,21 @@ def listado(item):
|
|||||||
|
|
||||||
def listado_busqueda(item):
|
def listado_busqueda(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
host = 'http://%s/' % scrapertools.find_single_match(item.url, '(\w+\.com)\/')
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
if item.category and item.category != "newest":
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
||||||
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
||||||
cnt_pag = 0 # Contador de líneas leídas de Matches
|
cnt_pag = 0 # Contador de líneas leídas de Matches
|
||||||
|
timeout_search = 5 # Timeout un poco más largo para las búsquedas
|
||||||
|
if timeout > 5:
|
||||||
|
timeout_search = timeout # Timeout un poco más largo para las búsquedas
|
||||||
|
data = ''
|
||||||
|
|
||||||
if item.cnt_pag:
|
if item.cnt_pag:
|
||||||
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
||||||
@@ -493,21 +529,21 @@ def listado_busqueda(item):
|
|||||||
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
||||||
while cnt_title <= cnt_tot and cnt_next < 5:
|
while cnt_title <= cnt_tot and cnt_next < 5:
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post, timeout=timeout_search).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
cnt_next += 1
|
cnt_next += 1
|
||||||
if not data or not scrapertools.find_single_match(data, pattern):
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, pattern) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, pattern)
|
item, data = generictools.fail_over_newpct1(item, pattern)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
host = host.replace(item.channel_alt, item.channel)
|
host = host.replace(item.channel_alt, item.channel)
|
||||||
@@ -531,7 +567,6 @@ def listado_busqueda(item):
|
|||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
data_alt = data
|
data_alt = data
|
||||||
data = scrapertools.get_match(data, pattern)
|
data = scrapertools.get_match(data, pattern)
|
||||||
#pattern = '<li[^>]*><a href="(?P<url>[^"]+).*?<img.*?src="(?P<thumb>[^"]+)?".*?<h2.*?>(?P<title>.*?)?<\/h2>'
|
|
||||||
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
||||||
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
||||||
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
||||||
@@ -541,7 +576,8 @@ def listado_busqueda(item):
|
|||||||
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
||||||
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
|
item, itemlist = generictools.post_tmdb_listado(item, itemlist) #Pintamos los datos de fail-over, si los hay
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
||||||
@@ -830,14 +866,14 @@ def listado_busqueda(item):
|
|||||||
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
||||||
|
|
||||||
#Leemos la página, a ver si es una página de episodios
|
#Leemos la página, a ver si es una página de episodios
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
||||||
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
||||||
#intentarlo con la otra url
|
#intentarlo con la otra url
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
@@ -876,9 +912,10 @@ def findvideos(item):
|
|||||||
from core import channeltools
|
from core import channeltools
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -987,8 +1024,9 @@ def findvideos(item):
|
|||||||
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
||||||
|
|
||||||
# Descarga la página
|
# Descarga la página
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -1001,7 +1039,7 @@ def findvideos(item):
|
|||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
@@ -1029,7 +1067,7 @@ def findvideos(item):
|
|||||||
item_local.url = scrapertools.find_single_match(data, patron)
|
item_local.url = scrapertools.find_single_match(data, patron)
|
||||||
if not item_local.url: #error
|
if not item_local.url: #error
|
||||||
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
||||||
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
||||||
@@ -1054,6 +1092,8 @@ def findvideos(item):
|
|||||||
#logger.debug(item_local)
|
#logger.debug(item_local)
|
||||||
|
|
||||||
# VER vídeos, descargar vídeos un link, o múltiples links
|
# VER vídeos, descargar vídeos un link, o múltiples links
|
||||||
|
data = scrapertools.find_single_match(data, '<div id="tab1" class="tab_content"(.*?<\/ul>(?:<div.*?>)?<\/div><\/div><\/div>)') #Seleccionar el bloque para evitar duplicados
|
||||||
|
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
||||||
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
||||||
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
||||||
@@ -1066,7 +1106,7 @@ def findvideos(item):
|
|||||||
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
||||||
enlaces_descargar = enlaces_ver
|
enlaces_descargar = enlaces_ver
|
||||||
#logger.debug(enlaces_ver)
|
#logger.debug(enlaces_ver)
|
||||||
|
|
||||||
#Recorre todos los links de VER, si está permitido
|
#Recorre todos los links de VER, si está permitido
|
||||||
cnt_enl_ver = 1
|
cnt_enl_ver = 1
|
||||||
cnt_enl_verif = 1
|
cnt_enl_verif = 1
|
||||||
@@ -1100,7 +1140,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1190,7 +1230,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1232,9 +1272,10 @@ def findvideos(item):
|
|||||||
def episodios(item):
|
def episodios(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -1255,7 +1296,7 @@ def episodios(item):
|
|||||||
|
|
||||||
data = ''
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
data_alt = ''
|
data_alt = ''
|
||||||
if data: data_alt = scrapertools.get_match(data, patron)
|
if data: data_alt = scrapertools.get_match(data, patron)
|
||||||
@@ -1276,7 +1317,7 @@ def episodios(item):
|
|||||||
|
|
||||||
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
||||||
@@ -1312,7 +1353,7 @@ def episodios(item):
|
|||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
if not data:
|
if not data:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
@@ -1321,7 +1362,7 @@ def episodios(item):
|
|||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if "pelisyseries.com" in item.url:
|
if "pelisyseries.com" in item.url:
|
||||||
@@ -1331,7 +1372,7 @@ def episodios(item):
|
|||||||
matches = re.compile(pattern, re.DOTALL).findall(data)
|
matches = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("patron: " + pattern)
|
#logger.debug("patron: " + pattern)
|
||||||
@@ -1399,7 +1440,7 @@ def episodios(item):
|
|||||||
match = [m.groupdict() for m in r.finditer(info)][0]
|
match = [m.groupdict() for m in r.finditer(info)][0]
|
||||||
if not match: #error
|
if not match: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
||||||
@@ -1449,8 +1490,6 @@ def episodios(item):
|
|||||||
|
|
||||||
if item_local.active:
|
if item_local.active:
|
||||||
del item_local.active
|
del item_local.active
|
||||||
if item_local.category:
|
|
||||||
del item_local.category
|
|
||||||
if item_local.infoLabels['title']:
|
if item_local.infoLabels['title']:
|
||||||
del item_local.infoLabels['title']
|
del item_local.infoLabels['title']
|
||||||
item_local.context = "['buscar_trailer']"
|
item_local.context = "['buscar_trailer']"
|
||||||
@@ -1467,6 +1506,8 @@ def episodios(item):
|
|||||||
del item_local.update_last
|
del item_local.update_last
|
||||||
if item_local.update_next:
|
if item_local.update_next:
|
||||||
del item_local.update_next
|
del item_local.update_next
|
||||||
|
if item_local.channel_host:
|
||||||
|
del item_local.channel_host
|
||||||
|
|
||||||
itemlist.append(item_local.clone())
|
itemlist.append(item_local.clone())
|
||||||
|
|
||||||
@@ -1501,9 +1542,6 @@ def actualizar_titulos(item):
|
|||||||
def search(item, texto):
|
def search(item, texto):
|
||||||
logger.info("search:" + texto)
|
logger.info("search:" + texto)
|
||||||
# texto = texto.replace(" ", "+")
|
# texto = texto.replace(" ", "+")
|
||||||
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
item.post = "q=%s" % texto
|
item.post = "q=%s" % texto
|
||||||
|
|||||||
@@ -12,40 +12,53 @@ from core import httptools
|
|||||||
from core import scrapertools
|
from core import scrapertools
|
||||||
from core import servertools
|
from core import servertools
|
||||||
from core.item import Item
|
from core.item import Item
|
||||||
from platformcode import config, logger
|
from platformcode import config, logger, platformtools
|
||||||
from core import tmdb
|
from core import tmdb
|
||||||
from lib import generictools
|
from lib import generictools
|
||||||
|
|
||||||
host = 'http://www.tvsinpagar.com/'
|
channel_py = 'newpct1'
|
||||||
|
|
||||||
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
#Código para permitir usar un único canal para todas las webs clones de NewPct1
|
||||||
clone_list = config.get_setting('clonenewpct1_channels_list', "torrentrapid") #Carga lista de clones
|
clone_list = config.get_setting('clonenewpct1_channels_list', channel_py) #Carga lista de clones
|
||||||
clone_list = ast.literal_eval(clone_list) #la convierte a lista de tuplas
|
clone_list = ast.literal_eval(clone_list) #la convierte en array
|
||||||
host_index = 0
|
host_index = 0
|
||||||
host_index = config.get_setting('clonenewpct1_channel_default', "torrentrapid") #Clone por defecto
|
host_index = config.get_setting('clonenewpct1_channel_default', channel_py) #Clone por defecto
|
||||||
i = 0
|
i = 0
|
||||||
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list:
|
||||||
if i == host_index:
|
if i == host_index:
|
||||||
#channel_clone_name = channel_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
channel_clone_name = channel_clone #Nombre del Canal elegido
|
||||||
#host = 'http://%s/' % host_clone #ACTIVAR CUANDO SE PASE A NEWPCT1
|
host = host_clone #URL del Canal elegido
|
||||||
i += 1
|
break
|
||||||
|
i += 1
|
||||||
|
item = Item()
|
||||||
|
item.channel_host = host
|
||||||
|
if item.channel != channel_py:
|
||||||
|
item.channel = channel_py
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
|
||||||
#Carga de opciones del canal
|
#Carga de opciones del canal
|
||||||
item = Item()
|
__modo_grafico__ = config.get_setting('modo_grafico', channel_py) #TMDB?
|
||||||
if not item.channel:
|
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', channel_py) #Actualización sólo últ. Temporada?
|
||||||
item.channel = scrapertools.find_single_match(host, r'(\w+)\.com\/')
|
timeout = config.get_setting('clonenewpct1_timeout_downloadpage', channel_py) #Timeout downloadpage
|
||||||
channel_clone_name = scrapertools.find_single_match(host, r'(\w+)\.com\/') #QUITAR CUANDO SE PASE A NEWPCT1
|
if timeout == 0: timeout = None
|
||||||
__modo_grafico__ = config.get_setting('modo_grafico', item.channel)
|
|
||||||
modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', item.channel)
|
platformtools.dialog_ok("NewPct1, ¡¡¡he vuelto como canal VIRTUAL!!!", "Hemos centralizado la gestión de los clones de NewPct1 en el canal virtual NewPct1. Los clones desaparecerán en breve.", "Para más información lee el tutorial: https://alfa-addon.com /threads/newpct1-implantando-alta-disponibilidad.1200/")
|
||||||
|
|
||||||
|
#Vayamos a la siguiente acción en el canal Newpct1
|
||||||
|
from platformcode import launcher
|
||||||
|
channel_clone_name = "tvsinpagar" #Nombre del Canal elegido
|
||||||
|
host = "http://www.tvsinpagar.com/"
|
||||||
|
item.category = channel_clone_name.capitalize()
|
||||||
|
item.action = "mainlist"
|
||||||
|
item.channel_host = host
|
||||||
|
launcher.run(item)
|
||||||
|
|
||||||
|
|
||||||
def mainlist(item):
|
def mainlist(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
if item.channel != channel_py:
|
||||||
|
return
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
thumb_pelis = get_thumb("channels_movie.png")
|
thumb_pelis = get_thumb("channels_movie.png")
|
||||||
@@ -58,20 +71,20 @@ def mainlist(item):
|
|||||||
thumb_settings = get_thumb("setting_0.png")
|
thumb_settings = get_thumb("setting_0.png")
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host,
|
||||||
extra="peliculas", thumbnail=thumb_pelis ))
|
extra="peliculas", thumbnail=thumb_pelis, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series",
|
||||||
thumbnail=thumb_series))
|
thumbnail=thumb_series, category=item.category))
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
itemlist.append(Item(channel=item.channel, action="submenu", title="Documentales", url=host, extra="varios",
|
||||||
thumbnail=thumb_docus))
|
thumbnail=thumb_docus, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar))
|
Item(channel=item.channel, action="search", title="Buscar", url=host + "buscar", thumbnail=thumb_buscar, category=item.category))
|
||||||
|
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
itemlist.append(
|
itemlist.append(
|
||||||
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings))
|
Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings, category=item.category))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -85,68 +98,60 @@ def submenu(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
host_alt = host
|
patron = '<li><a\s?class="[^"]+"\s?href="http:[^"]+"><i\s?class=.*><\/i>.*Inicio<\/a><\/li>(.+)<\/ul>\s?<\/nav>'
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
#Verificamos si se ha cargado una página, y si además tiene la estructura correcta
|
||||||
if not data or not scrapertools.find_single_match(data, patron):
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url)
|
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR] [ALT ] en uso'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] caído'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
host_alt = host.replace(item.channel_alt, item.channel)
|
|
||||||
del item.channel_alt
|
|
||||||
if item.url_alt: del item.url_alt
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
#data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
#data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
data = data.replace("'", '"').replace('/series"', '/series/"') #Compatibilidad con mispelisy.series.com
|
||||||
|
if "pelisyseries.com" in item.channel_host and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
||||||
host_dom = host_alt.replace("https://", "").replace("http://", "").replace("www.", "")
|
data = '<li><a href="' + item.channel_host + 'varios/" title="Documentales">Documentales</a></li>'
|
||||||
patron = '<li><a href="http://(?:www.)?' + host_dom + item.extra + '/">.*?<ul.*?>(.*?)</ul>'
|
|
||||||
if "pelisyseries.com" in host_alt and item.extra == "varios": #compatibilidad con mispelisy.series.com
|
|
||||||
data = '<a href="' + host_alt + 'varios/" title="Documentales"><i class="icon-rocket"></i> Documentales</a>'
|
|
||||||
else:
|
else:
|
||||||
if data:
|
data = scrapertools.get_match(data, patron) #Seleccionamos el trozo que nos interesa
|
||||||
data = scrapertools.get_match(data, patron)
|
if not data:
|
||||||
if not data:
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
else:
|
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
|
||||||
|
|
||||||
patron = '<.*?href="([^"]+)".*?>([^>]+)</a>'
|
patron = '<li><a.*?href="([^"]+)"\s?.itle="[^"]+"\s?>([^>]+)<\/a><\/li>'
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
|
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.strip()
|
title = scrapedtitle.strip()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
#Preguntamos por las entradas que no corresponden al "extra"
|
||||||
itemlist.append(
|
if item.extra in scrapedtitle.lower() or (item.extra == "peliculas" and ("cine" in scrapedurl or "anime" in scrapedurl)) or (item.extra == "varios" and ("documentales" in scrapedurl or "varios" in scrapedurl)):
|
||||||
Item(channel=item.channel, action="alfabeto", title=title + " [A-Z]", url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
itemlist.append(item.clone(action="alfabeto", title=title + " [A-Z]", url=scrapedurl))
|
||||||
|
|
||||||
if item.extra == "peliculas":
|
if item.extra == "peliculas":
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title="Películas 4K", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
itemlist.append(item.clone(action="listado", title="Películas 4K", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
itemlist.append(
|
itemlist.append(item.clone(action="alfabeto", title="Películas 4K" + " [A-Z]", url=item.channel_host + "peliculas-hd/4kultrahd/"))
|
||||||
Item(channel=item.channel, action="alfabeto", title="Películas 4K" + " [A-Z]", url=host_alt + "peliculas-hd/4kultrahd/", extra=item.extra))
|
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -155,28 +160,41 @@ def alfabeto(item):
|
|||||||
logger.info()
|
logger.info()
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = ''
|
||||||
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
|
|
||||||
patron = '<ul class="alfabeto">(.*?)</ul>'
|
patron = '<ul class="alfabeto">(.*?)</ul>'
|
||||||
if data:
|
if not data or not scrapertools.find_single_match(data, patron):
|
||||||
data = scrapertools.get_match(data, patron)
|
logger.error("ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL: " + item.url + data)
|
||||||
else:
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
return itemlist
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: ALFABETO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
|
if item.url_alt: del item.url_alt
|
||||||
|
del item.channel_alt
|
||||||
|
|
||||||
|
data = scrapertools.get_match(data, patron)
|
||||||
|
|
||||||
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
|
||||||
|
|
||||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||||
if not matches:
|
if not matches:
|
||||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: ALFABETO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: SUBMENU: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: ALFABETO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
for scrapedurl, scrapedtitle in matches:
|
for scrapedurl, scrapedtitle in matches:
|
||||||
title = scrapedtitle.upper()
|
title = scrapedtitle.upper()
|
||||||
url = scrapedurl
|
|
||||||
|
|
||||||
itemlist.append(Item(channel=item.channel, action="listado", title=title, url=url, extra=item.extra))
|
itemlist.append(item.clone(action="listado", title=title, url=scrapedurl))
|
||||||
|
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
@@ -191,11 +209,21 @@ def listado(item):
|
|||||||
if item.totalItems:
|
if item.totalItems:
|
||||||
del item.totalItems
|
del item.totalItems
|
||||||
|
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
patron = '<ul class="' + clase + '">(.*?)</ul>' #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, patron) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO: La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Establecemos los valores básicos en función del tipo de contenido
|
#Establecemos los valores básicos en función del tipo de contenido
|
||||||
@@ -218,7 +246,7 @@ def listado(item):
|
|||||||
fichas = scrapertools.get_match(data, patron)
|
fichas = scrapertools.get_match(data, patron)
|
||||||
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
if not fichas and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
elif '<h3><strong>( 0 ) Resultados encontrados </strong>' in data: #no hay vídeos
|
||||||
return itemlist
|
return itemlist
|
||||||
@@ -235,7 +263,7 @@ def listado(item):
|
|||||||
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
matches = re.compile(patron, re.DOTALL).findall(fichas)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
logger.error("ERROR 02: LISTADO: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + fichas)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("MATCHES: " + str(len(matches)))
|
#logger.debug("MATCHES: " + str(len(matches)))
|
||||||
@@ -460,13 +488,21 @@ def listado(item):
|
|||||||
|
|
||||||
def listado_busqueda(item):
|
def listado_busqueda(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
host = 'http://%s/' % scrapertools.find_single_match(item.url, '(\w+\.com)\/')
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
if item.category and item.category != "newest":
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
cnt_tot = 40 # Poner el num. máximo de items por página. Dejamos que la web lo controle
|
||||||
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
||||||
cnt_pag = 0 # Contador de líneas leídas de Matches
|
cnt_pag = 0 # Contador de líneas leídas de Matches
|
||||||
|
timeout_search = 5 # Timeout un poco más largo para las búsquedas
|
||||||
|
if timeout > 5:
|
||||||
|
timeout_search = timeout # Timeout un poco más largo para las búsquedas
|
||||||
|
data = ''
|
||||||
|
|
||||||
if item.cnt_pag:
|
if item.cnt_pag:
|
||||||
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
cnt_pag = item.cnt_pag # Se guarda en la lista de páginas anteriores en Item
|
||||||
@@ -493,21 +529,21 @@ def listado_busqueda(item):
|
|||||||
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
#Máximo num. de líneas permitidas por TMDB. Máx de 5 páginas por Itemlist para no degradar el rendimiento
|
||||||
while cnt_title <= cnt_tot and cnt_next < 5:
|
while cnt_title <= cnt_tot and cnt_next < 5:
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, post=item.post, timeout=timeout_search).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
cnt_next += 1
|
cnt_next += 1
|
||||||
if not data or not scrapertools.find_single_match(data, pattern):
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
|
if not data or (not scrapertools.find_single_match(data, pattern) and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data):
|
||||||
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
||||||
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
#Si no hay datos consistentes, llamamos al método de fail_over para que encuentre un canal que esté activo y pueda gestionar el submenú
|
||||||
item, data = generictools.fail_over_newpct1(item, pattern)
|
item, data = generictools.fail_over_newpct1(item, pattern)
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: LISTADO_BUSQUEDA:. La Web no responde o ha cambiado de URL. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
elif item.channel_alt: #Si ha habido fail-over, lo comento
|
||||||
host = host.replace(item.channel_alt, item.channel)
|
host = host.replace(item.channel_alt, item.channel)
|
||||||
@@ -531,7 +567,6 @@ def listado_busqueda(item):
|
|||||||
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
pattern = '<ul class="%s">(.*?)</ul>' % item.pattern #seleccionamos el bloque que nos interesa
|
||||||
data_alt = data
|
data_alt = data
|
||||||
data = scrapertools.get_match(data, pattern)
|
data = scrapertools.get_match(data, pattern)
|
||||||
#pattern = '<li[^>]*><a href="(?P<url>[^"]+).*?<img.*?src="(?P<thumb>[^"]+)?".*?<h2.*?>(?P<title>.*?)?<\/h2>'
|
|
||||||
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
pattern = '<li[^>]*><a href="(?P<scrapedurl>[^"]+).*?' #url
|
||||||
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
pattern += 'title="(?P<scrapedtitle>[^"]+).*?' #título
|
||||||
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
pattern += '<img.*?src="(?P<scrapedthumbnail>[^"]+)?".*?' #thumb
|
||||||
@@ -541,7 +576,8 @@ def listado_busqueda(item):
|
|||||||
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
matches_alt = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
if not matches_alt and not '<h3><strong>( 0 ) Resultados encontrados </strong>' in data_alt: #error
|
||||||
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
logger.error("ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data_alt)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: LISTADO_BUSQUEDA: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
|
item, itemlist = generictools.post_tmdb_listado(item, itemlist) #Pintamos los datos de fail-over, si los hay
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
#Ahora se hace una simulación para saber cuantas líneas podemos albergar en este Itemlist.
|
||||||
@@ -830,14 +866,14 @@ def listado_busqueda(item):
|
|||||||
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
url_tvshow = host + calidad_mps + real_title_mps + "/" #... otras no. A probar...
|
||||||
|
|
||||||
#Leemos la página, a ver si es una página de episodios
|
#Leemos la página, a ver si es una página de episodios
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_id, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" #Patrón de lista de episodios
|
||||||
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
if not scrapertools.find_single_match(data_serie, pattern) and serieid: #no es válida la página,
|
||||||
#intentarlo con la otra url
|
#intentarlo con la otra url
|
||||||
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow).data)
|
data_serie = data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_tvshow, timeout=timeout).data)
|
||||||
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data_serie = data_serie.replace("chapters", "buscar-list")
|
data_serie = data_serie.replace("chapters", "buscar-list")
|
||||||
|
|
||||||
@@ -876,9 +912,10 @@ def findvideos(item):
|
|||||||
from core import channeltools
|
from core import channeltools
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -987,8 +1024,9 @@ def findvideos(item):
|
|||||||
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
excluir_enlaces_descargas = [] #Lista vacía de servidores excluidos en Descargar
|
||||||
|
|
||||||
# Descarga la página
|
# Descarga la página
|
||||||
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -1001,7 +1039,7 @@ def findvideos(item):
|
|||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos
|
if not data: #Si no ha logrado encontrar nada, salimos
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: FINDVIDEOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
@@ -1029,7 +1067,7 @@ def findvideos(item):
|
|||||||
item_local.url = scrapertools.find_single_match(data, patron)
|
item_local.url = scrapertools.find_single_match(data, patron)
|
||||||
if not item_local.url: #error
|
if not item_local.url: #error
|
||||||
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
item_local.url = item_local.url.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
||||||
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
#logger.debug("Patron: " + patron + " url: " + item_local.url)
|
||||||
@@ -1054,6 +1092,8 @@ def findvideos(item):
|
|||||||
#logger.debug(item_local)
|
#logger.debug(item_local)
|
||||||
|
|
||||||
# VER vídeos, descargar vídeos un link, o múltiples links
|
# VER vídeos, descargar vídeos un link, o múltiples links
|
||||||
|
data = scrapertools.find_single_match(data, '<div id="tab1" class="tab_content"(.*?<\/ul>(?:<div.*?>)?<\/div><\/div><\/div>)') #Seleccionar el bloque para evitar duplicados
|
||||||
|
|
||||||
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
host_dom = host.replace("https://", "").replace("http://", "").replace("www.", "")
|
||||||
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=", "(")
|
||||||
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
data = re.sub(r'javascript:;" onClick="popup\("http:\/\/(?:www.)?' + host_dom + '\w{1,9}\/library\/include\/ajax\/get_modallinks.php\?links=', "", data)
|
||||||
@@ -1066,7 +1106,7 @@ def findvideos(item):
|
|||||||
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
enlaces_ver = re.compile(patron, re.DOTALL).findall(data)
|
||||||
enlaces_descargar = enlaces_ver
|
enlaces_descargar = enlaces_ver
|
||||||
#logger.debug(enlaces_ver)
|
#logger.debug(enlaces_ver)
|
||||||
|
|
||||||
#Recorre todos los links de VER, si está permitido
|
#Recorre todos los links de VER, si está permitido
|
||||||
cnt_enl_ver = 1
|
cnt_enl_ver = 1
|
||||||
cnt_enl_verif = 1
|
cnt_enl_verif = 1
|
||||||
@@ -1100,7 +1140,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_veronline != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_veronline or verificar_enlaces_veronline == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para cada link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_veronline_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1190,7 +1230,7 @@ def findvideos(item):
|
|||||||
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
if verificar_enlaces_descargas != 0: #Se quiere verificar si el link está activo?
|
||||||
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
if cnt_enl_verif <= verificar_enlaces_descargas or verificar_enlaces_descargas == -1: #contador?
|
||||||
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
#Llama a la subfunción de check_list_links(itemlist) para primer link de servidor
|
||||||
item_local.alive = servertools.check_video_link(enlace, servidor) #activo el link ?
|
item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ?
|
||||||
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
if verificar_enlaces_descargas_validos: #Los links tienen que ser válidos para contarlos?
|
||||||
if item_local.alive == "Ok": #Sí
|
if item_local.alive == "Ok": #Sí
|
||||||
cnt_enl_verif += 1 #Movemos los contadores
|
cnt_enl_verif += 1 #Movemos los contadores
|
||||||
@@ -1232,9 +1272,10 @@ def findvideos(item):
|
|||||||
def episodios(item):
|
def episodios(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
|
||||||
#Renombramos el canal al nombre de clone elegido
|
#Renombramos el canal al nombre de clone elegido. Actualizados URL
|
||||||
item.channel = channel_clone_name
|
host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
#item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
|
|
||||||
@@ -1255,7 +1296,7 @@ def episodios(item):
|
|||||||
|
|
||||||
data = ''
|
data = ''
|
||||||
try:
|
try:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
patron = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
data_alt = ''
|
data_alt = ''
|
||||||
if data: data_alt = scrapertools.get_match(data, patron)
|
if data: data_alt = scrapertools.get_match(data, patron)
|
||||||
@@ -1276,7 +1317,7 @@ def episodios(item):
|
|||||||
|
|
||||||
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
if not data: #No se ha encontrado ningún canal activo para este vídeo
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR]: Ningún canal NewPct1 activo'))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log'))
|
||||||
return itemlist
|
return itemlist
|
||||||
|
|
||||||
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
#Busca y pre-carga todas las páginas de episodios que componen las serie, para obtener la url de cada página
|
||||||
@@ -1312,7 +1353,7 @@ def episodios(item):
|
|||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
if not data:
|
if not data:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page).data)
|
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(page, timeout=timeout).data)
|
||||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||||
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
data = data.replace("chapters", "buscar-list") #Compatibilidad con mispelisy.series.com
|
||||||
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
pattern = '<ul class="%s">(.*?)</ul>' % "buscar-list" # item.pattern
|
||||||
@@ -1321,7 +1362,7 @@ def episodios(item):
|
|||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / " + str(list_pages) + " / DATA: " + str(data))
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if "pelisyseries.com" in item.url:
|
if "pelisyseries.com" in item.url:
|
||||||
@@ -1331,7 +1372,7 @@ def episodios(item):
|
|||||||
matches = re.compile(pattern, re.DOTALL).findall(data)
|
matches = re.compile(pattern, re.DOTALL).findall(data)
|
||||||
if not matches: #error
|
if not matches: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + data)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
#logger.debug("patron: " + pattern)
|
#logger.debug("patron: " + pattern)
|
||||||
@@ -1399,7 +1440,7 @@ def episodios(item):
|
|||||||
match = [m.groupdict() for m in r.finditer(info)][0]
|
match = [m.groupdict() for m in r.finditer(info)][0]
|
||||||
if not match: #error
|
if not match: #error
|
||||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + pattern + " / DATA: " + info)
|
||||||
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
itemlist.append(item.clone(action='', title=item.category + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log'))
|
||||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||||
|
|
||||||
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
if match['season'] is None: match['season'] = season #Si no se encuentran valores, pero poner lo básico
|
||||||
@@ -1449,8 +1490,6 @@ def episodios(item):
|
|||||||
|
|
||||||
if item_local.active:
|
if item_local.active:
|
||||||
del item_local.active
|
del item_local.active
|
||||||
if item_local.category:
|
|
||||||
del item_local.category
|
|
||||||
if item_local.infoLabels['title']:
|
if item_local.infoLabels['title']:
|
||||||
del item_local.infoLabels['title']
|
del item_local.infoLabels['title']
|
||||||
item_local.context = "['buscar_trailer']"
|
item_local.context = "['buscar_trailer']"
|
||||||
@@ -1467,6 +1506,8 @@ def episodios(item):
|
|||||||
del item_local.update_last
|
del item_local.update_last
|
||||||
if item_local.update_next:
|
if item_local.update_next:
|
||||||
del item_local.update_next
|
del item_local.update_next
|
||||||
|
if item_local.channel_host:
|
||||||
|
del item_local.channel_host
|
||||||
|
|
||||||
itemlist.append(item_local.clone())
|
itemlist.append(item_local.clone())
|
||||||
|
|
||||||
@@ -1501,9 +1542,6 @@ def actualizar_titulos(item):
|
|||||||
def search(item, texto):
|
def search(item, texto):
|
||||||
logger.info("search:" + texto)
|
logger.info("search:" + texto)
|
||||||
# texto = texto.replace(" ", "+")
|
# texto = texto.replace(" ", "+")
|
||||||
|
|
||||||
item.channel = channel_clone_name
|
|
||||||
if item.category: item.category = channel_clone_name.capitalize()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
item.post = "q=%s" % texto
|
item.post = "q=%s" % texto
|
||||||
|
|||||||
@@ -292,6 +292,7 @@ def get_episodes(item):
|
|||||||
|
|
||||||
def findvideos(item):
|
def findvideos(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
|
from lib import generictools
|
||||||
# logger.debug("item:\n" + item.tostring('\n'))
|
# logger.debug("item:\n" + item.tostring('\n'))
|
||||||
|
|
||||||
itemlist = []
|
itemlist = []
|
||||||
@@ -321,10 +322,11 @@ def findvideos(item):
|
|||||||
list_canales[nom_canal] = filetools.join(path_dir, fd)
|
list_canales[nom_canal] = filetools.join(path_dir, fd)
|
||||||
|
|
||||||
num_canales = len(list_canales)
|
num_canales = len(list_canales)
|
||||||
# logger.debug(str(list_canales))
|
|
||||||
if 'downloads' in list_canales:
|
if 'downloads' in list_canales:
|
||||||
json_path = list_canales['downloads']
|
json_path = list_canales['downloads']
|
||||||
item_json = Item().fromjson(filetools.read(json_path))
|
item_json = Item().fromjson(filetools.read(json_path))
|
||||||
|
item_json = generictools.redirect_clone_newpct1(item_json) ###### Redirección al canal NewPct1.py si es un clone
|
||||||
item_json.contentChannel = "local"
|
item_json.contentChannel = "local"
|
||||||
# Soporte para rutas relativas en descargas
|
# Soporte para rutas relativas en descargas
|
||||||
if filetools.is_relative(item_json.url):
|
if filetools.is_relative(item_json.url):
|
||||||
@@ -362,7 +364,12 @@ def findvideos(item):
|
|||||||
for nom_canal, json_path in list_canales.items():
|
for nom_canal, json_path in list_canales.items():
|
||||||
if filtro_canal and filtro_canal != nom_canal.capitalize():
|
if filtro_canal and filtro_canal != nom_canal.capitalize():
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
item_canal = Item()
|
||||||
|
item_canal.channel = nom_canal
|
||||||
|
item_canal = generictools.redirect_clone_newpct1(item_canal) ###### Redirección al canal NewPct1.py si es un clone
|
||||||
|
nom_canal = item_canal.channel
|
||||||
|
|
||||||
# Importamos el canal de la parte seleccionada
|
# Importamos el canal de la parte seleccionada
|
||||||
try:
|
try:
|
||||||
channel = __import__('channels.%s' % nom_canal, fromlist=["channels.%s" % nom_canal])
|
channel = __import__('channels.%s' % nom_canal, fromlist=["channels.%s" % nom_canal])
|
||||||
@@ -370,6 +377,7 @@ def findvideos(item):
|
|||||||
exec "import channels." + nom_canal + " as channel"
|
exec "import channels." + nom_canal + " as channel"
|
||||||
|
|
||||||
item_json = Item().fromjson(filetools.read(json_path))
|
item_json = Item().fromjson(filetools.read(json_path))
|
||||||
|
item_json = generictools.redirect_clone_newpct1(item_json) ###### Redirección al canal NewPct1.py si es un clone
|
||||||
list_servers = []
|
list_servers = []
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ from core.item import Item
|
|||||||
from platformcode import config, logger
|
from platformcode import config, logger
|
||||||
from core import tmdb
|
from core import tmdb
|
||||||
|
|
||||||
|
channel_py = "newpct1"
|
||||||
|
|
||||||
|
|
||||||
def update_title(item):
|
def update_title(item):
|
||||||
logger.info()
|
logger.info()
|
||||||
@@ -64,7 +66,13 @@ def update_title(item):
|
|||||||
item.title = item.from_title
|
item.title = item.from_title
|
||||||
del item.from_title
|
del item.from_title
|
||||||
else:
|
else:
|
||||||
item.add_videolibrary = True #Estamos Añadiendo a la Videoteca. Indicador para control de uso de los Canales
|
if item.contentType != "movie":
|
||||||
|
item.add_videolibrary = True #Estamos Añadiendo a la Videoteca. Indicador para control de uso de los Canales
|
||||||
|
else:
|
||||||
|
if item.channel == channel_py: #Si es una peli de NewPct1, ponemos el nombre del clone
|
||||||
|
item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
if item.channel_host: #Borramos ya el indicador para que no se guarde en la Videoteca
|
||||||
|
del item.channel_host
|
||||||
|
|
||||||
#Sólo ejecutamos este código si no se ha hecho antes en el Canal. Por ejemplo, si se ha llamado desde Episodios,
|
#Sólo ejecutamos este código si no se ha hecho antes en el Canal. Por ejemplo, si se ha llamado desde Episodios,
|
||||||
#ya no se ejecutará al Añadia a Videoteca, aunque desde el canal se podrá llamar tantas veces como se quiera,
|
#ya no se ejecutará al Añadia a Videoteca, aunque desde el canal se podrá llamar tantas veces como se quiera,
|
||||||
@@ -168,10 +176,13 @@ def post_tmdb_listado(item, itemlist):
|
|||||||
#Borramos valores si ha habido fail-over
|
#Borramos valores si ha habido fail-over
|
||||||
channel_alt = ''
|
channel_alt = ''
|
||||||
if item.channel_alt:
|
if item.channel_alt:
|
||||||
channel_alt = item.channel
|
channel_alt = item.channel_alt
|
||||||
del item.channel_alt
|
del item.channel_alt
|
||||||
if item.url_alt:
|
if item.url_alt:
|
||||||
del item.url_alt
|
del item.url_alt
|
||||||
|
#Ajustamos el nombre de la categoría
|
||||||
|
if item.category != "newest":
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
for item_local in itemlist: #Recorremos el Itenlist generado por el canal
|
for item_local in itemlist: #Recorremos el Itenlist generado por el canal
|
||||||
title = item_local.title
|
title = item_local.title
|
||||||
@@ -185,6 +196,10 @@ def post_tmdb_listado(item, itemlist):
|
|||||||
if item_local.url_alt:
|
if item_local.url_alt:
|
||||||
del item_local.url_alt
|
del item_local.url_alt
|
||||||
|
|
||||||
|
#Ajustamos el nombre de la categoría
|
||||||
|
if item_local.category != "newest":
|
||||||
|
item_local.category = scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
#Restauramos la info adicional guarda en la lista title_subs, y la borramos de Item
|
#Restauramos la info adicional guarda en la lista title_subs, y la borramos de Item
|
||||||
title_add = ' '
|
title_add = ' '
|
||||||
if item_local.title_subs:
|
if item_local.title_subs:
|
||||||
@@ -199,7 +214,8 @@ def post_tmdb_listado(item, itemlist):
|
|||||||
|
|
||||||
title_add = title_add.rstrip()
|
title_add = title_add.rstrip()
|
||||||
title_add += '%s -%s-' % (title_add, title_subs) #se agregan el resto de etiquetas salvadas
|
title_add += '%s -%s-' % (title_add, title_subs) #se agregan el resto de etiquetas salvadas
|
||||||
del item_local.title_subs
|
item_local.title_subs = []
|
||||||
|
del item_local.title_subs
|
||||||
|
|
||||||
#Preparamos el Rating del vídeo
|
#Preparamos el Rating del vídeo
|
||||||
rating = ''
|
rating = ''
|
||||||
@@ -276,9 +292,9 @@ def post_tmdb_listado(item, itemlist):
|
|||||||
title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', title).strip()
|
title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', title).strip()
|
||||||
|
|
||||||
if item.category == "newest": #Viene de Novedades. Marcamos el título con el nombre del canal
|
if item.category == "newest": #Viene de Novedades. Marcamos el título con el nombre del canal
|
||||||
title += ' -%s-' % item_local.channel.capitalize()
|
title += ' -%s-' % scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
if item_local.contentType == "movie":
|
if item_local.contentType == "movie":
|
||||||
item_local.contentTitle += ' -%s-' % item_local.channel.capitalize()
|
item_local.contentTitle += ' -%s-' % scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
item_local.title = title
|
item_local.title = title
|
||||||
|
|
||||||
@@ -288,8 +304,8 @@ def post_tmdb_listado(item, itemlist):
|
|||||||
|
|
||||||
#Si ha habido fail-over, lo comento
|
#Si ha habido fail-over, lo comento
|
||||||
if channel_alt:
|
if channel_alt:
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + channel_alt.capitalize() + '[/COLOR] [ALT ] en uso'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category + '[/COLOR] [ALT ] en uso'))
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR] caído'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + channel_alt.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
return (item, itemlist)
|
return (item, itemlist)
|
||||||
|
|
||||||
@@ -329,19 +345,29 @@ def post_tmdb_episodios(item, itemlist):
|
|||||||
num_temporada_max = 99
|
num_temporada_max = 99
|
||||||
num_episodios_flag = True
|
num_episodios_flag = True
|
||||||
|
|
||||||
#Restauramos el num de Temporada para hacer más flexible la elección de Videoteca
|
#Restauramos el num de Temporada para hacer más flexible la elección de Videoteca
|
||||||
contentSeason = item.contentSeason
|
contentSeason = item.contentSeason
|
||||||
if item.contentSeason_save:
|
if item.contentSeason_save:
|
||||||
contentSeason = item.contentSeason_save
|
contentSeason = item.contentSeason_save
|
||||||
item.contentSeason = item.contentSeason_save
|
item.contentSeason = item.contentSeason_save
|
||||||
del item.contentSeason_save
|
del item.contentSeason_save
|
||||||
|
|
||||||
|
#Ajustamos el nombre de la categoría
|
||||||
|
item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
|
|
||||||
#Restauramos valores si ha habido fail-over
|
#Restauramos valores si ha habido fail-over
|
||||||
channel_alt = ''
|
channel_alt = ''
|
||||||
if item.channel_alt:
|
if item.channel == channel_py:
|
||||||
channel_alt = item.channel
|
if item.channel_alt:
|
||||||
item.channel = item.channel_alt
|
channel_alt = item.category
|
||||||
del item.channel_alt
|
item.category = item.channel_alt.capitalize()
|
||||||
|
del item.channel_alt
|
||||||
|
else:
|
||||||
|
if item.channel_alt:
|
||||||
|
channel_alt = item.channel
|
||||||
|
item.channel = item.channel_alt
|
||||||
|
item.category = item.channel_alt.capitalize()
|
||||||
|
del item.channel_alt
|
||||||
if item.url_alt:
|
if item.url_alt:
|
||||||
item.url = item.url_alt
|
item.url = item.url_alt
|
||||||
del item.url_alt
|
del item.url_alt
|
||||||
@@ -351,17 +377,31 @@ def post_tmdb_episodios(item, itemlist):
|
|||||||
del item_local.add_videolibrary
|
del item_local.add_videolibrary
|
||||||
if item_local.add_menu:
|
if item_local.add_menu:
|
||||||
del item_local.add_menu
|
del item_local.add_menu
|
||||||
|
if item_local.contentSeason_save:
|
||||||
|
del item_local.contentSeason_save
|
||||||
|
|
||||||
#Restauramos valores para cada Episodio si ha habido fail-over
|
#Ajustamos el nombre de la categoría si es un clone de NewPct1
|
||||||
if item_local.channel_alt:
|
item_local.category = scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
|
||||||
item_local.channel = item_local.channel_alt
|
|
||||||
del item_local.channel_alt
|
#Restauramos valores para cada Episodio si ha habido fail-over de un clone de NewPct1
|
||||||
|
if item_local.channel == channel_py:
|
||||||
|
if item_local.channel_alt:
|
||||||
|
item_local.category = item_local.channel_alt
|
||||||
|
del item_local.channel_alt
|
||||||
|
else:
|
||||||
|
if item_local.channel_alt:
|
||||||
|
item_local.channel = item_local.channel_alt
|
||||||
|
del item_local.channel_alt
|
||||||
if item_local.url_alt:
|
if item_local.url_alt:
|
||||||
host_act = scrapertools.find_single_match(item_local.url, ':\/\/(.*?)\/')
|
host_act = scrapertools.find_single_match(item_local.url, ':\/\/(.*?)\/')
|
||||||
host_org = scrapertools.find_single_match(item_local.url_alt, ':\/\/(.*?)\/')
|
host_org = scrapertools.find_single_match(item_local.url_alt, ':\/\/(.*?)\/')
|
||||||
item_local.url = item_local.url.replace(host_act, host_org)
|
item_local.url = item_local.url.replace(host_act, host_org)
|
||||||
del item_local.url_alt
|
del item_local.url_alt
|
||||||
|
|
||||||
|
#Si está actualizando videoteca de una serie NewPct1, restauramos el channel con el nombre del clone
|
||||||
|
if item_local.channel == channel_py and (item.library_playcounts or item.add_videolibrary):
|
||||||
|
item_local.channel = scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
|
||||||
#Si el título de la serie está verificado en TMDB, se intenta descubrir los eisodios fuera de rango,
|
#Si el título de la serie está verificado en TMDB, se intenta descubrir los eisodios fuera de rango,
|
||||||
#que son probables errores de la Web
|
#que son probables errores de la Web
|
||||||
if item.tmdb_stat:
|
if item.tmdb_stat:
|
||||||
@@ -448,6 +488,10 @@ def post_tmdb_episodios(item, itemlist):
|
|||||||
#logger.debug("title: " + item_local.title + " / url: " + item_local.url + " / calidad: " + item_local.quality + " / Season: " + str(item_local.contentSeason) + " / EpisodeNumber: " + str(item_local.contentEpisodeNumber) + " / num_episodios_lista: " + str(num_episodios_lista) + str(num_episodios_flag))
|
#logger.debug("title: " + item_local.title + " / url: " + item_local.url + " / calidad: " + item_local.quality + " / Season: " + str(item_local.contentSeason) + " / EpisodeNumber: " + str(item_local.contentEpisodeNumber) + " / num_episodios_lista: " + str(num_episodios_lista) + str(num_episodios_flag))
|
||||||
#logger.debug(item_local)
|
#logger.debug(item_local)
|
||||||
|
|
||||||
|
#Si está actualizando videoteca de una serie NewPct1, restauramos el channel con el nombre del clone
|
||||||
|
if item.channel == channel_py and (item.library_playcounts or item.add_videolibrary):
|
||||||
|
item.channel = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/')
|
||||||
|
|
||||||
#Terminado el repaso de cada episodio, cerramos con el pié de página
|
#Terminado el repaso de cada episodio, cerramos con el pié de página
|
||||||
#En primer lugar actualizamos todos los episodios con su núm máximo de episodios por temporada
|
#En primer lugar actualizamos todos los episodios con su núm máximo de episodios por temporada
|
||||||
try:
|
try:
|
||||||
@@ -512,13 +556,13 @@ def post_tmdb_episodios(item, itemlist):
|
|||||||
#Si ha habido fail-over, lo comento
|
#Si ha habido fail-over, lo comento
|
||||||
if channel_alt:
|
if channel_alt:
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + channel_alt.capitalize() + '[/COLOR] [ALT ] en uso'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + channel_alt.capitalize() + '[/COLOR] [ALT ] en uso'))
|
||||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.channel.capitalize() + '[/COLOR] caído'))
|
itemlist.append(item.clone(action='', title="[COLOR yellow]" + item.category.capitalize() + '[/COLOR] inaccesible'))
|
||||||
|
|
||||||
if item.add_videolibrary: #Estamos Añadiendo a la Videoteca.
|
if item.add_videolibrary: #Estamos Añadiendo a la Videoteca.
|
||||||
del item.add_videolibrary #Borramos ya el indicador
|
del item.add_videolibrary #Borramos ya el indicador
|
||||||
if item.add_menu: #Opción que avisa si se ha añadido a la Videoteca
|
if item.add_menu: #Opción que avisa si se ha añadido a la Videoteca
|
||||||
del item.add_menu #desde la página de Episodios o desde Menú Contextual
|
del item.add_menu #desde la página de Episodios o desde Menú Contextual
|
||||||
|
|
||||||
#logger.debug(item)
|
#logger.debug(item)
|
||||||
|
|
||||||
return (item, itemlist)
|
return (item, itemlist)
|
||||||
@@ -593,6 +637,10 @@ def post_tmdb_findvideos(item, itemlist):
|
|||||||
|
|
||||||
if item.quality.lower() in ['gb', 'mb']:
|
if item.quality.lower() in ['gb', 'mb']:
|
||||||
item.quality = item.quality.replace('GB', 'G B').replace('Gb', 'G b').replace('MB', 'M B').replace('Mb', 'M b')
|
item.quality = item.quality.replace('GB', 'G B').replace('Gb', 'G b').replace('MB', 'M B').replace('Mb', 'M b')
|
||||||
|
|
||||||
|
#Ajustamos el nombre de la categoría
|
||||||
|
if item.channel != channel_py:
|
||||||
|
item.category = item.channel.capitalize()
|
||||||
|
|
||||||
#Formateamos de forma especial el título para un episodio
|
#Formateamos de forma especial el título para un episodio
|
||||||
if item.contentType == "episode": #Series
|
if item.contentType == "episode": #Series
|
||||||
@@ -619,9 +667,9 @@ def post_tmdb_findvideos(item, itemlist):
|
|||||||
title_gen = '[COLOR gold]Enlaces Ver: [/COLOR]%s' % (title_gen)
|
title_gen = '[COLOR gold]Enlaces Ver: [/COLOR]%s' % (title_gen)
|
||||||
|
|
||||||
if item.channel_alt:
|
if item.channel_alt:
|
||||||
title_gen = '[COLOR yellow]%s [/COLOR][ALT]: %s' % (item.channel.capitalize(), title_gen)
|
title_gen = '[COLOR yellow]%s [/COLOR][ALT]: %s' % (item.category.capitalize(), title_gen)
|
||||||
elif config.get_setting("quit_channel_name", "videolibrary") == 1 and item.contentChannel == "videolibrary":
|
elif config.get_setting("quit_channel_name", "videolibrary") == 1 and item.contentChannel == "videolibrary":
|
||||||
title_gen = '%s: %s' % (item.channel.capitalize(), title_gen)
|
title_gen = '%s: %s' % (item.category.capitalize(), title_gen)
|
||||||
|
|
||||||
#Pintamos el pseudo-título con toda la información disponible del vídeo
|
#Pintamos el pseudo-título con toda la información disponible del vídeo
|
||||||
item.action = ""
|
item.action = ""
|
||||||
@@ -633,7 +681,7 @@ def post_tmdb_findvideos(item, itemlist):
|
|||||||
return (item, itemlist)
|
return (item, itemlist)
|
||||||
|
|
||||||
|
|
||||||
def fail_over_newpct1(item, patron, patron2=None):
|
def fail_over_newpct1(item, patron, patron2=None, timeout=None):
|
||||||
logger.info()
|
logger.info()
|
||||||
import ast
|
import ast
|
||||||
|
|
||||||
@@ -641,56 +689,74 @@ def fail_over_newpct1(item, patron, patron2=None):
|
|||||||
|
|
||||||
Llamada para encontrar una web alternativa a un canal caído, clone de NewPct1
|
Llamada para encontrar una web alternativa a un canal caído, clone de NewPct1
|
||||||
|
|
||||||
Creamos una liat de tuplas con los datos de los canales alternativos. Los datos de la tupla son:
|
Creamos una array con los datos de los canales alternativos. Los datos de la tupla son:
|
||||||
|
|
||||||
- active = 0,1 Indica si el canal no está activo o sí lo está
|
- active = 0,1 Indica si el canal no está activo o sí lo está
|
||||||
- channel nombre del canal alternativo
|
- channel nombre del canal alternativo
|
||||||
- channel_host host del canal alternativo, utilizado para el reemplazo de parte de la url
|
- channel_host host del canal alternativo, utilizado para el reemplazo de parte de la url
|
||||||
- contentType indica que tipo de contenido que soporta el nuevo canal en fail-overs
|
- contentType indica que tipo de contenido que soporta el nuevo canal en fail-overs
|
||||||
- info reservado para uso futuro
|
- action_excluded lista las acciones que está excluidas para ese canal
|
||||||
|
|
||||||
La llamada al método desde el principio de Submenu, Episodios y Findvideos, es:
|
La llamada al método desde el principio de Submenu, Listado_Búsqueda, Episodios y Findvideos, es:
|
||||||
|
|
||||||
from lib import generictools
|
from lib import generictools
|
||||||
item, data = generictools.fail_over_newpct1(item, patron)
|
item, data = generictools.fail_over_newpct1(item, patron)
|
||||||
|
|
||||||
- Entrada: patron: con este patron permite verificar si los datos de la nueva web son buenos
|
- Entrada: patron: con este patron permite verificar si los datos de la nueva web son buenos
|
||||||
- Entrada (opcional): patron2: segundo patron opcional
|
- Entrada (opcional): patron2: segundo patron opcional
|
||||||
|
- Entrada (opcional): timeout: valor de espera máximo en download de página. Por defecto 3
|
||||||
- Saida: data: devuelve los datos del la nueva web. Si vuelve vacía es que no se ha encontrado alternativa
|
- Saida: data: devuelve los datos del la nueva web. Si vuelve vacía es que no se ha encontrado alternativa
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
data = ''
|
if timeout == None:
|
||||||
|
timeout = config.get_setting('clonenewpct1_timeout_downloadpage', channel_py) #Timeout downloadpage
|
||||||
#lista de tuplas con los datos de los canales alternativos
|
if timeout == 0: timeout = None
|
||||||
fail_over_list = config.get_setting('clonenewpct1_channels_list', "torrentrapid")
|
|
||||||
fail_over_list = ast.literal_eval(fail_over_list)
|
|
||||||
|
|
||||||
#Recorremos la tupla identificando el canala que falla
|
data = ''
|
||||||
for active, channel, channel_host, contentType, info in fail_over_list:
|
channel_failed = ''
|
||||||
if channel != item.channel: #es el canal que falla?
|
|
||||||
continue
|
#Array con los datos de los canales alternativos
|
||||||
channel_failed = channel #salvamos el nombre del canal
|
fail_over_list = config.get_setting('clonenewpct1_channels_list', channel_py)
|
||||||
|
fail_over_list = ast.literal_eval(fail_over_list)
|
||||||
|
|
||||||
|
#Recorremos el Array identificando el canal que falla
|
||||||
|
for active, channel, channel_host, contentType, action_excluded in fail_over_list:
|
||||||
|
if item.channel == channel_py:
|
||||||
|
if channel != item.category.lower(): #es el canal/categoría que falla?
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
if channel != item.channel: #es el canal que falla?
|
||||||
|
continue
|
||||||
|
channel_failed = channel #salvamos el nombre del canal o categoría
|
||||||
channel_host_failed = channel_host #salvamos el nombre del host
|
channel_host_failed = channel_host #salvamos el nombre del host
|
||||||
channel_url_failed = item.url #salvamos la url
|
channel_url_failed = item.url #salvamos la url
|
||||||
if item.action != 'submenu' and item.action != 'search' and item.contentType not in contentType: #soporta el fail_over de este contenido?
|
if (item.action == 'episodios' or item.action == 'findvideos') and item.contentType not in contentType: #soporta el fail_over de este contenido?
|
||||||
data = ''
|
data = ''
|
||||||
return (item, data) #no soporta el fail_over de este contenido, no podemos hacer nada
|
return (item, data) #no soporta el fail_over de este contenido, no podemos hacer nada
|
||||||
|
break
|
||||||
|
|
||||||
|
if not channel_failed:
|
||||||
|
logger.debug(item)
|
||||||
|
return (item, data) #Algo no ha funcionado, no podemos hacer nada
|
||||||
|
|
||||||
#Recorremos la tupla identificando canales activos que funcionen, distintos del caído, que soporten el contenido
|
#Recorremos el Array identificando canales activos que funcionen, distintos del caído, que soporten el contenido
|
||||||
for active, channel, channel_host, contentType, info in fail_over_list:
|
for active, channel, channel_host, contentType, action_excluded in fail_over_list:
|
||||||
data_alt = ''
|
data_alt = ''
|
||||||
if channel == channel_failed or active == '0': #está activo el nuevo canal?
|
if channel == channel_failed or active == '0' or item.action in action_excluded: #es válido el nuevo canal?
|
||||||
continue
|
continue
|
||||||
if item.action != 'submenu' and item.action != 'search' and item.contentType not in contentType: #soporta el contenido?
|
if (item.action == 'episodios' or item.action == 'findvideos') and item.contentType not in contentType: #soporta el contenido?
|
||||||
continue
|
continue
|
||||||
|
|
||||||
#Hacemos el cambio de nombre de canal y url, conservando las anteriores como ALT
|
#Hacemos el cambio de nombre de canal y url, conservando las anteriores como ALT
|
||||||
item.channel_alt = channel_failed
|
item.channel_alt = channel_failed
|
||||||
item.channel = channel
|
if item.channel != channel_py:
|
||||||
|
item.channel = channel
|
||||||
|
item.category = channel.capitalize()
|
||||||
item.url_alt = channel_url_failed
|
item.url_alt = channel_url_failed
|
||||||
item.url = channel_url_failed
|
item.url = channel_url_failed
|
||||||
item.url = item.url.replace(channel_host_failed, channel_host)
|
item.url = item.url.replace(channel_host_failed, channel_host)
|
||||||
|
item.channel_host = channel_host
|
||||||
#quitamos el código de series, porque puede variar entre webs
|
#quitamos el código de series, porque puede variar entre webs
|
||||||
if item.action == "episodios" or item.action == "get_seasons":
|
if item.action == "episodios" or item.action == "get_seasons":
|
||||||
item.url = re.sub(r'\/\d+$', '', item.url) #parece que con el título solo ecuentra la serie, normalmente...
|
item.url = re.sub(r'\/\d+$', '', item.url) #parece que con el título solo ecuentra la serie, normalmente...
|
||||||
@@ -698,9 +764,9 @@ def fail_over_newpct1(item, patron, patron2=None):
|
|||||||
#Leemos la nueva url
|
#Leemos la nueva url
|
||||||
try:
|
try:
|
||||||
if item.post:
|
if item.post:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, post=item.post, timeout=2).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, post=item.post, timeout=timeout).data)
|
||||||
else:
|
else:
|
||||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=2).data)
|
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url, timeout=timeout).data)
|
||||||
except:
|
except:
|
||||||
data = ''
|
data = ''
|
||||||
if not data: #no ha habido suerte, probamos con el siguiente canal válido
|
if not data: #no ha habido suerte, probamos con el siguiente canal válido
|
||||||
@@ -710,38 +776,62 @@ def fail_over_newpct1(item, patron, patron2=None):
|
|||||||
#Hemos logrado leer la web, validamos si encontramos un línk válido en esta estructura
|
#Hemos logrado leer la web, validamos si encontramos un línk válido en esta estructura
|
||||||
#Evitar páginas engañosas que puede meter al canal en un loop infinito
|
#Evitar páginas engañosas que puede meter al canal en un loop infinito
|
||||||
if (not ".com/images/no_imagen.jpg" in data and not ".com/images/imagen-no-disponible.jpg" in data) or item.action != "episodios":
|
if (not ".com/images/no_imagen.jpg" in data and not ".com/images/imagen-no-disponible.jpg" in data) or item.action != "episodios":
|
||||||
if item.action == 'submenu': #Para submenú hacemos un cambio total de canal
|
|
||||||
patron = patron.replace(item.channel_alt, item.channel) #el patron lleva el nombre de host
|
|
||||||
if patron:
|
if patron:
|
||||||
data_alt = scrapertools.find_single_match(data, patron)
|
data_alt = scrapertools.find_single_match(data, patron)
|
||||||
if patron2 != None:
|
if patron2 != None:
|
||||||
data_alt = scrapertools.find_single_match(data_alt, patron2)
|
data_alt = scrapertools.find_single_match(data_alt, patron2)
|
||||||
if not data_alt: #no ha habido suerte, probamos con el siguiente canal
|
if not data_alt: #no ha habido suerte, probamos con el siguiente canal
|
||||||
logger.error("ERROR 02: " + item.action + ": Ha cambiado la estructura de la Web: " + item.url + " / Patron: " + patron)
|
logger.error("ERROR 02: " + item.action + ": Ha cambiado la estructura de la Web: " + item.url + " / Patron: " + patron)
|
||||||
data = ''
|
|
||||||
if item.action == 'submenu': #restauramos el patrón para el siguiente canal
|
|
||||||
patron = patron.replace(item.channel, item.channel_alt)
|
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
#if item.action == "episodios" or item.action == "get_seasons": #guardamos la url real de esta web
|
|
||||||
#item.url += str(scrapertools.find_single_match(data, '<ul class="buscar-list">.*?<img src=".*?\/pictures\/.*?(\/\d+)_'))
|
|
||||||
#para Submenu y Search cambiamos también la Categoria
|
|
||||||
if item.action == 'submenu' or item.action == 'search':
|
|
||||||
item.category = item.channel.capitalize()
|
|
||||||
break #por fin !!! Este canal parece que funciona
|
break #por fin !!! Este canal parece que funciona
|
||||||
else:
|
else:
|
||||||
logger.error("ERROR 02: " + item.action + ": Ha cambiado la estructura de la Web: " + item.url + " / Patron: " + patron)
|
logger.error("ERROR 02: " + item.action + ": Ha cambiado la estructura de la Web: " + item.url + " / Patron: " + patron)
|
||||||
data = ''
|
data = ''
|
||||||
continue
|
continue
|
||||||
|
|
||||||
#logger.debug(item)
|
|
||||||
|
|
||||||
if not data: #Si no ha logrado encontrar nada, salimos limpiando variables
|
if not data: #Si no ha logrado encontrar nada, salimos limpiando variables
|
||||||
if item.channel_alt:
|
if item.channel == channel_py:
|
||||||
item.channel = item.channel_alt
|
if item.channel_alt:
|
||||||
del item.channel_alt
|
item.category = item.channel_alt.capitalize()
|
||||||
|
del item.channel_alt
|
||||||
|
else:
|
||||||
|
if item.channel_alt:
|
||||||
|
item.channel = item.channel_alt
|
||||||
|
del item.channel_alt
|
||||||
if item.url_alt:
|
if item.url_alt:
|
||||||
item.url = item.url_alt
|
item.url = item.url_alt
|
||||||
del item.url_alt
|
del item.url_alt
|
||||||
|
if item.channel_host:
|
||||||
|
del item.channel_host
|
||||||
|
|
||||||
return (item, data)
|
return (item, data)
|
||||||
|
|
||||||
|
|
||||||
|
def redirect_clone_newpct1(item):
|
||||||
|
logger.info()
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
Llamada para redirigir cualquier llamada a un clone de NewPct1 a NewPct1.py
|
||||||
|
Incluye las llamadas estándar del canal y la llamadas externas:
|
||||||
|
- Play fron Library
|
||||||
|
- Videolibrary Update
|
||||||
|
|
||||||
|
La lógica es reemplazar item.channel por "newpct1" y dejar el nombre del clone en item.category.
|
||||||
|
De esta forma utiliza siempre el código de NewPct1.py, aunque con las urls y apariencia del clone seleccionado por el usuario.
|
||||||
|
|
||||||
|
Este método interroga la configruación de NewPct1 para extraer la lista de canales clones. Si item.channel es un clone de NewPct1 y está en esa lista, actualiza item.channel='newpct1'
|
||||||
|
|
||||||
|
La llamada recibe el parámetro Item y lo devuleve actualizado
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
#Array con los datos de los canales alternativos
|
||||||
|
fail_over_list = config.get_setting('clonenewpct1_channels_list', channel_py)
|
||||||
|
|
||||||
|
channel = "'%s'" % item.channel
|
||||||
|
if channel in fail_over_list:
|
||||||
|
item.channel = channel_py
|
||||||
|
|
||||||
|
return item
|
||||||
@@ -18,16 +18,19 @@ from channels import videolibrary
|
|||||||
|
|
||||||
def update(path, p_dialog, i, t, serie, overwrite):
|
def update(path, p_dialog, i, t, serie, overwrite):
|
||||||
logger.info("Actualizando " + path)
|
logger.info("Actualizando " + path)
|
||||||
|
from lib import generictools
|
||||||
insertados_total = 0
|
insertados_total = 0
|
||||||
#logger.debug(serie)
|
|
||||||
head_nfo, it = videolibrarytools.read_nfo(path + '/tvshow.nfo')
|
head_nfo, it = videolibrarytools.read_nfo(path + '/tvshow.nfo')
|
||||||
|
|
||||||
# logger.debug("%s: %s" %(serie.contentSerieName,str(list_canales) ))
|
# logger.debug("%s: %s" %(serie.contentSerieName,str(list_canales) ))
|
||||||
for channel, url in serie.library_urls.items():
|
for channel, url in serie.library_urls.items():
|
||||||
serie.channel = channel
|
serie.channel = channel
|
||||||
serie.url = url
|
serie.url = url
|
||||||
|
|
||||||
|
serie = generictools.redirect_clone_newpct1(serie) ###### Redirección al canal NewPct1.py si es un clone
|
||||||
|
|
||||||
channel_enabled = channeltools.is_enabled(channel)
|
channel_enabled = channeltools.is_enabled(serie.channel)
|
||||||
|
|
||||||
if channel_enabled:
|
if channel_enabled:
|
||||||
|
|
||||||
@@ -38,13 +41,14 @@ def update(path, p_dialog, i, t, serie, overwrite):
|
|||||||
pathchannels = filetools.join(config.get_runtime_path(), "channels", serie.channel + '.py')
|
pathchannels = filetools.join(config.get_runtime_path(), "channels", serie.channel + '.py')
|
||||||
logger.info("Cargando canal: " + pathchannels + " " +
|
logger.info("Cargando canal: " + pathchannels + " " +
|
||||||
serie.channel)
|
serie.channel)
|
||||||
logger.debug(serie)
|
|
||||||
|
|
||||||
if serie.library_filter_show:
|
if serie.library_filter_show:
|
||||||
serie.show = serie.library_filter_show.get(channel, serie.contentSerieName)
|
serie.show = serie.library_filter_show.get(serie.channel, serie.contentSerieName)
|
||||||
|
|
||||||
obj = imp.load_source(serie.channel, pathchannels)
|
obj = imp.load_source(serie.channel, pathchannels)
|
||||||
itemlist = obj.episodios(serie)
|
itemlist = obj.episodios(serie)
|
||||||
|
|
||||||
|
serie.channel = channel #Restauramos el valor incial del clone de NewPct1
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if int(overwrite) == 3:
|
if int(overwrite) == 3:
|
||||||
|
|||||||
Reference in New Issue
Block a user