From 2130898fdd2126f4aaa2bc05433ad6136b118abe Mon Sep 17 00:00:00 2001 From: Kingbox <37674310+lopezvg@users.noreply.github.com> Date: Wed, 19 Sep 2018 14:51:46 +0200 Subject: [PATCH] AutoPlay y Filtrado de Idiomas: canales Torrent DivXtotal EliteTorrent EstrenosGo GranTorrent MejorTorrent NewPct1 ZonaTorrent --- plugin.video.alfa/channels/divxtotal.json | 16 ++ plugin.video.alfa/channels/divxtotal.py | 58 +++++- plugin.video.alfa/channels/elitetorrent.json | 57 +++++- plugin.video.alfa/channels/elitetorrent.py | 117 ++++++++++-- plugin.video.alfa/channels/estrenosgo.json | 16 ++ plugin.video.alfa/channels/estrenosgo.py | 116 +++++++++--- plugin.video.alfa/channels/grantorrent.json | 47 ++++- plugin.video.alfa/channels/grantorrent.py | 130 +++++++++++--- plugin.video.alfa/channels/mejortorrent1.py | 13 +- plugin.video.alfa/channels/newpct1.json | 16 ++ plugin.video.alfa/channels/newpct1.py | 179 ++++++++++++++++--- plugin.video.alfa/channels/zonatorrent.json | 40 ++--- plugin.video.alfa/channels/zonatorrent.py | 84 +++++++-- plugin.video.alfa/lib/generictools.py | 85 +++++++-- 14 files changed, 823 insertions(+), 151 deletions(-) diff --git a/plugin.video.alfa/channels/divxtotal.json b/plugin.video.alfa/channels/divxtotal.json index bf1c4ac6..811b5e44 100644 --- a/plugin.video.alfa/channels/divxtotal.json +++ b/plugin.video.alfa/channels/divxtotal.json @@ -27,6 +27,22 @@ "type": "bool", "visible": true }, + { + "id": "filter_languages", + "type": "list", + "label": "Mostrar enlaces en idioma...", + "default": 0, + "enabled": true, + "visible": true, + "lvalues": [ + "No filtrar", + "CAST", + "LAT", + "VO", + "VOS", + "VOSE" + ] + }, { "id": "timeout_downloadpage", "type": "list", diff --git a/plugin.video.alfa/channels/divxtotal.py b/plugin.video.alfa/channels/divxtotal.py index 1a0deaf5..b5ed39f6 100644 --- a/plugin.video.alfa/channels/divxtotal.py +++ b/plugin.video.alfa/channels/divxtotal.py @@ -14,6 +14,15 @@ from core.item import Item from platformcode import config, logger from core import tmdb from lib import generictools +from channels import filtertools +from channels import autoplay + + +#IDIOMAS = {'CAST': 'Castellano', 'LAT': 'Latino', 'VO': 'Version Original'} +IDIOMAS = {'Castellano': 'CAST', 'Latino': 'LAT', 'Version Original': 'VO'} +list_language = IDIOMAS.values() +list_quality = [] +list_servers = ['torrent'] host = 'https://www.divxtotal3.net/' channel = 'divxtotal' @@ -33,6 +42,9 @@ def mainlist(item): thumb_series = get_thumb("channels_tvshow.png") thumb_buscar = get_thumb("search.png") thumb_separador = get_thumb("next.png") + thumb_settings = get_thumb("setting_0.png") + + autoplay.init(item.channel, list_servers, list_quality) item.url_plus = "peliculas/" itemlist.append(Item(channel=item.channel, title="Películas", action="categorias", url=host + item.url_plus, url_plus=item.url_plus, thumbnail=thumb_cartelera, extra="Películas")) @@ -49,7 +61,20 @@ def mainlist(item): itemlist.append(Item(channel=item.channel, title="Buscar...", action="search", url=host + "?s=%s", thumbnail=thumb_buscar, extra="search")) + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR yellow]Configuración:[/COLOR]", folder=False, thumbnail=thumb_separador)) + + itemlist.append(Item(channel=item.channel, action="configuracion", title="Configurar canal", thumbnail=thumb_settings)) + + autoplay.show_option(item.channel, itemlist) #Activamos Autoplay + return itemlist + + +def configuracion(item): + from platformcode import platformtools + ret = platformtools.show_channel_settings() + platformtools.itemlist_refresh() + return def submenu(item): @@ -174,7 +199,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 - fin = inicio + 10 # Después de este tiempo pintamos (segundos) + fin = inicio + 5 # Después de este tiempo pintamos (segundos) timeout_search = timeout # Timeout para descargas if item.extra == 'search': timeout_search = timeout * 2 # Timeout un poco más largo para las búsquedas @@ -287,7 +312,7 @@ def listado(item): else: url = scrapedurl #No se encuentra la Serie, se trata como Episodio suelto - cnt_title += 1 + #cnt_title += 1 item_local = item.clone() #Creamos copia de Item para trabajar if item_local.tipo: #... y limpiamos del item_local.tipo @@ -458,7 +483,13 @@ def listado(item): item_local.contentSeason_save = item_local.contentSeason del item_local.infoLabels['season'] - itemlist.append(item_local.clone()) #Pintar pantalla + #Ahora se filtra por idioma, si procede, y se pinta lo que vale + if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra + itemlist = filtertools.get_link(itemlist, item_local, list_language) + else: + itemlist.append(item_local.clone()) #Si no, pintar pantalla + + cnt_title = len(itemlist) #Contador de líneas añadidas #logger.debug(item_local) @@ -483,6 +514,10 @@ def listado(item): def findvideos(item): logger.info() itemlist = [] + itemlist_t = [] #Itemlist total de enlaces + itemlist_f = [] #Itemlist de enlaces filtrados + if not item.language: + item.language = ['CAST'] #Castellano por defecto matches = [] item.category = categoria @@ -552,11 +587,26 @@ def findvideos(item): item_local.action = "play" #Visualizar vídeo item_local.server = "torrent" #Seridor Torrent - itemlist.append(item_local.clone()) #Pintar pantalla + itemlist_t.append(item_local.clone()) #Pintar pantalla, si no se filtran idiomas + + # Requerido para FilterTools + if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra + itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío #logger.debug("TORRENT: " + scrapedurl + " / title gen/torr: " + item.title + " / " + item_local.title + " / calidad: " + item_local.quality + " / content: " + item_local.contentTitle + " / " + item_local.contentSerieName) #logger.debug(item_local) + if len(itemlist_f) > 0: #Si hay entradas filtradas... + itemlist.extend(itemlist_f) #Pintamos pantalla filtrada + else: + if config.get_setting('filter_languages', channel) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... + thumb_separador = get_thumb("next.png") #... pintamos todo con aviso + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) + itemlist.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado + + # Requerido para AutoPlay + autoplay.start(itemlist, item) #Lanzamos Autoplay + return itemlist diff --git a/plugin.video.alfa/channels/elitetorrent.json b/plugin.video.alfa/channels/elitetorrent.json index ec17889b..50d2e298 100644 --- a/plugin.video.alfa/channels/elitetorrent.json +++ b/plugin.video.alfa/channels/elitetorrent.json @@ -21,6 +21,59 @@ "default": false, "enabled": true, "visible": true + }, + { + "id": "modo_grafico", + "type": "bool", + "label": "Buscar información extra en TMDB", + "default": true, + "enabled": true, + "visible": true + }, + { + "id": "filter_languages", + "type": "list", + "label": "Mostrar enlaces en idioma...", + "default": 0, + "enabled": true, + "visible": true, + "lvalues": [ + "No filtrar", + "CAST", + "LAT", + "VO", + "VOS", + "VOSE" + ] + }, + { + "id": "include_in_newest_peliculas", + "type": "bool", + "label": "Incluir en Novedades - Peliculas", + "default": true, + "enabled": true, + "visible": true + }, + { + "id": "timeout_downloadpage", + "type": "list", + "label": "Timeout (segs.) en descarga de páginas o verificación de servidores", + "default": 5, + "enabled": true, + "visible": true, + "lvalues": [ + "None", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10" + ] } - ] -} + ] +} \ No newline at end of file diff --git a/plugin.video.alfa/channels/elitetorrent.py b/plugin.video.alfa/channels/elitetorrent.py index 1a052a4a..2e2b6029 100644 --- a/plugin.video.alfa/channels/elitetorrent.py +++ b/plugin.video.alfa/channels/elitetorrent.py @@ -4,6 +4,7 @@ import re import sys import urllib import urlparse +import time from channelselector import get_thumb from core import httptools @@ -13,8 +14,22 @@ from core.item import Item from platformcode import config, logger from core import tmdb from lib import generictools +from channels import filtertools +from channels import autoplay + + +#IDIOMAS = {'CAST': 'Castellano', 'LAT': 'Latino', 'VO': 'Version Original'} +IDIOMAS = {'Castellano': 'CAST', 'Latino': 'LAT', 'Version Original': 'VO'} +list_language = IDIOMAS.values() +list_quality = [] +list_servers = ['torrent'] host = 'http://www.elitetorrent.biz' +channel = "elitetorrent" + +categoria = channel.capitalize() +__modo_grafico__ = config.get_setting('modo_grafico', channel) +timeout = config.get_setting('timeout_downloadpage', channel) def mainlist(item): @@ -26,19 +41,37 @@ def mainlist(item): thumb_series = get_thumb("channels_tvshow.png") thumb_series_hd = get_thumb("channels_tvshow_hd.png") thumb_buscar = get_thumb("search.png") + thumb_separador = get_thumb("next.png") + thumb_settings = get_thumb("setting_0.png") + + autoplay.init(item.channel, list_servers, list_quality) itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host, extra="peliculas", thumbnail=thumb_pelis)) itemlist.append(Item(channel=item.channel, action="submenu", title="Series", url=host, extra="series", thumbnail=thumb_series)) - itemlist.append(Item(channel=item.channel, action="search", title="Buscar", url=host, thumbnail=thumb_buscar)) + itemlist.append(Item(channel=item.channel, action="search", title="Buscar", url=host, thumbnail=thumb_buscar, filter_lang=True)) + + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR yellow]Configuración:[/COLOR]", folder=False, thumbnail=thumb_separador)) + + itemlist.append(Item(channel=item.channel, action="configuracion", title="Configurar canal", thumbnail=thumb_settings)) + + autoplay.show_option(item.channel, itemlist) #Activamos Autoplay return itemlist +def configuracion(item): + from platformcode import platformtools + ret = platformtools.show_channel_settings() + platformtools.itemlist_refresh() + return + + def submenu(item): logger.info() itemlist = [] + item.filter_lang = True data = '' try: @@ -84,10 +117,13 @@ def submenu(item): if "/serie" in scrapedurl: continue + if 'subtitulado' in scrapedtitle.lower() or 'latino' in scrapedtitle.lower() or 'original' in scrapedtitle.lower(): + item.filter_lang = False + itemlist.append(item.clone(action="listado", title=scrapedtitle, url=scrapedurl)) 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/")) + itemlist.append(item.clone(action="listado", title="Series VOSE", url=host + "/series-vose/", filter_lang=False)) return itemlist @@ -96,10 +132,18 @@ def listado(item): logger.info() itemlist = [] + inicio = time.time() # Controlaremos que el proceso no exceda de un tiempo razonable + fin = inicio + 5 # Después de este tiempo pintamos (segundos) + timeout_search = timeout # Timeout para descargas + if item.extra == 'search': + timeout_search = timeout * 2 # Timeout un poco más largo para las búsquedas + if timeout_search < 5: + timeout_search = 5 # Timeout un poco más largo para las búsquedas + # Descarga la página data = '' try: - data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item.url).data) + data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item.url, timeout=timeout_search).data) except: pass @@ -168,6 +212,9 @@ def listado(item): item_local.language += ["VO"] if "dual" in scrapedcategory.lower() or "dual" in title.lower(): item_local.language[0:0] = ["DUAL"] + + if item_local.language == []: + item_local.language = ['CAST'] #Por defecto #Limpiamos el título de la basura innecesaria title = title.replace("Dual", "").replace("dual", "").replace("Subtitulada", "").replace("subtitulada", "").replace("Subt", "").replace("subt", "").replace("Sub", "").replace("sub", "").replace("(Proper)", "").replace("(proper)", "").replace("Proper", "").replace("proper", "").replace("#", "").replace("(Latino)", "").replace("Latino", "") @@ -215,10 +262,14 @@ def listado(item): item_local.infoLabels['year'] = "-" #Pasamos a TMDB cada Item, para evitar el efecto memoria de tmdb - 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) + #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 + #Ahora se filtra por idioma, si procede, y se pinta lo que vale + if config.get_setting('filter_languages', channel) > 0 and item.filter_lang: #Si hay idioma seleccionado, se filtra + itemlist = filtertools.get_link(itemlist, item_local, list_language) + else: + itemlist.append(item_local.clone()) #Si no, 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 @@ -250,7 +301,7 @@ def listado(item): else: title = '[COLOR gold]Página siguiente >>[/COLOR] %s' % (int(matches[1]) - 1) - itemlist.append(Item(channel=item.channel, action="listado", title=title, url=scrapedurl, extra=item.extra)) + itemlist.append(Item(channel=item.channel, action="listado", title=title, url=scrapedurl, extra=item.extra, filter_lang=item.filter_lang)) return itemlist @@ -258,11 +309,15 @@ def listado(item): def findvideos(item): logger.info() itemlist = [] + itemlist_t = [] #Itemlist total de enlaces + itemlist_f = [] #Itemlist de enlaces filtrados + if not item.language: + item.language = ['CAST'] #Castellano por defecto #Bajamos los datos de la página data = '' try: - data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item.url).data) + data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item.url, timeout=timeout).data) except: pass @@ -308,12 +363,12 @@ def findvideos(item): if size: item.quality = '%s [%s]' % (item.quality, size) #Agregamos size al final de calidad item.quality = item.quality.replace("GB", "G B").replace("MB", "M B") #Se evita la palabra reservada en Unify - - #Generamos una copia de Item para trabajar sobre ella - item_local = item.clone() #Ahora pintamos el link del Torrent, si lo hay - if link_torrent: # Hay Torrent ? + if link_torrent: # Hay Torrent ? + #Generamos una copia de Item para trabajar sobre ella + item_local = item.clone() + if item_local.quality: item_local.quality += " " item_local.quality += "[Torrent]" @@ -332,10 +387,27 @@ def findvideos(item): item_local.action = "play" #Visualizar vídeo item_local.server = "torrent" #Seridor Torrent - itemlist.append(item_local.clone()) #Pintar pantalla + itemlist_t.append(item_local.clone()) #Pintar pantalla, si no se filtran idiomas + + # Requerido para FilterTools + if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra + itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío + + if len(itemlist_f) > 0: #Si hay entradas filtradas... + itemlist.extend(itemlist_f) #Pintamos pantalla filtrada + else: + if config.get_setting('filter_languages', channel) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... + thumb_separador = get_thumb("next.png") #... pintamos todo con aviso + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) + itemlist.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado #Ahora pintamos el link del Magnet, si lo hay + itemlist_t = [] #Itemlist total de enlaces + itemlist_f = [] #Itemlist de enlaces filtrados if link_magnet: # Hay Magnet ? + #Generamos una copia de Item para trabajar sobre ella + item_local = item.clone() + if item_local.quality: item_local.quality += " " item_local.quality = item_local.quality.replace("[Torrent]", "") + "[Magnet]" @@ -347,11 +419,26 @@ def findvideos(item): item_local.action = "play" #Visualizar vídeo item_local.server = "torrent" #Seridor Torrent - itemlist.append(item_local.clone()) #Pintar pantalla + itemlist_t.append(item_local.clone()) #Pintar pantalla, si no se filtran idiomas + + # Requerido para FilterTools + if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra + itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío + + if len(itemlist_f) > 0: #Si hay entradas filtradas... + itemlist.extend(itemlist_f) #Pintamos pantalla filtrada + else: + if config.get_setting('filter_languages', channel) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... + thumb_separador = get_thumb("next.png") #... pintamos todo con aviso + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) + itemlist.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado #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) + # Requerido para AutoPlay + autoplay.start(itemlist, item) #Lanzamos Autoplay + return itemlist @@ -387,7 +474,7 @@ def newest(categoria): itemlist = [] item = Item() try: - if categoria == 'torrent': + if categoria == 'peliculas': item.url = host item.extra = "peliculas" item.category_new= 'newest' diff --git a/plugin.video.alfa/channels/estrenosgo.json b/plugin.video.alfa/channels/estrenosgo.json index bf922a70..5ebbbafc 100755 --- a/plugin.video.alfa/channels/estrenosgo.json +++ b/plugin.video.alfa/channels/estrenosgo.json @@ -31,6 +31,22 @@ "type": "bool", "visible": true }, + { + "id": "filter_languages", + "type": "list", + "label": "Mostrar enlaces en idioma...", + "default": 0, + "enabled": true, + "visible": true, + "lvalues": [ + "No filtrar", + "CAST", + "LAT", + "VO", + "VOS", + "VOSE" + ] + }, { "id": "timeout_downloadpage", "type": "list", diff --git a/plugin.video.alfa/channels/estrenosgo.py b/plugin.video.alfa/channels/estrenosgo.py index 52b00848..796c77e6 100644 --- a/plugin.video.alfa/channels/estrenosgo.py +++ b/plugin.video.alfa/channels/estrenosgo.py @@ -14,12 +14,23 @@ from core.item import Item from platformcode import config, logger, platformtools from core import tmdb from lib import generictools +from channels import filtertools +from channels import autoplay + + +#IDIOMAS = {'CAST': 'Castellano', 'LAT': 'Latino', 'VO': 'Version Original'} +IDIOMAS = {'Castellano': 'CAST', 'Latino': 'LAT', 'Version Original': 'VO'} +list_language = IDIOMAS.values() +list_quality = [] +list_servers = ['torrent'] host = 'http://estrenosby.net/' # 'http://estrenosli.org/' +channel = "estrenosgo" + color1, color2, color3 = ['0xFF58D3F7', '0xFF2E64FE', '0xFF0404B4'] -__modo_grafico__ = config.get_setting('modo_grafico', 'estrenosgo') -modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', 'estrenosgo') #Actualización sólo últ. Temporada? -timeout = config.get_setting('timeout_downloadpage', 'estrenosgo') +__modo_grafico__ = config.get_setting('modo_grafico', channel) +modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', channel) #Actualización sólo últ. Temporada? +timeout = config.get_setting('timeout_downloadpage', channel) def mainlist(item): @@ -37,28 +48,41 @@ def mainlist(item): thumb_buscar = get_thumb("search.png") thumb_separador = get_thumb("next.png") thumb_cabecera = get_thumb("nofolder.png") + thumb_settings = get_thumb("setting_0.png") + + autoplay.init(item.channel, list_servers, list_quality) itemlist.append(Item(channel=item.channel, url=host, title="PELÍCULAS: ", folder=False, thumbnail=thumb_pelis)) - itemlist.append(Item(channel=item.channel, title=" - Cartelera", action="categorias", url=item.url + "descarga-0-58126", thumbnail=thumb_cartelera, extra="cartelera")) - itemlist.append(Item(channel=item.channel, title=" - DVD-RIP", action="categorias", url=item.url + "descarga-0-581210", thumbnail=thumb_pelis, extra="DVD-RIP")) - itemlist.append(Item(channel=item.channel, title=" - HD-RIP", action="categorias", url=item.url + "descarga-0-58128", thumbnail=thumb_pelis_hd, extra="HD-RIP")) - itemlist.append(Item(channel=item.channel, title=" - Subtituladas", action="categorias", url=item.url + "descarga-0-58127", thumbnail=thumb_pelis_VO, extra="VOSE")) - itemlist.append(Item(channel=item.channel, title=" - Versión Original", action="categorias", url=item.url + "descarga-0-5812255", thumbnail=thumb_pelis_VO, extra="VO")) - - itemlist.append(Item(channel=item.channel, url=host, title="", folder=False, thumbnail=thumb_separador)) + itemlist.append(Item(channel=item.channel, title=" - Cartelera", action="categorias", url=item.url + "descarga-0-58126", thumbnail=thumb_cartelera, extra="cartelera", filter_lang=True)) + itemlist.append(Item(channel=item.channel, title=" - DVD-RIP", action="categorias", url=item.url + "descarga-0-581210", thumbnail=thumb_pelis, extra="DVD-RIP", filter_lang=True)) + itemlist.append(Item(channel=item.channel, title=" - HD-RIP", action="categorias", url=item.url + "descarga-0-58128", thumbnail=thumb_pelis_hd, extra="HD-RIP", filter_lang=True)) + itemlist.append(Item(channel=item.channel, title=" - Subtituladas", action="categorias", url=item.url + "descarga-0-58127", thumbnail=thumb_pelis_VO, extra="VOSE", filter_lang=False)) + itemlist.append(Item(channel=item.channel, title=" - Versión Original", action="categorias", url=item.url + "descarga-0-5812255", thumbnail=thumb_pelis_VO, extra="VO", filter_lang=False)) itemlist.append(Item(channel=item.channel, url=host, title="Series", action="submenu", thumbnail=thumb_series, extra="series")) - - itemlist.append(Item(channel=item.channel, url=host, title="", folder=False, thumbnail=thumb_separador)) itemlist.append(Item(channel=item.channel, title="Buscar...", action="search", url=host + "descarga-0-0-0-0-fx-1-%s-sch-titulo-", thumbnail=thumb_buscar, extra="search")) + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR yellow]Configuración:[/COLOR]", folder=False, thumbnail=thumb_separador)) + + itemlist.append(Item(channel=item.channel, action="configuracion", title="Configurar canal", thumbnail=thumb_settings)) + + autoplay.show_option(item.channel, itemlist) #Activamos Autoplay + return itemlist + + +def configuracion(item): + from platformcode import platformtools + ret = platformtools.show_channel_settings() + platformtools.itemlist_refresh() + return def submenu(item): logger.info() itemlist = [] + item.filter_lang = True thumb_cartelera = get_thumb("now_playing.png") thumb_pelis = get_thumb("channels_movie.png") @@ -183,7 +207,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 - fin = inicio + 10 # Después de este tiempo pintamos (segundos) + fin = inicio + 5 # Después de este tiempo pintamos (segundos) timeout_search = timeout # Timeout para descargas if item.extra == 'search': timeout_search = timeout * 2 # Timeout un poco más largo para las búsquedas @@ -306,7 +330,7 @@ def listado(item): elif "Archivo Torrent" not in scrapedenlace and "Video Online" not in scrapedenlace: #Si no tiene enlaces pasamos continue - cnt_title += 1 + #cnt_title += 1 item_local = item.clone() #Creamos copia de Item para trabajar if item_local.tipo: #... y limpiamos del item_local.tipo @@ -326,6 +350,8 @@ def listado(item): del item_local.text_bold item_local.text_color = True del item_local.text_color + item_local.filter_lang = True + del item_local.filter_lang title_subs = [] #creamos una lista para guardar info importante item_local.language = [] #creamos lista para los idiomas @@ -473,7 +499,13 @@ def listado(item): item_local.contentSeason_save = item_local.contentSeason del item_local.infoLabels['season'] - itemlist.append(item_local.clone()) #Pintar pantalla + #Ahora se filtra por idioma, si procede, y se pinta lo que vale + if config.get_setting('filter_languages', channel) > 0 and item.filter_lang: #Si hay idioma seleccionado, se filtra + itemlist = filtertools.get_link(itemlist, item_local, list_language) + else: + itemlist.append(item_local.clone()) #Si no, pintar pantalla + + cnt_title = len(itemlist) #Contador de líneas añadidas #logger.debug(item_local) @@ -490,7 +522,7 @@ def listado(item): else: title = '%s' % curr_page-1 - itemlist.append(Item(channel=item.channel, action="listado", title=">> Página siguiente " + title, title_lista=title_lista, url=item.url, extra=item.extra, extra2=item.extra2, last_page=str(last_page), curr_page=str(curr_page))) + itemlist.append(Item(channel=item.channel, action="listado", title=">> Página siguiente " + title, title_lista=title_lista, url=item.url, extra=item.extra, extra2=item.extra2, last_page=str(last_page), curr_page=str(curr_page), filter_lang=item.filter_lang)) return itemlist @@ -572,8 +604,12 @@ def listado_series(item): item_local.title = title.strip().lower().title() item_local.from_title = title.strip().lower().title() - itemlist.append(item_local.clone()) #Pintar pantalla - + #Ahora se filtra por idioma, si procede, y se pinta lo que vale + if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra + itemlist = filtertools.get_link(itemlist, item_local, list_language) + else: + itemlist.append(item_local.clone()) #Si no, pintar pantalla + #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 @@ -598,6 +634,10 @@ def listado_series(item): def findvideos(item): logger.info() itemlist = [] + itemlist_t = [] #Itemlist total de enlaces + itemlist_f = [] #Itemlist de enlaces filtrados + if not item.language: + item.language = ['CAST'] #Castellano por defecto #logger.debug(item) @@ -682,7 +722,7 @@ def findvideos(item): #Ahora tratamos los enlaces .torrent itemlist_alt = [] #Usamos una lista intermedia para poder ordenar los episodios if matches_torrent: - for scrapedurl, scrapedquality, scrapedlang in matches_torrent: #leemos los torrents con la diferentes calidades + for scrapedurl, scrapedquality, scrapedlang in matches_torrent: #leemos los torrents con la diferentes calidades #Generamos una copia de Item para trabajar sobre ella item_local = item.clone() @@ -695,7 +735,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]] @@ -718,6 +758,7 @@ def findvideos(item): #logger.debug(data) for scrapedtorrent, scrapedtitle in matches: + item_local = item_local.clone() quality = item_local.quality qualityscraped = '' if not item_local.contentEpisodeNumber and item_local.contentType == 'episode': @@ -773,11 +814,23 @@ def findvideos(item): item_local.action = "play" #Visualizar vídeo item_local.server = "torrent" #Seridor Torrent - itemlist_alt.append(item_local.clone(quality=quality)) #Pintar pantalla + itemlist_t.append(item_local.clone(quality=quality)) #Pintar pantalla, si no se filtran idiomas + + # Requerido para FilterTools + if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra + itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío #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) + if len(itemlist_f) > 0: #Si hay entradas filtradas... + itemlist_alt.extend(itemlist_f) #Pintamos pantalla filtrada + else: + if config.get_setting('filter_languages', channel) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... + thumb_separador = get_thumb("next.png") #... pintamos todo con aviso + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) + itemlist_alt.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado + #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 @@ -786,6 +839,8 @@ def findvideos(item): #Ahora tratamos los servidores directo itemlist_alt = [] + itemlist_t = [] #Itemlist total de enlaces + itemlist_f = [] #Itemlist de enlaces filtrados if matches_directo: for scrapedurl, scrapedquality, scrapedlang in matches_directo: #leemos los torrents con la diferentes calidades #Generamos una copia de Item para trabajar sobre ella @@ -824,6 +879,8 @@ def findvideos(item): #logger.debug(data) for scrapedtitle, scrapedenlace in matches: + item_local = item_local.clone() + enlace = '' devuelve = '' mostrar_server = '' @@ -918,18 +975,33 @@ def findvideos(item): item_local.action = "play" #Visualizar vídeo item_local.server = servidor #Seridor Directo - itemlist_alt.append(item_local.clone(quality=quality)) #Pintar pantalla + itemlist_t.append(item_local.clone(quality=quality)) #Pintar pantalla, si no se filtran idiomas + + # Requerido para FilterTools + if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra + itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío except: logger.error('ERROR al procesar enlaces DIRECTOS: ' + servidor + ' / ' + scrapedenlace) #logger.debug("DIRECTO: " + scrapedenlace + " / 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) + if len(itemlist_f) > 0: #Si hay entradas filtradas... + itemlist_alt.extend(itemlist_f) #Pintamos pantalla filtrada + else: + if config.get_setting('filter_languages', channel) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... + thumb_separador = get_thumb("next.png") #... pintamos todo con aviso + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) + itemlist_alt.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado + #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 itemlist.extend(itemlist_alt) + + # Requerido para AutoPlay + autoplay.start(itemlist, item) #Lanzamos Autoplay return itemlist diff --git a/plugin.video.alfa/channels/grantorrent.json b/plugin.video.alfa/channels/grantorrent.json index e3f8591e..37483759 100644 --- a/plugin.video.alfa/channels/grantorrent.json +++ b/plugin.video.alfa/channels/grantorrent.json @@ -22,6 +22,30 @@ "enabled": true, "visible": true }, + { + "id": "modo_grafico", + "type": "bool", + "label": "Buscar información extra (TMDB)", + "default": true, + "enabled": true, + "visible": true + }, + { + "id": "filter_languages", + "type": "list", + "label": "Mostrar enlaces en idioma...", + "default": 0, + "enabled": true, + "visible": true, + "lvalues": [ + "No filtrar", + "CAST", + "LAT", + "VO", + "VOS", + "VOSE" + ] + }, { "id": "seleccionar_serie_temporada", "type": "list", @@ -43,12 +67,25 @@ "visible": true }, { - "id": "modo_grafico", - "type": "bool", - "label": "Buscar información extra (TMDB)", - "default": true, + "id": "timeout_downloadpage", + "type": "list", + "label": "Timeout (segs.) en descarga de páginas o verificación de servidores", + "default": 5, "enabled": true, - "visible": true + "visible": true, + "lvalues": [ + "None", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10" + ] } ] } diff --git a/plugin.video.alfa/channels/grantorrent.py b/plugin.video.alfa/channels/grantorrent.py index 072f81fb..1a4a7df3 100644 --- a/plugin.video.alfa/channels/grantorrent.py +++ b/plugin.video.alfa/channels/grantorrent.py @@ -4,6 +4,7 @@ import re import sys import urllib import urlparse +import time from channelselector import get_thumb from core import httptools @@ -13,13 +14,24 @@ from core.item import Item from platformcode import config, logger from core import tmdb from lib import generictools +from channels import filtertools +from channels import autoplay + + +#IDIOMAS = {'CAST': 'Castellano', 'LAT': 'Latino', 'VO': 'Version Original'} +IDIOMAS = {'Castellano': 'CAST', 'Latino': 'LAT', 'Version Original': 'VO'} +list_language = IDIOMAS.values() +list_quality = [] +list_servers = ['torrent'] host = "https://grantorrent.net/" +channel = "grantorrent" dict_url_seasons = dict() -__modo_grafico__ = config.get_setting('modo_grafico', 'grantorrent') -modo_serie_temp = config.get_setting('seleccionar_serie_temporada', 'grantorrent') -modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', 'grantorrent') +__modo_grafico__ = config.get_setting('modo_grafico', channel) +timeout = config.get_setting('timeout_downloadpage', channel) +modo_serie_temp = config.get_setting('seleccionar_serie_temporada', channel) +modo_ultima_temp = config.get_setting('seleccionar_ult_temporadda_activa', channel) def mainlist(item): @@ -32,7 +44,10 @@ def mainlist(item): thumb_series = get_thumb("channels_tvshow.png") thumb_series_hd = get_thumb("channels_tvshow_hd.png") thumb_buscar = get_thumb("search.png") + thumb_separador = get_thumb("next.png") thumb_settings = get_thumb("setting_0.png") + + autoplay.init(item.channel, list_servers, list_quality) itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=host, extra="peliculas", thumbnail=thumb_pelis)) @@ -43,11 +58,12 @@ def mainlist(item): #Buscar series itemlist.append(Item(channel=item.channel, action="search", title="Buscar en Series >>", url=host + "series/", extra="series", thumbnail=thumb_buscar)) + + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR yellow]Configuración:[/COLOR]", folder=False, thumbnail=thumb_separador)) - itemlist.append( - Item(channel=item.channel, action="", title="[COLOR yellow]Configuración del Canal:[/COLOR]", url="", thumbnail=thumb_settings)) - itemlist.append( - Item(channel=item.channel, action="settingCanal", title="Opciones de Videoteca y TMDB", url="", thumbnail=thumb_settings)) + itemlist.append(Item(channel=item.channel, action="settingCanal", title="Configurar canal", thumbnail=thumb_settings)) + + autoplay.show_option(item.channel, itemlist) #Activamos Autoplay return itemlist @@ -120,6 +136,8 @@ 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 result_mode = config.get_setting("result_mode", channel="search") # Búsquedas globales: listado completo o no + if not item.extra2: + item.extra2 = '' #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 @@ -133,18 +151,25 @@ def listado(item): cnt_top = 10 #max. num de páginas web a leer antes de pintar total_pag = 1 post_num = 1 #num pagina actual + inicio = time.time() # Controlaremos que el proceso no exceda de un tiempo razonable + fin = inicio + 5 # Después de este tiempo pintamos (segundos) + timeout_search = timeout # Timeout para descargas + if item.extra == 'search': + timeout_search = timeout * 2 # Timeout un poco más largo para las búsquedas + if timeout_search < 5: + timeout_search = 5 # Timeout un poco más largo para las búsquedas #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 - while cnt_title <= cnt_tot and cnt_next < cnt_top: + while cnt_title <= cnt_tot and cnt_next < cnt_top and fin > time.time(): # Descarga la página data = '' try: if not item.post: item.post = item.url video_section = '' - data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item.post).data) + data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item.post, timeout=timeout_search).data) video_section = scrapertools.find_single_match(data, '
(.*?
)') except: pass @@ -234,6 +259,10 @@ def listado(item): if scrapedurl_alt in title_lista_alt or scrapedurl_alt in title_lista_alt_for: # si ya se ha tratado, pasamos al siguiente item continue + + #Verificamos si el idioma está dentro del filtro, si no pasamos + if not lookup_idiomas_paginacion(item, scrapedurl, scrapedtitle, quality, list_language): + continue title_lista_alt_for += [scrapedurl_alt] cnt_title += 1 # Sería una línea real más para Itemlist @@ -278,7 +307,7 @@ def listado(item): 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 @@ -315,6 +344,9 @@ def listado(item): if "dual" in lang.lower() or "dual" in title.lower(): item_local.language[0:0] = ["DUAL"] + if item_local.language == []: + item_local.language = ['CAST'] #Por defecto + #Limpiamos el título de la basuna innecesaria title = title.replace("Dual", "").replace("dual", "").replace("Subtitulada", "").replace("subtitulada", "").replace("Subt", "").replace("subt", "").replace("Sub", "").replace("sub", "").replace("(Reparado)", "").replace("(Proper)", "").replace("(proper)", "").replace("Proper", "").replace("proper", "").replace("(Latino)", "").replace("Latino", "") title = title.replace("- HDRip", "").replace("(HDRip)", "").replace("- Hdrip", "").replace("(microHD)", "").replace("(DVDRip)", "").replace("(HDRip)", "").replace("(BR-LINE)", "").replace("(HDTS-SCREENER)", "").replace("(BDRip)", "").replace("(BR-Screener)", "").replace("(DVDScreener)", "").replace("TS-Screener", "").replace(" TS", "").replace(" Ts", "") @@ -346,8 +378,13 @@ def listado(item): item_local.from_title = title.strip() #Guardamos esta etiqueta para posible desambiguación de título item_local.infoLabels['year'] = "-" #Reseteamos el año para que TMDB nos lo de - #Agrega el item local a la lista itemlist - itemlist.append(item_local.clone()) + #Ahora se filtra por idioma, si procede, y se pinta lo que vale + if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra + itemlist = filtertools.get_link(itemlist, item_local, list_language) + else: + itemlist.append(item_local.clone()) #Si no, pintar pantalla + + cnt_title = len(itemlist) #Contador de líneas añadidas #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 @@ -373,7 +410,7 @@ def listado(item): else: title = '[COLOR gold]Página siguiente >>[/COLOR] %s' % post_num - itemlist.append(item.clone(action="listado", title=title, url=next_page, thumbnail=get_thumb("next.png"), title_lista=title_lista)) + itemlist.append(item.clone(action="listado", title=title, url=next_page, thumbnail=get_thumb("next.png"), title_lista=title_lista, language='')) return itemlist @@ -381,13 +418,17 @@ def listado(item): def findvideos(item): logger.info() itemlist = [] + itemlist_t = [] #Itemlist total de enlaces + itemlist_f = [] #Itemlist de enlaces filtrados + if not item.language: + item.language = ['CAST'] #Castellano por defecto #logger.debug(item) #Bajamos los datos de la página data = '' try: - data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, timeout=timeout).data) except: pass @@ -420,6 +461,14 @@ def findvideos(item): #Ahora recorremos todos los links por calidades for lang, quality, size, scrapedurl in matches: temp_epi = '' + if scrapertools.find_single_match(quality, '\s?\(Contrase.+?: ]*>(.*?)<\/font>\)') + quality = re.sub(r'\s?\(Contrase.+?: ]*>(.*?)<\/font>\)'): + password = scrapertools.find_single_match(size, '\s?\(Contrase.+?: ]*>(.*?)<\/font>\)', '', size) + size += ' [Contraseña=%s]' % password if item.contentType == "episode": #En Series los campos están en otro orden. No hay size, en su lugar sxe temp_epi = quality quality = size @@ -485,10 +534,10 @@ def findvideos(item): 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() + channel_alt = item_local.channel.capitalize() if item_local.from_channel: - channel = item_local.from_channel.capitalize() - item_local.quality = '[COLOR yellow][%s][/COLOR] %s' % (channel, item_local.quality) + channel_alt = item_local.from_channel.capitalize() + item_local.quality = '[COLOR yellow][%s][/COLOR] %s' % (channel_alt, item_local.quality) #Salvamos la url del .torrent if scrapedurl: @@ -507,11 +556,26 @@ def findvideos(item): item_local.action = "play" #Visualizar vídeo item_local.server = "torrent" #Seridor Torrent - itemlist.append(item_local.clone()) #Pintar pantalla + itemlist_t.append(item_local.clone()) #Pintar pantalla, si no se filtran idiomas + + # Requerido para FilterTools + if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra + itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío #logger.debug("TORRENT: " + item_local.url + " / title gen/torr: " + item.title + " / " + item_local.title + " / calidad: " + item_local.quality) #logger.debug(item_local) + if len(itemlist_f) > 0: #Si hay entradas filtradas... + itemlist.extend(itemlist_f) #Pintamos pantalla filtrada + else: + if config.get_setting('filter_languages', channel) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... + thumb_separador = get_thumb("next.png") #... pintamos todo con aviso + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) + itemlist.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado + + # Requerido para AutoPlay + autoplay.start(itemlist, item) #Lanzamos Autoplay + return itemlist @@ -530,7 +594,7 @@ def episodios(item): data = '' try: - data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) #Cargamos los datos de la página + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, timeout=timeout).data) #Cargamos los datos de la página patron_actual = ' 0 and item.extra2 != 'categorias': + itemlist = filtertools.get_link(itemlist, item, list_language) + + if len(itemlist) == 0: + estado = False + + #Volvemos a la siguiente acción en el canal + return estado def actualizar_titulos(item): diff --git a/plugin.video.alfa/channels/mejortorrent1.py b/plugin.video.alfa/channels/mejortorrent1.py index feffe91b..637f66f8 100644 --- a/plugin.video.alfa/channels/mejortorrent1.py +++ b/plugin.video.alfa/channels/mejortorrent1.py @@ -234,16 +234,15 @@ def listado(item): url_next_page = urlparse.urljoin(item.url, scrapertools.find_single_match(data, patron_next_page) + str(cnt_pag_num + 2)) #url_last_page = re.sub(r"\d+$", "9999", url_next_page) #data_last = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(url_last_page).data) - if "/documentales" in item.url: - patron_last_page = '\d+<\/a> <\/div>' - else: - patron_last_page = '&\w+;<\/a>&\w+;<\/div>' + #if "/documentales" in item.url: + #patron_last_page = '\d+<\/a> <\/div>' + patron_last_page = '&\w+;<\/a>&\w+;<\/div>' #patron_last_page = '(\d+)<\/span>' - if "/documentales" in item.url: - item.last_page = int(scrapertools.find_single_match(data, patron_last_page)) - else: + try: #item.last_page = int(scrapertools.find_single_match(data, patron_last_page)) * (len(matches) / cnt_tot) item.last_page = int(scrapertools.find_single_match(data, patron_last_page)) + except: + item.last_page = 0 if matches_cnt > cnt_tot and item.extra == "documentales" and pag: item.next_page = '' diff --git a/plugin.video.alfa/channels/newpct1.json b/plugin.video.alfa/channels/newpct1.json index 7c6f0412..15295888 100644 --- a/plugin.video.alfa/channels/newpct1.json +++ b/plugin.video.alfa/channels/newpct1.json @@ -32,6 +32,22 @@ "enabled": true, "visible": true }, + { + "id": "filter_languages", + "type": "list", + "label": "Mostrar enlaces en idioma...", + "default": 0, + "enabled": true, + "visible": true, + "lvalues": [ + "No filtrar", + "CAST", + "LAT", + "VO", + "VOS", + "VOSE" + ] + }, { "id": "clonenewpct1_channel_default", "type": "list", diff --git a/plugin.video.alfa/channels/newpct1.py b/plugin.video.alfa/channels/newpct1.py index 354f1b67..e46129a6 100644 --- a/plugin.video.alfa/channels/newpct1.py +++ b/plugin.video.alfa/channels/newpct1.py @@ -16,6 +16,15 @@ from core.item import Item from platformcode import config, logger from core import tmdb from lib import generictools +from channels import filtertools +from channels import autoplay + + +#IDIOMAS = {'CAST': 'Castellano', 'LAT': 'Latino', 'VO': 'Version Original'} +IDIOMAS = {'Castellano': 'CAST', 'Latino': 'LAT', 'Version Original': 'VO'} +list_language = IDIOMAS.values() +list_quality = [] +list_servers = ['torrent'] channel_py = 'newpct1' @@ -84,12 +93,15 @@ def mainlist(item): thumb_series_az = get_thumb("channels_tvshow_az.png") thumb_docus = get_thumb("channels_documentary.png") thumb_buscar = get_thumb("search.png") + thumb_separador = get_thumb("next.png") thumb_settings = get_thumb("setting_0.png") if channel_clone_name == "*** DOWN ***": #Ningún clones activo !!! itemlist.append(item.clone(action='', title="[COLOR yellow]Ningún canal NewPct1 activo[/COLOR]")) return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos y salimos + autoplay.init(item.channel, list_servers, list_quality) + itemlist.append(Item(channel=item.channel, action="submenu_novedades", title="Novedades", url=item.channel_host + "ultimas-descargas/", extra="novedades", thumbnail=thumb_pelis, category=item.category, channel_host=item.channel_host)) itemlist.append(Item(channel=item.channel, action="submenu", title="Películas", url=item.channel_host, @@ -103,10 +115,11 @@ def mainlist(item): itemlist.append( Item(channel=item.channel, action="search", title="Buscar", url=item.channel_host + "buscar", thumbnail=thumb_buscar, category=item.category, channel_host=item.channel_host)) - itemlist.append( - Item(channel=item.channel, action="", title="[COLOR yellow]Configuración de Servidores:[/COLOR]", url="", thumbnail=thumb_settings, category=item.category, channel_host=item.channel_host)) - itemlist.append( - Item(channel=item.channel, action="settingCanal", title="Servidores para Ver Online y Descargas", url="", thumbnail=thumb_settings, category=item.category, channel_host=item.channel_host)) + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR yellow]Configuración:[/COLOR]", folder=False, thumbnail=thumb_separador, category=item.category, channel_host=item.channel_host)) + + itemlist.append(Item(channel=item.channel, action="settingCanal", title="Configurar canal", thumbnail=thumb_settings, category=item.category, channel_host=item.channel_host)) + + autoplay.show_option(item.channel, itemlist) #Activamos Autoplay item.category = '%s / %s' % (channel_py.title(), item.category.title()) #Newpct1 / nombre de clone en pantalla de Mainlist @@ -124,6 +137,7 @@ def submenu(item): logger.info() itemlist = [] + item.extra2 = '' data = '' try: @@ -180,6 +194,13 @@ def submenu(item): #Preguntamos por las entradas que no corresponden al "extra" if item.extra in scrapedtitle.lower() or (item.extra == "peliculas" and ("cine" in scrapedurl or "anime" in scrapedurl)) or (item.extra == "varios" and ("documentales" in scrapedurl or "varios" in scrapedurl)): + + #Si tiene filtro de idiomas, marcamos estas páginas como no filtrables + if "castellano" in title.lower() or "latino" in title.lower() or "subtituladas" in title.lower() or "vo" in title.lower() or "v.o" in title.lower() or "- es" in title.lower(): + item.extra2 = "categorias" + else: + item.extra2 = "" + itemlist.append(item.clone(action="listado", title=title, url=scrapedurl)) itemlist.append(item.clone(action="alfabeto", title=title + " [A-Z]", url=scrapedurl)) @@ -195,6 +216,7 @@ def submenu_novedades(item): itemlist = [] itemlist_alt = [] + item.extra2 = '' data = '' timeout_search=timeout * 2 #Más tiempo para Novedades, que es una búsqueda @@ -273,6 +295,13 @@ def submenu_novedades(item): itemlist_alt = sorted(itemlist_alt, key=lambda it: it.title) #clasificamos for item_local in itemlist_alt: item_local.title = re.sub(r'^\d{2}', '', item_local.title) #Borramos la secuencia + + #Si tiene filtro de idiomas, marcamos estas páginas como no filtrables + if "castellano" in item_local.title.lower() or "latino" in item_local.title.lower() or "subtituladas" in item_local.title.lower() or "vo" in item_local.title.lower() or "v.o" in item_local.title.lower() or "- es" in item_local.title.lower(): + item_local.extra2 = "categorias" + else: + item_local.extra2 = "" + itemlist.append(item_local.clone()) itemlist.append( @@ -550,6 +579,9 @@ def listado(item): title = re.sub(r'- [m|M].*?serie ?\w+', '', title) title_subs += ["[Miniserie]"] + if not item_local.language: + item_local.language = ["CAST"] + #Limpiamos restos en título title = title.replace("Castellano", "").replace("castellano", "").replace("inglés", "").replace("ingles", "").replace("Inglés", "").replace("Ingles", "").replace("Ingl", "").replace("Engl", "").replace("Calidad", "").replace("de la Serie", "").replace("Spanish", "") title_alt = title_alt.replace("Castellano", "").replace("castellano", "").replace("inglés", "").replace("ingles", "").replace("Inglés", "").replace("Ingles", "").replace("Ingl", "").replace("Engl", "").replace("Calidad", "").replace("de la Serie", "").replace("Spanish", "") @@ -565,8 +597,9 @@ def listado(item): title = re.sub(r'\(\d{4}\)$', '', title) if re.sub(r'\d{4}$', '', title).strip(): title = re.sub(r'\d{4}$', '', title) - title = re.sub(r'\d+x\d+', '', title) - title = re.sub(r'x\d+', '', title).strip() + if item_local.contentType != "movie": + title = re.sub(r'\d+x\d+', '', title) + title = re.sub(r'x\d+', '', title).strip() if title.endswith("torrent gratis"): title = title[:-15] if title.endswith("gratis"): title = title[:-7] @@ -617,8 +650,11 @@ def listado(item): #Guarda la variable temporal que almacena la info adicional del título a ser restaurada después de TMDB item_local.title_subs = title_subs - #Agrega el item local a la lista itemlist - itemlist.append(item_local.clone()) + #Ahora se filtra por idioma, si procede, y se pinta lo que vale. Excluye categorías en otros idiomas. + #if config.get_setting('filter_languages', channel_py) > 0 and item.extra2 != 'categorias': + # itemlist = filtertools.get_link(itemlist, item_local, list_language) + #else: + itemlist.append(item_local.clone()) #Si no, pintar pantalla #logger.debug(item_local) @@ -802,6 +838,10 @@ def listado_busqueda(item): if "juego/" in scrapedurl: # no mostramos lo que no sean videos continue + + #Verificamos si el idioma está dentro del filtro, si no pasamos + if not lookup_idiomas_paginacion(item, scrapedurl, scrapedtitle, calidad, list_language): + continue cnt_title += 1 # Sería una línea real más para Itemlist #Control de página @@ -850,7 +890,7 @@ def listado_busqueda(item): if ("juego/" in scrapedurl or "xbox" in scrapedurl.lower()) and not "/serie" in scrapedurl or "xbox" in scrapedtitle.lower() or "windows" in scrapedtitle.lower() or "windows" in calidad.lower() or "nintendo" in scrapedtitle.lower() or "xbox" in calidad.lower() or "epub" in calidad.lower() or "pdf" in calidad.lower() or "pcdvd" in calidad.lower() or "crack" in calidad.lower(): # no mostramos lo que no sean videos continue - 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 #Creamos una copia de Item para cada contenido item_local = item.clone() @@ -1022,6 +1062,9 @@ def listado_busqueda(item): title = re.sub(r'- [m|M].*?serie ?\w+', '', title) title_subs += ["[Miniserie]"] + if not item_local.language: + item_local.language = ["CAST"] + #Limpiamos restos en título title = title.replace("Castellano", "").replace("castellano", "").replace("inglés", "").replace("ingles", "").replace("Inglés", "").replace("Ingles", "").replace("Ingl", "").replace("Engl", "").replace("Calidad", "").replace("de la Serie", "").replace("Spanish", "") @@ -1036,8 +1079,9 @@ def listado_busqueda(item): title = re.sub(r'\(\d{4}\)$', '', title) if re.sub(r'\d{4}$', '', title).strip(): title = re.sub(r'\d{4}$', '', title) - title = re.sub(r'\d+x\d+', '', title) - title = re.sub(r'x\d+', '', title).strip() + if item_local.contentType != "movie": + title = re.sub(r'\d+x\d+', '', title) + title = re.sub(r'x\d+', '', title).strip() if "pelisyseries.com" in host and item_local.contentType == "tvshow": titulo = '' @@ -1152,11 +1196,11 @@ def listado_busqueda(item): data_serie = unicode(data_serie, "iso-8859-1", errors="replace").encode("utf-8") data_serie = data_serie.replace("chapters", "buscar-list") - if not scrapertools.find_single_match(data_serie, pattern): #No ha habido suerte ... - item_local.contentType = "movie" #tratarlo el capítulo como película + if not scrapertools.find_single_match(data_serie, pattern): #No ha habido suerte ... + item_local.contentType = "movie" #tratarlo el capítulo como película item_local.extra = "peliculas" else: - item_local.url = url_tvshow #Cambiamos url de episodio por el de serie + item_local.url = url_tvshow #Cambiamos url de episodio por el de serie else: item_local.url = url_id #Cambiamos url de episodio por el de serie @@ -1165,8 +1209,13 @@ def listado_busqueda(item): item_local.title = real_title_mps.replace('-', ' ').title().strip() #Esperemos que el nuevo título esté bien item_local.contentSerieName = item_local.title - #Agrega el item local a la lista itemlist - itemlist.append(item_local.clone()) + #Ahora se filtra por idioma, si procede, y se pinta lo que vale. Excluye categorías en otros idiomas. + if config.get_setting('filter_languages', channel_py) > 0 and item.extra2 != 'categorias': + itemlist = filtertools.get_link(itemlist, item_local, list_language) + else: + itemlist.append(item_local.clone()) #Si no, pintar pantalla + + cnt_title = len(itemlist) #Contador de líneas añadidas #logger.debug(item_local) @@ -1180,7 +1229,7 @@ def listado_busqueda(item): item, itemlist = generictools.post_tmdb_listado(item, itemlist) if post: - itemlist.append(item.clone(channel=item.channel, action="listado_busqueda", title="[COLOR gold][B]Pagina siguiente >> [/B][/COLOR]" + str(post_num) + " de " + str(total_pag), thumbnail=get_thumb("next.png"), title_lista=title_lista, cnt_pag=cnt_pag)) + itemlist.append(item.clone(channel=item.channel, action="listado_busqueda", title="[COLOR gold][B]Pagina siguiente >> [/B][/COLOR]" + str(post_num) + " de " + str(total_pag), thumbnail=get_thumb("next.png"), title_lista=title_lista, cnt_pag=cnt_pag, language='')) #logger.debug("Titulos: " + str(len(itemlist)) + " Matches: " + str(len(matches)) + " Post: " + str(item.post) + " / " + str(post_actual) + " / " + str(total_pag)) @@ -1189,6 +1238,9 @@ def listado_busqueda(item): def findvideos(item): logger.info() itemlist = [] + itemlist_t = [] #Itemlist total de enlaces + itemlist_f = [] #Itemlist de enlaces filtrados + #logger.debug(item) @@ -1362,13 +1414,12 @@ def findvideos(item): data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") data = data.replace("$!", "#!").replace("'", "\"").replace("ñ", "ñ").replace("//pictures", "/pictures") - #Añadimos el tamaño para todos size = scrapertools.find_single_match(data, '
Size:<\/strong>?\s(\d+?\.?\d*?\s\w[b|B])<\/span>') size = size.replace(".", ",") #sustituimos . por , porque Unify lo borra if not size: - size = scrapertools.find_single_match(item.quality, '\s\[(\d+,?\d*?\s\w\s?[b|B])\]') + size = scrapertools.find_single_match(item.quality, '\s?\[(\d+.?\d*?\s?\w\s?[b|B])\]') if not size: size = generictools.get_torrent_size(item.url) #Buscamos el tamaño en el .torrent if size: @@ -1400,7 +1451,7 @@ def findvideos(item): quality = '%s [%s]' % (item_local.quality, size) #Agregamos size al final del título else: quality = item_local.quality - 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 = '[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 #Preparamos título y calidad, quitamos etiquetas vacías item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title) @@ -1408,18 +1459,32 @@ def findvideos(item): item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip() quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', quality) quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', quality) - quality = quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip() + item_local.quality = quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip() - item_local.alive = "??" #Calidad del link sin verificar - item_local.action = "play" #Visualizar vídeo - item_local.server = "torrent" #Servidor - - itemlist.append(item_local.clone(quality=quality)) #Pintar pantalla + item_local.alive = "??" #Calidad del link sin verificar + item_local.action = "play" #Visualizar vídeo + item_local.server = "torrent" #Servidor + + itemlist_t.append(item_local.clone()) #Pintar pantalla, si no se filtran idiomas + + # Requerido para FilterTools + if config.get_setting('filter_languages', channel_py) > 0: #Si hay idioma seleccionado, se filtra + itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío logger.debug("TORRENT: " + item_local.url + " / 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) + if len(itemlist_f) > 0: #Si hay entradas filtradas... + itemlist.extend(itemlist_f) #Pintamos pantalla filtrada + else: + if config.get_setting('filter_languages', channel_py) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... + thumb_separador = get_thumb("next.png") #... pintamos todo con aviso + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) + itemlist.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado + + itemlist_t = [] #Itemlist total de enlaces + itemlist_f = [] #Itemlist de enlaces filtrados # VER vídeos, descargar vídeos un link, o múltiples links data = scrapertools.find_single_match(data, '
(?:)?<\/div><\/div><\/div>)') #Seleccionar el bloque para evitar duplicados @@ -1442,7 +1507,9 @@ def findvideos(item): for logo, servidor, idioma, calidad, enlace, title in enlaces_ver: if ver_enlaces_veronline == 0: #Si no se quiere Ver Online, se sale del bloque break + if "ver" in title.lower(): + item_local = item.clone() servidor = servidor.replace("streamin", "streaminto") if servidor.capitalize() in excluir_enlaces_veronline: #Servidor excluido, pasamos al siguiente @@ -1503,11 +1570,25 @@ def findvideos(item): item_local.quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.quality) item_local.quality = item_local.quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip() - itemlist.append(item_local.clone()) + itemlist_t.append(item_local.clone()) #Pintar pantalla, si no se filtran idiomas + + # Requerido para FilterTools + if config.get_setting('filter_languages', channel_py) > 0: #Si hay idioma seleccionado, se filtra + itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío except: logger.error('ERROR al procesar enlaces VER DIRECTOS: ' + servidor + ' / ' + enlace) + if len(itemlist_f) > 0: #Si hay entradas filtradas... + itemlist.extend(itemlist_f) #Pintamos pantalla filtrada + else: + if config.get_setting('filter_languages', channel_py) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... + thumb_separador = get_thumb("next.png") #... pintamos todo con aviso + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) + itemlist.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado + + itemlist_t = [] #Itemlist total de enlaces + itemlist_f = [] #Itemlist de enlaces filtrados #Ahora vemos los enlaces de DESCARGAR if len(enlaces_descargar) > 0 and ver_enlaces_descargas != 0: @@ -1525,6 +1606,7 @@ def findvideos(item): break if "Ver" not in title: + item_local = item.clone() servidor = servidor.replace("uploaded", "uploadedto") partes = enlace.split(" ") #Partimos el enlace en cada link de las partes title = "Descarga" #Usamos la palabra reservada de Unify para que no formatee el título @@ -1607,11 +1689,26 @@ def findvideos(item): item_local.quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.quality) item_local.quality = item_local.quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip() - itemlist.append(item_local.clone()) + itemlist_t.append(item_local.clone()) #Pintar pantalla, si no se filtran idiomas + + # Requerido para FilterTools + if config.get_setting('filter_languages', channel_py) > 0: #Si hay idioma seleccionado, se filtra + itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío except: logger.error('ERROR al procesar enlaces DESCARGAR DIRECTOS: ' + servidor + ' / ' + enlace) + if len(itemlist_f) > 0: #Si hay entradas filtradas... + itemlist.extend(itemlist_f) #Pintamos pantalla filtrada + else: + if config.get_setting('filter_languages', channel_py) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... + thumb_separador = get_thumb("next.png") #... pintamos todo con aviso + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) + itemlist.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado + + # Requerido para AutoPlay + autoplay.start(itemlist, item) #Lanzamos Autoplay + return itemlist @@ -1926,6 +2023,32 @@ def episodios(item): return itemlist +def lookup_idiomas_paginacion(item, url, title, calidad, list_language): + logger.info() + estado = True + item.language = [] + itemlist = [] + + if "[vos" in title.lower() or "v.o.s" in title.lower() or "vo" in title.lower() or "subs" in title.lower() or ".com/pelicula/" in url or ".com/series-vo" in url or "-vo/" in url or "vos" in calidad.lower() or "vose" in calidad.lower() or "v.o.s" in calidad.lower() or "sub" in calidad.lower() or ".com/peliculas-vo" in item.url: + item.language += ["VOS"] + + if "latino" in title.lower() or "argentina" in title.lower() or "-latino/" in url or "latino" in calidad.lower() or "argentina" in calidad.lower(): + item.language += ["LAT"] + + if item.language == []: + item.language = ['CAST'] #Por defecto + + #Ahora se filtra por idioma, si procede, y se pinta lo que vale. Excluye categorías en otros idiomas. + if config.get_setting('filter_languages', channel_py) > 0 and item.extra2 != 'categorias': + itemlist = filtertools.get_link(itemlist, item, list_language) + + if len(itemlist) == 0: + estado = False + + #Volvemos a la siguiente acción en el canal + return estado + + def actualizar_titulos(item): logger.info() diff --git a/plugin.video.alfa/channels/zonatorrent.json b/plugin.video.alfa/channels/zonatorrent.json index ce829a98..7e9f5feb 100644 --- a/plugin.video.alfa/channels/zonatorrent.json +++ b/plugin.video.alfa/channels/zonatorrent.json @@ -30,6 +30,22 @@ "enabled": true, "visible": true }, + { + "id": "filter_languages", + "type": "list", + "label": "Mostrar enlaces en idioma...", + "default": 0, + "enabled": true, + "visible": true, + "lvalues": [ + "No filtrar", + "CAST", + "LAT", + "VO", + "VOS", + "VOSE" + ] + }, { "id": "timeout_downloadpage", "type": "list", @@ -66,30 +82,6 @@ "default": true, "enabled": true, "visible": true - }, - { - "id": "include_in_newest_infantiles", - "type": "bool", - "label": "Incluir en Novedades - Infantiles", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "include_in_newest_terror", - "type": "bool", - "label": "Incluir en Novedades - terror", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "include_in_newest_torrent", - "type": "bool", - "label": "Incluir en Novedades - Torrent", - "default": true, - "enabled": true, - "visible": true } ] } diff --git a/plugin.video.alfa/channels/zonatorrent.py b/plugin.video.alfa/channels/zonatorrent.py index 6bee0e95..58d1f0b1 100644 --- a/plugin.video.alfa/channels/zonatorrent.py +++ b/plugin.video.alfa/channels/zonatorrent.py @@ -14,6 +14,15 @@ from core.item import Item from platformcode import config, logger from core import tmdb from lib import generictools +from channels import filtertools +from channels import autoplay + + +#IDIOMAS = {'CAST': 'Castellano', 'LAT': 'Latino', 'VO': 'Version Original'} +IDIOMAS = {'Castellano': 'CAST', 'Latino': 'LAT', 'Version Original': 'VO'} +list_language = IDIOMAS.values() +list_quality = [] +list_servers = ['torrent'] host = 'https://zonatorrent.tv/' @@ -33,20 +42,35 @@ def mainlist(item): thumb_series = get_thumb("channels_tvshow.png") thumb_buscar = get_thumb("search.png") thumb_separador = get_thumb("next.png") + thumb_settings = get_thumb("setting_0.png") + autoplay.init(item.channel, list_servers, list_quality) itemlist.append(Item(channel=item.channel, title="Películas", action="submenu", url=host, thumbnail=thumb_pelis, extra="peliculas")) itemlist.append(Item(channel=item.channel, url=host, title="Series", action="submenu", thumbnail=thumb_series, extra="series")) itemlist.append(Item(channel=item.channel, title="Buscar...", action="search", url=host + "?s=", thumbnail=thumb_buscar, extra="search")) + + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR yellow]Configuración:[/COLOR]", folder=False, thumbnail=thumb_separador)) + + itemlist.append(Item(channel=item.channel, action="configuracion", title="Configurar canal", thumbnail=thumb_settings)) + + autoplay.show_option(item.channel, itemlist) #Activamos Autoplay return itemlist +def configuracion(item): + from platformcode import platformtools + ret = platformtools.show_channel_settings() + platformtools.itemlist_refresh() + return + def submenu(item): logger.info() itemlist = [] + item.extra2 = '' thumb_cartelera = get_thumb("now_playing.png") thumb_pelis_az = get_thumb("channels_movie_az.png") @@ -71,7 +95,7 @@ def submenu(item): itemlist.append(item.clone(title="Más vistas", action="listado", url=host + "/peliculas-mas-vistas-2/", url_plus=item.url_plus, thumbnail=thumb_popular, extra2="popular")) itemlist.append(item.clone(title="Más votadas", action="listado", url=host + "/peliculas-mas-votadas/", url_plus=item.url_plus, thumbnail=thumb_popular, extra2="popular")) itemlist.append(item.clone(title="Castellano", action="listado", url=host + "?s=spanish", url_plus=item.url_plus, thumbnail=thumb_spanish, extra2="CAST")) - itemlist.append(item.clone(title="Latino", action="listado", url=host + "?s=latino", url_plus=item.url_plus, thumbnail=thumb_latino, lextra2="LAT")) + itemlist.append(item.clone(title="Latino", action="listado", url=host + "?s=latino", url_plus=item.url_plus, thumbnail=thumb_latino, extra2="LAT")) itemlist.append(item.clone(title="Subtitulado", action="listado", url=host + "?s=Subtitulado", url_plus=item.url_plus, thumbnail=thumb_pelis_vos, extra2="VOSE")) else: @@ -288,8 +312,6 @@ def listado(item): title = scrapedtitle title = title.replace("á", "a").replace("é", "e").replace("í", "i").replace("ó", "o").replace("ú", "u").replace("ü", "u").replace("�", "ñ").replace("ñ", "ñ").replace("ã", "a").replace("&etilde;", "e").replace("ĩ", "i").replace("õ", "o").replace("ũ", "u").replace("ñ", "ñ").replace("’", "'") - - cnt_title += 1 item_local = item.clone() #Creamos copia de Item para trabajar if item_local.tipo: #... y limpiamos @@ -433,7 +455,14 @@ def listado(item): #Guarda la variable temporal que almacena la info adicional del título a ser restaurada después de TMDB item_local.title_subs = title_subs - itemlist.append(item_local.clone()) #Pintar pantalla + logger.debug(item.extra2) + #Ahora se filtra por idioma, si procede, y se pinta lo que vale + if config.get_setting('filter_languages', channel) > 0 and item.extra2 not in ['CAST', 'LAT', 'VO', 'VOS', 'VOSE']: #Si hay idioma seleccionado, se filtra + itemlist = filtertools.get_link(itemlist, item_local, list_language) + else: + itemlist.append(item_local.clone()) #Si no, pintar pantalla + + cnt_title = len(itemlist) #Contador de líneas añadidas #logger.debug(item_local) @@ -458,6 +487,10 @@ def listado(item): def findvideos(item): logger.info() itemlist = [] + itemlist_t = [] #Itemlist total de enlaces + itemlist_f = [] #Itemlist de enlaces filtrados + if not item.language: + item.language = ['CAST'] #Castellano por defecto matches = [] item.category = categoria @@ -549,12 +582,26 @@ def findvideos(item): item_local.action = "play" #Visualizar vídeo item_local.server = "torrent" #Servidor Torrent - itemlist.append(item_local.clone()) #Pintar pantalla + itemlist_t.append(item_local.clone()) #Pintar pantalla, si no se filtran idiomas + + # Requerido para FilterTools + if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra + itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío #logger.debug("TORRENT: " + scrapedurl + " / title gen/torr: " + item.title + " / " + item_local.title + " / calidad: " + item_local.quality + " / content: " + item_local.contentTitle + " / " + item_local.contentSerieName) #logger.debug(item_local) + if len(itemlist_f) > 0: #Si hay entradas filtradas... + itemlist.extend(itemlist_f) #Pintamos pantalla filtrada + else: + if config.get_setting('filter_languages', channel) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... + thumb_separador = get_thumb("next.png") #... pintamos todo con aviso + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) + itemlist.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado + #Ahora tratamos los Servidores Directos + itemlist_t = [] #Itemlist total de enlaces + itemlist_f = [] #Itemlist de enlaces filtrados titles = re.compile('data-TPlayerNv="Opt\d+">.*? (.*?)', re.DOTALL).findall(data) urls = re.compile('id="Opt\d+">]+src="([^"]+)"', re.DOTALL).findall(data) @@ -625,14 +672,30 @@ def findvideos(item): item_local.quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.quality) item_local.quality = item_local.quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip() - item_local.action = "play" #Visualizar vídeo - item_local.server = server #Servidor Directo + item_local.action = "play" #Visualizar vídeo + item_local.server = server #Servidor Directo - itemlist.append(item_local.clone()) #Pintar pantalla + itemlist_t.append(item_local.clone()) #Pintar pantalla, si no se filtran idiomas + + # Requerido para FilterTools + if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra + itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío #logger.debug("DIRECTO: " server + ' / ' + enlace + " / title: " + item.title + " / " + item_local.title + " / calidad: " + item_local.quality + " / content: " + item_local.contentTitle + " / " + item_local.contentSerieName) + #logger.debug(item_local) + if len(itemlist_f) > 0: #Si hay entradas filtradas... + itemlist.extend(itemlist_f) #Pintamos pantalla filtrada + else: + if config.get_setting('filter_languages', channel) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... + thumb_separador = get_thumb("next.png") #... pintamos todo con aviso + itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) + itemlist.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado + + # Requerido para AutoPlay + autoplay.start(itemlist, item) #Lanzamos Autoplay + return itemlist @@ -856,11 +919,6 @@ def search(item, texto): logger.info() #texto = texto.replace(" ", "+") - item.url = item.url + texto - - if texto != '': - return listado(item) - try: item.url = item.url + texto diff --git a/plugin.video.alfa/lib/generictools.py b/plugin.video.alfa/lib/generictools.py index 24d7d5c9..39107442 100644 --- a/plugin.video.alfa/lib/generictools.py +++ b/plugin.video.alfa/lib/generictools.py @@ -13,6 +13,7 @@ import sys import urllib import urlparse import datetime +import time from channelselector import get_thumb from core import httptools @@ -188,11 +189,11 @@ def update_title(item): if new_item.contentSeason: #Restauramos el núm. de Temporada después de TMDB item.contentSeason = new_item.contentSeason - if item.from_update: + if item.from_update: #Si la llamda es desde el menú del canal... item.from_update = True del item.from_update - platformtools.itemlist_update(item) - + xlistitem = refresh_screen(item) #Refrescamos la pantallas con el nuevo Item + #Para evitar el "efecto memoria" de TMDB, se le llama con un título ficticio para que resetee los buffers if item.contentSerieName: new_item.infoLabels['tmdb_id'] = '289' #una serie no ambigua @@ -208,6 +209,40 @@ def update_title(item): return item +def refresh_screen(item): + logger.info() + + """ + #### Compatibilidad con Kodi 18 #### + + Refresca la pantalla con el nuevo Item después que haber establecido un dialogo que ha causado el cambio de Item + Crea un xlistitem para engañar a Kodi con la función xbmcplugin.setResolvedUrl FALSE + + Entrada: item: El Item actualizado + Salida: xlistitem El xlistitem creado, por si resulta de alguna utilidad posterior + """ + + try: + import xbmcplugin + import xbmcgui + + xlistitem = xbmcgui.ListItem(path=item.url) #Creamos xlistitem por compatibilidad con Kodi 18 + if config.get_platform(True)['num_version'] >= 16.0: + xlistitem.setArt({"thumb": item.contentThumbnail}) #Cargamos el thumb + else: + xlistitem.setThumbnailImage(item.contentThumbnail) + xlistitem.setInfo("video", item.infoLabels) #Copiamos infoLabel + + xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, xlistitem) #Preparamos el entorno para evitar error Kod1 18 + time.sleep(1) #Dejamos tiempo para que se ejecute + except: + pass + + platformtools.itemlist_update(item) #refrescamos la pantalla con el nuevo Item + + return xlistitem + + def post_tmdb_listado(item, itemlist): logger.info() itemlist_fo = [] @@ -297,6 +332,17 @@ def post_tmdb_listado(item, itemlist): item_local.infoLabels['year'] = '' item_local.infoLabels['aired'] = '' + #Si traía el TMDB-ID, pero no ha funcionado, lo reseteamos e intentamos de nuevo + if item_local.infoLabels['tmdb_id'] and not item_local.infoLabels['originaltitle']: + logger.error("*** TMDB-ID erroneo, reseteamos y reintentamos ***") + logger.error(item_local) + del item_local.infoLabels['tmdb_id'] #puede traer un TMDB-ID erroneo + try: + tmdb.set_infoLabels(item_local, True) #pasamos otra vez por TMDB + except: + pass + logger.error(item_local) + # Si TMDB no ha encontrado nada y hemos usado el año de la web, lo intentamos sin año if not item_local.infoLabels['tmdb_id']: if item_local.infoLabels['year']: #lo intentamos de nuevo solo si había año, puede que erroneo @@ -383,7 +429,7 @@ def post_tmdb_listado(item, itemlist): title = '%s [COLOR yellow][%s][/COLOR] [%s] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (title, str(item_local.infoLabels['year']), rating, item_local.quality, str(item_local.language)) else: #Si Titulos Inteligentes SÍ seleccionados: - title = title.replace("[", "-").replace("]", "-").replace(".", ",") + title = title.replace("[", "-").replace("]", "-").replace(".", ",").replace("GB", "G B").replace("Gb", "G b").replace("gb", "g b").replace("MB", "M B").replace("Mb", "M b").replace("mb", "m b") #Limpiamos las etiquetas vacías if item_local.infoLabels['episodio_titulo']: @@ -393,9 +439,15 @@ def post_tmdb_listado(item, itemlist): title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', title).strip() if item.category_new == "newest": #Viene de Novedades. Marcamos el título con el nombre del canal - title += ' -%s-' % scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() - if item_local.contentType == "movie": - item_local.contentTitle += ' -%s-' % scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + if scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/'): + title += ' -%s-' % scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + else: + title += ' -%s-' % item_local.channel.capitalize() + if item_local.contentType == "movie": + if scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/'): + item_local.contentTitle += ' -%s-' % scrapertools.find_single_match(item_local.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + else: + item_local.contentTitle += ' -%s-' % item_local.channel.capitalize() elif "Episodio " in title: if not item_local.contentSeason or not item_local.contentEpisodeNumber: item_local.contentSeason, item_local.contentEpisodeNumber = scrapertools.find_single_match(title_add, 'Episodio (\d+)x(\d+)') @@ -483,7 +535,7 @@ def post_tmdb_seasons(item, itemlist): del item_season.season_colapse title = '** Todas las Temporadas' #Agregamos título de TODAS las Temporadas (modo tradicional) if item_season.infoLabels['number_of_episodes']: #Ponemos el núm de episodios de la Serie - title += ' [%s epi]' % str(item_season.infoLabels['number_of_episodes']) + title += ' [%sx%s epi]' % (str(item_season.infoLabels['number_of_seasons']), str(item_season.infoLabels['number_of_episodes'])) rating = '' #Ponemos el rating, si es diferente del de la Serie if item_season.infoLabels['rating'] and item_season.infoLabels['rating'] != 0.0: @@ -543,7 +595,7 @@ def post_tmdb_seasons(item, itemlist): if not config.get_setting("unify"): #Si Titulos Inteligentes NO seleccionados: item_local.title = '%s [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.title, item_local.quality, str(item_local.language)) else: #Lo arreglamos un poco para Unify - item_local.title = item_local.title.replace('[', '-').replace(']', '-').replace('.', ',').strip() + item_local.title = item_local.title.replace("[", "-").replace("]", "-").replace(".", ",").replace("GB", "G B").replace("Gb", "G b").replace("gb", "g b").replace("MB", "M B").replace("Mb", "M b").replace("mb", "m b") item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip() #logger.debug(item_local) @@ -795,6 +847,7 @@ def post_tmdb_episodios(item, itemlist): item_local.title = item_local.title.replace(" []", "").strip() item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?-?\s?\]?\]\[\/COLOR\]', '', item_local.title).strip() item_local.title = re.sub(r'\s?\[COLOR \w+\]-?\s?\[\/COLOR\]', '', item_local.title).strip() + item_local.title = item_local.title.replace("[", "-").replace("]", "-").replace(".", ",").replace("GB", "G B").replace("Gb", "G b").replace("gb", "g b").replace("MB", "M B").replace("Mb", "M b").replace("mb", "m b") #Si la información de num. total de episodios de TMDB no es correcta, tratamos de calcularla if num_episodios < item_local.contentEpisodeNumber: @@ -996,7 +1049,15 @@ def post_tmdb_findvideos(item, itemlist): #busco "duration" en infoLabels tiempo = 0 if item.infoLabels['duration']: - tiempo = item.infoLabels['duration'] + try: + if config.get_platform(True)['num_version'] < 18: + tiempo = item.infoLabels['duration'] + elif xbmc.getCondVisibility('Window.IsMedia') == 1: + item.quality = re.sub(r'\s?\[\d+:\d+\ h]', '', item.quality) + else: + tiempo = item.infoLabels['duration'] + except: + tiempo = item.infoLabels['duration'] elif item.contentChannel == 'videolibrary': #No hay, viene de la Videoteca? buscamos en la DB #Leo de la BD de Kodi la duración de la película o episodio. En "from_fields" se pueden poner las columnas que se quiera @@ -1212,7 +1273,7 @@ def get_torrent_size(url): #si tiene múltiples archivos sumamos la longitud de todos if not size: - check_video = scrapertools.find_multiple_matches(str(torrent["info"]["files"]), "'length': (\d+)}") + check_video = scrapertools.find_multiple_matches(str(torrent["info"]["files"]), "'length': (\d+).*?}") sizet = sum([int(i) for i in check_video]) size = convert_size(sizet) @@ -1651,6 +1712,8 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F channel_alt = item.channel if item.url: channel_alt = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').lower() #Salvamos en nombre del canal o clone + if not channel_alt: + channel_alt = item.channel channel = "'%s'" % channel_alt category = '' if channel_alt != 'videolibrary':