From bfd30bb6b16f5fcbfff6572b5ee37d2532ccdc54 Mon Sep 17 00:00:00 2001 From: pipcat Date: Tue, 3 Apr 2018 11:23:05 +0200 Subject: [PATCH 01/42] =?UTF-8?q?A=C3=B1adidas=20funciones=20para=20compro?= =?UTF-8?q?bar=20links?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Una función principal: check_list_links y un par de funciones auxiliares: check_video_link, get_url_play. Para los canales dónde se quiera implementar la verificación de enlaces, llamar a check_list_links después de obtener la lista de enlaces itemlist, en la función findvideos del canal. --- plugin.video.alfa/core/servertools.py | 51 +++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/plugin.video.alfa/core/servertools.py b/plugin.video.alfa/core/servertools.py index da799696..c59ad44a 100644 --- a/plugin.video.alfa/core/servertools.py +++ b/plugin.video.alfa/core/servertools.py @@ -705,3 +705,54 @@ def filter_servers(servers_list): servers_list = servers_list_filter return servers_list + +def check_list_links(itemlist): + """ + Comprueba una lista de enlaces a videos y la devuelve modificando el titulo con la verificacion. + """ + for it in itemlist: + if it.server != '' and it.url != '': + verificacion = check_video_link(it.url, it.server) + it.title = verificacion + ', ' + it.title.strip() + return itemlist + +def check_video_link(url, server): + """ + Comprueba si el enlace a un video es valido y devuelve un string de 2 posiciones con la verificacion. + :param url, server: Link y servidor + :return: str(2) '??':No se ha podido comprobar. 'Ok':Parece que el link funciona. 'NO':Parece que no funciona. + """ + try: + server = server.lower() + server_module = __import__('servers.%s' % server, None, None, ["servers.%s" % server]) + except: + server_module = None + logger.info("[check_video_link] No se puede importar el servidor! %s" % server) + return "??" + + if hasattr(server_module, 'test_video_exists'): + try: + urlcheck = url if server == 'netutv' else get_url_play(url, server) + video_exists, message = server_module.test_video_exists(page_url=urlcheck) + if not video_exists: + logger.info("[check_video_link] No existe! %s %s %s" % (message, server, url)) + return "NO" + else: + logger.info("[check_video_link] comprovacion OK %s %s" % (server, url)) + return "Ok" + except: + logger.info("[check_video_link] No se puede comprobar ahora! %s %s" % (server, url)) + return "??" + + logger.info("[check_video_link] No hay test_video_exists para servidor: %s" % server) + return "??" + +def get_url_play(url, server): + """ + Obtener url que sirva para comprobar si el video existe + """ + url = url.replace("http://miracine.tv/n/?etu=", "http://hqq.tv/player/embed_player.php?vid=") + url = url.replace("streamcloud.eu/embed-", "streamcloud.eu/") + enlaces = findvideosbyserver(url, server)[0] + + return enlaces[1] From 98756c7650e47a4cb50ebbcfaf20fdc2a135f733 Mon Sep 17 00:00:00 2001 From: pipcat Date: Tue, 3 Apr 2018 11:25:27 +0200 Subject: [PATCH 02/42] =?UTF-8?q?A=C3=B1adido=20par=C3=A1metro=20comprueba?= =?UTF-8?q?=5Fenlaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Para poder activar/desactivar la comprobación de enlaces --- plugin.video.alfa/channels/cinefox.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugin.video.alfa/channels/cinefox.json b/plugin.video.alfa/channels/cinefox.json index 17b3228f..19c3898e 100755 --- a/plugin.video.alfa/channels/cinefox.json +++ b/plugin.video.alfa/channels/cinefox.json @@ -67,6 +67,14 @@ "enabled": true, "visible": true }, + { + "id": "comprueba_enlaces", + "type": "bool", + "label": "Verificar si los enlaces existen", + "default": true, + "enabled": true, + "visible": true + }, { "id": "perfil", "type": "list", From ee513872b2cddf73aa244bbc9fc72c67f3312092 Mon Sep 17 00:00:00 2001 From: pipcat Date: Tue, 3 Apr 2018 11:29:39 +0200 Subject: [PATCH 03/42] =?UTF-8?q?A=C3=B1adir=20verificaci=C3=B3n=20de=20en?= =?UTF-8?q?laces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Llamada a servertools.check_list_links(itemlist) si el parámetro comprueba_enlaces lo requiere --- plugin.video.alfa/channels/cinefox.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugin.video.alfa/channels/cinefox.py b/plugin.video.alfa/channels/cinefox.py index 115e5d89..4eea0b7a 100644 --- a/plugin.video.alfa/channels/cinefox.py +++ b/plugin.video.alfa/channels/cinefox.py @@ -25,6 +25,7 @@ list_servers = ['openload', 'powvideo', 'rapidvideo', 'streamango', 'streamcloud __modo_grafico__ = config.get_setting('modo_grafico', 'cinefox') __perfil__ = int(config.get_setting('perfil', "cinefox")) __menu_info__ = config.get_setting('menu_info', 'cinefox') +__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'cinefox') # Fijar perfil de color perfil = [['0xFFFFE6CC', '0xFFFFCE9C', '0xFF994D00', '0xFFFE2E2E', '0xFF088A08'], @@ -685,6 +686,9 @@ def findvideos(item): autoplay.start(itemlist, item) + if __comprueba_enlaces__: + itemlist = servertools.check_list_links(itemlist) + return itemlist From 6aa7b5da2a2b110510c3147072b1bce1ca6d3805 Mon Sep 17 00:00:00 2001 From: pipcat Date: Tue, 3 Apr 2018 11:33:13 +0200 Subject: [PATCH 04/42] =?UTF-8?q?A=C3=B1adido=20comprueba=5Fenlaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.video.alfa/channels/peliculasdk.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/peliculasdk.json b/plugin.video.alfa/channels/peliculasdk.json index 2fed6d4d..60510ed3 100755 --- a/plugin.video.alfa/channels/peliculasdk.json +++ b/plugin.video.alfa/channels/peliculasdk.json @@ -26,6 +26,14 @@ "default": true, "enabled": true, "visible": true + }, + { + "id": "comprueba_enlaces", + "type": "bool", + "label": "Verificar si los enlaces existen", + "default": true, + "enabled": true, + "visible": true } ] -} \ No newline at end of file +} From b3f77519d263a0ff17f87be0b676f9cf6028afcf Mon Sep 17 00:00:00 2001 From: pipcat Date: Tue, 3 Apr 2018 11:34:56 +0200 Subject: [PATCH 05/42] =?UTF-8?q?A=C3=B1adido=20verificaci=C3=B3n=20de=20e?= =?UTF-8?q?nlaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.video.alfa/channels/peliculasdk.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugin.video.alfa/channels/peliculasdk.py b/plugin.video.alfa/channels/peliculasdk.py index 24b596da..a194b54f 100644 --- a/plugin.video.alfa/channels/peliculasdk.py +++ b/plugin.video.alfa/channels/peliculasdk.py @@ -11,6 +11,8 @@ from platformcode import logger from platformcode import config from core import tmdb +__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'peliculasdk') + host = "http://www.peliculasdk.com" def mainlist(item): @@ -183,6 +185,8 @@ def findvideos(item): language=idioma, quality=calidad)) tmdb.set_infoLabels(itemlist) itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) + if __comprueba_enlaces__: + itemlist = servertools.check_list_links(itemlist) if item.library and config.get_videolibrary_support() and len(itemlist) > 0: infoLabels = {'tmdb_id': item.infoLabels['tmdb_id'], 'title': item.fulltitle} From 22783c6c61a713dd7979112536ecd88a87a1ee86 Mon Sep 17 00:00:00 2001 From: pipcat Date: Tue, 3 Apr 2018 12:16:52 +0200 Subject: [PATCH 06/42] =?UTF-8?q?A=C3=B1adido=20comprueba=5Fenlaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.video.alfa/channels/newpct.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/newpct.json b/plugin.video.alfa/channels/newpct.json index 9a3b8e8d..8b3fe8d9 100755 --- a/plugin.video.alfa/channels/newpct.json +++ b/plugin.video.alfa/channels/newpct.json @@ -20,6 +20,14 @@ "default": false, "enabled": true, "visible": true + }, + { + "id": "comprueba_enlaces", + "type": "bool", + "label": "Verificar si los enlaces existen", + "default": true, + "enabled": true, + "visible": true } ] -} \ No newline at end of file +} From 8034c67651e81f45f9fc29b59b0ec62b15add910 Mon Sep 17 00:00:00 2001 From: pipcat Date: Tue, 3 Apr 2018 12:18:12 +0200 Subject: [PATCH 07/42] =?UTF-8?q?A=C3=B1adido=20verificaci=C3=B3n=20de=20e?= =?UTF-8?q?nlaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.video.alfa/channels/newpct.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugin.video.alfa/channels/newpct.py b/plugin.video.alfa/channels/newpct.py index 22bf446e..25abeb2d 100755 --- a/plugin.video.alfa/channels/newpct.py +++ b/plugin.video.alfa/channels/newpct.py @@ -10,6 +10,9 @@ from core.item import Item from platformcode import logger from core import httptools +from platformcode import config +__comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'newpct') + Host='http://www.tvsinpagar.com' @@ -97,4 +100,6 @@ def findvideos(item): itemlist.extend(new_item) for it in itemlist: it.channel = item.channel + if __comprueba_enlaces__: + itemlist = servertools.check_list_links(itemlist) return itemlist From 21ee98ceb077b978ab85f397ea115c93f15e18e0 Mon Sep 17 00:00:00 2001 From: pipcat Date: Wed, 4 Apr 2018 08:41:54 +0200 Subject: [PATCH 08/42] =?UTF-8?q?A=C3=B1adir=20funci=C3=B3n=20test=5Fvideo?= =?UTF-8?q?=5Fexists?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.video.alfa/servers/netutv.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugin.video.alfa/servers/netutv.py b/plugin.video.alfa/servers/netutv.py index e17c0fec..6e401fad 100755 --- a/plugin.video.alfa/servers/netutv.py +++ b/plugin.video.alfa/servers/netutv.py @@ -8,6 +8,15 @@ from core import jsontools from core import scrapertools from platformcode import logger +def test_video_exists(page_url): + logger.info("(page_url='%s')" % page_url) + + data = httptools.downloadpage(page_url).data + + if "var userid = '';" in data.lower(): + return False, "[netutv] El archivo no existe o ha sido borrado" + + return True, "" def get_video_url(page_url, premium=False, user="", password="", video_password=""): logger.info("url=" + page_url) From 701fd163286e106a28ad4beb9559ce8015d779c5 Mon Sep 17 00:00:00 2001 From: pipcat Date: Thu, 5 Apr 2018 18:56:54 +0200 Subject: [PATCH 09/42] =?UTF-8?q?Cambio=20en=20la=20verificaci=C3=B3n=20de?= =?UTF-8?q?=20enlaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La función check_list_links recibe tb un parámetro con el número de enlaces a comprobar, y se eliminan las excepciones de servidores que había en check_video_link. --- plugin.video.alfa/core/servertools.py | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/plugin.video.alfa/core/servertools.py b/plugin.video.alfa/core/servertools.py index c59ad44a..f280145c 100644 --- a/plugin.video.alfa/core/servertools.py +++ b/plugin.video.alfa/core/servertools.py @@ -706,14 +706,17 @@ def filter_servers(servers_list): return servers_list -def check_list_links(itemlist): +def check_list_links(itemlist, numero): """ Comprueba una lista de enlaces a videos y la devuelve modificando el titulo con la verificacion. + El segundo parametro (numero) indica cuantos enlaces hay que verificar (0:5, 1:10, 2:15, 3:20) """ + numero = ((int(numero) + 1) * 5) if numero != '' else 10 for it in itemlist: - if it.server != '' and it.url != '': + if numero > 0 and it.server != '' and it.url != '': verificacion = check_video_link(it.url, it.server) it.title = verificacion + ', ' + it.title.strip() + numero -= 1 return itemlist def check_video_link(url, server): @@ -723,7 +726,6 @@ def check_video_link(url, server): :return: str(2) '??':No se ha podido comprobar. 'Ok':Parece que el link funciona. 'NO':Parece que no funciona. """ try: - server = server.lower() server_module = __import__('servers.%s' % server, None, None, ["servers.%s" % server]) except: server_module = None @@ -732,8 +734,7 @@ def check_video_link(url, server): if hasattr(server_module, 'test_video_exists'): try: - urlcheck = url if server == 'netutv' else get_url_play(url, server) - video_exists, message = server_module.test_video_exists(page_url=urlcheck) + video_exists, message = server_module.test_video_exists(page_url=url) if not video_exists: logger.info("[check_video_link] No existe! %s %s %s" % (message, server, url)) return "NO" @@ -746,13 +747,3 @@ def check_video_link(url, server): logger.info("[check_video_link] No hay test_video_exists para servidor: %s" % server) return "??" - -def get_url_play(url, server): - """ - Obtener url que sirva para comprobar si el video existe - """ - url = url.replace("http://miracine.tv/n/?etu=", "http://hqq.tv/player/embed_player.php?vid=") - url = url.replace("streamcloud.eu/embed-", "streamcloud.eu/") - enlaces = findvideosbyserver(url, server)[0] - - return enlaces[1] From f730a16ffa47c9f2cdb38711589291d6c14a2f95 Mon Sep 17 00:00:00 2001 From: pipcat Date: Thu, 5 Apr 2018 19:00:23 +0200 Subject: [PATCH 10/42] Cambio en test_video_exists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ir directamente a la página donde se redirige --- plugin.video.alfa/servers/netutv.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugin.video.alfa/servers/netutv.py b/plugin.video.alfa/servers/netutv.py index 6e401fad..df396157 100755 --- a/plugin.video.alfa/servers/netutv.py +++ b/plugin.video.alfa/servers/netutv.py @@ -11,6 +11,9 @@ from platformcode import logger def test_video_exists(page_url): logger.info("(page_url='%s')" % page_url) + # http://netu.tv/watch_video.php=XX solo contiene una redireccion, ir directamente a http://hqq.tv/player/embed_player.php?vid=XX + page_url = page_url.replace("http://netu.tv/watch_video.php?v=", "http://hqq.tv/player/embed_player.php?vid=") + data = httptools.downloadpage(page_url).data if "var userid = '';" in data.lower(): From add730aa6070488f2bb46cfdc72f70b0e0562285 Mon Sep 17 00:00:00 2001 From: pipcat Date: Thu, 5 Apr 2018 19:03:03 +0200 Subject: [PATCH 11/42] =?UTF-8?q?A=C3=B1adir=20comprueba=5Fenlaces=5Fnum?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añadido parámetro para limitar los enlaces a verificar. Comprobación de enlaces por defecto desactivada. --- plugin.video.alfa/channels/cinefox.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/cinefox.json b/plugin.video.alfa/channels/cinefox.json index 19c3898e..2edcc04a 100755 --- a/plugin.video.alfa/channels/cinefox.json +++ b/plugin.video.alfa/channels/cinefox.json @@ -71,10 +71,19 @@ "id": "comprueba_enlaces", "type": "bool", "label": "Verificar si los enlaces existen", - "default": true, + "default": false, "enabled": true, "visible": true }, + { + "id": "comprueba_enlaces_num", + "type": "list", + "label": "Número de enlaces a verificar", + "default": 1, + "enabled": true, + "visible": "eq(-1,true)", + "lvalues": [ "5", "10", "15", "20" ] + }, { "id": "perfil", "type": "list", From e649fa9b9cf50fad8d0f6fbf966cfd59f4ec6426 Mon Sep 17 00:00:00 2001 From: pipcat Date: Thu, 5 Apr 2018 19:09:04 +0200 Subject: [PATCH 12/42] =?UTF-8?q?Cambios=20en=20la=20verificaci=C3=B3n=20d?= =?UTF-8?q?e=20enlaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añadido parámetro con el número de enlaces a verificar. Llamada a normalizar_url para comprobar enlaces, para forzar la llamada a findvideosbyserver y tener la url standard que permite ser comprobada. --- plugin.video.alfa/channels/cinefox.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/cinefox.py b/plugin.video.alfa/channels/cinefox.py index 4eea0b7a..b6a67f85 100644 --- a/plugin.video.alfa/channels/cinefox.py +++ b/plugin.video.alfa/channels/cinefox.py @@ -26,6 +26,7 @@ __modo_grafico__ = config.get_setting('modo_grafico', 'cinefox') __perfil__ = int(config.get_setting('perfil', "cinefox")) __menu_info__ = config.get_setting('menu_info', 'cinefox') __comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'cinefox') +__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'cinefox') # Fijar perfil de color perfil = [['0xFFFFE6CC', '0xFFFFCE9C', '0xFF994D00', '0xFFFE2E2E', '0xFF088A08'], @@ -687,10 +688,22 @@ def findvideos(item): autoplay.start(itemlist, item) if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist) + for it in itemlist: + if it.server != '' and it.url != '': + it.url = normalizar_url(it.url, it.server) + itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) return itemlist +def normalizar_url(url, server): + # Pasar por findvideosbyserver para para obtener url a partir de los pattern/url de los json de servidores + # Excepciones copiadas de la funcion play + url = url.replace("http://miracine.tv/n/?etu=", "http://hqq.tv/player/embed_player.php?vid=") + url = url.replace("streamcloud.eu/embed-", "streamcloud.eu/") + enlaces = findvideosbyserver(url, server)[0] + if enlaces[1] != '': + return enlaces[1] + return url def get_enlaces(item, url, type): itemlist = [] From a944cadfe6b2823ab0ceea008f360cf19aa2ebb5 Mon Sep 17 00:00:00 2001 From: pipcat Date: Thu, 5 Apr 2018 19:10:04 +0200 Subject: [PATCH 13/42] =?UTF-8?q?A=C3=B1adir=20comprueba=5Fenlaces=5Fnum?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.video.alfa/channels/newpct.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/newpct.json b/plugin.video.alfa/channels/newpct.json index 8b3fe8d9..d9d4943f 100755 --- a/plugin.video.alfa/channels/newpct.json +++ b/plugin.video.alfa/channels/newpct.json @@ -25,9 +25,18 @@ "id": "comprueba_enlaces", "type": "bool", "label": "Verificar si los enlaces existen", - "default": true, + "default": false, "enabled": true, "visible": true + }, + { + "id": "comprueba_enlaces_num", + "type": "list", + "label": "Número de enlaces a verificar", + "default": 1, + "enabled": true, + "visible": "eq(-1,true)", + "lvalues": [ "5", "10", "15", "20" ] } ] } From 1f61946f9725b1e2217d3aec8c4ff2db6afc9dbc Mon Sep 17 00:00:00 2001 From: pipcat Date: Thu, 5 Apr 2018 19:11:11 +0200 Subject: [PATCH 14/42] =?UTF-8?q?A=C3=B1adir=20comprueba=5Fenlaces=5Fnum?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.video.alfa/channels/peliculasdk.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/peliculasdk.json b/plugin.video.alfa/channels/peliculasdk.json index 60510ed3..8f52c17e 100755 --- a/plugin.video.alfa/channels/peliculasdk.json +++ b/plugin.video.alfa/channels/peliculasdk.json @@ -31,9 +31,18 @@ "id": "comprueba_enlaces", "type": "bool", "label": "Verificar si los enlaces existen", - "default": true, + "default": false, "enabled": true, "visible": true + }, + { + "id": "comprueba_enlaces_num", + "type": "list", + "label": "Número de enlaces a verificar", + "default": 1, + "enabled": true, + "visible": "eq(-1,true)", + "lvalues": [ "5", "10", "15", "20" ] } ] } From a12e9edb765f2eb3be19770f2d3f0f70254f19c2 Mon Sep 17 00:00:00 2001 From: pipcat Date: Thu, 5 Apr 2018 19:12:51 +0200 Subject: [PATCH 15/42] =?UTF-8?q?Tener=20en=20cuenta=20el=20n=C3=BAmero=20?= =?UTF-8?q?de=20enlaces=20a=20verificar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.video.alfa/channels/newpct.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/newpct.py b/plugin.video.alfa/channels/newpct.py index 25abeb2d..b6833ac6 100755 --- a/plugin.video.alfa/channels/newpct.py +++ b/plugin.video.alfa/channels/newpct.py @@ -12,6 +12,7 @@ from core import httptools from platformcode import config __comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'newpct') +__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'newpct') Host='http://www.tvsinpagar.com' @@ -101,5 +102,5 @@ def findvideos(item): for it in itemlist: it.channel = item.channel if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist) + itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) return itemlist From f0fe6723d859ae04cd36992358598a366710f0ee Mon Sep 17 00:00:00 2001 From: pipcat Date: Thu, 5 Apr 2018 19:14:12 +0200 Subject: [PATCH 16/42] =?UTF-8?q?Tratar=20n=C3=BAmero=20de=20enlaces=20a?= =?UTF-8?q?=20verificar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.video.alfa/channels/peliculasdk.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/peliculasdk.py b/plugin.video.alfa/channels/peliculasdk.py index a194b54f..546cdf52 100644 --- a/plugin.video.alfa/channels/peliculasdk.py +++ b/plugin.video.alfa/channels/peliculasdk.py @@ -12,6 +12,7 @@ from platformcode import config from core import tmdb __comprueba_enlaces__ = config.get_setting('comprueba_enlaces', 'peliculasdk') +__comprueba_enlaces_num__ = config.get_setting('comprueba_enlaces_num', 'peliculasdk') host = "http://www.peliculasdk.com" @@ -186,7 +187,7 @@ def findvideos(item): tmdb.set_infoLabels(itemlist) itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) if __comprueba_enlaces__: - itemlist = servertools.check_list_links(itemlist) + itemlist = servertools.check_list_links(itemlist, __comprueba_enlaces_num__) if item.library and config.get_videolibrary_support() and len(itemlist) > 0: infoLabels = {'tmdb_id': item.infoLabels['tmdb_id'], 'title': item.fulltitle} From d1443913936719685582839035a28ccdb8116cc2 Mon Sep 17 00:00:00 2001 From: pipcat Date: Sat, 7 Apr 2018 18:47:52 +0200 Subject: [PATCH 17/42] =?UTF-8?q?Evitar=20recursi=C3=B3n=20infinita=20si?= =?UTF-8?q?=20falla=20Cloudflare?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añadido parámetro bypass_cloudflare=False en el downloadpage interior cuando hay bypass_cloudflare, para evitar bucle infinito si falla el acceso a Cloudflare. --- plugin.video.alfa/core/httptools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.video.alfa/core/httptools.py b/plugin.video.alfa/core/httptools.py index d1a553e2..e7f9683c 100755 --- a/plugin.video.alfa/core/httptools.py +++ b/plugin.video.alfa/core/httptools.py @@ -240,7 +240,7 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr logger.info("cloudflare detectado, esperando %s segundos..." % cf.wait_time) auth_url = cf.get_url() logger.info("Autorizando... url: %s" % auth_url) - if downloadpage(auth_url, headers=request_headers, replace_headers=True).sucess: + if downloadpage(auth_url, headers=request_headers, replace_headers=True, bypass_cloudflare=False).sucess: logger.info("Autorización correcta, descargando página") resp = downloadpage(url=response["url"], post=post, headers=headers, timeout=timeout, follow_redirects=follow_redirects, From 504d9a151b4680997f2e46375a4710a87f57ab46 Mon Sep 17 00:00:00 2001 From: pipcat Date: Sat, 7 Apr 2018 18:56:05 +0200 Subject: [PATCH 18/42] Cambio en el decode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añadir una rutina diferente para hacer el decode y redondear jschl_answer, simulando lo que hace la rutina javascript de la protección cloudflare. --- plugin.video.alfa/core/cloudflare.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/plugin.video.alfa/core/cloudflare.py b/plugin.video.alfa/core/cloudflare.py index 356eb310..2c1605d2 100755 --- a/plugin.video.alfa/core/cloudflare.py +++ b/plugin.video.alfa/core/cloudflare.py @@ -62,12 +62,13 @@ class Cloudflare: def get_url(self): # Metodo #1 (javascript) if self.js_data.get("wait", 0): - jschl_answer = self.decode(self.js_data["value"]) + jschl_answer = self.decode2(self.js_data["value"]) for op, v in self.js_data["op"]: - jschl_answer = eval(str(jschl_answer) + op + str(self.decode(v))) + jschl_answer = eval(str(jschl_answer) + op + str(self.decode2(v))) - self.js_data["params"]["jschl_answer"] = jschl_answer + len(self.domain) + jschl_answer += 0.00000000005 if jschl_answer >= 0 else -0.00000000005 + self.js_data["params"]["jschl_answer"] = round(jschl_answer, 10) + len(self.domain) response = "%s://%s%s?%s" % ( self.protocol, self.domain, self.js_data["auth_url"], urllib.urlencode(self.js_data["params"])) @@ -85,6 +86,27 @@ class Cloudflare: return response + def decode2(self, data): + data = re.sub("\!\+\[\]", "1", data) + data = re.sub("\!\!\[\]", "1", data) + data = re.sub("\[\]", "0", data) + + pos = data.find("/") + numerador = data[:pos] + denominador = data[pos+1:] + + aux = re.compile('\(([0-9\+]+)\)').findall(numerador) + num1 = "" + for n in aux: + num1 += str(eval(n)) + + aux = re.compile('\(([0-9\+]+)\)').findall(denominador) + num2 = "" + for n in aux: + num2 += str(eval(n)) + + return float(num1) / float(num2) + def decode(self, data): t = time.time() timeout = False From cf59ba461d1c592543ce0915a3017802a95c38c7 Mon Sep 17 00:00:00 2001 From: pipcat Date: Sun, 8 Apr 2018 11:03:16 +0200 Subject: [PATCH 19/42] Correcciones decimales MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Todavía no es 100% fiable pq hay cálculos en coma flotante de javascript que no dan igual que en python, pero con esta modifiación se acerca un poco más a lo que debería dar. --- plugin.video.alfa/core/cloudflare.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/plugin.video.alfa/core/cloudflare.py b/plugin.video.alfa/core/cloudflare.py index 2c1605d2..0398ec94 100755 --- a/plugin.video.alfa/core/cloudflare.py +++ b/plugin.video.alfa/core/cloudflare.py @@ -9,7 +9,7 @@ import urllib import urlparse from platformcode import logger - +from decimal import Decimal, ROUND_UP class Cloudflare: def __init__(self, response): @@ -65,9 +65,16 @@ class Cloudflare: jschl_answer = self.decode2(self.js_data["value"]) for op, v in self.js_data["op"]: - jschl_answer = eval(str(jschl_answer) + op + str(self.decode2(v))) + #jschl_answer = eval(str(jschl_answer) + op + str(self.decode2(v))) + if op == '+': + jschl_answer = jschl_answer + self.decode2(v) + elif op == '-': + jschl_answer = jschl_answer - self.decode2(v) + elif op == '*': + jschl_answer = jschl_answer * self.decode2(v) + elif op == '/': + jschl_answer = jschl_answer / self.decode2(v) - jschl_answer += 0.00000000005 if jschl_answer >= 0 else -0.00000000005 self.js_data["params"]["jschl_answer"] = round(jschl_answer, 10) + len(self.domain) response = "%s://%s%s?%s" % ( @@ -105,7 +112,8 @@ class Cloudflare: for n in aux: num2 += str(eval(n)) - return float(num1) / float(num2) + #return float(num1) / float(num2) + return Decimal(Decimal(num1) / Decimal(num2)).quantize(Decimal('.0000000000000001'), rounding=ROUND_UP) def decode(self, data): t = time.time() From 52fed32251f16dc115adcd02c45fdb455a86f8a3 Mon Sep 17 00:00:00 2001 From: pipcat Date: Sun, 8 Apr 2018 13:14:40 +0200 Subject: [PATCH 20/42] Quitado ROUND_UP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No cambia mucho, es casi igual, pero parece un poquito más aproximado --- plugin.video.alfa/core/cloudflare.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin.video.alfa/core/cloudflare.py b/plugin.video.alfa/core/cloudflare.py index 0398ec94..b4948b71 100755 --- a/plugin.video.alfa/core/cloudflare.py +++ b/plugin.video.alfa/core/cloudflare.py @@ -113,7 +113,8 @@ class Cloudflare: num2 += str(eval(n)) #return float(num1) / float(num2) - return Decimal(Decimal(num1) / Decimal(num2)).quantize(Decimal('.0000000000000001'), rounding=ROUND_UP) + #return Decimal(Decimal(num1) / Decimal(num2)).quantize(Decimal('.0000000000000001'), rounding=ROUND_UP) + return Decimal(Decimal(num1) / Decimal(num2)).quantize(Decimal('.0000000000000001')) def decode(self, data): t = time.time() From b746cf65db16d8d7ac253481be90b644674c34f2 Mon Sep 17 00:00:00 2001 From: pipcat Date: Sun, 8 Apr 2018 13:40:21 +0200 Subject: [PATCH 21/42] Bug en normalizar_url MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añadido prefijo servertools. --- plugin.video.alfa/channels/cinefox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/cinefox.py b/plugin.video.alfa/channels/cinefox.py index b6a67f85..264afbd2 100644 --- a/plugin.video.alfa/channels/cinefox.py +++ b/plugin.video.alfa/channels/cinefox.py @@ -700,7 +700,7 @@ def normalizar_url(url, server): # Excepciones copiadas de la funcion play url = url.replace("http://miracine.tv/n/?etu=", "http://hqq.tv/player/embed_player.php?vid=") url = url.replace("streamcloud.eu/embed-", "streamcloud.eu/") - enlaces = findvideosbyserver(url, server)[0] + enlaces = servertools.findvideosbyserver(url, server)[0] if enlaces[1] != '': return enlaces[1] return url From 320171eea5dc5cd9b06a22879312a2bb00350f7a Mon Sep 17 00:00:00 2001 From: pipcat Date: Sun, 8 Apr 2018 18:14:01 +0200 Subject: [PATCH 22/42] Limitar recursiones MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cuando falla la autorización cloudflare, limitar el número de reintentos para evitar un posible bucle infinito de peticiones. --- plugin.video.alfa/core/httptools.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugin.video.alfa/core/httptools.py b/plugin.video.alfa/core/httptools.py index e7f9683c..8e1217c9 100755 --- a/plugin.video.alfa/core/httptools.py +++ b/plugin.video.alfa/core/httptools.py @@ -68,7 +68,7 @@ load_cookies() def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=True, cookies=True, replace_headers=False, - add_referer=False, only_headers=False, bypass_cloudflare=True): + add_referer=False, only_headers=False, bypass_cloudflare=True, count_retries=0): """ Abre una url y retorna los datos obtenidos @@ -234,13 +234,14 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr logger.info("No se ha podido descomprimir") # Anti Cloudflare - if bypass_cloudflare: + if bypass_cloudflare and count_retries < 5: cf = Cloudflare(response) if cf.is_cloudflare: + count_retries += 1 logger.info("cloudflare detectado, esperando %s segundos..." % cf.wait_time) auth_url = cf.get_url() - logger.info("Autorizando... url: %s" % auth_url) - if downloadpage(auth_url, headers=request_headers, replace_headers=True, bypass_cloudflare=False).sucess: + logger.info("Autorizando... intento %d url: %s" % (count_retries, auth_url)) + if downloadpage(auth_url, headers=request_headers, replace_headers=True, count_retries=count_retries).sucess: logger.info("Autorización correcta, descargando página") resp = downloadpage(url=response["url"], post=post, headers=headers, timeout=timeout, follow_redirects=follow_redirects, From 87f67acf3344087b243142cd39f6bf942456e482 Mon Sep 17 00:00:00 2001 From: Kingbox <37674310+lopezvg@users.noreply.github.com> Date: Sun, 8 Apr 2018 20:40:15 +0200 Subject: [PATCH 23/42] Thumbs y banners de Tumejortorrent y Tvsinpagar --- .../media/channels/banner/tumejortorrent.png | Bin 0 -> 42454 bytes .../media/channels/banner/tvsinpagar.png | Bin 0 -> 32411 bytes .../media/channels/thumb/tumejortorrent.png | Bin 0 -> 14905 bytes .../media/channels/thumb/tvsinpagar.png | Bin 0 -> 28669 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 plugin.video.alfa/resources/media/channels/banner/tumejortorrent.png create mode 100644 plugin.video.alfa/resources/media/channels/banner/tvsinpagar.png create mode 100644 plugin.video.alfa/resources/media/channels/thumb/tumejortorrent.png create mode 100644 plugin.video.alfa/resources/media/channels/thumb/tvsinpagar.png diff --git a/plugin.video.alfa/resources/media/channels/banner/tumejortorrent.png b/plugin.video.alfa/resources/media/channels/banner/tumejortorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..1910766d22cfcb9d181a02adf869d16664cd41a2 GIT binary patch literal 42454 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 literal 0 HcmV?d00001 diff --git a/plugin.video.alfa/resources/media/channels/banner/tvsinpagar.png b/plugin.video.alfa/resources/media/channels/banner/tvsinpagar.png new file mode 100644 index 0000000000000000000000000000000000000000..ea43d48763d27001a79329685a3985f356fe19b1 GIT binary patch literal 32411 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 F{{ftSL&N|8 literal 0 HcmV?d00001 diff --git a/plugin.video.alfa/resources/media/channels/thumb/tumejortorrent.png b/plugin.video.alfa/resources/media/channels/thumb/tumejortorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..2e86f13ebf406ee34376842d8599ab4517760f45 GIT binary patch literal 14905 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 literal 0 HcmV?d00001 diff --git a/plugin.video.alfa/resources/media/channels/thumb/tvsinpagar.png b/plugin.video.alfa/resources/media/channels/thumb/tvsinpagar.png new file mode 100644 index 0000000000000000000000000000000000000000..103e4d8be9dbda47461b69c4c3bae1026abdcf94 GIT binary patch literal 28669 zcmeEtQ*$QF^LA|8+1R#i+qP}nPVU&Yv$2zn?PO!y#($sl_u%~izk`{ssX6GXsqUWc ztFMkyl$U^q!GQq+0)m&46jlBwfBsugApiD8>-5}z0@y`aLKvuS2Jh_O0n9>3PUzoN z0_>*|_`fr>qokG#5D>!9e+&4JLxm|2kVCSRsF13s{#6g8C)&~bOCKw+kQkpk8jm}z zL;`q8dAgiCN7wqck6itxiuAg%5l)%PjB16ifbx|Fw@c7A!I5LJ@ja(OEfq=l{0Q!=)J zT=YN-0`1u9z9{YG`=0DHe+cLT@#&y{Jn)sMjvg|*CRL%5IZ!W6mvEfMOVdkJ@(TOL z@_SQz#MDz6%8%}Umv|5QM%ODNe1%X#SRhP1rhWuXYhbOYRq#6iLO!i0H7zKA1efih z=$!=;3^14;Xoc!V`9d${(R#m<69PtIgb7-yC>NR%iJ)dt# zslb>jKAr;-^K(r>&iuZ!_|sN?RB2WKZ}ao}Oal1TcE3Z&F(2q%O=Z@sH{_k=y)|tP z{pClZ;r;phrBit~K%_(}AcB8MW7qn+{`AuL&6ziEYKkmJ?w*! zo|bc59a{T#C-2~A{0F*ToDZWvEQ0Z>&MNDHg4^_QKvCaCkbsgS!#|a;{<7>SueW z-JO@`n}q&xRMYZ_CtqEseX(vkvp_n17t+{{vkQrekUm70C`M(Rocv&A1BV|tX{e9& zh51#{@?I2x zvXIy=Ch}@-ZN1ONChLZeY|hFCZOuF~sHunk@4I@3ey1-Z5LO3ri0(mpH*rJaf+3#L z&FfnTr-7k=`$%4u3TpoN$?_NQ_{pkU|5OMS=`BP3M*QcF|LnC`Ei9^YU$j*wP5*mB z)u@~FVkhJ2oA9)+i9OICI2EiiX5Csq2fw|&vaZ_~8meX$d_)2r2EC*&xdrKa zd)Ejj2l$;YJsaotO9QuGK>X(gR%qZzBfZt#Wq|6E5H0a|)4jqFrn`VC!v~QbeqeXL*gv?H0G@eq-~0XHPueV5XhRo`D*DwaCihR)PF7uq_3 zvX))1M5kcxexS}JS|7ex3lXZaNX^yBLmp8e-%3!OinB?C(9Kub_crV#IRK8K> zRI+oKAu{@@;mVky;TcmM_&=&aVW;}364+BF(XEYD#IlX-;#!oFwb|6pyA%_}K++Ja z5HjL4Fb!ZlFe@R0nlZJCSc`^ClLN5Urw!(|R{8#H76WR6(IWpxrs2Kz`kGAfqS<<^=5Bu+|J3b-v(EnBI?S&zZzk|B&MyWz z3>bL(LS*EzK92hiU#@zGSCVyH84ZGnYd{AXRT{28@81=X+`@`QzNNDmRSGe^f(n+u zOJ3335=s#>%73~lQU5OWrt~PM_yyQ-tmv0iJj+X`?8~WQ-YK8&v)(e%JN`Vs6C!vh zmQz*LrdMTjsasYao=#+1b5gk4KdDA>%xm6p^Weuz=L%fN0hTZG!UoG5Y@)Sa{AhG8 zg7^xir2x(aQ7l0$6U+d?T?V0>m{klhsx1{!uavNk&n0Wx2y~}fbUYU=M=oAg2v}Jjr^rtF-?Sx3!%6R_Y z*OriOr*O*~Vt!8#R&d_qWya)VD&9^YbH_m3rBU1lse|Zr9uzpfx-MSHrL^N36>gg^)| zFmsqjsg{ZHX0=c$7cZ)UzF*=;d)kvqztr(#jWT~WvXVDGp+ESFm+Nlz)1AstJRtN;#c)SPBG>y4G&QL4^DzP|@t`+cC z&`W_L6^f1PmJo;wHDX_x0kTHSIY zY$8G&dL1iEW4MKsA{dZ%x?fZy#&Y!eZTPj^FzWKPJKqm9wGg<%qJ5R5mGnn0SL~G) zWFTAJFM>>mm6+3!oLGnnsk$Z4JniYXuykRw(5R-6v0!VTM;FsU*jL2tK04_1Q^(c0 zP*M*epk}Zcvxvuxtb0Ig#FE$Z3+N-2xQ%c%2UpM)_ALyd1xk74_u>e%Ook-G_=Jxmm;13vf}B9e zZ9#^?&(c!DxISB8GVI%F6L#%Kfz(jyhkhN5&R2k*3#CIo}Qz08V>>vMF$p{L_v-@t#z4R5yJ~gMk;k7>ONcGV>e%&QJD(vwj z%cVuik~gb}mJ!D@Ym~T9*2>q?NtCrZn|Vhu@oA+e*^a53q77FoYjsY6nZanJ(=(Rg zbG!A16mff3g4&%NVWZm)4|{V+p?*DY45Pr5CCiyd1eEOr*LO z!o1|?zEDjbf(i>fAZY@rWV3P&Z|{{84FjoX(VV=yXQIfkAfevHLAWU?B5k%Z5OE+h z!5kYPp;!jtNGar}Os=xKRkiH-{EauUT4~ye?#ZAY4cG&Xkq8fQg-Ic{_P#^bpV6;B zV8Fr)sP=7DBc+Q{;|+)AAY{?s;w;fa^VfLh5YrF$D?)_R_iyKWPL-z=q-Ofj_&^Jb z8>kh-MGM#d{&S=b{4zt;EOn;+fmNgz7dH9*pKrOx6a;vEzaNsXs14@4#^8`O!Q>cO z60Pi6HFNTD5Z;XH%>A4fUiN`gjaZ&-eREVIE_;yiyQQ{BE9jrCj|i zN_mxRJ`k~R%``JfIs}U|V=yXZ9q8HJ82DF$OKx=lCf&GDM(7^$1Clv$Xr{1D6lW>i zq!FDa3fYV};b0WhZi3r3mX&=DFQI@GWvQ!fCGZ)izcH$FlH3)vt{L%mdhC<61Cp_l zIa}H7e_~2uS;Q`3vi%xr)yS+yhC29l>TrCYIaj6-stxvdn>2H^1Ky&5V83Lb zX4a%hzkzt+o5CGpF)hszj*s^6K|_Raz^BY(F{NxoEfEA-yNhUB=sSJ$Bb8!Cfox>x zfrS6`!bj@*({F)y@{C=a-8J2yd1}dk+X)+kub_`64Vw1D4Xc9h$;TI}wG94uz%9_>PIhPH3Wsc*`y74u0%_i4u4tTW+XHMZgv8om$a zmA9s=`unum;kk{lOK_s#xc((4qtTd7;U@fy7!Jq_Dq??0-b&mnJm4G9bAoiw=B9Ea z!~Yw7nm@jwA%%NGZu;l(gOrB%H)wa0T;6>tp#zWWvnIoGIB1`!U+atP@`6HYhgnpo zE?_>_Hb{#*z^+)E3PsS^1u*kHGuk7^m+EmWG12|5nMNXiVVH^Z*3O7v_$!zt9Q!~s zb_ScQSsQlPeWBLr3?&<3?A)62IZ26$A&b#FU-KiLy4@h%IvpC+Oe4qi?x$JAk3 zCqAVpdF*zGK>zIg)(C!oD10jkf`Q`u9gzyXBuIF@rGw>&RphPfnFqo227GHKO68E;4?v+PFft;+b0-lhB%?meJ;xsC4m3R`v7=ZrgivnhB>7H>Ql1pc?~+ zFvCUDD~P=$HT8kQ<~Jgq-PQX<>{gghwaRRnE8mM21Gh z9q{8HOPY*PoEG4>#IgOiyqq*JkxP2Onv(J0y#PGTO^U5bruz01y2e+EQ zIqM#B(X9Es;t%&(G;A49H1a{Z`BXJ9p9WS1n(YW&ZHq>G4(7%I*Vie0_!d6&f#oYK zhsszmdFNN#%S$EFFY@szG;CZH3hsKrQO~;E%j?rgxat9KG)Or;_Y%q8=ZT<)&2o;P zGo&W)r?alA0eu%h2*7HEtsr4;qn~P5=@qa&OHuCD@1Gv)!nsT%--`rrq^gURGY*LP zdDMzGypC8$v#z?<)?FD&oUlv;5Rh)-*a*+Yh;F^rFMmYjCUS!1KC&FmodU1$`O@i? zc77ZMD_W+s--u|R$42DW)=KpsDcBqaBy7dhLz#J2U~b+ldIdN^-;qn0-~W!BdVJs` ze$mNi6wca3A{`ZyZt9}f!}7MGc&^b18tok1Igmy6AU2shNF1?;;IN_NJwlqMgy0PLo`hRrf{4`TKx5*p|PN$mLEJSIET0}yIMxb zx$R${p$LT!e5P2(^?9>JMVm?wCHqIu6Vu=)>uNU%1vi6!QKxrh zt-z%eM2+`L7jD}iqF(nBXk?FD4Dl-!;4wN^fEBct1z&Hi&2~m7>Rwl2ggID^p)sX3 zyG_hl1<81MS{oF^kvK^Hf(xb)P2pHpor|`kccfZCZNoX4)I8J_`^_vOKA&^ZZEq_~ zh7-wW-M5SxG0*cVzBuqe)rWyIgWn^Jtq(DcpikTCcl-- z{kWaag%tuu=V))6zc1r}Pjo`xd2rA!!Lje%Y6Gswi5B{p=CLk0m@Zp5uZXMD(spBGr=IqWQAzEdk zs(+Y2g+aFW?JIW9WwV~6Mk?8Fm}$^2SwFFsGS+!b-~-c(%QNuS;V{>vM8EmX{EF!g ztjbO9N|p4Am)_63;^BgusB}&KzxS~6T=EMmxgTND+1u6uJ|h-aku;R&x$pw_aHYHG zHk%Ck=a;39;hx$W$=hGgqqVp3r1u@7M`}|?mUzfc8}H%he0+zgBm~uZ-O;sE3{~0) zh;hx!%Wh6r$Mq?x&!U+u01N%6b&UPMy$8yw25+yX1-b=qqve=Y-|wOCl>(zF{ZA() zGkkMyZXboba`pP1G+Sz<^4G?lvNrllv(@Vm<5ITZ>WIp0d^RY(1`;^FYL4%*g^rTS zR$>!unXFFlzknP6b(h`r z@Z+V#E}gV4?j=*8rw4FvcclH4g0`8qRlH8|cn5dQd=Uz+n9KChDQoTA5yaKD&lA(( zpIKN*WXoD%=J}#{Ya&-$n>n`6f;c+g96bJZJb%58L8R93*c?X2UFe>1LgRt($viH( zCgyp{U~0zSbKGZFwdgb-*HKtQE|3*#FHjcFRwRUyIbgl{Ia!Euz$+wl#W^I9z z59`Ya2%Rv$12>I>64-_a=q8f4VZh3QlMr~5h^OL{jiGH)8<##CS|a=_eZZNugE`wz zDD@(f2;Ovx$jg(4gK-d(85<&7HQKxJa$b|T9>JBkO_75{i4B3IRh2 zQ0w7&*-d^uLS98gUS^3ZrlVU*6<~{chknZkkv}O;X2ugZ(_r3exzNnu1LMY8yTt=t6+McW`48C;sN}cM1D$DH>f0*7C02xw0CDCNXu@ z&wAJ{2kEIUFh0w4uX-?^4TC)q(EF{Ft4!Ujev7u=o5i(eWkYe->Jaeh7tHu4L*=)d zf{e~DARf=;jUC}>{bw4|W=^_oD@vDhko8F)8-5LJ=H;`IrX^yv zaKa&N2KK(Wk39{6heX(DK4zDrZIizg49PTolnLI)Ge3+Zn+e=bv{z%azwwhVV3LQ= z1PD2oeS0A*xe%n2_YZMmipJn+?=^*jD}T)#2BRd}WL4RL%Vf(ZZ_MZwsr$BY3FSdF zd94^94oeCiupuZ(Cpo;sWMFs`j8NlXFq?HW?$ZV__mmj{dt>`Vcxc{!v%?jZb;E!; zLpTF`&qKCbKI$!j30tv8Troye< zB2TCL4U`FiB!uxjL&3wT{4vqmB}Kj{@<|K;T|ax^ugz*a74@O`^!)(0e(Jhbxb^cORY5cWj+wEb_LWCQv}?%UA|Qw=t^( zi{Y=U-->h~GITWZF2%Ehfv0yzva$o{74_Edgugq&EP>m)JjCdv#O`duVPIT0-9#& ztjxT%#wNes2)ksli3lxAZ=!#ug+x3K(1p+E_rs_m6dnj>yHz+y~GAkx6 zJK|eQp(UYj1U!7VK|DuT`Xm9FM=##|3bA9CAcs+^Izq_{l>+j6fWgPc7|suvdmS^X z4^#p61$hgzv%h9f_4SyzZXiT4sB}WCKg;&ELCV1dVzT?*b$BgH=;8(AttGR3>( z4GwSA?0phRi8P58+`b^yswz^f!kl*4@v>4&aBG_^*g)*cl`#VKbC2T#^>K!?HpGq| zspPG=v{Lfh|MhBZ?>J@m@-h=4nTJ^ZwD9qbY(5z;Y9xZi?|!SpaBDVX{gdD&C8O2y zUFR-ZH)=yqyOZ(sV{g+MqX%~9hE8wJ1)7BIZZ|)mL#e{OLYc;ELAAUd#|yT=wo8z0 z>ZdPYsM{jvQ@{U`EWh_aa08}Dnk4qA)k-KZw4fcIfS7h*q>9LHgx;v z5wdcEPW|M@uGbSM0&dmunOG-+1M>pv3om6#bE0eILo!S824F4 z;0NEWj6ujGpL$xZ1t4zKL)*+CpZW3j3_4c4i%IYP3{abnMmD{BB7+`3ZlPt^@MyW> zof!le=%A=oZqx+t?uK*s{dL0|;p}t=S-*}@L%qF3-oWIE3B(nYxw z1S4LzL1l#kYRWj34`N`t6+vERSzhh^O;I)#gXh9*Dx+1=^zWvDO+T2IsxOHc$-%Ct zf*eXXo0d@O*d1VGzNT=U5EC+Qw{Yi~cxwmGgW*Z7bc1w|{2-7j*ad&gaNGC4h57_j z{7bN%Uez9}?~@;~1RY(?oWh$Z&4h}26CLPNOFhR^95H=>=CTs{B$LlK8I$S1S*0^^ z9d1R9hZ`_P#+ZjOA~ds;0au!LD-$A+2p$l1>@BXk+CK-ttW$|9VJxnVPTkEOdyp4`edV@H;^*$7m8vhD zaRy}3%HY<&b<y4zCqOHtwDLX*H z0s*_J{fe)gFgm-$4X_uV34}v|EvM5Yl5>lQsomI8jukuM_AxB_hXIVLnPaGTyL9JT z_lf3Sm#jE^i5D$VFJ*FvG`E|&Uu5RFG(6a!56uQ3(d01ay6iL}V6kYgiz_v$LaO8q zv7`>ujIq=Ju{vodo8 zdr(ih=sTGo)~_luXV?~Fr*;*R)6d@aCRVUhoaIeVWZ8W6?zHq$7Yh_VSrebVg#x~oN3hyHH31d1% z7%kYu29-d1>Wi8Wz$zwW^*u~65fe{XI=84E>!HS4BkkoI*Y+?2dL#LwFC_PQ=|w%o zCzZwGuv;(XjpI|gGB);I1dwLg45AUVRgxmVHO_yn1ODD}MEYhah7^HUFlV@({-ebkN19f2T=y1S|I#jlnG34k1NAj)xBYI1 zH#@4~1tW8u(*@=0GwYgUDq_}R!GnV|k$*JY!fNc+sf)K>`wcc4I~*b6dM{IlI6~wEA*UJ%D6_QVb^Vx=#Fya?Yvu zqQ5Yu0*r)3yj#y_oNZ3sl}xNOU7bRwd1)Qt^2Jw!A=drC0}|YvdDpR}*Ndi)I|44R zGc>5(_?dVZpH{ANPV?;mn3Ip0J^z}syx~ZUI@%;|@yF`$;iXepU=VtaFw&ZrmkqAJ zRK6O^do>2i-`LD6x~3ECFbl#tA-9+z8pR?;h319;6_R!D)r-o_NLeAH<(Iqx@HG=5 zbTwJR@jHpAmaSQxVtTpM-Gp3xBXW24wQuaa1K2^h4mPO0F&vh7!Hq!Z{0)S7Ul81= zpm^UvLv;3y4}GxBKYWH*hYC(GbvtmvXweVimgmc|LBi6JfJZKuR{=_pf#gDNr9A`Y zo>>CT8P~-vv?|h$TI@FZ)q3S#fr&q`4ZzY z>aG~>Wq+!AZ>iwI#CkeM^l8xP+x>pCjc5fF^f#^T^^@I-q}V)xue%Kfw=*-lzoblp z#0Us8?jF1oD#L0Ek5&2ag}FBd4rwJCq5xU&zBw?hM{}q1p&;f zH6O>KJ}=`Be1eeM-t!cjvNJG;aDs$keXrgYtO_(MJ}+!3Xdo*d-Nhz<+Z@t+f7ACB z%&Tz2!WRB3PZQWLjbRr?&bN+P!2D80r$#wS_JKyk^XGO?tn?a8FZb8P&gZnENhX&y zVbbaKLV)4TqtvhL&W3@ql{s;thn%7}x=(7Bj*)SlIcz_m>9|}vi<=|fuLUt@Mj|c( zL{IQ|+%W96+v=^F6q9Vnl}ry&-;pO?6m>lCMVJmt|CR4k9_($pr`!t2gi8&srE}^y z<-$PwJiY);Pt4_Yr%IU$g@i;*Mmm;ni^q@;EYQq-3STeAnm@P0N}aUN*djN6W-xz7 zIsQSf*P=a`y%=z0l+I5bZnLsT!(*39%oMA-@to2bD_F(k3RW()=!1_qhfT7zI+pY; zhk(!#vYoGfl~|$QC^s`$Fi(W6yn>$v{$CJ}7pwIG#RfnAaFO#4Kp{cMhQqZl0&)RokYF}UsuReiQkTLq&do>?-D#pTuh+E znc<}{=qIILldaMqhvc;jveCcAR!$vcL~9-=JCP zRB|LH(~Di(P^p!t63cUXG&UaypKu6#k~5+83;Di2)wS6>D}h+B_Shmb!)LZq_gV4> zTJrC>e4?;j{hcMNJc@5Bh0;rse^lnH=Ko|3&xaWLWo4j)h?0!&^GqGL4imz{#MNs4 zoMmD$rY6|}&~!s&vl!6UPy&qw+t}H98+oCF?hIzMvJa*fOyI^cUMR$yI#| zW+Sc!-6S65@u~Ytk=ry56>n^`oVlO=(C*Ud3YPDI95Oo?RQQCKQ7Gc*tTe&r%lGTS z6i=p|=5mkb-db@gs)qam+DSl091t&>8dpBdza%puiEXRQl}0m|KQe?Q$kru5o=Hc&A19oT*TyG`P& zQb+qc!(=L@gmc~&&Retf>ExKRHO1<7IZ*2%!23F?gB?3C z7Z@Z0iP%wT@PmsL`wh$lbvu0W0&U)J2#4c5sRtD_YG~2}N~F@xm@cy&{PAT2JJ5xM zg<(`(VEy9c%~u6))*emNf$MMl4>7HxN~JA;0-|gw*63o zlT#t%nzu%r)Fvo&>`6+co~n5FHlPr9e?|9r8|0D^808w$Y;;=n&l{gn^?Y29!wPe1 z657+?d3IR_$I1oNeqEn}JEwI%;ic*PX4bwjp@MOSIR=I*fMDRfDWf86rn@A;;lf*M@n&(7|buR1=0BjdGh`)oEWyeyD823WLvigjmErymCCXNzN)> zw@v|ogK%J{=~4Qc<78o;Wtz*05Hn2g*B*pRUP9?~g6g58EI7B%^j*whln7S8hCpj1 zbM-+S)*Pu!`09x+lP`l7F5cF{!YXP$NwUtgZU#ais=XS=?5YqKkwKVI=G*J(+?## z*fk;1T%@W6x`deoJBnn$eARA51&BvHgTNaq)eOb#SJhwWd)}nVNUCWmc668N!#auf z3CQ<@*ySYadlXcO8yQ8e5e&j)4ZtY8h*?$l{iQfuy%BQ+YZsHW(DwX58x=ULdHuV3 zww?;h&jFc(Lq+yi-P|#TDPY7}dc3$Si#KlpXHqRPwhj!wQA)_0Yc+#G*=$@E9GP07 zr7_l_2E#I@l$=7v+8CR;SPh#A=6ALCkrNm?<`~&vtAQUXon!(E_t08q*_L<^5l3>p zMoD@Pfz59AL>PeCtW7}KI2I*yT&Ea?!ysgBi0U_|nYd34W10!A*`{>?XRA)ZbeiRY zFFFe=AjdO`OWnFstDy=TfXNv69(I#VV>MwMKS3cVY&;eN$V6?$zJJ8YD?~$(x1<}L z^)%y_xI)ja=AuUV5|5#yB$s!guzpC9JF=A%ORl4qzC>B~g+BjBK&hHLj7B|#c`}1$ z#Bym|QV*WELZ96AuBpQ||HBGch$2($W`(qQ3kNBzl+4nn^O%ZSM9;i(qpn^BXv8;A z3+V~!vo5EJN?lH<3K*nOtsJ?qx#y%p={dy~M%vL!v$vz5XByi$h)s;K15A9SRxpXT@d@d=ZtgUG zxY?V2c8x^BcbIn}P=+3HopFnIriUB?XmhAkGINymX4)CA=X3}IPt4)k8+VX0{`{&4 z_z4n%hxsH4H29XVL_|uk5~vU``DIM_d657g5za!!c{K4@Wf_G!{4!7Y3P?t}@gno1n1 zK1oA9NmC5>?HLk7HYu05c_3RlUpAp>#iXE;Q!;_9b49CyFnJmLhOY2|q=X6)_Y8}f zUjHqcq)yc)m$G3#D%HcZV4K$w=ul1SP?<6d|90T|Z0Sb6xvzG}&Y0FK>IN-wBEN8K z#XMmgwvH$BTvZpGvEic$|=o;Rx5tbYH}o#(}+8)WN8|Z)Q`K9M}4fN=DiooUV;kIuX6t ziQ=|=cWw=+V;WaQG?8I#U*q-(o`~;GDX$Ob0g`mYL-o?)guNAA!$(;W4TD{$Q#pcI zH&pQnJZa&t-qKGI!QR2g z@b?}PMU5x1{C1|P+FFf31PFO#R5@R{%a;-Z4r&qM@q)3+W_3d5a3kWNLRp6(;Cl{6 zvv17c+A~G3Orh7v`2Ba`L)|>zb?iIBY=gwUJ`g*cEc<|iuuhm?`e4b~Oa*@d8!|$` z5%^9@hAoTmc7o77LKaZ$6u|qJ18T`1|5V5%UME`oku!5*zRyD6ltkI5tQA<%MK7(7 zUQ!!QWKo@9OHKCa?_@4Ot-c?jj0wp{7o;%M5k%Y%srPAyLqFhLA3H8S+8#T^8+LPE zt!ae0QT-e1D91-_QT4Fy%>hz{bx`9tR73TCPif+mJOjzWrFMYGp-O5^le`p}*1VP# z%jt*lN4yTF9D|Je>jxK7z8CPlhoYo zs>qv(!CiHbPPS-lC4-K}338LqN#6Raz>JyV(b}?%H{=@MNT7#YO>}d_sFnt@`6+5A zl2Jk_eh|mvUECsHR?0fS%O|XbOI{zhxGYf(gE}212~f-{u8mCvkeANjPzaAZ8?Ds* z>rKQCqSCmetggV3DH%h)Ds7yIRejzHUAAB+y=Q5<3~BbNSXL%x$qaK7D(GQUSD4`( zk5-tIS>m9QhUs=>*Wdqoj^|hoy_hJshCP@j)AeK1Q5#Q96CeLH%G$SdvC0|8B$_^$ z=oT(bpm`c-JD`nAX)*gj-9ZG;$ANnNHgrX9Z&AiBuQ$%DI$(pEgvnTtHBrAqx}C;y z9V!40m1X2V4Hv9ncKj7(C;0X+ABRlQ#drX9z;iu-l0`m->kVpuz=dE8hd0_{O=W5j z2uW1fmEa7$XM}1X&}Bsu2suQ=7On$>_+an*I>=LPn<4CW=pWDVrsK}_jq9Fen& zRYe;#a)~2@GItD4@+iX8Z0mHC(<&*W9ZclaK$}FsfQdk?gq9#h+ z9R`0xbSyqy-dO>lhmmsEVPN_PHTnbBx*6gp9$*FlGIRkY`#wA!~VU*S-EGi_-FBfVQvqo~mDCKSG zEiB2ZrTx*mAaP6Et3pxCGp&Jc)w^fkNjwi_~qK15D1R5@4924!} z&_9%4S#^qS9y)?=JkMl`=B{fC_XUV+W!P55DyNGXZ?UH)+9XdjiK2JwqyLFi1iWTR z#!;+m51@5jvA5|mZH{&_qY76EfY*-P}rbV4}K{lyT;q~=VUM!KHnl{{|= z`X)MMT9}?Mq<;~w+zxgY<}gf3WP}g2^#PB?m?(NHNGK4pexCT9@kbz#H|nGD zYe<|4V$0)z&qF?gQ!{aROcL9c4K9Nj;PitZi!6dQWN*0DkL3*tdK{_=i3?8@#4lVK zG!%}29~}*Wh#zbe>@+kt&(KZ3bku;x6?76G`GFYz&A7BHHoF@HM)&q&0!R9&NubJ@ z5>yEm1MdH9cR%}YR)kw?cR$10P+%{5-&2H*7et;q*wcLX>b??%fx=BYxD+Cl)PhwW zxvNOc)KjP+*go_pjrC#iSU#DV;G#s`;hj!Nq*n;3k~(fhUEIoveq!&6 zc&T(xdd&`Wl-^!kuYCa)*950J;~nOHIBx~=ayM{5D|90tsGHWTLf4S4Ql|~MgWR%4w+6x!t-9nsQaVY7$hTIlbSG0;d`Uo-OLw zyM;*JAZU(B`@%x!Lh;vtYK(gmZ3A#qj#X7Z`5uhGqGkxYXccUT%zlfRlJt(JJ^!XA ze(_@ri@Er(rUigpa=W5hPSBQbtT>oWO|;4fsv8-vi(G0qR!Ji*ysREuRz&T-n!hH3 z7u14o$dp~xV1#FAW%a)HxuMLdOKj1Y>Ueb;^?g{pXe%ObgPa?brlE!q)_2agV2%m_ z>>sPDXrg*KbeO%mRB&4}p`5D7^o2n6a4Hy0bHd5X_MZ-o{x>?22yox$U$T394&q2G zhCuCvfp@#%xL89D#&9?@SiU?aV}7v`f8xwHqtmDP{5!w*wXXg_)6eYJ<3m;W*&W!& zg})I)HVIu#`XC{Oz!VJvMjMa=fFHgf;R(GDZVQJPEg!qio;QtjfB*f7xm~do+!gU20YYdY)21d~mXvhf1xa44+Gh=mtWD|( zMC3Hg>#%ojLIuXc32|bUKZ{XG9}FL0N*pNw#vMX?9%a>lTq861J1EJlrk-I~749gC zr^DwSC+L(sH^8h0l1yoayb+E8abuf&D7_cGoLpa+sBn!%Jy-&6{UMBm=zw1th)b+d zF@haO>vCplguqc6oWlt}&gdixrM2gtqH@t_Kx>pafozvtA8sWxXl8#&Kdud$Vv=Pe zm0tmpFDaB*^yCa;gjhDXWSv)wax`xn8$tOwd;0TLQY5NaARuhOB&8KvMvDCjLbufy z)6Hi&lBg|NmwqAhkC+?Pc`2dqiT{WwS~H8qoEpk9e6b@K3=qT$)pZ|p9BtUd_TXdZ zRlZf0r?R=udi5goTxHm7Q`qr#9gG5KAl?ML4HvHEJsg`v99Hkh`(JMJKr)Lb%3^{- zTL%JfIlG9+%gign+rh-qw z1TG82Rvk!3%~CrIQ!7CluWU6$9!_acRD;^g9-bAUj0A%g4|^^E4u0$fA@v(nFGCU1 zb}LyzF1{aJDv#DZt#FKrFsTUt!B{(QMBlP+Uz%Y{7aPMnrP=R>{v(t%E*Qszq1OUm#>lLKvyIjcIwj20GkPi!jRl4({s(zrYK&GeP7 zKrxU0zW1H7fMWu0rbLan;B{zZn-)?^6h#sba}s4n{jF1TKboYFl-(5j&9TD?$L~XF zf;0!&4&{P0z!?5)vE@#4u&!}~fo1S89jDW4G&rbWkkxgZnK`M_r{Dg2$hYaK19iGs z2SLE=@OOGPVpy)V86i(<`SA#XNi5Lwkc1)HF9<`q->%P(d7M!dX}YMojn+qr$iIyo zJorEH3iEkCRb+jwcW)4$<`cjks}4E|h>c?Nx>aVG07C&W%2h?8Z^*&6$wt+DiM(CN zA&C${kVQCx zh%^0Qx>PIT(zykhzCpydE4ZU^nq+S|sIUFUoI*_0h|Iu(NcBzwn9OSSru?_YOv;$T zAVHPX>xu&`snK@Jy8k+iMMy+QZ{LNzvKdV9=0G>`dXRlF5bh*L^ogM&c^NslpCxFP zL$1-kFj+`>V0i1nm6hP^B*A$9O?NSCB~mp&dM5=k0C4X>X5qw1+FpWS(Q8k@YvWiRGv$lr>>QIsAZEH`= zW0G3pHQs-ciV&TP!Z+mfGb+QgK;^aCoFVSVvpB_#o&160uY>nWh^U;gIJ@Lc;aOMh zXTjvZU9}vIE5-u75gr@*g>BcrXad!4)DJ%dn(i)mbrri=-pfuekicbebm*1e$LTVZ zA+{;bu>Cn4%^*RqOSP`r_W*Zu+pD7!zvXf_mGRux$42;mkt9-2uwDIRc0S6-m-*_4 zvORRi()-~ASpfNtIo74Z_ZRKyw0V{hA`xmb@#vs3SL&RYJ@{`wX76x!mux+zR_?j|t!z)Q>Ce+0`x2WhkXBbwPN$SX6ld$uEphTWW@W=35Nb_Mi zn_*yB^DyhKx)hQE0E}R`--^69#TP5pw>D~6QX26ef#3+Z%Xw7BUOEkx!PEUX{C6rlWpQ95$puz3%LGDhPQ7@PZhg`aP;2tW9@Bb=0>$WD` zaF3fHB@)u1AfR+e$3$Y1`vKD3Qqsa;FcAR>K{^IZrMtU9MwfJs7%e$^8#_C1;9S@F z=Xn9o^~4>Y@Ap=90AAc9Wj2I7y#FnE-SO9*h;Zxw%$4uSabCA;7_2C(5q`Sp zvZAvskwBK?O!=5XOsaVmX!eCnhbO@(Krp{7pa0D5*I*yTH@$M9aYe&%Np`~G^9lcK)WR(xcwP$E{NH- z(=8^1lSq{4uHM_*JE|QpV$tvig02dk3?sn-QCakcN18^}$J6O0mS&Z1XJ6o|LP$yH z`Pc~LvdrE=+&MsSZn?|Fy{#eVV8Xi$B+l;N>V%vu6R4 zbuu@MboS5{clgGz@!5U0=P_`>DvssLDt)%OUmRs#x(Nq46)qKUs%?J3OsL;lwxW)+`rnJ z{S=FcUxVX=^p4K_8f@OgrnG=lc-6LQSB)`_XNkTcUt{DZKEF>87&S;+j(Y8$`^O(& zLc`dA)Hu|qYL0l^wwA(7OmTm&L4=`S&7H&0{+NAZ%k#3$0W9__iPf?%%ZxKyYLV)4 ztylyNfCda?1L-8>t8491So0h@H^w@vWb4Hk%Q5Z-*2Wg_Sm6u~1edw_+f-jwU}~}4 z5^8BvoA-hi#KL->dba^NSAkzulzcxuy!(#`C;zh}b?^Gq_6743$MYk=&emeY^2rm+ ztUkS#)!X|`M|d_I!=HzbJn{q^U;mTWPM}N}{coz8(vP5&s`{-N-{e0!SQa5u=qLG) zlihgyDNya-TT?EuJ{+=CET{RShx|%AlYo74`QBytvUnfl;r>L*!A1V3)(3$Q^ke$m zyV1%j?XP>srkm^}pfSSonJ&`~`YOk|+}?VxrN0wE9S_d>E1O*70ix7?-JfG6+CS{M zidZ$BKDEApy&BP(8#Jz#`?bQ{15%n*<8SwOVl&lyrdARH3S+E%1bX@zW;SIYGfs4; zZ#Iz7*h-5;6?CP%d0`Zhqk^__s8owxh}6#o8?XcIK}p+(a$Zgc7q%a~6Bdfb%A#o; zAGY`FY94l|d-tRF)B|Ir?u*Nor1sd;zHW`~iA;1j={HPXvhj`|H~Y5mTV;1Zra?4^ z#TPMDUB$A6IFmX1khdEOr)i8iiU{p3)W8#$%=L4IZ3WmeeoO1?-RHs6|+y)wveN`DBsNb zkIsGV(e+pv-zezC>3PI`O9hogtGrJ6SI6;9MopaR2?TlS2SkQIM{Uj<^h0OdB~a(S zYfHdwfz-<<;qs$q*L7_-W#X`l9P+PO!A%=!=TM*lfW^*rm>TD zkw}PBtfU2#%|aGul=A3@<>oakxO%(8N*WyK#>_64b%q;0#d8&E#TyU`y|C*Gf>5TP znx#AAdk5Fcfi|)HZcdE~Wj`)nbgcQ$aR7^cwnWLj5u-{6*+@X$yEBm=39}@gGv#^g zR6ImB?Pb(`nS~zTVicO{Py_TF9~l*j0a$Q{b&O&tBWJi+IC*1am;bk}MtGP1k1qeO zUH;i!@0dP?+D);72Mb$u^;?CUoZZ$@3q>@{+%YhPlRQKk{r19&SWK z*YJ+b^R*b5)g3##UBJIEdb|YqbV~NH(RSR*3+=Kxu88W!ubSR^;l1VT*|5ejPl5}n z*H)Dk*?979oOLTA5;ULg{HNwDz~OY-9){?d4KR@{+GPLtjVkw>mPI`W@iu>s$75|H zogVebrk}gyb-@^&s+IJ$?AzrE$KW~WbG7XA2}E0(q`hHPo^eOre}S+fWzX=D`8$Jv zIj=WX$AZ@$vd%AIbz2)1l+Q|abFZWZ|2b&@06-lya=w2SRjW5Ofle9`=gj$_7|@l8 zD|p00tzmtB?=+0^cu?O_$f%B_SMF&vb+6NPJ9zE_Er8Kw^-W8!!fKQwcHt)qq@0=& z1)#t550qF#su;)&%NKiQTL`oh)`t?@r|bM&%lVK1>nxB$Gc8_kw}fUP4?14f(Rofc zp^@fsGTZHKv1R=Ww~I~gm-RgF#M;D%Kt6hh#d&gCY{2vuhn|m5GE04}W~FKgEDfnu zWI+HGFr^7>=)M0is$xh9I1(Jl>Re)a^^3sx6YEMIDe+fiw}rO`*RE=i>v6bnsTMHk z3W?N-U1!mRGaW%eQAX(Ij!AGZ2-)G88q79?f~{)PSS$Tt#s;bja_ z`FXClf^luUA z#2H-lkH1TMubw9o_hm_)sxD3#YD>r?>wy+UwVUCF_F)(s_KlT+MzYYyP2O@p@gtJU zGjKC4E->PI50SO{5)@E-@Hj+;5) z`k)^EoNSvawYTgp;9w4+ctr6ry6tgnne$-;8FF!MK`{?y=#l$Mt$OPBUKo$;E5G?n zcR#q)xO#fEdSbFM$=ecTcY3D-Z^P1viV^+{0pUi)r>5!50<}zDyq#_RJJhhu`LM~@ zdOb3OkM9f|;k$VfxH;-?bp*8F5$IbO$F)O>9J&N%CK699f>=J&q1w?Z873zE9GG78 z?v=@PZ`@tja8~^p+3?SbfA(l=6Z=WzR#9~VEhC8y?9a}(P1rxK8jz1}w4pnKeAwzb z!nDc&W-*+Q=;DG>>OknePE!t8kJ*ZzS~z-an^e=pRMoQg5YEX#Z8G>EW$=aGJmEM& zGEFwtm|DM4@$eLfBhO!e-zA2ye7d?LwH(sJ*s!7v!QVlM#RQjj^?0$dY(lpt7~SPs zP~Sz^+b;gricn&>HuO$^8{Hm%Yc7fxuK>>63bfvSud1`I7?aR85yzi|!R2awF5Adp zY$gHg@z))4Eyv7Px2@lgaS5?KW7#rix{GUuCULjt%IGwjzHGVclAr2DRS_65?k0i6 z8dXY0`Aj)-sz!Is+jupuE3!K6 zpU?91mzV~uvs_>Auf=YbNbKs7PC1P2)yam0@%FHDRsK=ay-R226w_%!5T^J6FduP# z5tVeS?U(bP9t3yVEc^zEr|Y{W@1x!0o|C>+cvcktsvg&nVZV92s^8_jDts2Nlx~tjUUCs z*X}_xpW^TR^j?|wSbd#0R2E5{|2)s3=#)97^x@=(#iCAPNd6eq^5+14ub|%jGF$CO zK86XY8tRR!kt#l82mw#00yv7})6DD06uJw!>S&vJ>9d-Z^))T;c0BvLH5|0>&9acf zp79t?-l|v?Kx1lyfef(?OJ?OO%%6FeLmwmGi*iXv=LoQki6#=OjD!K$c2}-!`TmXn zFb&#a3Ckr5r+VHW`(z9Fjs>3<{FA+;|EVdNifZ3yQ&o|h<(LnSJL9rM957aY;vB#+ z^Ct{?tmu6)BenSnjgWx<^|ZavcjJq{JN6)j;{jXB5wMTlcSu58+Q?~y%CuH&F<8EM ztFCatlctyxG5Q*0A?|+GP040*(IX%ISdO3z41ADpz7P~ya zkf^JP6KDTokoi{+tb4_EvJS}(fzZR2a!BN+JmvM71YfB(+_kW)-cE;t1~{i7y4gfR_X8^eO;y7VJ`Sb z?4j`JVHZu3NR8cjGkdJ>4}WuKzGujjq+GS(?1PRhRsYIUH0u$hxy@#4@pJIZUyy&4 zk87Aer%twHm@VeGBs4Hq@2%}!Ll}K7`$=to5`MG*X;nJsTNpG?Y?(afPmG4O1JZKe zZT9P-)g7Q`=k5TO!!OB#x5t6@1{A<;`@z$?dEXLA>;+n6+>$NZF5yEBeMbwOUG!O# zH{qx2eq$ML5&k)FdDP+0QpxO*34S@mc&LAtW#x92?}6{5c|X=&Rk2R_9U<7c#ExNZ zfI%6O1esYnl7(M!;0HFYm79>mh6P+7-0aumJ~hKk(7l((^c3h>f}(hO%(Sewk=CI= zWU}F;C3NKA1y@>wLxF@lo#9agKs9`7$M zB@bK<^3SC8(a1&rYM58@*jkZrwW*y$1b5k^yCkY$WzM}Mn|2uxT<38Xc1a;9X*9in(=VaK)sJVUjUfyWo z9o)SfbZABJT??ADzXzBFi31sGKG9uo>>Nws!4g#6c@U^!6Gm6n8`>W{2`cDt-&3i* zgJf?Vd@l|?sEU5)9po|QX?D;65NDOu5>aumqxwK@xJ^o*>+I$7`SkZ?MQ|A!vQx>@KAnKUFobel=TPfS^=Y|#1eSdJmkkAe~7CMv|hY@k`P zhKE#B?_@RU-oStLS4zJGfj>v;Q-}Y6jQC|Jbn8-8TAzkx#^|Pb)Vf^s8leeXJ0AjXd0d0@zaJNum=Sc0i`Vu0^88Bp($@!n(yaT@nRC*JCPy#? z1DZ&i5C!f>4x0v`yZ>CvZ2I)ydl8aTUS^uzfLIwlZLB* zT-4L=v@XDWlF#-xcg*B+=x;8pwp%Q3GuMlKlSXf@kJF<+9GJp;BX#R>0f#L(R(|^w zi57B!YiB<(Q0hUE`J=NFJy*|>fI!Z45qje+il40zM3hv>$s5xnLx4or4_%hzK-1>& zsooMvx>*6laQEfR{UBJI%@K+70i|P)@?+o87^yJWl1=J%u_$j(qT4+^#a0gbSAhv3 zOQdgxbNbU61-UPaf4S_&(b^lC`-(uc@YYa8YH9zM)tU&{26v>Lw49c8(%`@#Kg@Y} zn~ZP0kA96c(3G`{NCE z((`9hO=8<2r}XEq>jqAmk>?96+jI6!Yka@6UsGC>?^9lm?Fc0n3uYcQPA%U>f~Eqk zFUJ69?809spbu>OU)IaP^8};x>9~#ee-He!u)G=YuIE)YesQ-`JBLf#d}SD^O(ZyQ zuKSbJ1MhLA+mqlc*JhfrPH#jOQ+{(4>yxc~yr346=7WSdnWS?!e7Yn#4JuS(MX3#^ z9|gk-Pmg0%UL87VvF1u>B9X1cp?9ng?=hZPlY2yb!_0nM8=mpQayP<;2Uc2^CMl}5Uh}hDMciIJ-KGFI$e4;T$ z56FBID0Oo$e^5FShG^pIr%v)s(mxA9*5v z$943L<%D!x>WJ?PjCY(Y2BBnC>fCc2N~zPA2|Q^x#G9wCB@bQW4()jxIc;9EO2eNy zDAI$2wiHmn?w=u4*sZu<4%>Drm)}c-VJ=LDZLRlJoQDqe_yw+C>y`c;63-b?`8}23 z{@5qjd(|dW4(MJ1n9&k1y<$4k5MxGE|9x0Q(M97YfO}gaWRY>8v4mlXc~MW_j#B1<>`v>nZt{ANpk4bxvcZ2i580l#-Xp~Eg>nXl zYy}mh3Jt@eNhfal@4Elglcp^2y}qVKq4t&J%oXGJ^pf^#3l2EsSTP$Gn=yhpZuJ*XC1-&Ch#{$R@q>9pVkk@ zRUW;R*v~*K571_YvIO8O-Kl0TYO5S^|7^bbZT0~C=cnFxr%fi3z;xX0jd`GHV3h!J zhk`!$Rkd^f{;q&|74r3mX z*Li7WqtU7MJwiVnjQByow?Zsb3!zmUI@#aBk$F!-Uznyx-+kiZnVV+gR{dB_8ayUA zU>5mHL0iAGCJCs4zNQ1{xzR7E_k^YYP9i3g_o-py2ak zv^U(p+U#li9*9&ZjzLzy2Ga92(sv_&3KUQiF8$F#{VI?w+oICpZ2gGM?0A18nldi? zaw8hu&?@TfdwZkO@p^F~w*5>0_S{KCMl8Uuc5`|wU#-utU}|sD)pogwW}jsZJ-L$U z1T&F8Kk-MkON#bmIz%SoBVr}8q(JTdBDNFV&l{H6u8v9G;uk+QJH~XHG3D`-&Khv# z4&TW#v}$7`UE;zjL6V>N8(?|kD?Xab+b0~QC-4m5U71Qr!|)-iXu)X69G@^(_cyAF z$}xYx{RzQhpTh#3_2Je*`;IKdtCp1?mJ#vK)%I!Aqm7Fp!<@p;7Ksk`i7(Du?m+=# zY>@my=Uu}xTKyXA{yXE~4EK|4y{UDOU(W>hUKGLH^&QuMw{H-$g_EgepfJ?_`luNz zJqU=R#cWXF252`cd}MWg?h783yR(tu|KtAYvb+6(OeO#KK%@+!vxV{gk=2q%pzD`! z1)6G8Eu80E)`*OkN)Kz%D+Bpq3)eTQO>tkGUWvj zlUhQx5^*vsUQq8LF@ceadY1I@X4yP-7cJQ8C`>m+wusx!^}Bq4%q8PBYs?~0m}ptX z=a?dtC?){4Mxqm+V@WX8vw8+zC_r|uNiIu3u9k)GL^i!i(4jBq3sOS0-=+rLvQukI zw2E{1hT7f$kt~>V+DJ&OS+2s|LT-O4VwDCP2qc(KdVt!~iOu?Lbx>8upMxbg9{KC} zRy`}@HrrdB=beEpHsctsvC4XsbpfW#i$-jMo?W}ztDDLLZ3Fcgd~R29<8^1YW;CV{ zo5WO+D+RAS=(yY4BAwrA8@pcVCX!3c;AoJZD|K!MmljO=<~oi&$Oausz)8;M5EypM zY1Q_&oOH8}%=Do>FclHw786useF`J&TCBr_=J8)jR7bD890)G^ zOD{Qlrap=ewPd36hh$*)`xpX-w9?j*Ws(%Y(u+N@v8O00_D0NF%OO-I!QIZ344f{G z5?Jhzy}}!W+%hnNSt!2vDKk8)OaOF05gd+9Ks}HB(t|j)5)QrgzxoG#3w2!`%dXZ! zjfJYdG86tRrFHjOx1jpT4rkP=aS7Ef!35ZTUW|ZE7%m*M|8Jm@Dl6?=z?~B#;`4$K z{UJTtho8MSd9c7A%gvrcZn{rX*ya$t=hakqG9Xd{1l(?NQhp4$s`AZwghRs_V4Fd!8o>KWf$O3$WKld==MVGd~+B+-x~C^IC0xs>Mlv6yP(T!b4Z8 zjtjWSuFs9NW&FGpSKP+4kvzN2zRT2U0UG`|FQ*{nTwh7{K}Cg%JQv zbz2rg)${R%U*pF{&z*7Dll{chM>ag#5NOxE;+p8af3a|CPxOeN$$^Sq*o{$^{BiYI z9WmaLj}?r_vVRtL>!sPgirjxO_BSty$C)(I&HnAF{-XywY=781uqS)ncMkENgRgw; z663w-cYy2(0Bj)_RDo&7RsbtcerFu?RJt*RR};f@%>LVDmuC#ZN9f#RTi9^SwyOs* zikyfDk!!ES|6slPmlN>P6Q-|4WXVqAppM4%q5=glc0!0PXuT#vwIT@Hdz}N% zI9X(0-mn4gaX)+rw zI-;*IA)yf~ukWG6Hs+D;nDPk7Wjh7~0yISa0m&1%V$e5x5Ls zQj6<%t%+tlmFk1+yAF)F$mUK{DAVb-`+cFV2e;i4*ZU)i>lJiG5v^W%d?C`FWhhGO z9`f}%6)I7lzV}pRFVpz@Bf#%!@`;xLPUS85g00fux%)K_d{eRTbsudC|w z3rt{$TDG8*KUJw9w(G?rIEDCWY36K6rmag9w`4Q-`|Wm}`161~`Sz{dK#Lv9$<}l2 zU&?K^vlXaneAr6e5wx2mn$35}ZRxnM%+ht0E1Kbc_?~%tk*G%D1Up2CUv)E!W014L z;Nc2wC?4?^m5)m13k6&?lhgX3pvoO_!JQPPcX4*sg6cNj)&TDLvG_W1Zc`hEWddkQcKP94MD+K<8 zH3hX}cR6im0B2ZwO1XxMs*VxxdXuVJ%+QF&afDV88Cglz6ASt0)!eRc?YqD3I#HoA z#`gMBUD=y@bOFg(^2=tP7f zGd8oz`xKeB%K{h?DUxw~YmAsv2fnQfvt>mv3_Fqp1P=H`22G10B6`0EoV`lc?QrP> zy{GiObuB3QnJI!TXJ}IS5$?^R9#7dsv>Ep!aBeHAv!&xaji=&+Q-T05^*Xgdna!r)F@UeCmyaF&Gpj5z6bw^5YQmaLdF4# z@k5d*0M1z%|G$!f=2zhrYfewrlEWC8^3(FeV9pOk$6kML!S0gqu|vTdg(9X$&|q}X zSQ+#zPZ}hr&l5c?^e#pyT`JESVzfN>ZBO#IbG~M24E(h`m-8mpk-k+nU|x}g9(#CO*ww8v1P@$0 zU*l9=@w(gzga;5zE1?G}Rrr8i0tKs3UKT*0xEe!Rgmdl^eGW4UgB$tVvkg@&W2>JG zcaCt5Dr&~PGV1&9&FSi!!RYwAM8c8qh<@T-A>B0>2|Uzn_AfghnpD8vGr=`vqG*KI zfxIQrCdQ}GIt?X@3nqaI+}ZL5Vf#A?+ly|6@p%jlgS9A1KgG7sqE!Q2~_DWV2+I{FLFj*CK}CH^1&*|9&aB1RndnoMU(x z=-*Y}=K#&F-aKH}-T}Rib5gkJuG%Vyt5aBl*w_u75HDWzJ3lRNou!wxFf};dvbp@K zI!n8LyS!Eo@*ey?2EacE^|S=2x)oKNYc8r4qx-`yzBKO;XHsy5aPXC)tfYNP`ubtx}>CnoWoc@PjLHrm*pWC zyHCt!F1qzgz1Jn3%bIGs;yX<2Q}^&}{xAc*gaCG=`KzZ`8CA)4Yvp=d-^zkN-V_;U z){cq13=Z@^kpzw6McwvW0CmnF*1&x6<3i9-WT19tBj(QuM*Eic!;eL@W!BNnqRkO= z^zsIie4;ZNkxZvGFrT?qntiq~Nv=B8;|B*+7vLZ@Bk^9dlQ|y)QEcYnd3gs9uK)87 z9K-Go9WtKuyHs%fi9GeFJvQ=iP>c%;VHPvI?1d(NxWPXqT%TDp#){+WDU0~LZ?81s zsF(&ULA#PRgYU}`JKFETQZv;IbxN78Cb^X(K{plq?BMlnVz%pDAx^(#%s7IW%}8qN zR(*3QJ#USM*AlZ|N&@51t_JJy$kUT-%mEqHr)0{et4N? z1P9dD`a>4Rj4vu`)zldGxJ@M4!;(0Gz+ z*DEG$e-KSFcyBntl+8b6;;4SD=TN6mtQYY%b~IXe;b*@|?#P+^*;Gpod`bAG=sbsQ z`FJOhUGCyfX)2s|R(tfNBd9#a-}kZiQq0xK`AOn_qr1Tn_vmn(Nz>}J3Ll&0)j*EB zTcH1L1Bie5;;frONC?Z}hC79u>VjAq7Xz-6H?)N6SOQP{(Hdo1LJbEJQ$^nYX!Z^^ zm{{B;WC$g~?)+`-;+L73RR(z&Zv7P8dT5*|Lyo)6aIsLU@-5qbIw#NLg}>ySN6kSV zt4h2LqTx#jhG6v1mL}fQ39?4)aVPT#zITb(mtqN;-=V~QqZBs#lhVBH0-!(pcZ?iz zk)4C?!PV$LjxRb6BQZm)1`?6Co4;&`B1he&F8%A0MWGsj+a%$#waC2f9-;uXOA(0J zeK@#nHCfUt?_^N!_UpZsef{+l`!6KD*dmqcfrmE(_M`pA-WKqx^?9eGxb%kI^m*oN z*vY(QL6FqP1zxnQw;v0yd@ZOR+VSBic&&mM6-YT4EcIrl@A_^~p^I%lOrT%5Fc*QxUQXG|&_c*)! za}M{c44k=-1+DtRFdbn4rk>^^$?yuP?kqz4KMWVGYPR@QLA$s2pdOK%bc%ZKm*1ni zgGzF!aYjo$O_#F_&;28K^7KWj0V#9Ji&3nNyFojn%E@NAFaF#mZJIAe%yHDe zugN3K=Fs%_JfB^S0fR$F85|w^;c%VYP&KI7C%D|fq24(l1M)H7p-5jEprNN{J>c>V zRN~!OXXDGFM^Md+s^q6~zxdjxmKQ}%XUfXf1+pue8&J*fq~%i&3@)ZFC7awM%zk(W z@jPZAEkBGNpJpG&)9>Qlg+CJjS%`iG%UR!m{98Q|;DJGI3YXIX$wDTBmPKYgzv|+X zqIAU6)XVo=bfJd%n)-~@Dp9WAyI~y1>5XBeZs6Zl&z6#&W+gD%Rw7D9y)VY_5B5AvTpU62 z!0~6(snNdeFN{^Hy<{|W;H9rpi@a;YSz=#vDaJFu;*y-};bQYtSE3cN{CV0XB~8kM z{ExQ4S4(#b$QV7BQvGuSSRLKn)lcknCm)|hN{t0P(Sm*sW?|3(ePJ(OVdwGwL0{`@ zQC}x)wy9qGT6veLTl~B0e&z!e50BfJ-^pfNN&LtFJa{6pgD;9yN7M*psh=y65YfvlcY-?k+L?NV86}>V`?+d>a*a<2 zF;IM|Y4Y^_>dQ)rV*yD~8aY7|{QFsI{Mec07lpISGfUGibY*yhiL*&k^Z(aE_=yBe op1;fpHu=T(e=f!SVR&|5;-q$7y(_}RzB_l+RJ4`L-&%e7AMC>H`v3p{ literal 0 HcmV?d00001 From fc5fb473dd7e9d0590dc1492b9415cdeafc5327c Mon Sep 17 00:00:00 2001 From: Kingbox <37674310+lopezvg@users.noreply.github.com> Date: Mon, 9 Apr 2018 15:51:09 +0200 Subject: [PATCH 24/42] Clones de Newpct1: mejora estabilidad en Episodios MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Evita el error de los canales cuando llega una Serie con títulos de capítulos con formatos distintos de los previstos. En este caso crea un formáto de título básico para que prosiga el programa de la forma prevista. --- plugin.video.alfa/channels/descargas2020.py | 38 +++++++++++------- plugin.video.alfa/channels/mispelisyseries.py | 40 ++++++++++++------- plugin.video.alfa/channels/torrentlocura.py | 38 +++++++++++------- plugin.video.alfa/channels/torrentrapid.py | 38 +++++++++++------- plugin.video.alfa/channels/tumejortorrent.py | 40 ++++++++++++------- plugin.video.alfa/channels/tvsinpagar.py | 40 ++++++++++++------- 6 files changed, 147 insertions(+), 87 deletions(-) diff --git a/plugin.video.alfa/channels/descargas2020.py b/plugin.video.alfa/channels/descargas2020.py index 7de30a6b..4008919a 100644 --- a/plugin.video.alfa/channels/descargas2020.py +++ b/plugin.video.alfa/channels/descargas2020.py @@ -133,7 +133,8 @@ def listado(item): for scrapedurl, scrapedtitle, scrapedthumbnail, title_alt, calidad in matches: url = scrapedurl - title = scrapedtitle + title = scrapedtitle.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") + title_alt = title_alt.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") thumbnail = scrapedthumbnail action = "findvideos" extra = "" @@ -209,10 +210,11 @@ def listado_busqueda(item): for url, thumb, title in matches: real_title = scrapertools.find_single_match(title, r'(.*?)Temporada.*?<\/strong>') #series - if real_title == "": + if not real_title: real_title = scrapertools.find_single_match(title, r'(.*?)\[.*?]') #movies real_title = scrapertools.remove_htmltags(real_title).decode('iso-8859-1').encode('utf-8') real_title = scrapertools.htmlclean(real_title) + real_title = real_title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") calidad = scrapertools.find_single_match(title, r'.*?\s*Calidad.*?]+>[\[]\s*(?P.*?)\s*[\]]<\/span>') #series if calidad == "": calidad = scrapertools.find_single_match(title, r'..*?(\[.*?.*\])') #movies @@ -220,9 +222,8 @@ def listado_busqueda(item): # fix encoding for title title = scrapertools.htmlclean(title) - title = title.replace("�", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng") title = re.sub(r'(Calidad.*?\])', '', title) - + title = title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") if real_title == "": real_title = title if calidad == "": @@ -236,18 +237,22 @@ def listado_busqueda(item): # Codigo para rescatar lo que se puede en pelisy.series.com de Series para la Videoteca. la URL apunta al capítulo y no a la Serie. Nombre de Serie frecuentemente en blanco. Se obtiene de Thumb, así como el id de la serie if ("/serie" in url or "-serie" in url) and "pelisyseries.com" in host: - calidad_mps = "series/" if "seriehd" in url: calidad_mps = "series-hd/" - if "serievo" in url: + elif "serievo" in url: calidad_mps = "series-vo/" - if "serie-vo" in url: + elif "serie-vo" in url: calidad_mps = "series-vo/" + else: + calidad_mps = "series/" - real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) - real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) + if "no_image" in thumb: + real_title_mps = title + else: + real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) + real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) - if "/0_" not in thumb: + if "/0_" not in thumb and not "no_image" in thumb: serieid = scrapertools.find_single_match(thumb, r'.*?\/\w\/(?P\d+).*?.*') if len(serieid) > 5: serieid = "" @@ -507,6 +512,11 @@ def episodios(item): "[\[]\s*(?P.*?)?\s*[\]]<\/span>" if "Especial" in info: # Capitulos Especiales pattern = ".*?[^>]+>.*?Temporada.*?\[.*?(?P\d+).*?\].*?Capitulo.*?\[\s*(?P\d+).*?\]?(?:.*?(?P\d+)?)<.+?]+>(?P.*?)?<\/span>\s*Calidad\s*]+>[\[]\s*(?P.*?)?\s*[\]]<\/span>" + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioNEW: " + pattern) + logger.debug(info) + info = '>%sTemporada %s Capitulo 0 - Español Castellano Calidad [%s]' % (item.contentTitle, season, item.infoLabels['quality']) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] @@ -540,11 +550,11 @@ def episodios(item): "(?P\d{2}))?.*?\].*?(?:\[(?P.*?)\])?" elif scrapertools.find_single_match(info, 'Cap.\d{2,3}'): pattern = ".*?Temp.*?\s(?P.*?)\s.*?Cap.(?P\d).*?(?P\d{2})(?:_(?P\d+)(?P\d{2}))?.*?\s(?P.*)?" - else: - logger.debug("patron episodio: " + pattern) + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioOLD: " + pattern) logger.debug(info) - continue - + info = '%s [%s][Cap.%s00][Español]' % (item.contentTitle, item.infoLabels['quality'], season) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] diff --git a/plugin.video.alfa/channels/mispelisyseries.py b/plugin.video.alfa/channels/mispelisyseries.py index f58462a8..7c6ae65b 100644 --- a/plugin.video.alfa/channels/mispelisyseries.py +++ b/plugin.video.alfa/channels/mispelisyseries.py @@ -10,7 +10,7 @@ from core.item import Item from platformcode import config, logger from core import tmdb -host = 'http://www.mispelisyseries.com/' +host = 'http://mispelisyseries.com/' def mainlist(item): logger.info() @@ -133,7 +133,8 @@ def listado(item): for scrapedurl, scrapedtitle, scrapedthumbnail, title_alt, calidad in matches: url = scrapedurl - title = scrapedtitle + title = scrapedtitle.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") + title_alt = title_alt.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") thumbnail = scrapedthumbnail action = "findvideos" extra = "" @@ -209,10 +210,11 @@ def listado_busqueda(item): for url, thumb, title in matches: real_title = scrapertools.find_single_match(title, r'(.*?)Temporada.*?<\/strong>') #series - if real_title == "": + if not real_title: real_title = scrapertools.find_single_match(title, r'(.*?)\[.*?]') #movies real_title = scrapertools.remove_htmltags(real_title).decode('iso-8859-1').encode('utf-8') real_title = scrapertools.htmlclean(real_title) + real_title = real_title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") calidad = scrapertools.find_single_match(title, r'.*?\s*Calidad.*?]+>[\[]\s*(?P.*?)\s*[\]]<\/span>') #series if calidad == "": calidad = scrapertools.find_single_match(title, r'..*?(\[.*?.*\])') #movies @@ -220,9 +222,8 @@ def listado_busqueda(item): # fix encoding for title title = scrapertools.htmlclean(title) - title = title.replace("�", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng") title = re.sub(r'(Calidad.*?\])', '', title) - + title = title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") if real_title == "": real_title = title if calidad == "": @@ -236,18 +237,22 @@ def listado_busqueda(item): # Codigo para rescatar lo que se puede en pelisy.series.com de Series para la Videoteca. la URL apunta al capítulo y no a la Serie. Nombre de Serie frecuentemente en blanco. Se obtiene de Thumb, así como el id de la serie if ("/serie" in url or "-serie" in url) and "pelisyseries.com" in host: - calidad_mps = "series/" if "seriehd" in url: calidad_mps = "series-hd/" - if "serievo" in url: + elif "serievo" in url: calidad_mps = "series-vo/" - if "serie-vo" in url: + elif "serie-vo" in url: calidad_mps = "series-vo/" + else: + calidad_mps = "series/" - real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) - real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) + if "no_image" in thumb: + real_title_mps = title + else: + real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) + real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) - if "/0_" not in thumb: + if "/0_" not in thumb and not "no_image" in thumb: serieid = scrapertools.find_single_match(thumb, r'.*?\/\w\/(?P\d+).*?.*') if len(serieid) > 5: serieid = "" @@ -507,6 +512,11 @@ def episodios(item): "[\[]\s*(?P.*?)?\s*[\]]<\/span>" if "Especial" in info: # Capitulos Especiales pattern = ".*?[^>]+>.*?Temporada.*?\[.*?(?P\d+).*?\].*?Capitulo.*?\[\s*(?P\d+).*?\]?(?:.*?(?P\d+)?)<.+?]+>(?P.*?)?<\/span>\s*Calidad\s*]+>[\[]\s*(?P.*?)?\s*[\]]<\/span>" + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioNEW: " + pattern) + logger.debug(info) + info = '>%sTemporada %s Capitulo 0 - Español Castellano Calidad [%s]' % (item.contentTitle, season, item.infoLabels['quality']) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] @@ -540,11 +550,11 @@ def episodios(item): "(?P\d{2}))?.*?\].*?(?:\[(?P.*?)\])?" elif scrapertools.find_single_match(info, 'Cap.\d{2,3}'): pattern = ".*?Temp.*?\s(?P.*?)\s.*?Cap.(?P\d).*?(?P\d{2})(?:_(?P\d+)(?P\d{2}))?.*?\s(?P.*)?" - else: - logger.debug("patron episodio: " + pattern) + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioOLD: " + pattern) logger.debug(info) - continue - + info = '%s [%s][Cap.%s00][Español]' % (item.contentTitle, item.infoLabels['quality'], season) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] diff --git a/plugin.video.alfa/channels/torrentlocura.py b/plugin.video.alfa/channels/torrentlocura.py index 2d3d50c6..78ebcfa8 100755 --- a/plugin.video.alfa/channels/torrentlocura.py +++ b/plugin.video.alfa/channels/torrentlocura.py @@ -133,7 +133,8 @@ def listado(item): for scrapedurl, scrapedtitle, scrapedthumbnail, title_alt, calidad in matches: url = scrapedurl - title = scrapedtitle + title = scrapedtitle.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") + title_alt = title_alt.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") thumbnail = scrapedthumbnail action = "findvideos" extra = "" @@ -209,10 +210,11 @@ def listado_busqueda(item): for url, thumb, title in matches: real_title = scrapertools.find_single_match(title, r'(.*?)Temporada.*?<\/strong>') #series - if real_title == "": + if not real_title: real_title = scrapertools.find_single_match(title, r'(.*?)\[.*?]') #movies real_title = scrapertools.remove_htmltags(real_title).decode('iso-8859-1').encode('utf-8') real_title = scrapertools.htmlclean(real_title) + real_title = real_title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") calidad = scrapertools.find_single_match(title, r'.*?\s*Calidad.*?]+>[\[]\s*(?P.*?)\s*[\]]<\/span>') #series if calidad == "": calidad = scrapertools.find_single_match(title, r'..*?(\[.*?.*\])') #movies @@ -220,9 +222,8 @@ def listado_busqueda(item): # fix encoding for title title = scrapertools.htmlclean(title) - title = title.replace("�", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng") title = re.sub(r'(Calidad.*?\])', '', title) - + title = title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") if real_title == "": real_title = title if calidad == "": @@ -236,18 +237,22 @@ def listado_busqueda(item): # Codigo para rescatar lo que se puede en pelisy.series.com de Series para la Videoteca. la URL apunta al capítulo y no a la Serie. Nombre de Serie frecuentemente en blanco. Se obtiene de Thumb, así como el id de la serie if ("/serie" in url or "-serie" in url) and "pelisyseries.com" in host: - calidad_mps = "series/" if "seriehd" in url: calidad_mps = "series-hd/" - if "serievo" in url: + elif "serievo" in url: calidad_mps = "series-vo/" - if "serie-vo" in url: + elif "serie-vo" in url: calidad_mps = "series-vo/" + else: + calidad_mps = "series/" - real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) - real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) + if "no_image" in thumb: + real_title_mps = title + else: + real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) + real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) - if "/0_" not in thumb: + if "/0_" not in thumb and not "no_image" in thumb: serieid = scrapertools.find_single_match(thumb, r'.*?\/\w\/(?P\d+).*?.*') if len(serieid) > 5: serieid = "" @@ -507,6 +512,11 @@ def episodios(item): "[\[]\s*(?P.*?)?\s*[\]]<\/span>" if "Especial" in info: # Capitulos Especiales pattern = ".*?[^>]+>.*?Temporada.*?\[.*?(?P\d+).*?\].*?Capitulo.*?\[\s*(?P\d+).*?\]?(?:.*?(?P\d+)?)<.+?]+>(?P.*?)?<\/span>\s*Calidad\s*]+>[\[]\s*(?P.*?)?\s*[\]]<\/span>" + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioNEW: " + pattern) + logger.debug(info) + info = '>%sTemporada %s Capitulo 0 - Español Castellano Calidad [%s]' % (item.contentTitle, season, item.infoLabels['quality']) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] @@ -540,11 +550,11 @@ def episodios(item): "(?P\d{2}))?.*?\].*?(?:\[(?P.*?)\])?" elif scrapertools.find_single_match(info, 'Cap.\d{2,3}'): pattern = ".*?Temp.*?\s(?P.*?)\s.*?Cap.(?P\d).*?(?P\d{2})(?:_(?P\d+)(?P\d{2}))?.*?\s(?P.*)?" - else: - logger.debug("patron episodio: " + pattern) + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioOLD: " + pattern) logger.debug(info) - continue - + info = '%s [%s][Cap.%s00][Español]' % (item.contentTitle, item.infoLabels['quality'], season) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] diff --git a/plugin.video.alfa/channels/torrentrapid.py b/plugin.video.alfa/channels/torrentrapid.py index 85caf927..17273437 100644 --- a/plugin.video.alfa/channels/torrentrapid.py +++ b/plugin.video.alfa/channels/torrentrapid.py @@ -133,7 +133,8 @@ def listado(item): for scrapedurl, scrapedtitle, scrapedthumbnail, title_alt, calidad in matches: url = scrapedurl - title = scrapedtitle + title = scrapedtitle.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") + title_alt = title_alt.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") thumbnail = scrapedthumbnail action = "findvideos" extra = "" @@ -209,10 +210,11 @@ def listado_busqueda(item): for url, thumb, title in matches: real_title = scrapertools.find_single_match(title, r'(.*?)Temporada.*?<\/strong>') #series - if real_title == "": + if not real_title: real_title = scrapertools.find_single_match(title, r'(.*?)\[.*?]') #movies real_title = scrapertools.remove_htmltags(real_title).decode('iso-8859-1').encode('utf-8') real_title = scrapertools.htmlclean(real_title) + real_title = real_title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") calidad = scrapertools.find_single_match(title, r'.*?\s*Calidad.*?]+>[\[]\s*(?P.*?)\s*[\]]<\/span>') #series if calidad == "": calidad = scrapertools.find_single_match(title, r'..*?(\[.*?.*\])') #movies @@ -220,9 +222,8 @@ def listado_busqueda(item): # fix encoding for title title = scrapertools.htmlclean(title) - title = title.replace("�", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng") title = re.sub(r'(Calidad.*?\])', '', title) - + title = title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") if real_title == "": real_title = title if calidad == "": @@ -236,18 +237,22 @@ def listado_busqueda(item): # Codigo para rescatar lo que se puede en pelisy.series.com de Series para la Videoteca. la URL apunta al capítulo y no a la Serie. Nombre de Serie frecuentemente en blanco. Se obtiene de Thumb, así como el id de la serie if ("/serie" in url or "-serie" in url) and "pelisyseries.com" in host: - calidad_mps = "series/" if "seriehd" in url: calidad_mps = "series-hd/" - if "serievo" in url: + elif "serievo" in url: calidad_mps = "series-vo/" - if "serie-vo" in url: + elif "serie-vo" in url: calidad_mps = "series-vo/" + else: + calidad_mps = "series/" - real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) - real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) + if "no_image" in thumb: + real_title_mps = title + else: + real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) + real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) - if "/0_" not in thumb: + if "/0_" not in thumb and not "no_image" in thumb: serieid = scrapertools.find_single_match(thumb, r'.*?\/\w\/(?P\d+).*?.*') if len(serieid) > 5: serieid = "" @@ -507,6 +512,11 @@ def episodios(item): "[\[]\s*(?P.*?)?\s*[\]]<\/span>" if "Especial" in info: # Capitulos Especiales pattern = ".*?[^>]+>.*?Temporada.*?\[.*?(?P\d+).*?\].*?Capitulo.*?\[\s*(?P\d+).*?\]?(?:.*?(?P\d+)?)<.+?]+>(?P.*?)?<\/span>\s*Calidad\s*]+>[\[]\s*(?P.*?)?\s*[\]]<\/span>" + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioNEW: " + pattern) + logger.debug(info) + info = '>%sTemporada %s Capitulo 0 - Español Castellano Calidad [%s]' % (item.contentTitle, season, item.infoLabels['quality']) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] @@ -540,11 +550,11 @@ def episodios(item): "(?P\d{2}))?.*?\].*?(?:\[(?P.*?)\])?" elif scrapertools.find_single_match(info, 'Cap.\d{2,3}'): pattern = ".*?Temp.*?\s(?P.*?)\s.*?Cap.(?P\d).*?(?P\d{2})(?:_(?P\d+)(?P\d{2}))?.*?\s(?P.*)?" - else: - logger.debug("patron episodio: " + pattern) + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioOLD: " + pattern) logger.debug(info) - continue - + info = '%s [%s][Cap.%s00][Español]' % (item.contentTitle, item.infoLabels['quality'], season) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] diff --git a/plugin.video.alfa/channels/tumejortorrent.py b/plugin.video.alfa/channels/tumejortorrent.py index 3ea77b12..10cf34e5 100644 --- a/plugin.video.alfa/channels/tumejortorrent.py +++ b/plugin.video.alfa/channels/tumejortorrent.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- import re @@ -133,7 +133,8 @@ def listado(item): for scrapedurl, scrapedtitle, scrapedthumbnail, title_alt, calidad in matches: url = scrapedurl - title = scrapedtitle + title = scrapedtitle.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") + title_alt = title_alt.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") thumbnail = scrapedthumbnail action = "findvideos" extra = "" @@ -209,10 +210,11 @@ def listado_busqueda(item): for url, thumb, title in matches: real_title = scrapertools.find_single_match(title, r'(.*?)Temporada.*?<\/strong>') #series - if real_title == "": + if not real_title: real_title = scrapertools.find_single_match(title, r'(.*?)\[.*?]') #movies real_title = scrapertools.remove_htmltags(real_title).decode('iso-8859-1').encode('utf-8') real_title = scrapertools.htmlclean(real_title) + real_title = real_title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") calidad = scrapertools.find_single_match(title, r'.*?\s*Calidad.*?]+>[\[]\s*(?P.*?)\s*[\]]<\/span>') #series if calidad == "": calidad = scrapertools.find_single_match(title, r'..*?(\[.*?.*\])') #movies @@ -220,9 +222,8 @@ def listado_busqueda(item): # fix encoding for title title = scrapertools.htmlclean(title) - title = title.replace("�", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng") title = re.sub(r'(Calidad.*?\])', '', title) - + title = title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") if real_title == "": real_title = title if calidad == "": @@ -236,18 +237,22 @@ def listado_busqueda(item): # Codigo para rescatar lo que se puede en pelisy.series.com de Series para la Videoteca. la URL apunta al capítulo y no a la Serie. Nombre de Serie frecuentemente en blanco. Se obtiene de Thumb, así como el id de la serie if ("/serie" in url or "-serie" in url) and "pelisyseries.com" in host: - calidad_mps = "series/" if "seriehd" in url: calidad_mps = "series-hd/" - if "serievo" in url: + elif "serievo" in url: calidad_mps = "series-vo/" - if "serie-vo" in url: + elif "serie-vo" in url: calidad_mps = "series-vo/" + else: + calidad_mps = "series/" - real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) - real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) + if "no_image" in thumb: + real_title_mps = title + else: + real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) + real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) - if "/0_" not in thumb: + if "/0_" not in thumb and not "no_image" in thumb: serieid = scrapertools.find_single_match(thumb, r'.*?\/\w\/(?P\d+).*?.*') if len(serieid) > 5: serieid = "" @@ -507,6 +512,11 @@ def episodios(item): "[\[]\s*(?P.*?)?\s*[\]]<\/span>" if "Especial" in info: # Capitulos Especiales pattern = ".*?[^>]+>.*?Temporada.*?\[.*?(?P\d+).*?\].*?Capitulo.*?\[\s*(?P\d+).*?\]?(?:.*?(?P\d+)?)<.+?]+>(?P.*?)?<\/span>\s*Calidad\s*]+>[\[]\s*(?P.*?)?\s*[\]]<\/span>" + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioNEW: " + pattern) + logger.debug(info) + info = '>%sTemporada %s Capitulo 0 - Español Castellano Calidad [%s]' % (item.contentTitle, season, item.infoLabels['quality']) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] @@ -540,11 +550,11 @@ def episodios(item): "(?P\d{2}))?.*?\].*?(?:\[(?P.*?)\])?" elif scrapertools.find_single_match(info, 'Cap.\d{2,3}'): pattern = ".*?Temp.*?\s(?P.*?)\s.*?Cap.(?P\d).*?(?P\d{2})(?:_(?P\d+)(?P\d{2}))?.*?\s(?P.*)?" - else: - logger.debug("patron episodio: " + pattern) + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioOLD: " + pattern) logger.debug(info) - continue - + info = '%s [%s][Cap.%s00][Español]' % (item.contentTitle, item.infoLabels['quality'], season) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] diff --git a/plugin.video.alfa/channels/tvsinpagar.py b/plugin.video.alfa/channels/tvsinpagar.py index 56898ea1..ab352ac1 100644 --- a/plugin.video.alfa/channels/tvsinpagar.py +++ b/plugin.video.alfa/channels/tvsinpagar.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- import re @@ -133,7 +133,8 @@ def listado(item): for scrapedurl, scrapedtitle, scrapedthumbnail, title_alt, calidad in matches: url = scrapedurl - title = scrapedtitle + title = scrapedtitle.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") + title_alt = title_alt.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "") thumbnail = scrapedthumbnail action = "findvideos" extra = "" @@ -209,10 +210,11 @@ def listado_busqueda(item): for url, thumb, title in matches: real_title = scrapertools.find_single_match(title, r'(.*?)Temporada.*?<\/strong>') #series - if real_title == "": + if not real_title: real_title = scrapertools.find_single_match(title, r'(.*?)\[.*?]') #movies real_title = scrapertools.remove_htmltags(real_title).decode('iso-8859-1').encode('utf-8') real_title = scrapertools.htmlclean(real_title) + real_title = real_title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") calidad = scrapertools.find_single_match(title, r'.*?\s*Calidad.*?]+>[\[]\s*(?P.*?)\s*[\]]<\/span>') #series if calidad == "": calidad = scrapertools.find_single_match(title, r'..*?(\[.*?.*\])') #movies @@ -220,9 +222,8 @@ def listado_busqueda(item): # fix encoding for title title = scrapertools.htmlclean(title) - title = title.replace("�", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng") title = re.sub(r'(Calidad.*?\])', '', title) - + title = title.replace("�", "ñ").replace("ñ", "ñ").replace("Temp", " Temp").replace("Esp", " Esp").replace("Ing", " Ing").replace("Eng", " Eng").replace("Calidad", "").replace("de la Serie", "") if real_title == "": real_title = title if calidad == "": @@ -236,18 +237,22 @@ def listado_busqueda(item): # Codigo para rescatar lo que se puede en pelisy.series.com de Series para la Videoteca. la URL apunta al capítulo y no a la Serie. Nombre de Serie frecuentemente en blanco. Se obtiene de Thumb, así como el id de la serie if ("/serie" in url or "-serie" in url) and "pelisyseries.com" in host: - calidad_mps = "series/" if "seriehd" in url: calidad_mps = "series-hd/" - if "serievo" in url: + elif "serievo" in url: calidad_mps = "series-vo/" - if "serie-vo" in url: + elif "serie-vo" in url: calidad_mps = "series-vo/" + else: + calidad_mps = "series/" - real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) - real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) + if "no_image" in thumb: + real_title_mps = title + else: + real_title_mps = re.sub(r'.*?\/\d+_', '', thumb) + real_title_mps = re.sub(r'\.\w+.*?', '', real_title_mps) - if "/0_" not in thumb: + if "/0_" not in thumb and not "no_image" in thumb: serieid = scrapertools.find_single_match(thumb, r'.*?\/\w\/(?P\d+).*?.*') if len(serieid) > 5: serieid = "" @@ -507,6 +512,11 @@ def episodios(item): "[\[]\s*(?P.*?)?\s*[\]]<\/span>" if "Especial" in info: # Capitulos Especiales pattern = ".*?[^>]+>.*?Temporada.*?\[.*?(?P\d+).*?\].*?Capitulo.*?\[\s*(?P\d+).*?\]?(?:.*?(?P\d+)?)<.+?]+>(?P.*?)?<\/span>\s*Calidad\s*]+>[\[]\s*(?P.*?)?\s*[\]]<\/span>" + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioNEW: " + pattern) + logger.debug(info) + info = '>%sTemporada %s Capitulo 0 - Español Castellano Calidad [%s]' % (item.contentTitle, season, item.infoLabels['quality']) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] @@ -540,11 +550,11 @@ def episodios(item): "(?P\d{2}))?.*?\].*?(?:\[(?P.*?)\])?" elif scrapertools.find_single_match(info, 'Cap.\d{2,3}'): pattern = ".*?Temp.*?\s(?P.*?)\s.*?Cap.(?P\d).*?(?P\d{2})(?:_(?P\d+)(?P\d{2}))?.*?\s(?P.*)?" - else: - logger.debug("patron episodio: " + pattern) + + if not scrapertools.find_single_match(info, pattern): #en caso de error de formato, creo uno básico + logger.debug("patron episodioOLD: " + pattern) logger.debug(info) - continue - + info = '%s [%s][Cap.%s00][Español]' % (item.contentTitle, item.infoLabels['quality'], season) r = re.compile(pattern) match = [m.groupdict() for m in r.finditer(info)][0] From 1a3560977392b6c77f8d685f04fc6b60dfebdfd2 Mon Sep 17 00:00:00 2001 From: Kingbox <37674310+lopezvg@users.noreply.github.com> Date: Mon, 9 Apr 2018 15:53:15 +0200 Subject: [PATCH 25/42] Mejortorrent: arreglos de url MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Después del cambio de dominio, ha cambiado el comportamiento de la creación de urls de .torrents, tanto en Series como en Películas --- plugin.video.alfa/channels/mejortorrent.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/plugin.video.alfa/channels/mejortorrent.py b/plugin.video.alfa/channels/mejortorrent.py index f085f160..c31662f6 100755 --- a/plugin.video.alfa/channels/mejortorrent.py +++ b/plugin.video.alfa/channels/mejortorrent.py @@ -254,7 +254,7 @@ def episodios(item): url = host + scrapertools.find_single_match(data,patron) # "episodios%5B1%5D=11744&total_capis=5&tabla=series&titulo=Sea+Patrol+-+2%AA+Temporada" post = urllib.urlencode({name: value, "total_capis": total_capis, "tabla": tabla, "titulo": titulo}) - logger.debug("post=" + post) + #logger.debug("post=" + post) if item.extra == "series": epi = scrapedtitle.split("x") @@ -311,7 +311,6 @@ def show_movie_info(item): pass data = httptools.downloadpage(item.url).data - logger.debug("data=" + data) patron = "") + if scrapertools.find_single_match(torrent_data, ""): + link = scrapertools.get_match(torrent_data, "") + else: + link = scrapertools.get_match(torrent_data, "") link = urlparse.urljoin(url, link) logger.debug("link=" + link) itemlist.append(Item(channel=item.channel, action="play", server="torrent", title=item.title, url=link, @@ -363,7 +364,7 @@ def play(item): else: #data = httptools.downloadpage(item.url, post=item.extra).data data = httptools.downloadpage(item.url).data - logger.debug("data=" + data) + #logger.debug("data=" + data) params = dict(urlparse.parse_qsl(item.extra)) patron = host + "/secciones.php?sec=descargas&ap=contar&tabla=" + params["tabla"] + "&id=" + item.id @@ -373,7 +374,9 @@ def play(item): data = httptools.downloadpage(patron).data patron = "Pincha " - link = host + scrapertools.find_single_match(data, patron) + link = scrapertools.find_single_match(data, patron) + if not host in link: + link = host + link logger.info("link=" + link) itemlist.append(Item(channel=item.channel, action="play", server="torrent", title=item.title, url=link, thumbnail=item.thumbnail, plot=item.plot, folder=False)) From 2576ebcac1d4e4f87e7db846fa75c538f35e2cc6 Mon Sep 17 00:00:00 2001 From: pipcat Date: Mon, 9 Apr 2018 16:24:16 +0200 Subject: [PATCH 26/42] =?UTF-8?q?Eliminado=20c=C3=B3digo=20obsoleto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.video.alfa/core/cloudflare.py | 70 +++------------------------- 1 file changed, 7 insertions(+), 63 deletions(-) diff --git a/plugin.video.alfa/core/cloudflare.py b/plugin.video.alfa/core/cloudflare.py index b4948b71..5fd485f7 100755 --- a/plugin.video.alfa/core/cloudflare.py +++ b/plugin.video.alfa/core/cloudflare.py @@ -9,7 +9,7 @@ import urllib import urlparse from platformcode import logger -from decimal import Decimal, ROUND_UP +from decimal import Decimal class Cloudflare: def __init__(self, response): @@ -62,18 +62,17 @@ class Cloudflare: def get_url(self): # Metodo #1 (javascript) if self.js_data.get("wait", 0): - jschl_answer = self.decode2(self.js_data["value"]) + jschl_answer = self.decode(self.js_data["value"]) for op, v in self.js_data["op"]: - #jschl_answer = eval(str(jschl_answer) + op + str(self.decode2(v))) if op == '+': - jschl_answer = jschl_answer + self.decode2(v) + jschl_answer = jschl_answer + self.decode(v) elif op == '-': - jschl_answer = jschl_answer - self.decode2(v) + jschl_answer = jschl_answer - self.decode(v) elif op == '*': - jschl_answer = jschl_answer * self.decode2(v) + jschl_answer = jschl_answer * self.decode(v) elif op == '/': - jschl_answer = jschl_answer / self.decode2(v) + jschl_answer = jschl_answer / self.decode(v) self.js_data["params"]["jschl_answer"] = round(jschl_answer, 10) + len(self.domain) @@ -93,7 +92,7 @@ class Cloudflare: return response - def decode2(self, data): + def decode(self, data): data = re.sub("\!\+\[\]", "1", data) data = re.sub("\!\!\[\]", "1", data) data = re.sub("\[\]", "0", data) @@ -112,59 +111,4 @@ class Cloudflare: for n in aux: num2 += str(eval(n)) - #return float(num1) / float(num2) - #return Decimal(Decimal(num1) / Decimal(num2)).quantize(Decimal('.0000000000000001'), rounding=ROUND_UP) return Decimal(Decimal(num1) / Decimal(num2)).quantize(Decimal('.0000000000000001')) - - def decode(self, data): - t = time.time() - timeout = False - - while not timeout: - data = re.sub("\[\]", "''", data) - data = re.sub("!\+''", "+1", data) - data = re.sub("!''", "0", data) - data = re.sub("!0", "1", data) - - if "(" in data: - x, y = data.rfind("("), data.find(")", data.rfind("(")) + 1 - part = data[x + 1:y - 1] - else: - x = 0 - y = len(data) - part = data - - val = "" - - if not part.startswith("+"): part = "+" + part - - for i, ch in enumerate(part): - if ch == "+": - if not part[i + 1] == "'": - if val == "": val = 0 - if type(val) == str: - val = val + self.get_number(part, i + 1) - else: - val = val + int(self.get_number(part, i + 1)) - else: - val = str(val) - val = val + self.get_number(part, i + 1) or "0" - - if type(val) == str: val = "'%s'" % val - data = data[0:x] + str(val) + data[y:] - - timeout = time.time() - t > self.timeout - - if not "+" in data and not "(" in data and not ")" in data: - return int(self.get_number(data)) - - def get_number(self, str, start=0): - ret = "" - for chr in str[start:]: - try: - int(chr) - except: - if ret: break - else: - ret += chr - return ret From 96f6484503758023b7fdebcb432dbebac15e6032 Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Mon, 9 Apr 2018 17:12:07 -0500 Subject: [PATCH 27/42] pepecine: cambio de dominio --- plugin.video.alfa/channels/pepecine.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin.video.alfa/channels/pepecine.py b/plugin.video.alfa/channels/pepecine.py index c1e42e78..e5025687 100755 --- a/plugin.video.alfa/channels/pepecine.py +++ b/plugin.video.alfa/channels/pepecine.py @@ -14,7 +14,7 @@ from core import tmdb from core.item import Item, InfoLabels from platformcode import config, logger -host = "https://pepecine.info" +host = "https://pepecinehd.tv" perpage = 20 def mainlist1(item): @@ -29,7 +29,7 @@ def mainlist(item): itemlist = [] itemlist.append(Item(channel=item.channel, title="Ultimas", - url=host+'/peliculas-tv-online', + url=host+'/tv-peliculas-online', action='list_latest', indexp=1, type='movie')) @@ -149,7 +149,7 @@ def list_latest(item): logger.info() itemlist = [] data = get_source(item.url) - data_url= scrapertools.find_single_match(data,' Date: Mon, 9 Apr 2018 17:14:35 -0500 Subject: [PATCH 28/42] Update seriespapaya.json --- plugin.video.alfa/channels/seriespapaya.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin.video.alfa/channels/seriespapaya.json b/plugin.video.alfa/channels/seriespapaya.json index 9bf0fe56..7f0acff1 100755 --- a/plugin.video.alfa/channels/seriespapaya.json +++ b/plugin.video.alfa/channels/seriespapaya.json @@ -24,7 +24,7 @@ "Inglés", "Latino", "Catalán", - "VOS" + "VOSE" ] }, { @@ -44,4 +44,4 @@ "visible": true } ] -} \ No newline at end of file +} From bb7368c08aaaf9e068795b5548ea11ba417228e9 Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Mon, 9 Apr 2018 17:29:33 -0500 Subject: [PATCH 29/42] doomtv: fix --- plugin.video.alfa/channels/doomtv.py | 91 +++------------------------- 1 file changed, 10 insertions(+), 81 deletions(-) diff --git a/plugin.video.alfa/channels/doomtv.py b/plugin.video.alfa/channels/doomtv.py index c262503a..c57cd547 100644 --- a/plugin.video.alfa/channels/doomtv.py +++ b/plugin.video.alfa/channels/doomtv.py @@ -23,36 +23,6 @@ list_quality = CALIDADES.values() list_servers = ['directo', 'openload'] host = 'http://doomtv.net/' -headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0 Chrome/58.0.3029.110', - 'Referer': host} - -tgenero = {"Comedia": "https://s7.postimg.org/ne9g9zgwb/comedia.png", - "Suspenso": "https://s13.postimg.org/wmw6vl1cn/suspenso.png", - "Drama": "https://s16.postimg.org/94sia332d/drama.png", - "Acción": "https://s3.postimg.org/y6o9puflv/accion.png", - "Aventura": "https://s10.postimg.org/6su40czih/aventura.png", - "Romance": "https://s15.postimg.org/fb5j8cl63/romance.png", - "Animación": "https://s13.postimg.org/5on877l87/animacion.png", - "Ciencia ficción": "https://s9.postimg.org/diu70s7j3/cienciaficcion.png", - "Terror": "https://s7.postimg.org/yi0gij3gb/terror.png", - "Documental": "https://s16.postimg.org/7xjj4bmol/documental.png", - "Música": "https://s29.postimg.org/bbxmdh9c7/musical.png", - "Fantasía": "https://s13.postimg.org/65ylohgvb/fantasia.png", - "Bélico Guerra": "https://s23.postimg.org/71itp9hcr/belica.png", - "Misterio": "https://s1.postimg.org/w7fdgf2vj/misterio.png", - "Crimen": "https://s4.postimg.org/6z27zhirx/crimen.png", - "Biográfia": "https://s15.postimg.org/5lrpbx323/biografia.png", - "Familia": "https://s7.postimg.org/6s7vdhqrf/familiar.png", - "Familiar": "https://s7.postimg.org/6s7vdhqrf/familiar.png", - "Intriga": "https://s27.postimg.org/v9og43u2b/intriga.png", - "Thriller": "https://s22.postimg.org/5y9g0jsu9/thriller.png", - "Guerra": "https://s4.postimg.org/n1h2jp2jh/guerra.png", - "Estrenos": "https://s21.postimg.org/fy69wzm93/estrenos.png", - "Peleas": "https://s14.postimg.org/we1oyg05t/peleas.png", - "Policiales": "https://s21.postimg.org/n9e0ci31z/policial.png", - "Uncategorized": "https://s30.postimg.org/uj5tslenl/otros.png", - "LGBT": "https://s30.postimg.org/uj5tslenl/otros.png"} def mainlist(item): @@ -177,15 +147,13 @@ def seccion(item): url = scrapedurl title = scrapedtitle thumbnail = '' - if title in tgenero: - thumbnail = tgenero[title] if url not in duplicado: itemlist.append( Item(channel=item.channel, action='lista', title=title, url=url, - thumbnail = thumbnail + thumbnail=thumbnail )) return itemlist @@ -221,64 +189,25 @@ def newest(categoria): return itemlist -def get_vip(item, url): - logger.info() - itemlist = [] - data = httptools.downloadpage(url+'/videocontent').data - data = re.sub(r'"|\n|\r|\t| |
|\s{2,}', "", data) - video_id = scrapertools.find_single_match(data, 'id=videoInfo >(.*?)') - new_url = 'https://v.d0stream.com/api/videoinfo/%s?src-url=https://Fv.d0stream.com' % video_id - json_data = httptools.downloadpage(new_url).data - dict_data = jsontools.load(json_data) - sources = dict_data['sources'] - - for vip_item in sources['mp4_cdn']: - vip_url= vip_item['url'] - vip_quality = vip_item['label'] - title ='%s [%s]' % (item.title, vip_quality) - itemlist.append(item.clone(title = title, url=vip_url, action='play', quality=vip_quality, server='directo')) - - return itemlist - def findvideos(item): logger.info() itemlist = [] data = httptools.downloadpage(item.url).data data = re.sub(r'"|\n|\r|\t| |
|\s{2,}', "", data) - player_vip = scrapertools.find_single_match(data, 'class=movieplay>