Mejoras de código e Idiomas en .jsons
This commit is contained in:
@@ -100,14 +100,14 @@ def categorias(item):
|
||||
|
||||
if not data: #Si no ha logrado encontrar nada, salimos
|
||||
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
|
||||
|
||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||
|
||||
if not matches:
|
||||
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'))
|
||||
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(item.url_plus)
|
||||
#logger.debug(matches)
|
||||
@@ -173,7 +173,7 @@ def listado(item):
|
||||
|
||||
cnt_tot = 40 # Poner el num. máximo de items por página
|
||||
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
||||
inicio = time.time() # Controlaremos que el proceso no exceda de un tiempo razonable
|
||||
inicio = time.time() # Controlaremos que el proceso no exceda de un tiempo razonable
|
||||
fin = inicio + 10 # Después de este tiempo pintamos (segundos)
|
||||
timeout_search = timeout # Timeout para descargas
|
||||
if item.extra == 'search':
|
||||
@@ -182,8 +182,8 @@ def listado(item):
|
||||
timeout_search = 5 # Timeout un poco más largo para las búsquedas
|
||||
|
||||
#Sistema de paginado para evitar páginas vacías o semi-vacías en casos de búsquedas con series con muchos episodios
|
||||
title_lista = [] # Guarda la lista de series que ya están en Itemlist, para no duplicar lineas
|
||||
if item.title_lista: # Si viene de una pasada anterior, la lista ya estará guardada
|
||||
title_lista = [] # Guarda la lista de series que ya están en Itemlist, para no duplicar lineas
|
||||
if item.title_lista: # Si viene de una pasada anterior, la lista ya estará guardada
|
||||
title_lista.extend(item.title_lista) # Se usa la lista de páginas anteriores en Item
|
||||
del item.title_lista # ... limpiamos
|
||||
|
||||
@@ -206,7 +206,7 @@ def listado(item):
|
||||
if not data and not item.extra2: #Si la web está caída salimos sin dar error
|
||||
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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
break #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
#Patrón para todo, menos para Series completas, incluido búsquedas en cualquier caso
|
||||
patron = '<tr><td(?: class="[^"]+")?><a href="([^"]+)".?title="([^"]+)".*?<\/a><\/td><td(?: class="[^"]+")?>(?:<a href="[^"]+">)?(.*?)(?:<\/a>)?<\/td><td(?: class="[^"]+")?>.*?<\/td><td(?: class="[^"]+")?>(.*?)<\/td><\/tr>'
|
||||
@@ -224,7 +224,7 @@ def listado(item):
|
||||
|
||||
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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
break #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
#logger.debug("PATRON: " + patron)
|
||||
#logger.debug(matches)
|
||||
@@ -547,7 +547,7 @@ def episodios(item):
|
||||
itemlist = []
|
||||
item.category = categoria
|
||||
|
||||
logger.debug(item)
|
||||
#logger.debug(item)
|
||||
|
||||
if item.from_title:
|
||||
item.title = item.from_title
|
||||
@@ -616,8 +616,8 @@ def episodios(item):
|
||||
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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
logger.debug("PATRON: " + patron)
|
||||
logger.debug(matches)
|
||||
#logger.debug("PATRON: " + patron)
|
||||
#logger.debug(matches)
|
||||
#logger.debug(data)
|
||||
|
||||
season = max_temp
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"name": "Elite Torrent",
|
||||
"active": true,
|
||||
"adult": false,
|
||||
"language": ["*"],
|
||||
"language": ["cast", "lat"],
|
||||
"thumbnail": "elitetorrent.png",
|
||||
"banner": "elitetorrent.png",
|
||||
"categories": [
|
||||
|
||||
@@ -49,14 +49,14 @@ def submenu(item):
|
||||
if not data:
|
||||
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url)
|
||||
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'))
|
||||
return itemlist #Algo no funciona, pintamos lo que tenemos
|
||||
return itemlist #Algo no funciona, pintamos lo que tenemos
|
||||
|
||||
patron = '<div class="cab_menu">.*?<\/div>' #Menú principal
|
||||
patron = '<div class="cab_menu">.*?<\/div>' #Menú principal
|
||||
data1 = scrapertools.get_match(data, patron)
|
||||
patron = '<div id="menu_langen">.*?<\/div>' #Menú de idiomas
|
||||
patron = '<div id="menu_langen">.*?<\/div>' #Menú de idiomas
|
||||
data1 += scrapertools.get_match(data, patron)
|
||||
|
||||
patron = '<a href="(.*?)".*?title="(.*?)"' #Encontrar todos los apartados
|
||||
patron = '<a href="(.*?)".*?title="(.*?)"' #Encontrar todos los apartados
|
||||
matches = re.compile(patron, re.DOTALL).findall(data1)
|
||||
if not matches:
|
||||
item = generictools.web_intervenida(item, data) #Verificamos que no haya sido clausurada
|
||||
@@ -68,25 +68,25 @@ def submenu(item):
|
||||
|
||||
logger.error("ERROR 02: SUBMENU: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data1)
|
||||
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
|
||||
|
||||
for scrapedurl, scrapedtitle in matches:
|
||||
scrapedtitle = re.sub('\r\n', '', scrapedtitle).decode('utf8').strip()
|
||||
scrapedtitle = scrapedtitle.replace(" torrent", "").replace(" Torrent", "").replace("Series y ", "").title()
|
||||
|
||||
if "castellano" in scrapedtitle.lower(): #Evita la entrada de peliculas castellano del menú de idiomas
|
||||
if "castellano" in scrapedtitle.lower(): #Evita la entrada de peliculas castellano del menú de idiomas
|
||||
continue
|
||||
|
||||
if item.extra == "series": #Tratamos Series
|
||||
if item.extra == "series": #Tratamos Series
|
||||
if not "/serie" in scrapedurl:
|
||||
continue
|
||||
else: #Tratamos Películas
|
||||
else: #Tratamos Películas
|
||||
if "/serie" in scrapedurl:
|
||||
continue
|
||||
|
||||
itemlist.append(item.clone(action="listado", title=scrapedtitle, url=scrapedurl))
|
||||
|
||||
if item.extra == "series": #Añadimos Series VOSE que está fuera del menú principal
|
||||
if item.extra == "series": #Añadimos Series VOSE que está fuera del menú principal
|
||||
itemlist.append(item.clone(action="listado", title="Series VOSE", url=host + "/series-vose/"))
|
||||
|
||||
return itemlist
|
||||
@@ -103,24 +103,24 @@ def listado(item):
|
||||
except:
|
||||
pass
|
||||
|
||||
if not data: #Si la web está caída salimos sin dar error
|
||||
if not data: #Si la web está caída salimos sin dar error
|
||||
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'))
|
||||
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
|
||||
|
||||
patron = '<div id="principal">.*?<\/nav><\/div><\/div>'
|
||||
data = scrapertools.find_single_match(data, patron)
|
||||
|
||||
patron = '<li>.*?<a href="(.*?)".*?' #url
|
||||
patron += 'title="(.*?)".*?' #título
|
||||
patron += 'src="(.*?)".*?' #thumb
|
||||
patron += "title='(.*?)'.*?" #categoría, idioma
|
||||
patron += '"><i>(.*?)<\/i><\/span.*?' #calidad
|
||||
patron += '="dig1">(.*?)<.*?' #tamaño
|
||||
patron += '="dig2">(.*?)<\/span><\/div>' #tipo tamaño
|
||||
patron = '<li>.*?<a href="(.*?)".*?' #url
|
||||
patron += 'title="(.*?)".*?' #título
|
||||
patron += 'src="(.*?)".*?' #thumb
|
||||
patron += "title='(.*?)'.*?" #categoría, idioma
|
||||
patron += '"><i>(.*?)<\/i><\/span.*?' #calidad
|
||||
patron += '="dig1">(.*?)<.*?' #tamaño
|
||||
patron += '="dig2">(.*?)<\/span><\/div>' #tipo tamaño
|
||||
|
||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||
if not matches and not '<title>503 Backend fetch failed</title>' in data: #error
|
||||
if not matches and not '<title>503 Backend fetch failed</title>' in data: #error
|
||||
item = generictools.web_intervenida(item, data) #Verificamos que no haya sido clausurada
|
||||
if item.intervencion: #Sí ha sido clausurada judicialmente
|
||||
item, itemlist = generictools.post_tmdb_listado(item, itemlist) #Llamamos al método para el pintado del error
|
||||
@@ -128,21 +128,21 @@ def listado(item):
|
||||
|
||||
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'))
|
||||
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: " + patron)
|
||||
#logger.debug(matches)
|
||||
#logger.debug(data)
|
||||
|
||||
for scrapedurl, scrapedtitle, scrapedthumbnail, scrapedcategory, scrapedcalidad, scrapedsize, scrapedsizet in matches:
|
||||
item_local = item.clone() #Creamos copia de Item para trabajar
|
||||
item_local = item.clone() #Creamos copia de Item para trabajar
|
||||
|
||||
title = re.sub('\r\n', '', scrapedtitle).decode('utf8').strip()
|
||||
title = title.replace(" torrent", "").replace(" Torrent", "").replace("Series y ", "")
|
||||
item_local.url = urlparse.urljoin(host, scrapedurl)
|
||||
item_local.thumbnail = urlparse.urljoin(host, scrapedthumbnail)
|
||||
|
||||
if "---" in scrapedcalidad: #limpiamos calidades
|
||||
if "---" in scrapedcalidad: #limpiamos calidades
|
||||
scrapedcalidad = ''
|
||||
if "microhd" in title.lower():
|
||||
item_local.quality = "microHD"
|
||||
@@ -158,7 +158,7 @@ def listado(item):
|
||||
else:
|
||||
item_local.quality += ' [%s %s]' % (scrapedsize.replace(".", ","), scrapedsizet)
|
||||
|
||||
item_local.language = [] #Verificamos el idioma por si encontramos algo
|
||||
item_local.language = [] #Verificamos el idioma por si encontramos algo
|
||||
if "latino" in scrapedcategory.lower() or "latino" in item.url or "latino" in title.lower():
|
||||
item_local.language += ["LAT"]
|
||||
if "ingles" in scrapedcategory.lower() or "ingles" in item.url or "vose" in scrapedurl or "vose" in item.url:
|
||||
@@ -175,7 +175,7 @@ def listado(item):
|
||||
title = re.sub(r'\??\s?\d*?\&.*', '', title).title().strip()
|
||||
item_local.from_title = title #Guardamos esta etiqueta para posible desambiguación de título
|
||||
|
||||
if item_local.extra == "peliculas": #preparamos Item para películas
|
||||
if item_local.extra == "peliculas": #preparamos Item para películas
|
||||
if "/serie" in scrapedurl or "/serie" in item.url:
|
||||
continue
|
||||
if not "/serie" in scrapedurl and not "/serie" in item.url:
|
||||
@@ -183,7 +183,7 @@ def listado(item):
|
||||
item_local.contentTitle = title
|
||||
item_local.extra = "peliculas"
|
||||
|
||||
if item_local.extra == "series": #preparamos Item para series
|
||||
if item_local.extra == "series": #preparamos Item para series
|
||||
if not "/serie" in scrapedurl and not "/serie" in item.url:
|
||||
continue
|
||||
if "/serie" in scrapedurl or "/serie" in item.url:
|
||||
@@ -202,7 +202,7 @@ def listado(item):
|
||||
item_local.contentEpisodeNumber = 1
|
||||
item_local.contentSerieName = title
|
||||
if epi_mult:
|
||||
title = "%sx%s al %s -" % (item_local.contentSeason, str(item_local.contentEpisodeNumber).zfill(2), str(epi_mult).zfill(2)) #Creamos un título con el rango de episodios
|
||||
title = "%sx%s al %s -" % (item_local.contentSeason, str(item_local.contentEpisodeNumber).zfill(2), str(epi_mult).zfill(2)) #Creamos un título con el rango de episodios
|
||||
else:
|
||||
title = '%sx%s ' % (str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2))
|
||||
|
||||
@@ -214,7 +214,7 @@ def listado(item):
|
||||
if item.category: #Si este campo no existe es que viene de la primera pasada de una búsqueda global, pasamos
|
||||
tmdb.set_infoLabels(item_local, True)
|
||||
|
||||
itemlist.append(item_local.clone()) #Pintar pantalla
|
||||
itemlist.append(item_local.clone()) #Pintar pantalla
|
||||
|
||||
#if not item.category: #Si este campo no existe es que viene de la primera pasada de una búsqueda global
|
||||
# return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorra tiempo
|
||||
@@ -227,12 +227,12 @@ def listado(item):
|
||||
|
||||
# Extrae el paginador
|
||||
patron = '<div class="paginacion">.*?<span class="pagina pag_actual".*?'
|
||||
patron += "<a href='([^']+)'.*?" #url siguiente página
|
||||
patron += 'class="pagina">(\d+)<' #próxima página
|
||||
patron += "<a href='([^']+)'.*?" #url siguiente página
|
||||
patron += 'class="pagina">(\d+)<' #próxima página
|
||||
matches = scrapertools.find_single_match(data, patron)
|
||||
|
||||
patron = 'class="pagina pag_sig">Siguiente.*?'
|
||||
patron += "<a href='.*?\/page\/(\d+)\/" #total de páginas
|
||||
patron += "<a href='.*?\/page\/(\d+)\/" #total de páginas
|
||||
last_page = scrapertools.find_single_match(data, patron)
|
||||
if not last_page:
|
||||
patron = '<div class="paginacion">.*?'
|
||||
@@ -265,7 +265,7 @@ def findvideos(item):
|
||||
if not data:
|
||||
logger.error("ERROR 01: FINDVIDEOS: La Web no responde o la URL es erronea: " + item.url + " / DATA: " + data)
|
||||
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'))
|
||||
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, "utf-8", errors="replace")
|
||||
|
||||
#Añadimos el tamaño para todos
|
||||
@@ -278,7 +278,7 @@ def findvideos(item):
|
||||
patron_t = '<div class="enlace_descarga".*?<a href="(.*?\.torrent)"'
|
||||
link_torrent = scrapertools.find_single_match(data, patron_t)
|
||||
link_torrent = urlparse.urljoin(item.url, link_torrent)
|
||||
link_torrent = link_torrent.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
||||
link_torrent = link_torrent.replace(" ", "%20") #sustituimos espacios por %20, por si acaso
|
||||
#logger.info("link Torrent: " + link_torrent)
|
||||
|
||||
patron_m = '<div class="enlace_descarga".*?<a href="(magnet:?.*?)"'
|
||||
@@ -286,7 +286,7 @@ def findvideos(item):
|
||||
link_magnet = urlparse.urljoin(item.url, link_magnet)
|
||||
#logger.info("link Magnet: " + link_magnet)
|
||||
|
||||
if not link_torrent and not link_magnet: #error
|
||||
if not link_torrent and not link_magnet: #error
|
||||
item = generictools.web_intervenida(item, data) #Verificamos que no haya sido clausurada
|
||||
if item.intervencion: #Sí ha sido clausurada judicialmente
|
||||
item, itemlist = generictools.post_tmdb_findvideos(item, itemlist) #Llamamos al método para el pintado del error
|
||||
@@ -294,7 +294,7 @@ def findvideos(item):
|
||||
|
||||
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron_t + " / " + patron_m + " / 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'))
|
||||
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
|
||||
|
||||
#Llamamos al método para crear el título general del vídeo, con toda la información obtenida de TMDB
|
||||
item, itemlist = generictools.post_tmdb_findvideos(item, itemlist)
|
||||
@@ -315,14 +315,14 @@ def findvideos(item):
|
||||
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Torrent
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title) #Quitamos etiquetas vacías
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title) #Quitamos colores vacíos
|
||||
item_local.alive = "??" #Calidad del link sin verificar
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = "torrent" #Seridor Torrent
|
||||
item_local.alive = "??" #Calidad del link sin verificar
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = "torrent" #Seridor Torrent
|
||||
|
||||
itemlist.append(item_local.clone()) #Pintar pantalla
|
||||
itemlist.append(item_local.clone()) #Pintar pantalla
|
||||
|
||||
#Ahora pintamos el link del Magnet, si lo hay
|
||||
if link_magnet: # Hay Magnet ?
|
||||
if link_magnet: # Hay Magnet ?
|
||||
if item_local.quality:
|
||||
item_local.quality += " "
|
||||
item_local.quality = item_local.quality.replace("[Torrent]", "") + "[Magnet]"
|
||||
@@ -330,11 +330,11 @@ def findvideos(item):
|
||||
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Magnet
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title) #Quitamos etiquetas vacías
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title) #Quitamos colores vacíos
|
||||
item_local.alive = "??" #Calidad del link sin verificar
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = "torrent" #Seridor Torrent
|
||||
item_local.alive = "??" #Calidad del link sin verificar
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = "torrent" #Seridor Torrent
|
||||
|
||||
itemlist.append(item_local.clone()) #Pintar pantalla
|
||||
itemlist.append(item_local.clone()) #Pintar pantalla
|
||||
|
||||
#logger.debug("TORRENT: " + link_torrent + "MAGNET: " + link_magnet + " / title gen/torr: " + item.title + " / " + item_local.title + " / calidad: " + item_local.quality + " / tamaño: " + size + " / content: " + item_local.contentTitle + " / " + item_local.contentSerieName)
|
||||
#logger.debug(item_local)
|
||||
@@ -380,7 +380,7 @@ def newest(categoria):
|
||||
item.category_new= 'newest'
|
||||
|
||||
itemlist = listado(item)
|
||||
if itemlist[-1].title == "Página siguiente >>":
|
||||
if "Página siguiente >>" in itemlist[-1].title:
|
||||
itemlist.pop()
|
||||
|
||||
# Se captura la excepción, para no interrumpir al canal novedades si un canal falla
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"name": "EstrenosGo",
|
||||
"active": true,
|
||||
"adult": false,
|
||||
"language": ["cast", "LAT", "VOSE", "VOS"],
|
||||
"language": ["cast", "lat"],
|
||||
"fanart": "estrenosgo.png",
|
||||
"thumbnail": "estrenosgo.png",
|
||||
"banner": "estrenosgo.png",
|
||||
@@ -11,7 +11,8 @@
|
||||
"movie",
|
||||
"tvshow",
|
||||
"torrent",
|
||||
"direct"
|
||||
"direct",
|
||||
"vos"
|
||||
],
|
||||
"settings": [
|
||||
{
|
||||
|
||||
@@ -113,7 +113,7 @@ def categorias(item):
|
||||
|
||||
if not data: #Si no ha logrado encontrar nada, salimos
|
||||
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
|
||||
|
||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||
@@ -121,7 +121,7 @@ def categorias(item):
|
||||
if not matches:
|
||||
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'))
|
||||
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)
|
||||
|
||||
@@ -182,7 +182,7 @@ def listado(item):
|
||||
|
||||
cnt_tot = 40 # Poner el num. máximo de items por página
|
||||
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
||||
inicio = time.time() # Controlaremos que el proceso no exceda de un tiempo razonable
|
||||
inicio = time.time() # Controlaremos que el proceso no exceda de un tiempo razonable
|
||||
fin = inicio + 10 # Después de este tiempo pintamos (segundos)
|
||||
timeout_search = timeout # Timeout para descargas
|
||||
if item.extra == 'search':
|
||||
@@ -191,9 +191,9 @@ def listado(item):
|
||||
timeout_search = 5 # Timeout un poco más largo para las búsquedas
|
||||
|
||||
#Sistema de paginado para evitar páginas vacías o semi-vacías en casos de búsquedas con series con muchos episodios
|
||||
title_lista = [] # Guarda la lista de series que ya están en Itemlist, para no duplicar lineas
|
||||
if item.title_lista: # Si viene de una pasada anterior, la lista ya estará guardada
|
||||
title_lista.extend(item.title_lista) # Se usa la lista de páginas anteriores en Item
|
||||
title_lista = [] # Guarda la lista de series que ya están en Itemlist, para no duplicar lineas
|
||||
if item.title_lista: # Si viene de una pasada anterior, la lista ya estará guardada
|
||||
title_lista.extend(item.title_lista) # Se usa la lista de páginas anteriores en Item
|
||||
del item.title_lista # ... limpiamos
|
||||
|
||||
if not item.extra2: # Si viene de Catálogo o de Alfabeto
|
||||
@@ -215,7 +215,12 @@ def listado(item):
|
||||
if not data: #Si la web está caída salimos sin dar error
|
||||
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + 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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
if len(itemlist) > 1:
|
||||
#Pasamos a TMDB la lista completa Itemlist
|
||||
tmdb.set_infoLabels(itemlist, __modo_grafico__)
|
||||
#Llamamos al método para el maquillaje de los títulos obtenidos desde TMDB
|
||||
item, itemlist = generictools.post_tmdb_listado(item, itemlist)
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
#Patrón para todo menos para Series completas
|
||||
patron = '<div class="MiniFicha"><a href="([^"]+)" title="([^"]+)">'
|
||||
@@ -237,7 +242,12 @@ def listado(item):
|
||||
|
||||
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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
if len(itemlist) > 1:
|
||||
#Pasamos a TMDB la lista completa Itemlist
|
||||
tmdb.set_infoLabels(itemlist, __modo_grafico__)
|
||||
#Llamamos al método para el maquillaje de los títulos obtenidos desde TMDB
|
||||
item, itemlist = generictools.post_tmdb_listado(item, itemlist)
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
#logger.debug("PATRON: " + patron)
|
||||
#logger.debug(matches)
|
||||
@@ -253,9 +263,9 @@ def listado(item):
|
||||
except:
|
||||
last_page = 1 #Si no lo encuentra, lo ponemos a 1
|
||||
|
||||
if item.extra == 'series': #Si son series completas, vamos a un listado especializado
|
||||
item.matches = matches #salvamos todas las matches, no hay paginación
|
||||
return listado_series(item) #llamamos a un método especializado
|
||||
if item.extra == 'series': #Si son series completas, vamos a un listado especializado
|
||||
item.matches = matches #salvamos todas las matches, no hay paginación
|
||||
return listado_series(item) #llamamos a un método especializado
|
||||
|
||||
#Empezamos el procesado de matches
|
||||
for scrapedurl, scrapedenlace, scrapedthumbnail, scrapedtitle, cat_ppal, cat_sec, opciones in matches:
|
||||
@@ -280,25 +290,25 @@ def listado(item):
|
||||
except:
|
||||
pass
|
||||
|
||||
if not data_serie: #Si la web está caída salimos sin dar error. Pintamos el episodio
|
||||
if not data_serie: #Si la web está caída salimos sin dar error. Pintamos el episodio
|
||||
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + scrapedurl + " / SERIE: " + cat_sec)
|
||||
else:
|
||||
patron_serie = '<div id="where_i_am">.*?<a href="[^"]+">.*?<\/a>.*?<a href="([^"]+)">'
|
||||
url = scrapertools.find_single_match(data_serie, patron_serie) #buscamos la url de la serie completa
|
||||
if url:
|
||||
url = host + url
|
||||
extra = 'series' #es una serie completa
|
||||
title_lista += [cat_sec] #la añadimos a la lista de series completas procesadas
|
||||
title = cat_sec #salvamos el título de la serie completa
|
||||
extra = 'series' #es una serie completa
|
||||
title_lista += [cat_sec] #la añadimos a la lista de series completas procesadas
|
||||
title = cat_sec #salvamos el título de la serie completa
|
||||
else:
|
||||
url = scrapedurl #No se encuentra la Serie, se trata como Episodio suelto
|
||||
url = scrapedurl #No se encuentra la Serie, se trata como Episodio suelto
|
||||
|
||||
elif "Archivo Torrent" not in scrapedenlace and "Video Online" not in scrapedenlace: #Si no tiene enlaces pasamos
|
||||
elif "Archivo Torrent" not in scrapedenlace and "Video Online" not in scrapedenlace: #Si no tiene enlaces pasamos
|
||||
continue
|
||||
|
||||
cnt_title += 1
|
||||
item_local = item.clone() #Creamos copia de Item para trabajar
|
||||
if item_local.tipo: #... y limpiamos
|
||||
item_local = item.clone() #Creamos copia de Item para trabajar
|
||||
if item_local.tipo: #... y limpiamos
|
||||
del item_local.tipo
|
||||
if item_local.totalItems:
|
||||
del item_local.totalItems
|
||||
@@ -317,18 +327,18 @@ def listado(item):
|
||||
item_local.text_color = True
|
||||
del item_local.text_color
|
||||
|
||||
title_subs = [] #creamos una lista para guardar info importante
|
||||
item_local.language = [] #creamos lista para los idiomas
|
||||
item_local.quality = '' #iniciamos calidad
|
||||
title_subs = [] #creamos una lista para guardar info importante
|
||||
item_local.language = [] #creamos lista para los idiomas
|
||||
item_local.quality = '' #iniciamos calidad
|
||||
quality_alt = ''
|
||||
if 'series' not in cat_ppal: #si no son series, contiene la calidad
|
||||
if 'series' not in cat_ppal: #si no son series, contiene la calidad
|
||||
quality_alt = cat_sec.lower().strip()
|
||||
item_local.extra = extra #guardamos el extra procesado
|
||||
item_local.url = url #guardamos la url final
|
||||
item_local.thumbnail = host[:-1] + scrapedthumbnail #guardamos el thumb
|
||||
item_local.extra = extra #guardamos el extra procesado
|
||||
item_local.url = url #guardamos la url final
|
||||
item_local.thumbnail = host[:-1] + scrapedthumbnail #guardamos el thumb
|
||||
item_local.context = "['buscar_trailer']"
|
||||
|
||||
item_local.contentType = "movie" #por defecto, son películas
|
||||
item_local.contentType = "movie" #por defecto, son películas
|
||||
item_local.action = "findvideos"
|
||||
|
||||
#Analizamos los formatos de la películas
|
||||
@@ -347,7 +357,7 @@ def listado(item):
|
||||
elif item_local.extra == 'series':
|
||||
item_local.contentType = "tvshow"
|
||||
item_local.action = "episodios"
|
||||
item_local.season_colapse = True #Muestra las series agrupadas por temporadas
|
||||
item_local.season_colapse = True #Muestra las series agrupadas por temporadas
|
||||
elif 'series' in cat_ppal or item_local.extra == 'episodios':
|
||||
item_local.contentType = "episode"
|
||||
item_local.extra = "episodios"
|
||||
@@ -361,7 +371,7 @@ def listado(item):
|
||||
item_local.contentType = "season"
|
||||
item_local.extra = "season"
|
||||
|
||||
if item_local.contentType == "movie": #para las peliculas ponemos el mismo extra
|
||||
if item_local.contentType == "movie": #para las peliculas ponemos el mismo extra
|
||||
item_local.extra = "peliculas"
|
||||
|
||||
#Detectamos idiomas
|
||||
@@ -495,13 +505,13 @@ def listado_series(item):
|
||||
#logger.debug(item)
|
||||
|
||||
#Control de paginación
|
||||
matches = item.matches #Restauramos la matches de la primera pasada
|
||||
matches = item.matches #Restauramos la matches de la primera pasada
|
||||
del item.matches
|
||||
matches_tot = len(matches) #La web no pagina las Series, lo tenemos que controlar
|
||||
if item.matches_current: #Llevamos los contadores de cuánto hemos pintado y cuánto queda
|
||||
matches_tot = len(matches) #La web no pagina las Series, lo tenemos que controlar
|
||||
if item.matches_current: #Llevamos los contadores de cuánto hemos pintado y cuánto queda
|
||||
matches_current = item.matches_current
|
||||
if matches_tot >= matches_current + pag:
|
||||
item.matches_current = matches_current + pag #Establecemos el bloque a pintar en este pasada
|
||||
item.matches_current = matches_current + pag #Establecemos el bloque a pintar en este pasada
|
||||
else:
|
||||
item.matches_current = matches_tot
|
||||
|
||||
@@ -566,8 +576,8 @@ def listado_series(item):
|
||||
|
||||
#logger.debug(item_local)
|
||||
|
||||
#if not item.category: #Si este campo no existe es que viene de la primera pasada de una búsqueda global
|
||||
# return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorra tiempo
|
||||
#if not item.category: #Si este campo no existe es que viene de la primera pasada de una búsqueda global
|
||||
# return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorra tiempo
|
||||
|
||||
#Pasamos a TMDB la lista completa Itemlist
|
||||
tmdb.set_infoLabels(itemlist, __modo_grafico__)
|
||||
@@ -607,7 +617,7 @@ def findvideos(item):
|
||||
if not data_torrent and not data_directo:
|
||||
logger.error("ERROR 01: FINDVIDEOS: La Web no responde o la URL es erronea: " + item.url)
|
||||
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'))
|
||||
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
|
||||
|
||||
patron = '<div class="content"><a href="([^"]+).*?'
|
||||
patron += '(?:<div class="content_medium">(.*?)<\/div>.*?)?'
|
||||
@@ -621,7 +631,7 @@ def findvideos(item):
|
||||
logger.error(data_torrent)
|
||||
if data_directo:
|
||||
logger.error(data_directo)
|
||||
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: " + patron)
|
||||
#logger.debug(matches_torrent)
|
||||
@@ -652,17 +662,17 @@ def findvideos(item):
|
||||
item_local.contentType = 'tvshow'
|
||||
item_local.extra = 'series'
|
||||
item_local.action = 'episodios'
|
||||
item_local.season_colapse = True #Muestra las series agrupadas por temporadas
|
||||
item_local.season_colapse = True #Muestra las series agrupadas por temporadas
|
||||
|
||||
#Buscamos la url de la serie y verificamos que existe
|
||||
patron_serie = '<div class="linkMoreMovies"><div class="linkMore"><a href="([^"]+)">'
|
||||
item_local.url = scrapertools.find_single_match(data_torrent, patron_serie) #buscamos la url de la serie completa
|
||||
item_local.url = scrapertools.find_single_match(data_torrent, patron_serie) #buscamos la url de la serie completa
|
||||
if not item_local.url:
|
||||
item_local.url = scrapertools.find_single_match(data_directo, patron_serie) #buscamos la url de la serie completa
|
||||
item_local.url = scrapertools.find_single_match(data_directo, patron_serie) #buscamos la url de la serie completa
|
||||
if item_local.url:
|
||||
item_local.url = item_local.url.replace('descargar-torrent', 'descarga').replace('-0-0-0-0-fx-', '-0-0-fx-')
|
||||
try:
|
||||
tmdb.set_infoLabels(item_local, True) #TMDB de la serie completa
|
||||
tmdb.set_infoLabels(item_local, True) #TMDB de la serie completa
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -685,7 +695,7 @@ def findvideos(item):
|
||||
if not item_local.quality:
|
||||
item_local.quality = item.quality
|
||||
elif scrapertools.find_single_match(item.quality, '(\[\d+:\d+ h\])'): #Salvamos la duración
|
||||
item_local.quality += ' [/COLOR][COLOR white]%s' % scrapertools.find_single_match(item.quality, '(\[\d+:\d+ h\])') #Copiamos duración
|
||||
item_local.quality += ' [/COLOR][COLOR white]%s' % scrapertools.find_single_match(item.quality, '(\[\d+:\d+ h\])') #Copiamos duración
|
||||
|
||||
if scrapedlang in IDIOMAS: #Salvamos el idioma, si lo hay
|
||||
item_local.language = ["%s" % IDIOMAS[scrapedlang]]
|
||||
@@ -701,7 +711,7 @@ def findvideos(item):
|
||||
|
||||
if not data or not matches:
|
||||
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / URL: " + item_local.url + " / DATA: " + data)
|
||||
continue #si no hay más datos, algo no funciona, pasamos a Ver Online
|
||||
continue #si no hay más datos, algo no funciona, pasamos a Ver Online
|
||||
|
||||
#logger.debug(patron)
|
||||
#logger.debug(matches)
|
||||
@@ -749,11 +759,11 @@ def findvideos(item):
|
||||
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (quality, str(item_local.language)) #Preparamos título de Torrent
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title) #Quitamos etiquetas vacías
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title) #Quitamos colores vacíos
|
||||
item_local.alive = "??" #Calidad del link sin verificar
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = "torrent" #Seridor Torrent
|
||||
item_local.alive = "??" #Calidad del link sin verificar
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = "torrent" #Seridor Torrent
|
||||
|
||||
itemlist_alt.append(item_local.clone(quality=quality)) #Pintar pantalla
|
||||
itemlist_alt.append(item_local.clone(quality=quality)) #Pintar pantalla
|
||||
|
||||
#logger.debug("TORRENT: " + scrapedtorrent + " / title gen/torr: " + item.title + " / " + item_local.title + " / calidad: " + item_local.quality + " / tamaño: " + scrapedsize + " / content: " + item_local.contentTitle + " / " + item_local.contentSerieName)
|
||||
#logger.debug(item_local)
|
||||
@@ -761,17 +771,17 @@ def findvideos(item):
|
||||
#Si son múltiples episodios, ordenamos
|
||||
if len(itemlist_alt) > 1 and (item.contentType == 'episode' or item.contentType == 'season'):
|
||||
itemlist_alt = sorted(itemlist_alt, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber))) #clasificamos
|
||||
tmdb.set_infoLabels(itemlist_alt, True) #TMDB de la lista de episodios
|
||||
tmdb.set_infoLabels(itemlist_alt, True) #TMDB de la lista de episodios
|
||||
itemlist.extend(itemlist_alt)
|
||||
|
||||
#Ahora tratamos los servidores directo
|
||||
itemlist_alt = []
|
||||
if matches_directo:
|
||||
for scrapedurl, scrapedquality, scrapedlang in matches_directo: #leemos los torrents con la diferentes calidades
|
||||
for scrapedurl, scrapedquality, scrapedlang in matches_directo: #leemos los torrents con la diferentes calidades
|
||||
#Generamos una copia de Item para trabajar sobre ella
|
||||
item_local = item.clone()
|
||||
|
||||
item_local.url = scrapedurl #Guardamos la url intermedia
|
||||
item_local.url = scrapedurl #Guardamos la url intermedia
|
||||
|
||||
item_local.quality = ''
|
||||
if scrapedquality:
|
||||
@@ -779,11 +789,11 @@ def findvideos(item):
|
||||
|
||||
if not item_local.quality:
|
||||
item_local.quality = item.quality
|
||||
elif scrapertools.find_single_match(item.quality, '(\[\d+:\d+ h\])'): #Salvamos la duración
|
||||
elif scrapertools.find_single_match(item.quality, '(\[\d+:\d+ h\])'): #Salvamos la duración
|
||||
item_local.quality += ' [/COLOR][COLOR white]%s' % scrapertools.find_single_match(item.quality, '(\[\d+:\d+ h\])') #Copiamos duración
|
||||
|
||||
if scrapedlang in IDIOMAS:
|
||||
item_local.language = ["%s" % IDIOMAS[scrapedlang]] #Salvamos el idioma, si lo hay
|
||||
item_local.language = ["%s" % IDIOMAS[scrapedlang]] #Salvamos el idioma, si lo hay
|
||||
|
||||
#Leemos la página con el enlace al Servidor
|
||||
try:
|
||||
@@ -797,7 +807,7 @@ def findvideos(item):
|
||||
if not data or not matches:
|
||||
logger.error("ERROR 02: FINDVIDEOS: El enlace 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 enlace no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
|
||||
break #si no hay más datos, algo no funciona, pasamos a Ver Online
|
||||
continue #si no hay más datos, algo no funciona, salimos
|
||||
|
||||
#logger.debug(patron)
|
||||
#logger.debug(matches)
|
||||
@@ -862,14 +872,14 @@ def findvideos(item):
|
||||
|
||||
#Verificamos el si el enlace del servidor está activo
|
||||
mostrar_server = True
|
||||
if config.get_setting("hidepremium"): #Si no se aceptan servidore premium, se ignoran
|
||||
if config.get_setting("hidepremium"): #Si no se aceptan servidore premium, se ignoran
|
||||
mostrar_server = servertools.is_server_enabled(servidor)
|
||||
|
||||
try: #Obtenemos el enlace
|
||||
try: #Obtenemos el enlace
|
||||
if mostrar_server:
|
||||
devuelve = servertools.findvideosbyserver(scrapedenlace, servidor) #existe el link ?
|
||||
devuelve = servertools.findvideosbyserver(scrapedenlace, servidor) #existe el link ?
|
||||
if devuelve:
|
||||
enlace = devuelve[0][1] #Se guarda el link
|
||||
enlace = devuelve[0][1] #Se guarda el link
|
||||
if not enlace:
|
||||
continue
|
||||
|
||||
@@ -877,21 +887,21 @@ def findvideos(item):
|
||||
#Si el link no está activo se ignora
|
||||
if "??" in item_local.alive: #dudoso
|
||||
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][%s][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (servidor.capitalize(), quality, str(item_local.language))
|
||||
elif "no" in item_local.alive.lower(): #No está activo. Lo preparo, pero no lo pinto
|
||||
elif "no" in item_local.alive.lower(): #No está activo. Lo preparo, pero no lo pinto
|
||||
item_local.title = '[COLOR red][%s][/COLOR] [COLOR yellow][%s][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.alive, servidor.capitalize(), quality, str(item_local.language))
|
||||
logger.debug(item_local.alive + ": ALIVE / " + servidor + " / " + enlace)
|
||||
raise
|
||||
else: #Sí está activo
|
||||
else: #Sí está activo
|
||||
item_local.title = '[COLOR yellow][%s][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (servidor.capitalize(), quality, str(item_local.language))
|
||||
|
||||
#Ahora pintamos el link Directo
|
||||
item_local.url = enlace
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title) #Quitamos etiquetas vacías
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title) #Quitamos colores vacíos
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = servidor #Seridor Directo
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title) #Quitamos colores vacíos
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = servidor #Seridor Directo
|
||||
|
||||
itemlist_alt.append(item_local.clone(quality=quality)) #Pintar pantalla
|
||||
itemlist_alt.append(item_local.clone(quality=quality)) #Pintar pantalla
|
||||
except:
|
||||
logger.error('ERROR al procesar enlaces DIRECTOS: ' + servidor + ' / ' + scrapedenlace)
|
||||
|
||||
@@ -901,7 +911,7 @@ def findvideos(item):
|
||||
#Si son múltiples episodios, ordenamos
|
||||
if len(itemlist_alt) > 1 and (item.contentType == 'episode' or item.contentType == 'season'):
|
||||
itemlist_alt = sorted(itemlist_alt, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber))) #clasificamos
|
||||
tmdb.set_infoLabels(itemlist_alt, True) #TMDB de la lista de episodios
|
||||
tmdb.set_infoLabels(itemlist_alt, True) #TMDB de la lista de episodios
|
||||
itemlist.extend(itemlist_alt)
|
||||
|
||||
return itemlist
|
||||
@@ -913,14 +923,14 @@ def episodios(item):
|
||||
|
||||
#logger.debug(item)
|
||||
|
||||
curr_page = 1 # Página inicial
|
||||
last_page = 99999 # Última página inicial
|
||||
curr_page = 1 # Página inicial
|
||||
last_page = 99999 # Última página inicial
|
||||
if item.curr_page:
|
||||
curr_page = int(item.curr_page) # Si viene de una pasada anterior, lo usamos
|
||||
del item.curr_page # ... y lo borramos
|
||||
curr_page = int(item.curr_page) # Si viene de una pasada anterior, lo usamos
|
||||
del item.curr_page # ... y lo borramos
|
||||
if item.last_page:
|
||||
last_page = int(item.last_page) # Si viene de una pasada anterior, lo usamos
|
||||
del item.last_page # ... y lo borramos
|
||||
last_page = int(item.last_page) # Si viene de una pasada anterior, lo usamos
|
||||
del item.last_page # ... y lo borramos
|
||||
url_item = item.url.replace('1-.fx', '%s-.fx').replace('-1.fx', '-%s.fx')
|
||||
if item.from_title:
|
||||
item.title = item.from_title
|
||||
@@ -928,8 +938,8 @@ def episodios(item):
|
||||
#Limpiamos num. Temporada y Episodio que ha podido quedar por Novedades
|
||||
season_display = 0
|
||||
if item.contentSeason:
|
||||
if item.season_colapse: #Si viene del menú de Temporadas...
|
||||
season_display = item.contentSeason #... salvamos el num de sesión a pintar
|
||||
if item.season_colapse: #Si viene del menú de Temporadas...
|
||||
season_display = item.contentSeason #... salvamos el num de sesión a pintar
|
||||
item.from_num_season_colapse = season_display
|
||||
del item.season_colapse
|
||||
item.contentType = "tvshow"
|
||||
@@ -949,14 +959,14 @@ def episodios(item):
|
||||
tmdb.set_infoLabels(item, True)
|
||||
|
||||
modo_ultima_temp_alt = modo_ultima_temp
|
||||
if item.ow_force == "1": #Si hay un traspaso de canal o url, se actualiza todo
|
||||
if item.ow_force == "1": #Si hay un traspaso de canal o url, se actualiza todo
|
||||
modo_ultima_temp_alt = False
|
||||
|
||||
max_temp = 1
|
||||
if item.infoLabels['number_of_seasons']:
|
||||
max_temp = item.infoLabels['number_of_seasons']
|
||||
y = []
|
||||
if modo_ultima_temp_alt and item.library_playcounts: #Averiguar cuantas temporadas hay en Videoteca
|
||||
if modo_ultima_temp_alt and item.library_playcounts: #Averiguar cuantas temporadas hay en Videoteca
|
||||
patron = 'season (\d+)'
|
||||
matches = re.compile(patron, re.DOTALL).findall(str(item.library_playcounts))
|
||||
for x in matches:
|
||||
@@ -967,19 +977,19 @@ def episodios(item):
|
||||
|
||||
# Descarga la página
|
||||
data = ''
|
||||
url = url_item % curr_page #Inserto en num de página en la url
|
||||
url = url_item % curr_page #Inserto en num de página en la url
|
||||
try:
|
||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)| ", "", httptools.downloadpage(url, timeout=timeout).data)
|
||||
data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
|
||||
except: #Algún error de proceso, salimos
|
||||
except: #Algún error de proceso, salimos
|
||||
pass
|
||||
|
||||
if not data:
|
||||
logger.error("ERROR 01: EPISODIOS: La Web no responde o la URL es erronea" + item.url)
|
||||
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'))
|
||||
return itemlist
|
||||
break #Pintamos lo que tenemos
|
||||
|
||||
curr_page += 1 #Apunto ya a la página siguiente
|
||||
curr_page += 1 #Apunto ya a la página siguiente
|
||||
|
||||
#Usamos el mismo patrón que en listado
|
||||
patron = '<div class="MiniFicha"><a href="([^"]+)" title="([^"]+)">'
|
||||
@@ -996,7 +1006,7 @@ def episodios(item):
|
||||
|
||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / 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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
break #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
#logger.debug("PATRON: " + patron)
|
||||
#logger.debug(matches)
|
||||
@@ -1080,10 +1090,10 @@ def episodios(item):
|
||||
else:
|
||||
item_local.title = '%sx%s -' % (str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2))
|
||||
|
||||
if modo_ultima_temp_alt and item.library_playcounts: #Si solo se actualiza la última temporada de Videoteca
|
||||
if modo_ultima_temp_alt and item.library_playcounts: #Si solo se actualiza la última temporada de Videoteca
|
||||
if item_local.contentSeason < max_temp:
|
||||
curr_page = 999999 #Sale del bucle de leer páginas
|
||||
break #Sale del bucle actual del WHILE de episodios por página
|
||||
curr_page = 999999 #Sale del bucle de leer páginas
|
||||
break #Sale del bucle actual del WHILE de episodios por página
|
||||
|
||||
if season_display > 0:
|
||||
if item_local.contentSeason > season_display:
|
||||
@@ -1098,10 +1108,10 @@ def episodios(item):
|
||||
if len(itemlist) > 1:
|
||||
itemlist = sorted(itemlist, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber))) #clasificamos
|
||||
|
||||
if item.season_colapse and not item.add_videolibrary: #Si viene de listado, mostramos solo Temporadas
|
||||
if item.season_colapse and not item.add_videolibrary: #Si viene de listado, mostramos solo Temporadas
|
||||
item, itemlist = generictools.post_tmdb_seasons(item, itemlist)
|
||||
|
||||
if not item.season_colapse: #Si no es pantalla de Temporadas, pintamos todo
|
||||
if not item.season_colapse: #Si no es pantalla de Temporadas, pintamos todo
|
||||
# Pasada por TMDB y clasificación de lista por temporada y episodio
|
||||
tmdb.set_infoLabels(itemlist, True)
|
||||
|
||||
|
||||
@@ -3,14 +3,15 @@
|
||||
"name": "GranTorrent",
|
||||
"active": true,
|
||||
"adult": false,
|
||||
"language": ["*"],
|
||||
"language": ["cast", "lat"],
|
||||
"thumbnail": "grantorrent.jpg",
|
||||
"banner": "grantorrent.png",
|
||||
"fanart": "grantorrent.png",
|
||||
"categories": [
|
||||
"torrent",
|
||||
"movie",
|
||||
"tvshow"
|
||||
"tvshow",
|
||||
"vos"
|
||||
],
|
||||
"settings": [
|
||||
{
|
||||
|
||||
@@ -72,39 +72,39 @@ def submenu(item):
|
||||
if not data:
|
||||
logger.error("ERROR 01: SUBMENU: La Web no responde o ha cambiado de URL: " + item.url)
|
||||
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'))
|
||||
return itemlist #Algo no funciona, pintamos lo que tenemos
|
||||
return itemlist #Algo no funciona, pintamos lo que tenemos
|
||||
|
||||
if item.extra == "peliculas":
|
||||
patron = '<li class="navigation-top">.*?<a href="(.*?)".*?class="nav"> (.*?)\s?<\/a><\/li>'
|
||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||
if not matches:
|
||||
item = generictools.web_intervenida(item, data) #Verificamos que no haya sido clausurada
|
||||
if item.intervencion: #Sí ha sido clausurada judicialmente
|
||||
item = generictools.web_intervenida(item, data) #Verificamos que no haya sido clausurada
|
||||
if item.intervencion: #Sí ha sido clausurada judicialmente
|
||||
for clone_inter, autoridad in item.intervencion:
|
||||
thumb_intervenido = get_thumb(autoridad)
|
||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + clone_inter.capitalize() + ': [/COLOR]' + intervenido_judicial + '. Reportar el problema en el foro', thumbnail=thumb_intervenido))
|
||||
return itemlist #Salimos
|
||||
return itemlist #Salimos
|
||||
|
||||
itemlist.append(item.clone(action="listado", title="Novedades", url=host)) #Menú principal películas
|
||||
|
||||
for scrapedurl, scrapedtitle in matches:
|
||||
scrapedtitle = re.sub('\r\n', '', scrapedtitle).decode('utf8').encode('utf8').strip()
|
||||
|
||||
if not "películas" in scrapedtitle.lower(): #Evita la entrada de ayudas y demás
|
||||
if not "películas" in scrapedtitle.lower(): #Evita la entrada de ayudas y demás
|
||||
continue
|
||||
|
||||
itemlist.append(item.clone(action="listado", title=scrapedtitle, url=scrapedurl)) #Menú películas
|
||||
|
||||
else: #Tratamos Series
|
||||
else: #Tratamos Series
|
||||
patron = '<li class="navigation-top-dcha">.*?<a href="(.*?)".*?class="series"> (.*?)\s?<\/a><\/li>'
|
||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||
if not matches:
|
||||
item = generictools.web_intervenida(item, data) #Verificamos que no haya sido clausurada
|
||||
if item.intervencion: #Sí ha sido clausurada judicialmente
|
||||
item = generictools.web_intervenida(item, data) #Verificamos que no haya sido clausurada
|
||||
if item.intervencion: #Sí ha sido clausurada judicialmente
|
||||
for clone_inter, autoridad in item.intervencion:
|
||||
thumb_intervenido = get_thumb(autoridad)
|
||||
itemlist.append(item.clone(action='', title="[COLOR yellow]" + clone_inter.capitalize() + ': [/COLOR]' + intervenido_judicial + '. Reportar el problema en el foro', thumbnail=thumb_intervenido))
|
||||
return itemlist #Salimos
|
||||
return itemlist #Salimos
|
||||
|
||||
for scrapedurl, scrapedtitle in matches:
|
||||
scrapedtitle = re.sub('\r\n', '', scrapedtitle).decode('utf8').encode('utf8').strip()
|
||||
@@ -117,22 +117,22 @@ def submenu(item):
|
||||
def listado(item):
|
||||
logger.info()
|
||||
itemlist = []
|
||||
cnt_tot = 40 # Poner el num. máximo de items por página
|
||||
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
||||
result_mode = config.get_setting("result_mode", channel="search") # Búsquedas globales: listado completo o no
|
||||
cnt_tot = 40 # Poner el num. máximo de items por página
|
||||
cnt_title = 0 # Contador de líneas insertadas en Itemlist
|
||||
result_mode = config.get_setting("result_mode", channel="search") # Búsquedas globales: listado completo o no
|
||||
|
||||
#Sistema de paginado para evitar páginas vacías o semi-vacías en casos de búsquedas con series con muchos episodios
|
||||
title_lista = [] # Guarda la lista de series que ya están en Itemlist, para no duplicar lineas
|
||||
if item.title_lista: # Si viene de una pasada anterior, la lista ya estará guardada
|
||||
title_lista = [] # Guarda la lista de series que ya están en Itemlist, para no duplicar lineas
|
||||
if item.title_lista: # Si viene de una pasada anterior, la lista ya estará guardada
|
||||
title_lista = item.title_lista # Se usa la lista de páginas anteriores en Item
|
||||
title_lista_alt = [] # Creamos otra lista para esta pasada
|
||||
title_lista_alt = [] # Creamos otra lista para esta pasada
|
||||
for url in title_lista:
|
||||
title_lista_alt += [url] #hacemos una copia no vinculada de title_lista
|
||||
title_lista_alt += [url] #hacemos una copia no vinculada de title_lista
|
||||
matches = []
|
||||
cnt_next = 0 #num de página próxima
|
||||
cnt_top = 10 #max. num de páginas web a leer antes de pintar
|
||||
cnt_next = 0 #num de página próxima
|
||||
cnt_top = 10 #max. num de páginas web a leer antes de pintar
|
||||
total_pag = 1
|
||||
post_num = 1 #num pagina actual
|
||||
post_num = 1 #num pagina actual
|
||||
|
||||
#Máximo num. de líneas permitidas por TMDB (40). Máx de 5 páginas por Itemlist para no degradar el rendimiento.
|
||||
#Si itemlist sigue vacío después de leer 5 páginas, se pueden llegar a leer hasta 10 páginas para encontrar algo
|
||||
@@ -150,10 +150,15 @@ def listado(item):
|
||||
pass
|
||||
|
||||
cnt_next += 1
|
||||
if not data: #Si la web está caída salimos sin dar error
|
||||
if not data: #Si la web está caída salimos sin dar error
|
||||
logger.error("ERROR 01: LISTADO: La Web no responde o ha cambiado de URL: " + item.url + " / DATA: " + video_section)
|
||||
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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
if len(itemlist) > 1:
|
||||
#Pasamos a TMDB la lista completa Itemlist
|
||||
tmdb.set_infoLabels(itemlist, __modo_grafico__)
|
||||
#Llamamos al método para el maquillaje de los títulos obtenidos desde TMDB
|
||||
item, itemlist = generictools.post_tmdb_listado(item, itemlist)
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
#Obtiene la dirección de la próxima página, si la hay
|
||||
try:
|
||||
@@ -168,9 +173,9 @@ def listado(item):
|
||||
|
||||
except:
|
||||
post = False
|
||||
cnt_next = 99 #No hay más páginas. Salir del bucle después de procesar ésta
|
||||
cnt_next = 99 #No hay más páginas. Salir del bucle después de procesar ésta
|
||||
|
||||
if post: #puntero a la siguiente página. Cada página de la web tiene 30 entradas
|
||||
if post: #puntero a la siguiente página. Cada página de la web tiene 30 entradas
|
||||
if "page/" in item.post:
|
||||
item.post = re.sub(r"page\/\d+\/", "page/%s/" % post, item.post)
|
||||
else:
|
||||
@@ -203,7 +208,12 @@ def listado(item):
|
||||
|
||||
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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
if len(itemlist) > 1:
|
||||
#Pasamos a TMDB la lista completa Itemlist
|
||||
tmdb.set_infoLabels(itemlist, __modo_grafico__)
|
||||
#Llamamos al método para el maquillaje de los títulos obtenidos desde TMDB
|
||||
item, itemlist = generictools.post_tmdb_listado(item, itemlist)
|
||||
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.
|
||||
#Se controlará cuantas páginas web se tienen que leer para rellenar la lista, sin pasarse
|
||||
@@ -258,20 +268,20 @@ def listado(item):
|
||||
#El control de página ya se ha realizado más arriba
|
||||
|
||||
scrapedurl_alt = scrapedurl
|
||||
if modo_serie_temp == 1: #si está en modo Serie agrupamos todos los episodios en una línea
|
||||
if modo_serie_temp == 1: #si está en modo Serie agrupamos todos los episodios en una línea
|
||||
scrapedurl_alt = re.sub(r'-temporada.*?-\d+.*', '/', scrapedurl_alt)
|
||||
scrapedurl_alt = re.sub(r'-?\d+x\d+.*', '/', scrapedurl_alt) #quita los datos de Temporada/episodio
|
||||
else: #si es modo Temporada, se agrupan a una línea por Temporada
|
||||
else: #si es modo Temporada, se agrupan a una línea por Temporada
|
||||
num_temp = scrapertools.find_single_match(scrapedurl_alt, '-?(\d+)x') #captura num de Temporada
|
||||
scrapedurl_alt = re.sub(r'-?\d+x\d+.*', '-temporada-%s-completa' % num_temp, scrapedurl_alt) #epis. a Temporada
|
||||
|
||||
if scrapedurl_alt in title_lista: # si ya se ha tratado, pasamos al siguiente item
|
||||
continue # solo guardamos la url para series y docus
|
||||
if scrapedurl_alt in title_lista: # si ya se ha tratado, pasamos al siguiente item
|
||||
continue # solo guardamos la url para series y docus
|
||||
title_lista += [scrapedurl_alt]
|
||||
cnt_title += 1 # Sería una línea real más para Itemlist
|
||||
cnt_title += 1 # Sería una línea real más para Itemlist
|
||||
|
||||
item_local = item.clone() #Creamos copia de Item para trabajar y limpiamos campos innecesarios
|
||||
if item_local.media: #Viene de Búsquedas
|
||||
item_local = item.clone() #Creamos copia de Item para trabajar y limpiamos campos innecesarios
|
||||
if item_local.media: #Viene de Búsquedas
|
||||
del item_local.media
|
||||
if item_local.title_lista:
|
||||
del item_local.title_lista
|
||||
@@ -339,8 +349,8 @@ def listado(item):
|
||||
#Agrega el item local a la lista itemlist
|
||||
itemlist.append(item_local.clone())
|
||||
|
||||
#if not item.category and result_mode == 0: #Si este campo no existe, viene de la primera pasada de una búsqueda global
|
||||
# return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorrar tiempo
|
||||
#if not item.category and result_mode == 0: #Si este campo no existe, viene de la primera pasada de una búsqueda global
|
||||
# return itemlist #Retornamos sin pasar por la fase de maquillaje para ahorrar tiempo
|
||||
|
||||
#Pasamos a TMDB la lista completa Itemlist
|
||||
tmdb.set_infoLabels(itemlist, __modo_grafico__)
|
||||
@@ -371,6 +381,8 @@ def listado(item):
|
||||
def findvideos(item):
|
||||
logger.info()
|
||||
itemlist = []
|
||||
|
||||
#logger.debug(item)
|
||||
|
||||
#Bajamos los datos de la página
|
||||
data = ''
|
||||
@@ -382,13 +394,13 @@ def findvideos(item):
|
||||
if not data:
|
||||
logger.error("ERROR 01: FINDVIDEOS: La Web no responde o la URL es erronea: " + item.url + " / DATA: " + data)
|
||||
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'))
|
||||
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, "utf-8", errors="replace").encode("utf-8")
|
||||
data = scrapertools.find_single_match(data, 'div id="Tokyo" [^>]+>(.*?)</div>') #Seleccionamos la zona de links
|
||||
|
||||
patron = '\/icono_.*?png" title="(?P<lang>.*?)?" [^>]+><\/td><td>(?P<quality>.*?)?<?\/td>.*?<td>(?P<size>.*?)?<\/td><td><a class="link" href="(?P<url>.*?)?"'
|
||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||
if not matches: #error
|
||||
if not matches: #error
|
||||
item = generictools.web_intervenida(item, data) #Verificamos que no haya sido clausurada
|
||||
if item.intervencion: #Sí ha sido clausurada judicialmente
|
||||
item, itemlist = generictools.post_tmdb_findvideos(item, itemlist) #Llamamos al método para el pintado del error
|
||||
@@ -396,7 +408,7 @@ def findvideos(item):
|
||||
|
||||
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'))
|
||||
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: " + patron)
|
||||
#logger.debug(matches)
|
||||
@@ -454,19 +466,21 @@ def findvideos(item):
|
||||
|
||||
#Tratamos la calidad y tamaño de cada link
|
||||
if quality:
|
||||
tiempo = ''
|
||||
if item_local.quality:
|
||||
tiempo = scrapertools.find_single_match(item_local.quality, r'(\s\[.*?\])')
|
||||
item_local.quality = quality + tiempo
|
||||
item_local.quality = quality
|
||||
else:
|
||||
item_local.quality = item.quality
|
||||
if "temporada" in temp_epi.lower():
|
||||
item_local.quality = '%s [Temporada]' % item_local.quality
|
||||
#Añadimos la duración, que estará en item.quility
|
||||
if scrapertools.find_single_match(item.quality, '(\[\d+:\d+)'): #si ya tiene la duración, la ponemos
|
||||
item_local.quality = '%s [%s h]' % (item_local.quality, scrapertools.find_single_match(item.quality, '(\d+:\d+)'))
|
||||
if scrapertools.find_single_match(item.quality, '(\[\d+:\d+)') and not scrapertools.find_single_match(item_local.quality, '(\[\d+:\d+)'):
|
||||
item_local.quality = '%s [/COLOR][COLOR white][%s h]' % (item_local.quality, scrapertools.find_single_match(item.quality, '(\d+:\d+)'))
|
||||
#if size and item_local.contentType != "episode":
|
||||
if size:
|
||||
size = size.replace(".", ",").replace("B,", " B").replace("b,", " b")
|
||||
item_local.quality = '%s [%s]' % (item_local.quality, size)
|
||||
if '[/COLOR][COLOR white]' in item_local.quality:
|
||||
item_local.quality = '%s [%s]' % (item_local.quality, size)
|
||||
else:
|
||||
item_local.quality = '%s [/COLOR][COLOR white][%s]' % (item_local.quality, size)
|
||||
if item_local.action == 'show_result': #Viene de una búsqueda global
|
||||
channel = item_local.channel.capitalize()
|
||||
if item_local.from_channel:
|
||||
@@ -476,14 +490,14 @@ def findvideos(item):
|
||||
#Salvamos la url del .torrent
|
||||
if scrapedurl:
|
||||
item_local.url = scrapedurl
|
||||
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Torrent
|
||||
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Torrent
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title).strip() #Quitamos etiquetas vacías
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title).strip() #Quitamos colores vacíos
|
||||
item_local.alive = "??" #Calidad del link sin verificar
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = "torrent" #Seridor Torrent
|
||||
item_local.alive = "??" #Calidad del link sin verificar
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = "torrent" #Seridor Torrent
|
||||
|
||||
itemlist.append(item_local.clone()) #Pintar pantalla
|
||||
itemlist.append(item_local.clone()) #Pintar pantalla
|
||||
|
||||
#logger.debug("TORRENT: " + item_local.url + " / title gen/torr: " + item.title + " / " + item_local.title + " / calidad: " + item_local.quality)
|
||||
#logger.debug(item_local)
|
||||
@@ -549,12 +563,12 @@ def episodios(item):
|
||||
|
||||
elif max_temp >= item.infoLabels["number_of_seasons"]: #Si tenemos en .nfo igaual o más temporadas, investigar
|
||||
cnt_s = 0
|
||||
for s in item.library_playcounts: #Ver cuántas Temporadas hay en Videoteca
|
||||
for s in item.library_playcounts: #Ver cuántas Temporadas hay en Videoteca
|
||||
if "season" in s:
|
||||
cnt_s += 1
|
||||
|
||||
if cnt_s > 1: #hay más de 1 temporada en Videoteca, es Serie?
|
||||
if temp_actual_num > 1: #Temp. actual > 1, parece Temporada
|
||||
if cnt_s > 1: #hay más de 1 temporada en Videoteca, es Serie?
|
||||
if temp_actual_num > 1: #Temp. actual > 1, parece Temporada
|
||||
s = 1
|
||||
while s <= item.infoLabels["number_of_seasons"]: #Buscamos la primera Temporada de Videoteca
|
||||
if item.library_playcounts.has_key('season %d' % s): #Buscamos si la Temporada 1 existe
|
||||
@@ -564,19 +578,19 @@ def episodios(item):
|
||||
item.contentType = "tvshow" #No es Temporada 1, pero es más baja que la actual. Es Serie
|
||||
break
|
||||
s += 1
|
||||
else: #Sí, es Serie
|
||||
else: #Sí, es Serie
|
||||
item.contentType = "tvshow"
|
||||
|
||||
else: #Solo hay una temporada en la Videoteca
|
||||
if temp_actual_num > 1: #es Temporada la actual?
|
||||
else: #Solo hay una temporada en la Videoteca
|
||||
if temp_actual_num > 1: #es Temporada la actual?
|
||||
if item.contentSeason:
|
||||
item.contentType = "season" #Si está informado el num de Temp. se creó como Temporada
|
||||
item.contentType = "season" #Si está informado el num de Temp. se creó como Temporada
|
||||
else:
|
||||
item.contentType = "tvshow" #Si no, es Serie que no tiene Temp. 1
|
||||
else: #Si es Temp. 1, se procesa según el valor de configuración
|
||||
if modo_serie_temp == 0: #Es Temporada
|
||||
item.contentType = "tvshow" #Si no, es Serie que no tiene Temp. 1
|
||||
else: #Si es Temp. 1, se procesa según el valor de configuración
|
||||
if modo_serie_temp == 0: #Es Temporada
|
||||
item.contentType = "season"
|
||||
else: #Es Serie
|
||||
else: #Es Serie
|
||||
item.contentType = "tvshow"
|
||||
else:
|
||||
item.contentType = "list"
|
||||
@@ -592,21 +606,21 @@ def episodios(item):
|
||||
#Controla que no haya un bucle en la cadena de links entre temporadas
|
||||
if scrapertools.find_single_match(temp_actual, patron_actual_num) in temp_lista:
|
||||
temp_bucle += 1
|
||||
if temp_bucle > 5: #Si ha pasado por aquí más de 5 veces es que algo anda mal
|
||||
if temp_bucle > 5: #Si ha pasado por aquí más de 5 veces es que algo anda mal
|
||||
logger.error("ERROR 05: EPISODIOS: Los links entre temporadas están rotos y se está metiendo en un loop: " + temp_actual + " (" + str (temp_actual_num) + ") / Previa: " + temp_previous + " / o Siguiente: " + temp_next + " / Avance: " + temp_advance + " / Lista temps: " + str(temp_lista) + " / DATA: " + data)
|
||||
itemlist.append(item.clone(action='', title=item.channel + ': ERROR 05: EPISODIOS. Los links entre temporadas están rotos y se está metiendo en un loop. Reportar error con log'))
|
||||
data = ''
|
||||
return itemlist #Algo no funciona con los links, pintamos lo que tenemos
|
||||
break #Algo no funciona con los links, pintamos lo que tenemos
|
||||
if temp_advance == "back": #Se salta una temporada hacia atrás
|
||||
logger.error("ERROR 05: EPISODIOS: Temporada duplicada. Link BACK erroneo: " + temp_actual + " (" + str (temp_actual_num) + ") / Previa: " + temp_previous + " / o Siguiente: " + temp_next + " / Avance: " + temp_advance + " / Lista temps: " + str(temp_lista) + " / Bucle: " + str(temp_bucle) + " / DATA: " + data)
|
||||
temp_actual = scrapertools.find_single_match(data, patron_previous) #url de temporada anterior
|
||||
data = ''
|
||||
continue #volvemos a leer página con la url de la anterior
|
||||
continue #volvemos a leer página con la url de la anterior
|
||||
if temp_advance == "forw": #Se salta una temporada hacia adelante
|
||||
logger.error("ERROR 05: EPISODIOS: Temporada duplicada. Link FORW erroneo: " + temp_actual + " (" + str (temp_actual_num) + ") / Previa: " + temp_previous + " / o Siguiente: " + temp_next + " / Avance: " + temp_advance + " / Lista temps: " + str(temp_lista) + " / Bucle: " + str(temp_bucle) + " / DATA: " + data)
|
||||
temp_actual = scrapertools.find_single_match(data, patron_next) #url de temporada siguiente
|
||||
data = ''
|
||||
continue #volvemos a leer página con la url de la siguiente
|
||||
continue #volvemos a leer página con la url de la siguiente
|
||||
|
||||
#Comprobamos si se ha saltado una Temporada
|
||||
if temp_advance == "back": #Avanza marcha atrás?
|
||||
@@ -625,9 +639,9 @@ def episodios(item):
|
||||
logger.error("ERROR 05: EPISODIOS: Los links entre temporadas están rotos y se está metiendo en un loop: " + temp_actual + " (" + str (temp_actual_num) + ") / Previa: " + temp_previous + " / o Siguiente: " + temp_next + " / Avance: " + temp_advance + " / Lista temps: " + str(temp_lista) + " / DATA: " + data)
|
||||
data = ''
|
||||
itemlist.append(item.clone(action='', title=item.channel + ': ERROR 05: EPISODIOS. Los links entre temporadas están rotos y se está metiendo en un loop. Reportar error con log'))
|
||||
return itemlist #Algo no funciona con los links, pintamos lo que tenemos
|
||||
break #Algo no funciona con los links, pintamos lo que tenemos
|
||||
data = ''
|
||||
continue #volvemos a leer página con la url de la siguiente
|
||||
continue #volvemos a leer página con la url de la siguiente
|
||||
|
||||
#Comprobamos si se ha saltado una Temporada
|
||||
if temp_advance == "forw": #Avanza marcha adelante?
|
||||
@@ -646,9 +660,9 @@ def episodios(item):
|
||||
logger.error("ERROR 05: EPISODIOS: Los links entre temporadas están rotos y se está metiendo en un loop: " + temp_actual + " (" + str (temp_actual_num) + ") / Previa: " + temp_previous + " / o Siguiente: " + temp_next + " / Avance: " + temp_advance + " / Lista temps: " + str(temp_lista) + " / DATA: " + data)
|
||||
data = ''
|
||||
itemlist.append(item.clone(action='', title=item.channel + ': ERROR 05: EPISODIOS. Los links entre temporadas están rotos y se está metiendo en un loop. Reportar error con log'))
|
||||
return itemlist #Algo no funciona con los links, pintamos lo que tenemos
|
||||
break #Algo no funciona con los links, pintamos lo que tenemos
|
||||
data = ''
|
||||
continue #volvemos a leer página con la url de la siguiente
|
||||
continue #volvemos a leer página con la url de la siguiente
|
||||
|
||||
temp_actual_num = scrapertools.find_single_match(temp_actual, patron_actual_num) #num de la temporada actual
|
||||
temp_actual_num = int(temp_actual_num)
|
||||
@@ -660,7 +674,7 @@ def episodios(item):
|
||||
except: #Error al leer o procesar la página actual? Salimos
|
||||
logger.error("ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea: " + temp_actual + " (" + str (temp_actual_num) + ") / Previa: " + temp_previous + " / o Siguiente: " + temp_next + " / Avance: " + temp_advance + " / DATA: " + data)
|
||||
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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
break #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
if item.contentType == "season":
|
||||
temp_advance = '' #Es la única temporada
|
||||
@@ -700,7 +714,7 @@ def episodios(item):
|
||||
|
||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / 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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
break #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
#logger.debug("PATRON: " + patron)
|
||||
#logger.debug(matches)
|
||||
@@ -752,7 +766,7 @@ def episodios(item):
|
||||
item_local.contentSeason = temp_actual_num
|
||||
item_local.contentSeason = int(item_local.contentSeason)
|
||||
item_local.contentEpisodeNumber = 1
|
||||
else: #si es un episodio lo guardamos
|
||||
else: #si es un episodio lo guardamos
|
||||
if scrapertools.find_single_match(temp_epi, r'(\d+)&#.*?;(\d+)'):
|
||||
item_local.contentSeason, item_local.contentEpisodeNumber = scrapertools.find_single_match(temp_epi, r'(\d+)&#.*?;(\d+)')
|
||||
if not item_local.contentSeason:
|
||||
@@ -766,32 +780,32 @@ def episodios(item):
|
||||
item_local.contentEpisodeNumber = int(item_local.contentEpisodeNumber)
|
||||
except:
|
||||
logger.error("ERROR 07: EPISODIOS: Error en número de Temporada o Episodio: " + temp_epi)
|
||||
continue #si da un error pasamos del episodio
|
||||
continue #si da un error pasamos del episodio
|
||||
|
||||
if item_local.contentSeason != temp_actual_num: #A veces es diferente el num de Temp. de la URL y de
|
||||
temp_actual_num = item_local.contentSeason #los episodios. Anatomia de Grey Temp. 14
|
||||
|
||||
if "-" in temp_epi: #episodios múltiples
|
||||
if "-" in temp_epi: #episodios múltiples
|
||||
episode2 = scrapertools.find_single_match(temp_epi, r'-(\d+)')
|
||||
item_local.title = "%sx%s al %s -" % (item_local.contentSeason, str(item_local.contentEpisodeNumber).zfill(2), str(episode2).zfill(2)) #Creamos un título con el rango de episodios
|
||||
item_local.title = "%sx%s al %s -" % (item_local.contentSeason, str(item_local.contentEpisodeNumber).zfill(2), str(episode2).zfill(2)) #Creamos un título con el rango de episodios
|
||||
elif "temporada" in temp_epi.lower() or "completa" in temp_epi.lower(): #Temporada completa
|
||||
episode2 = 99
|
||||
item_local.title = "%sx%s al %s -" % (item_local.contentSeason, str(item_local.contentEpisodeNumber).zfill(2), str(episode2).zfill(2)) #Creamos un título con el rango ficticio de episodios
|
||||
elif item_local.contentEpisodeNumber == 0: #episodio extraño
|
||||
item_local.title = "%sx%s al %s -" % (item_local.contentSeason, str(item_local.contentEpisodeNumber).zfill(2), str(episode2).zfill(2)) #Creamos un título con el rango ficticio de episodios
|
||||
elif item_local.contentEpisodeNumber == 0: #episodio extraño
|
||||
item_local.title = '%sx%s - %s' % (item_local.contentSeason, str(item_local.contentEpisodeNumber).zfill(2), temp_epi)
|
||||
else: #episodio normal
|
||||
else: #episodio normal
|
||||
item_local.title = '%sx%s -' % (item_local.contentSeason, str(item_local.contentEpisodeNumber).zfill(2))
|
||||
|
||||
if len(itemlist) > 0 and item_local.contentSeason == itemlist[-1].contentSeason and item_local.contentEpisodeNumber == itemlist[-1].contentEpisodeNumber and item_local.title == itemlist[-1].title and itemlist[-1].contentEpisodeNumber != 0: #solo guardamos un episodio ...
|
||||
if len(itemlist) > 0 and item_local.contentSeason == itemlist[-1].contentSeason and item_local.contentEpisodeNumber == itemlist[-1].contentEpisodeNumber and item_local.title == itemlist[-1].title and itemlist[-1].contentEpisodeNumber != 0: #solo guardamos un episodio ...
|
||||
if itemlist[-1].quality:
|
||||
itemlist[-1].quality += ", " + quality #... pero acumulamos las calidades
|
||||
itemlist[-1].quality += ", " + quality #... pero acumulamos las calidades
|
||||
else:
|
||||
itemlist[-1].quality = quality
|
||||
continue #ignoramos el episodio duplicado
|
||||
continue #ignoramos el episodio duplicado
|
||||
else:
|
||||
item_local.quality = quality
|
||||
|
||||
itemlist.append(item_local.clone()) #guardamos el episodio
|
||||
itemlist.append(item_local.clone()) #guardamos el episodio
|
||||
|
||||
#logger.debug("EPISODIOS: " + temp_actual + " (" + str (item_local.contentSeason) + "x" + str (item_local.contentEpisodeNumber) + ") / Previa: " + temp_previous + " / o Siguiente: " + temp_next + " / Avance: " + temp_advance + " / Lista Temps: " + str(temp_lista))
|
||||
#logger.debug(item_local)
|
||||
@@ -823,7 +837,7 @@ def episodios(item):
|
||||
def actualizar_titulos(item):
|
||||
logger.info()
|
||||
|
||||
item = generictools.update_title(item) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels
|
||||
item = generictools.update_title(item) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels
|
||||
|
||||
#Volvemos a la siguiente acción en el canal
|
||||
return item
|
||||
@@ -835,7 +849,7 @@ def search(item, texto):
|
||||
itemlist = []
|
||||
|
||||
item.url = "%s?s=%s" % (item.url, texto)
|
||||
item.media = "search" #Marcar para "Listado": igual comportamiento que "Categorías"
|
||||
item.media = "search" #Marcar para "Listado": igual comportamiento que "Categorías"
|
||||
|
||||
try:
|
||||
if "series/" in item.url:
|
||||
|
||||
@@ -3,14 +3,15 @@
|
||||
"name": "Mejor Torrent 1",
|
||||
"active": true,
|
||||
"adult": false,
|
||||
"language": ["*"],
|
||||
"language": ["cast", "lat"],
|
||||
"thumbnail": "mejortorrent.png",
|
||||
"banner": "mejortorrent.png",
|
||||
"categories": [
|
||||
"torrent",
|
||||
"movie",
|
||||
"tvshow",
|
||||
"documentary"
|
||||
"documentary",
|
||||
"vos"
|
||||
],
|
||||
"settings": [
|
||||
{
|
||||
|
||||
@@ -117,13 +117,12 @@ def alfabeto(item):
|
||||
def listado(item):
|
||||
logger.info()
|
||||
itemlist = []
|
||||
url_next_page ='' # Control de paginación
|
||||
cnt_tot = 30 # Poner el num. máximo de items por página
|
||||
url_next_page ='' # Control de paginación
|
||||
cnt_tot = 30 # Poner el num. máximo de items por página
|
||||
|
||||
if item.category:
|
||||
del item.category
|
||||
if item.totalItems:
|
||||
del item.totalItems
|
||||
item.category = item.channel.capitalize()
|
||||
|
||||
try:
|
||||
data = ''
|
||||
@@ -134,27 +133,27 @@ def listado(item):
|
||||
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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
if not data: #Si la web está caída salimos sin dar error
|
||||
if not data: #Si la web está caída salimos sin dar error
|
||||
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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
# En este canal las url's y los títulos tienen diferente formato dependiendo del contenido
|
||||
if (item.extra == "peliculas" or item.extra == "varios") and item.tipo: #Desde Lista Alfabética
|
||||
if (item.extra == "peliculas" or item.extra == "varios") and item.tipo: #Desde Lista Alfabética
|
||||
patron = '<a href="([^"]+)">([^<]+)?<\/a>'
|
||||
patron_enlace = '\/\/.*?\/(.*?)\/$'
|
||||
patron_title = '<a href="[^"]+">([^<]+)<\/a>(\s*<b>([^>]+)<\/b>)?'
|
||||
item.action = "findvideos"
|
||||
item.contentType = "movie"
|
||||
pag = False #No hay paginación
|
||||
pag = False #No hay paginación
|
||||
elif (item.extra == "peliculas" or item.extra == "varios") and not item.tipo: #Desde Menú principal
|
||||
patron = '<a href="([^"]+)">?<img src="([^"]+)"[^<]+<\/a>'
|
||||
patron_enlace = '\/\/.*?\/(.*?)\/$'
|
||||
patron_title = '<a href="[^"]+">([^<]+)<\/a>(\s*<b>([^>]+)<\/b>)?'
|
||||
item.action = "findvideos"
|
||||
item.contentType = "movie"
|
||||
pag = True #Sí hay paginación
|
||||
cnt_tot = 20 # Poner el num. máximo de items por página. Parece que hay 18
|
||||
pag = True #Sí hay paginación
|
||||
cnt_tot = 20 # Poner el num. máximo de items por página. Parece que hay 18
|
||||
item.next_page = 'b'
|
||||
elif item.extra == "series" and item.tipo:
|
||||
patron = '<a href="([^"]+)">([^<]+)?<\/a>'
|
||||
@@ -165,7 +164,7 @@ def listado(item):
|
||||
item.action = "episodios"
|
||||
item.contentType = "season"
|
||||
pag = False
|
||||
cnt_tot = 10 # Se reduce el numero de items por página porque es un proceso pesado
|
||||
cnt_tot = 10 # Se reduce el numero de items por página porque es un proceso pesado
|
||||
elif item.extra == "series" and not item.tipo:
|
||||
patron = '<a href="([^"]+)">?<img src="([^"]+)"[^<]+<\/a>'
|
||||
patron_enlace = '\/\/.*?\/(.*?)-[temporada]?\d+[-|x]'
|
||||
@@ -175,7 +174,7 @@ def listado(item):
|
||||
item.action = "episodios"
|
||||
item.contentType = "season"
|
||||
pag = True
|
||||
cnt_tot = 10 # Se reduce el numero de items por página porque es un proceso pesado
|
||||
cnt_tot = 10 # Se reduce el numero de items por página porque es un proceso pesado
|
||||
elif item.extra == "documentales" and item.tipo:
|
||||
patron = '<a href="([^"]+)">([^<]+)?<\/a>'
|
||||
patron_enlace = '\/\/.*?\/(.*?)-[temporada]?\d+[-|x]'
|
||||
@@ -219,13 +218,13 @@ def listado(item):
|
||||
|
||||
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'))
|
||||
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
|
||||
|
||||
#Capturamos el num. de la última página para informala a pié de página. Opción para páginas sin paginación
|
||||
if pag == False:
|
||||
item.last_page = (len(matches) / cnt_tot) + 1
|
||||
|
||||
if not item.last_page and pag: #Capturamos el num. de la última página para informala a pié de página
|
||||
if not item.last_page and pag: #Capturamos el num. de la última página para informala a pié de página
|
||||
item.last_page = -1
|
||||
#patron_next_page = "<a href='([^']+)' class='paginar'> Siguiente >> <\/a>"
|
||||
if "/documentales" in item.url:
|
||||
@@ -309,7 +308,7 @@ def listado(item):
|
||||
item_local.thumbnail = scrapedthumbnail
|
||||
if "http" not in item_local.thumbnail:
|
||||
item_local.thumbnail = ''
|
||||
item_local.infoLabels['year'] = '-' # Al no saber el año, le ponemos "-" y TmDB lo calcula automáticamente
|
||||
item_local.infoLabels['year'] = '-' # Al no saber el año, le ponemos "-" y TmDB lo calcula automáticamente
|
||||
|
||||
# Para que el menú contextual muestre conrrectamente las opciones de añadir a Videoteca
|
||||
if item_local.extra == "series":
|
||||
@@ -327,15 +326,18 @@ def listado(item):
|
||||
data_epi = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item_local.url).data)
|
||||
url = scrapertools.find_single_match(data_epi, '<tr><td>.*<a href="([^"]+)" style="text-decoration:none;"><h1 style=')
|
||||
if not url:
|
||||
url = scrapertools.find_single_match(data_epi, '<td><a href="(secciones.php\?sec\=descargas&ap=[^"]+)"') ###
|
||||
if not url: #No encuentro la Temporada. Lo dejo como capítulo suelto
|
||||
url = scrapertools.find_single_match(data_epi, '<td><a href="(secciones.php\?sec\=descargas&ap=[^"]+)"')
|
||||
#Probamos si es una temporada completa, aunque no tenga raiz
|
||||
if not url and scrapertools.find_single_match(data_epi, "(<form (?:style='[^']+'\s)?name='episodios' action='[^']+' method='post'>.*?)<\/form>"):
|
||||
url = item_local.url #Salvamos la url original
|
||||
if not url: #No encuentro la Temporada. Lo dejo como capítulo suelto
|
||||
item_local.action = "findvideos"
|
||||
item_local.contentEpisodeNumber = episodio
|
||||
if not item_local.contentEpisodeNumber:
|
||||
item_local.contentEpisodeNumber = 1
|
||||
logger.debug(item_local)
|
||||
logger.debug(data_epi)
|
||||
else: #Busco la temporada. Salvo url de episodio por si acaso
|
||||
else: #Busco la temporada. Salvo url de episodio por si acaso
|
||||
#item_local.url_ori = item_local.url
|
||||
item_local.url = url
|
||||
item_local.contentType = "season"
|
||||
@@ -386,7 +388,7 @@ def listado(item):
|
||||
# Limpiamos títulos, Sacamos datos de calidad, audio y lenguaje
|
||||
scrapedtitle = re.sub('\r\n', '', scrapedtitle_alt).decode('utf8').encode('utf8').strip()
|
||||
title = scrapedtitle
|
||||
title = title.replace("á", "a").replace("é", "e").replace("í", "i").replace("ó", "o").replace("ú", "u").replace("ü", "u").replace("�", "ñ").replace("ñ", "ñ")
|
||||
title = title.replace("á", "a").replace("é", "e").replace("í", "i").replace("ó", "o").replace("ú", "u").replace("ü", "u").replace("�", "ñ").replace("ñ", "ñ").replace("×", "x")
|
||||
|
||||
title_subs = []
|
||||
|
||||
@@ -400,10 +402,7 @@ def listado(item):
|
||||
title = title.replace(" Latino", "").replace(" latino", "").replace(" Argentina", "").replace(" argentina", "")
|
||||
title = title.replace("Castellano", "").replace("castellano", "").replace("inglés", "").replace("ingles", "").replace("Inglés", "").replace("Ingles", "")
|
||||
|
||||
if "3d" in title.lower(): #Reservamos info para después de TMDB
|
||||
item_local.quality += " 3D"
|
||||
title = title.replace(" [3d]", "").replace(" 3d", "").replace(" [3D]", "").replace(" 3D", "")
|
||||
if "audio" in title.lower(): #Reservamos info de audio para después de TMDB
|
||||
if "audio" in title.lower(): #Reservamos info de audio para después de TMDB
|
||||
title_subs += ['[%s]' % scrapertools.find_single_match(title, r'(\[[a|A]udio.*?\])')]
|
||||
title = re.sub(r'\[[a|A]udio.*?\]', '', title)
|
||||
if "[dual" in title.lower():
|
||||
@@ -427,7 +426,7 @@ def listado(item):
|
||||
# scrapedinfo tiene la calidad, pero solo en llamadas desde peliculas sin alfabeto
|
||||
if item_local.extra == "series" or item_local.extra == "documentales":
|
||||
if item_local.quality:
|
||||
title = re.sub(r'[\[|\(]\d+.*?[\)|\]]', '', title) # Quitar la calidad del título
|
||||
title = re.sub(r'[\[|\(]\d+.*?[\)|\]]', '', title) # Quitar la calidad del título
|
||||
info = ""
|
||||
if not item_local.contentSerieName:
|
||||
item_local.contentSerieName = title.strip()
|
||||
@@ -435,12 +434,20 @@ def listado(item):
|
||||
item_local.contentSerieName = "SIN TITULO"
|
||||
if item_local.infoLabels['title']:
|
||||
del item_local.infoLabels['title']
|
||||
if item_local.contentType == "episode":
|
||||
title = re.sub(r'\d+x\d+(?: al \d+)?', '', title)
|
||||
|
||||
if info != "" and not item_local.quality:
|
||||
item_local.quality = info
|
||||
if not scrapertools.find_single_match(title, '[\[|\(](.*?)[\)|\]]') in item_local.quality:
|
||||
if item_local.quality:
|
||||
item_local.quality += ' '
|
||||
item_local.quality = scrapertools.find_single_match(title, '[\[|\(](.*?)[\)|\]]')
|
||||
if scrapertools.find_single_match(title, '[\[|\(].*?[\)|\]]\s?[\[|\(](.*?)[\)|\]]') and not scrapertools.find_single_match(title, '[\[|\(].*?[\)|\]]\s?[\[|\(](.*?)[\)|\]]') in item_local.quality:
|
||||
item_local.quality += ' %s' % scrapertools.find_single_match(title, '[\[|\(].*?[\)|\]]\s?[\[|\(](.*?)[\)|\]]')
|
||||
title = re.sub(r'[\[|\(].*?[\)|\]]\s?[\[|\(].*?[\)|\]]', '', title)
|
||||
title = re.sub(r'[\[|\(].*?[\)|\]]', '', title)
|
||||
if "(hdrip" in title.lower() or "(br" in title.lower() or "(vhsrip" in title.lower() or "(dvdrip" in title.lower() or "(fullb" in title.lower() or "(blu" in title.lower() or "(4k" in title.lower() or "(hevc" in title.lower() or "(imax" in title.lower() or "extendida" in title.lower() or "[720p]" in title.lower() or "[1080p]" in title.lower():
|
||||
if not item_local.quality:
|
||||
item_local.quality = scrapertools.find_single_match(title, '[\[|\(](.*?)[\)|\]]')
|
||||
title = re.sub(r'[\[|\(].*?[\)|\]]', '', title)
|
||||
if not item_local.quality:
|
||||
if "fullbluray" in title.lower():
|
||||
@@ -450,12 +457,13 @@ def listado(item):
|
||||
item_local.quality = "4K"
|
||||
title = title.replace("4k-hdr", "").replace("4K-HDR", "").replace("hdr", "").replace("HDR", "").replace("4k", "").replace("4K", "")
|
||||
title = title.replace("(", "").replace(")", "").replace("[", "").replace("]", "").strip()
|
||||
if item_local.extra == "peliculas":
|
||||
if item_local.contentType == "movie":
|
||||
item_local.title = title
|
||||
item_local.contentTitle = title
|
||||
elif item_local.contentType != "episode":
|
||||
item_local.title = title
|
||||
item_local.title = item_local.contentSerieName
|
||||
title = item_local.contentSerieName
|
||||
item_local.from_title = title #Guardamos esta etiqueta para posible desambiguación de título
|
||||
|
||||
if "saga" in item_local.contentTitle.lower() or "saga" in item_local.contentSerieName.lower():
|
||||
@@ -505,14 +513,14 @@ def listado(item):
|
||||
def listado_busqueda(item):
|
||||
logger.info()
|
||||
itemlist = []
|
||||
url_next_page ='' # Controlde paginación
|
||||
cnt_tot = 39 # 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_pag = 0 # Contador de líneas leídas de Matches
|
||||
cnt_next = 0 # Contador de páginas leidas antes de pintar la pantalla
|
||||
total_pag = 10 # Líneas por página de la web
|
||||
curr_page_num = 1 # Página actual
|
||||
category = "" # Guarda la categoria que viene desde una busqueda global
|
||||
url_next_page ='' # Controlde paginación
|
||||
cnt_tot = 39 # 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_pag = 0 # Contador de líneas leídas de Matches
|
||||
cnt_next = 0 # Contador de páginas leidas antes de pintar la pantalla
|
||||
total_pag = 10 # Líneas por página de la web
|
||||
curr_page_num = 1 # Página actual
|
||||
category = "" # Guarda la categoria que viene desde una busqueda global
|
||||
matches = []
|
||||
|
||||
if item.url_next_page:
|
||||
@@ -523,7 +531,7 @@ 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
|
||||
while cnt_title <= cnt_tot and cnt_next < 5:
|
||||
|
||||
status = False # Calidad de los datos leídos
|
||||
status = False # Calidad de los datos leídos
|
||||
data = ''
|
||||
try:
|
||||
data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url_next_page, post=item.post).data)
|
||||
@@ -532,10 +540,20 @@ def listado_busqueda(item):
|
||||
except:
|
||||
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
||||
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'))
|
||||
if len(itemlist) > 1:
|
||||
#Pasamos a TMDB la lista completa Itemlist
|
||||
tmdb.set_infoLabels(itemlist, __modo_grafico__)
|
||||
#Llamamos al método para el maquillaje de los títulos obtenidos desde TMDB
|
||||
item, itemlist = generictools.post_tmdb_listado(item, itemlist)
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
if not data: #Si la web está caída salimos sin dar error
|
||||
logger.error("ERROR 01: LISTADO_BUSQUEDA: La Web no responde o ha cambiado de URL: " + item.url + item.post + " / DATA: " + data)
|
||||
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'))
|
||||
if len(itemlist) > 1:
|
||||
#Pasamos a TMDB la lista completa Itemlist
|
||||
tmdb.set_infoLabels(itemlist, __modo_grafico__)
|
||||
#Llamamos al método para el maquillaje de los títulos obtenidos desde TMDB
|
||||
item, itemlist = generictools.post_tmdb_listado(item, itemlist)
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
cnt_next += 1
|
||||
@@ -561,7 +579,11 @@ def listado_busqueda(item):
|
||||
|
||||
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'))
|
||||
item, itemlist = generictools.post_tmdb_listado(item, itemlist) #Llamamos al método para el pintado del error
|
||||
if len(itemlist) > 1:
|
||||
#Pasamos a TMDB la lista completa Itemlist
|
||||
tmdb.set_infoLabels(itemlist, __modo_grafico__)
|
||||
#Llamamos al método para el maquillaje de los títulos obtenidos desde TMDB
|
||||
item, itemlist = generictools.post_tmdb_listado(item, itemlist)
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
#Capturamos el num. de la última página para informala a pié de página
|
||||
@@ -591,7 +613,7 @@ def listado_busqueda(item):
|
||||
item_local = item.clone()
|
||||
if item_local.category:
|
||||
category = item.category
|
||||
del item_local.category
|
||||
item_local.category = item_local.channel.capitalize()
|
||||
item_local.tipo = True
|
||||
del item_local.tipo
|
||||
if item_local.totalItems:
|
||||
@@ -624,9 +646,6 @@ def listado_busqueda(item):
|
||||
title = title.replace(" Latino", "").replace(" latino", "").replace(" Argentina", "").replace(" argentina", "")
|
||||
title = title.replace("Castellano", "").replace("castellano", "").replace("inglés", "").replace("ingles", "").replace("Inglés", "").replace("Ingles", "")
|
||||
|
||||
if "3d" in title or "3D" in title: #Reservamos info para después de TMDB
|
||||
item_local.quality += " 3D"
|
||||
title = title.replace(" [3d]", "").replace(" 3d", "").replace(" [3D]", "").replace(" 3D", "")
|
||||
if "audio" in title.lower(): #Reservamos info de audio para después de TMDB
|
||||
title_subs += ['[%s]' % scrapertools.find_single_match(title, r'(\[[a|A]udio.*?\])')]
|
||||
title = re.sub(r'\[[a|A]udio.*?\]', '', title)
|
||||
@@ -645,7 +664,8 @@ def listado_busqueda(item):
|
||||
title = scrapertools.remove_htmltags(title)
|
||||
|
||||
# Ahora preparamos el título y la calidad tanto para series como para documentales y películas
|
||||
if item.extra == "novedades" and ("Series" in scrapedtype or "Documentales" in scrapedtype):
|
||||
#if item.extra == "novedades" and ("Series" in scrapedtype or "Documentales" in scrapedtype):
|
||||
if item.extra == "novedades":
|
||||
item_local.quality = scrapertools.find_single_match(scrapedtitle, '.*?\[(.*?)\]')
|
||||
else:
|
||||
item_local.quality = scrapertools.remove_htmltags(scrapedquality).decode('utf8').encode('utf8')
|
||||
@@ -660,8 +680,8 @@ def listado_busqueda(item):
|
||||
item_local.extra = "documentales"
|
||||
item_local.contentType = "season"
|
||||
|
||||
title = re.sub(r'\[\d+.*?\]', '', title) # Quitar la calidad del título
|
||||
item_local.contentSerieName = scrapertools.find_single_match(title, '(.*?) Temporada \d+\s?').strip()
|
||||
title = re.sub(r'\[\d+.*?\]', '', title) # Quitar la calidad del título
|
||||
item_local.contentSerieName = scrapertools.find_single_match(title, '(.*?) Temporada\s?(?:\d+)?\s?').strip()
|
||||
if not item_local.contentSerieName:
|
||||
item_local.contentSerieName = title.strip()
|
||||
if item_local.infoLabels['title']:
|
||||
@@ -673,12 +693,17 @@ def listado_busqueda(item):
|
||||
item_local.contentSeason = scrapertools.find_single_match(scrapedurl, 'temporada-?(?:\d+p-)?(\d{1,2})[-|\/]')
|
||||
if not item_local.contentSeason:
|
||||
item_local.contentSeason = 1
|
||||
title = title.replace('Temporada', '').replace('temporada', '')
|
||||
|
||||
if not scrapertools.find_single_match(title, '[\[|\(](.*?)[\)|\]]') in item_local.quality:
|
||||
if item_local.quality:
|
||||
item_local.quality += ' '
|
||||
item_local.quality += scrapertools.find_single_match(title, '[\[|\(](.*?)[\)|\]]')
|
||||
if scrapertools.find_single_match(title, '[\[|\(].*?[\)|\]]\s?[\[|\(](.*?)[\)|\]]') and not scrapertools.find_single_match(title, '[\[|\(].*?[\)|\]]\s?[\[|\(](.*?)[\)|\]]') in item_local.quality:
|
||||
item_local.quality += ' %s' % scrapertools.find_single_match(title, '[\[|\(].*?[\)|\]]\s?[\[|\(](.*?)[\)|\]]')
|
||||
title = re.sub(r'[\[|\(].*?[\)|\]]\s?[\[|\(].*?[\)|\]]', '', title)
|
||||
title = re.sub(r'[\[|\(].*?[\)|\]]', '', title)
|
||||
if "(hdrip" in title.lower() or "(br" in title.lower() or "(vhsrip" in title.lower() or "(dvdrip" in title.lower() or "(fullb" in title.lower() or "(blu" in title.lower() or "(4k" in title.lower() or "(hevc" in title.lower() or "(imax" in title.lower() or "extendida" in title.lower() or "[720p]" in title.lower() or "[1080p]" in title.lower():
|
||||
if not item_local.quality:
|
||||
item_local.quality = scrapertools.find_single_match(title, r'\(.*?\)?\(.*?\)')
|
||||
if not item_local.quality:
|
||||
item_local.quality = scrapertools.find_single_match(title, r'[\[|\(](.*?)[\)|\]]')
|
||||
title = re.sub(r'\(.*?\)?\(.*?\)', '', title)
|
||||
title = re.sub(r'[\[|\(].*?[\)|\]]', '', title)
|
||||
if not item_local.quality:
|
||||
@@ -743,10 +768,12 @@ def listado_busqueda(item):
|
||||
def findvideos(item):
|
||||
logger.info()
|
||||
itemlist = []
|
||||
|
||||
#logger.debug(item)
|
||||
|
||||
data = ''
|
||||
torrent_data = ''
|
||||
headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Referer': item.url} #Necesario para el Post del .Torrent
|
||||
headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Referer': item.url} #Necesario para el Post del .Torrent
|
||||
|
||||
#Llamamos al método para crear el título general del vídeo, con toda la información obtenida de TMDB
|
||||
item, itemlist = generictools.post_tmdb_findvideos(item, itemlist)
|
||||
@@ -781,7 +808,7 @@ def findvideos(item):
|
||||
#logger.debug(matches)
|
||||
#logger.debug(data)
|
||||
|
||||
for scrapedurl, name1, value1, value2, name2 in matches:
|
||||
for scrapedurl, name1, value1, value2, name2 in matches: #Hacemos el FOR aunque solo habrá un item
|
||||
#Generamos una copia de Item para trabajar sobre ella
|
||||
item_local = item.clone()
|
||||
url = scrapedurl
|
||||
@@ -790,19 +817,18 @@ def findvideos(item):
|
||||
post = '%s=%s&%s=%s' % (name1, value1, name2, value2)
|
||||
try:
|
||||
torrent_data = httptools.downloadpage(url, post=post, headers=headers, follow_redirects=False)
|
||||
except: #error
|
||||
except: #error
|
||||
pass
|
||||
|
||||
else:
|
||||
#Generamos una copia de Item para trabajar sobre ella
|
||||
#Viene de SERIES y DOCUMENTALES. Generamos una copia de Item para trabajar sobre ella
|
||||
item_local = item.clone()
|
||||
try: #Localiza el .torrent en el siguiente link con Post. Viene de Documentales y Varios
|
||||
url = item.url_post
|
||||
torrent_data = httptools.downloadpage(url, post=item.post, headers=headers, follow_redirects=False)
|
||||
except:
|
||||
pass
|
||||
|
||||
#logger.debug(torrent_data.headers)
|
||||
|
||||
if not torrent_data:
|
||||
item = generictools.web_intervenida(item, data) #Verificamos que no haya sido clausurada
|
||||
if item.intervencion: #Sí ha sido clausurada judicialmente
|
||||
@@ -813,7 +839,8 @@ def findvideos(item):
|
||||
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'))
|
||||
return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
|
||||
|
||||
item_local.url = torrent_data.headers['location'] #Capturamos la url del .torrent desde el Header
|
||||
#Capturamos la url del .torrent desde el Header
|
||||
item_local.url = torrent_data.headers['location'] if 'location' in torrent_data.headers else item.url_post
|
||||
item_local.url = item_local.url.replace(" ", "%20") #Quitamos espacios
|
||||
|
||||
# Poner la calidad, si es necesario
|
||||
@@ -838,14 +865,14 @@ def findvideos(item):
|
||||
|
||||
#Ahora pintamos el link del Torrent, si lo hay
|
||||
if item_local.url: # Hay Torrent ?
|
||||
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Torrent
|
||||
item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Torrent
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\[?\]?\]\[\/COLOR\]', '', item_local.title) #Quitamos etiquetas vacías
|
||||
item_local.title = re.sub(r'\s\[COLOR \w+\]\[\/COLOR\]', '', item_local.title) #Quitamos colores vacíos
|
||||
item_local.alive = "??" #Calidad del link sin verificar
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = "torrent" #Seridor Torrent
|
||||
item_local.alive = "??" #Calidad del link sin verificar
|
||||
item_local.action = "play" #Visualizar vídeo
|
||||
item_local.server = "torrent" #Seridor Torrent
|
||||
|
||||
itemlist.append(item_local.clone()) #Pintar pantalla
|
||||
itemlist.append(item_local.clone()) #Pintar pantalla
|
||||
|
||||
#logger.debug("title=[" + item.title + "], torrent=[ " + item_local.url + " ], url=[ " + url + " ], post=[" + item.post + "], thumbnail=[ " + item.thumbnail + " ]" + " size: " + size)
|
||||
#logger.debug(item_local)
|
||||
@@ -862,28 +889,38 @@ def episodios(item):
|
||||
tmdb.set_infoLabels(item, True)
|
||||
|
||||
# Carga la página
|
||||
data = ''
|
||||
data_ini = ''
|
||||
try:
|
||||
data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
||||
data = data.replace('"', "'")
|
||||
except: #Algún error de proceso, salimos
|
||||
data_ini = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data)
|
||||
data_ini = data_ini.replace('"', "'")
|
||||
except: #Algún error de proceso, salimos
|
||||
pass
|
||||
|
||||
if not data:
|
||||
if not data_ini:
|
||||
logger.error("ERROR 01: EPISODIOS: La Web no responde o la URL es erronea" + item.url)
|
||||
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'))
|
||||
return itemlist
|
||||
|
||||
# Selecciona en tramo que nos interesa
|
||||
data = scrapertools.find_single_match(data, "(<form (?:style='[^']+'\s)?name='episodios' action='[^']+' method='post'>.*?)<\/form>")
|
||||
data = scrapertools.find_single_match(data_ini, "(<form (?:style='[^']+'\s)?name='episodios' action='[^']+' method='post'>.*?)<\/form>")
|
||||
|
||||
# Prepara el patrón de búsqueda
|
||||
if item.extra == "documentales":
|
||||
patron = "<form (?:style='[^']+'\s)?name='episodios' action='([^']+)'.*?<input type='hidden' value='([^']+)' name='([^']+)'>"
|
||||
url, value2, name2 = scrapertools.find_single_match(data, patron)
|
||||
patron = "<input type='\w+' name='([^']+)' value='([^']+)'>"
|
||||
else:
|
||||
patron = "<td bgcolor='[^>]+><a href='([^']+)'>[^<]+<\/a><\/td><td[^>]+><div[^>]+>([^<]+)?<\/div><\/td>"
|
||||
patron = "<form (?:style='[^']+'\s)?name='episodios' action='([^']+)'"
|
||||
url = scrapertools.find_single_match(data, patron) #Salvamos la url de descarga
|
||||
url = url.replace('descargar_series.php', 'descargar.php') #ESTA DESCARGARÍA EL TORRENT EN VEZ DEL ENLACE
|
||||
patron = "<form (?:style='[^']+'\s)?name='episodios' action='[^']+'.*?<input type='hidden' value='([^']+)' name='([^']+)'>"
|
||||
value2 = '' #Patrón general para Documentales (1)
|
||||
name2 = ''
|
||||
if scrapertools.find_single_match(data, patron):
|
||||
value2, name2 = scrapertools.find_single_match(data, patron) #extraemos valores para el Post
|
||||
|
||||
patron = "<td bgcolor='[^>]+><a href='([^']+)'>[^<]+<\/a><\/td><td[^>]+><div[^>]+>[^<]+?<\/div><\/td>.*?<input type='\w+'\s?name='([^']+)'\s?value='([^']+)'>\s?<\/td><\/tr>" #Patrón para series con Post
|
||||
if not scrapertools.find_single_match(data, patron):
|
||||
patron = "<form name='episodios' action='([^']+)'.*?<input type='\w+' name='([^']+)' value='([^']+)'>"
|
||||
if not scrapertools.find_single_match(data, patron): #Patrón para documentales (2)
|
||||
#Si no han funcionado los anteriores, usamos el tradicional para series sin Post
|
||||
patron = "<td bgcolor='[^>]+><a href='([^']+)'>[^<]+<\/a><\/td><td[^>]+><div([^>]+)>([^<]+)?<\/div><\/td>"
|
||||
|
||||
matches = re.compile(patron, re.DOTALL).findall(data)
|
||||
if not matches: #error
|
||||
item = generictools.web_intervenida(item, data) #Verificamos que no haya sido clausurada
|
||||
@@ -891,16 +928,16 @@ def episodios(item):
|
||||
item, itemlist = generictools.post_tmdb_episodios(item, itemlist) #Llamamos al método para el pintado del error
|
||||
return itemlist #Salimos
|
||||
|
||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data)
|
||||
logger.error("ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA_INI: " + data_ini + " / 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'))
|
||||
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: " + patron)
|
||||
#logger.debug(matches)
|
||||
#logger.debug(data)
|
||||
|
||||
# Recorremos todos los episodios generando un Item local por cada uno en Itemlist
|
||||
for scrapedurl, year in matches:
|
||||
for scrapedurl, name1, value1 in matches:
|
||||
item_local = item.clone()
|
||||
item_local.action = "findvideos"
|
||||
item_local.contentType = "episode"
|
||||
@@ -922,43 +959,40 @@ def episodios(item):
|
||||
item_local.context = "['buscar_trailer']"
|
||||
item_local.url = scrapedurl
|
||||
|
||||
if item.extra == "documentales": #llamada con post
|
||||
name1 = scrapedurl
|
||||
value1 = year
|
||||
item_local.url = item.url
|
||||
item_local.url_post = url
|
||||
item_local.post = '%s=%s&%s=%s' % (name1, value1, name2, value2)
|
||||
item_local.contentSeason = 1
|
||||
try:
|
||||
item_local.contentEpisodeNumber = int(value1) + 1
|
||||
except:
|
||||
item_local.contentEpisodeNumber = 1
|
||||
|
||||
else:
|
||||
scrapedtemp, scrapedepi = scrapertools.find_single_match(item_local.url, "\/.*?-(\d{1,2})x(\d{1,2})[-|\/]")
|
||||
scrapedepi2 = scrapertools.find_single_match(item_local.url, "\/.*?-\d{1,2}x\d{1,2}-al-\d{1,2}x(\d{1,2})[-|\/]")
|
||||
item_local.title = '%sx%s -' % (scrapedtemp, str(scrapedepi).zfill(2))
|
||||
try:
|
||||
item_local.contentSeason = int(scrapedtemp)
|
||||
except:
|
||||
item_local.contentSeason = 1
|
||||
try:
|
||||
item_local.contentEpisodeNumber = int(scrapedepi)
|
||||
except:
|
||||
item_local.contentEpisodeNumber = 1
|
||||
try:
|
||||
scrapedepi2 = int(scrapedepi2)
|
||||
except:
|
||||
scrapedepi2 = ''
|
||||
|
||||
if scrapedepi2:
|
||||
item_local.title = '%sx%s al %s -' % (scrapedtemp, str(scrapedepi).zfill(2), str(scrapedepi2).zfill(2))
|
||||
#item_local.infoLabels['episodio_titulo'] = 'al %s' % scrapedepi2
|
||||
else:
|
||||
item_local.title = '%sx%s -' % (scrapedtemp, str(scrapedepi).zfill(2))
|
||||
if name1 and value1: #llamada con post
|
||||
item_local.url = item.url #Dejamos la url de la Temporada como Refer
|
||||
item_local.url_post = url #Ponemos la url de Descarga (retocado)
|
||||
item_local.post = '%s=%s' % (name1, value1) #Ponemos la primera pareja de valores
|
||||
if not name2 and not value2: #Si no hay segunda pareja...
|
||||
item_local.post = '%s=0&id_post=%s' % (name1, value1) #... adaptamos el formato final
|
||||
if name2 and value2: #Si hay segunda pareja, la añadimos
|
||||
if item_local.post:
|
||||
item_local.post += '&'
|
||||
item_local.post += '%s=%s' % (name2, value2)
|
||||
|
||||
if year:
|
||||
item_local.infoLabels['year'] = scrapertools.find_single_match(year, r"(\d{4})")
|
||||
scrapedtemp = ''
|
||||
scrapedepi = ''
|
||||
if scrapertools.find_single_match(scrapedurl, "\/.*?-(\d{1,2})x(\d{1,2})[-|\/]"):
|
||||
scrapedtemp, scrapedepi = scrapertools.find_single_match(scrapedurl, "\/.*?-(\d{1,2})x(\d{1,2})[-|\/]")
|
||||
scrapedepi2 = scrapertools.find_single_match(scrapedurl, "\/.*?-\d{1,2}x\d{1,2}-al-\d{1,2}x(\d{1,2})[-|\/]")
|
||||
try:
|
||||
item_local.contentSeason = int(scrapedtemp)
|
||||
except:
|
||||
item_local.contentSeason = 1
|
||||
try:
|
||||
item_local.contentEpisodeNumber = int(scrapedepi)
|
||||
except:
|
||||
item_local.contentEpisodeNumber = 1
|
||||
try:
|
||||
scrapedepi2 = int(scrapedepi2)
|
||||
except:
|
||||
scrapedepi2 = ''
|
||||
|
||||
if scrapedepi2:
|
||||
item_local.title = '%sx%s al %s -' % (str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2), str(scrapedepi2).zfill(2))
|
||||
#item_local.infoLabels['episodio_titulo'] = 'al %s' % scrapedepi2
|
||||
else:
|
||||
item_local.title = '%sx%s -' % (str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2))
|
||||
|
||||
itemlist.append(item_local.clone())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user