From c9f82b1b857779f8631406e8729aac9e16e0706d Mon Sep 17 00:00:00 2001 From: Alfa <30527549+alfa-addon@users.noreply.github.com> Date: Fri, 19 Jan 2018 17:09:22 -0500 Subject: [PATCH 01/14] hdfull: fix --- plugin.video.alfa/channels/hdfull.py | 33 +++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/plugin.video.alfa/channels/hdfull.py b/plugin.video.alfa/channels/hdfull.py index 425c8534..e5714a34 100644 --- a/plugin.video.alfa/channels/hdfull.py +++ b/plugin.video.alfa/channels/hdfull.py @@ -646,6 +646,7 @@ def findvideos(item): key = scrapertools.find_single_match(data_js, 'JSON.parse\(atob.*?substrings\((.*?)\)') data_js = httptools.downloadpage("http://hdfull.tv/js/providers.js").data + try: data_js = jhexdecode(data_js) except: @@ -667,10 +668,11 @@ def findvideos(item): infolabels["year"] = year matches = [] for match in data_decrypt: - prov = eval(scrapertools.find_single_match(data_js, 'p\[%s\]\s*=\s*(\{.*?\}[\'"]\})' % match["provider"])) - function = prov["l"].replace("code", match["code"]).replace("var_1", match["code"]) + prov = eval(scrapertools.find_single_match(data_js, 'p\[%s\]\s*=\s*(\{.*?\}[\']\})' % match["provider"])) - url = scrapertools.find_single_match(function, "return\s*(.*?)[;]*\}") + server_url = scrapertools.find_single_match(prov['l'], 'return\s*"(.*?)"') + + url = '%s%s' % (server_url, match['code']) url = re.sub(r'\'|"|\s|\+', '', url) url = re.sub(r'var_\d+\[\d+\]', '', url) embed = prov["e"] @@ -691,6 +693,8 @@ def findvideos(item): ' Date: Fri, 19 Jan 2018 17:10:14 -0500 Subject: [PATCH 02/14] httptools: updated --- 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 82345bfb..dc509577 100755 --- a/plugin.video.alfa/core/httptools.py +++ b/plugin.video.alfa/core/httptools.py @@ -25,7 +25,7 @@ ficherocookies = os.path.join(config.get_data_path(), "cookies.dat") # Headers por defecto, si no se especifica nada default_headers = dict() -default_headers["User-Agent"] = "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3163.100 Safari/537.36" +default_headers["User-Agent"] = "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3163.100 Safari/537.36" default_headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" default_headers["Accept-Language"] = "es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3" default_headers["Accept-Charset"] = "UTF-8" From c6d02446f1c21338ecef74b87c173d0e193c3d87 Mon Sep 17 00:00:00 2001 From: Alfa <30527549+alfa-addon@users.noreply.github.com> Date: Fri, 19 Jan 2018 17:17:31 -0500 Subject: [PATCH 03/14] Update powvideo.py --- plugin.video.alfa/servers/powvideo.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/plugin.video.alfa/servers/powvideo.py b/plugin.video.alfa/servers/powvideo.py index 4ae29447..51d18c9d 100755 --- a/plugin.video.alfa/servers/powvideo.py +++ b/plugin.video.alfa/servers/powvideo.py @@ -48,19 +48,18 @@ class S: self.c = None self.b = None self.d = None - var = eval(var) - for x in range(0x1f0, 0, -1): + for x in range(0x0ac, 0, -1): var.append(var.pop(0)) self.var = var self.t( - self.decode_index('0x22', '!UJH') + - self.decode_index('0x23', 'NpE)') + - self.decode_index('0x24', '4uT2') + - self.decode_index('0x23', 'NpE)'), - self.decode_index('0x25', '@ZC2') + self.decode_index('0x21', 'bGw%') + + self.decode_index('0x22', 'I&xf') + + self.decode_index('0x23', '[THM') + + self.decode_index('0x24', 'bGw%'), + self.decode_index('0x25', 'nLWZ') ) def decode_index(self, index, key): From b2881f3f9c57eee285f2c4d068369eea0427dd14 Mon Sep 17 00:00:00 2001 From: Alfa <30527549+alfa-addon@users.noreply.github.com> Date: Fri, 19 Jan 2018 17:18:01 -0500 Subject: [PATCH 04/14] Update streamplay.py --- plugin.video.alfa/servers/streamplay.py | 31 +++++++++++++++---------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/plugin.video.alfa/servers/streamplay.py b/plugin.video.alfa/servers/streamplay.py index 316fe259..de9ae4ad 100644 --- a/plugin.video.alfa/servers/streamplay.py +++ b/plugin.video.alfa/servers/streamplay.py @@ -30,14 +30,24 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= referer = page_url.replace('iframe', 'preview') data = httptools.downloadpage(page_url, headers={'Referer': referer}).data + _0xd003 = scrapertools.find_single_match(data, 'var _0x[0-f]+=(\[[^;]+\]);') + # `forShift` and `forIndex` for Class S ---------------- + regex = ";\}\([^,]+,([^\)]+)\)\);" + forShift = int(scrapertools.find_single_match(data, regex), 16) + + regex = "new _0x[^\(]+\(_0x[^\(]+(\(.*?\))\);" + lineKey = scrapertools.find_single_match(data,regex) + + regex = "\(\s*'([^']+)'\s*,\s*'([^']+)'\s*\)\s*([\+,]*)" + forIndex = scrapertools.find_multiple_matches(lineKey,regex) + # ------------------------------------------------------ packed = scrapertools.find_single_match(data, "") unpacked = jsunpack.unpack(packed) - _0xd003 = scrapertools.find_single_match(data, 'var _0x[0-f]+=(\[[^;]+\]);') video_urls = [] url = scrapertools.find_single_match(unpacked, '(http[^,]+\.mp4)') - video_urls.append([".mp4" + " [streamplay]", S(_0xd003).decode(url)]) + video_urls.append([".mp4" + " [streamplay]", S(_0xd003, forShift, forIndex).decode(url)]) video_urls.sort(key=lambda x: x[0], reverse=True) for video_url in video_urls: @@ -47,7 +57,7 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= class S: - def __init__(self, var): + def __init__(self, var, forShift, forIndex): self.r = None self.s = None self.k = None @@ -57,18 +67,15 @@ class S: self.d = None var = eval(var) - for x in range(0x1f0, 0, -1): + #for x in range(0x1f0, 0, -1): + for x in range(forShift, 0, -1): var.append(var.pop(0)) self.var = var - - self.t( - self.decode_index('0x22', '!UJH') + - self.decode_index('0x23', 'NpE)') + - self.decode_index('0x24', '4uT2') + - self.decode_index('0x23', 'NpE)'), - self.decode_index('0x25', '@ZC2') - ) + _decode_index = "self.t(" + for i, v, o in forIndex: + _decode_index += "self.decode_index('" + i + "','" + v + "') " + o + exec _decode_index + ")" def decode_index(self, index, key): b64_data = self.var[int(index, 16)]; From 467ac55faa9c0ed826773f8e5bf4efdd06c6c7cb Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Sat, 20 Jan 2018 09:23:22 -0500 Subject: [PATCH 05/14] seriesblanco: fix --- plugin.video.alfa/channels/seriesblanco.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/seriesblanco.py b/plugin.video.alfa/channels/seriesblanco.py index 88769f89..23f89af6 100644 --- a/plugin.video.alfa/channels/seriesblanco.py +++ b/plugin.video.alfa/channels/seriesblanco.py @@ -305,7 +305,6 @@ def findvideos(item): if filtro_enlaces != 1: list_links.extend(parse_videos(item, "Descargar", online[-1])) - list_links = filtertools.get_links(list_links, item, list_idiomas, CALIDADES) for i in range(len(list_links)): @@ -315,6 +314,7 @@ def findvideos(item): d=c[0].rstrip( ) d=d.lstrip( ) list_links[i].server=d.replace("streamix", "streamixcloud") + list_links[i].server=d.replace("uploaded", "uploadedto") list_links = servertools.get_servers_itemlist(list_links) autoplay.start(list_links, item) From 40b475b554044c04cc02297eea79de638b351dfe Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Sat, 20 Jan 2018 09:24:11 -0500 Subject: [PATCH 06/14] clipwatching: nuevo server --- plugin.video.alfa/servers/clipwatching.json | 42 +++++++++++++++++++++ plugin.video.alfa/servers/clipwatching.py | 25 ++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 plugin.video.alfa/servers/clipwatching.json create mode 100644 plugin.video.alfa/servers/clipwatching.py diff --git a/plugin.video.alfa/servers/clipwatching.json b/plugin.video.alfa/servers/clipwatching.json new file mode 100644 index 00000000..d02c62a8 --- /dev/null +++ b/plugin.video.alfa/servers/clipwatching.json @@ -0,0 +1,42 @@ +{ + "active": true, + "find_videos": { + "ignore_urls": [], + "patterns": [ + { + "pattern": "clipwatching.com/(.*?).html", + "url": "http://clipwatching.com/\\1.html" + } + ] + }, + "free": true, + "id": "clipwatching", + "name": "clipwatching", + "settings": [ + { + "default": false, + "enabled": true, + "id": "black_list", + "label": "Incluir en lista negra", + "type": "bool", + "visible": true + }, + { + "default": 0, + "enabled": true, + "id": "favorites_servers_list", + "label": "Incluir en lista de favoritos", + "lvalues": [ + "No", + "1", + "2", + "3", + "4", + "5" + ], + "type": "list", + "visible": false + } + ], + "thumbnail": "https://s17.postimg.org/e6kcan0vj/clipwatching1.png" +} diff --git a/plugin.video.alfa/servers/clipwatching.py b/plugin.video.alfa/servers/clipwatching.py new file mode 100644 index 00000000..7a8139e8 --- /dev/null +++ b/plugin.video.alfa/servers/clipwatching.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +from core import httptools +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 "no longer exists" in data or "to copyright issues" in data: + return False, "[clipwatching] El video ha sido borrado" + if "please+try+again+later." in data: + return False, "[clipwatching] Error de clipwatching, no se puede generar el enlace al video" + return True, "" + + +def get_video_url(page_url, user="", password="", video_password=""): + logger.info("(page_url='%s')" % page_url) + data = httptools.downloadpage(page_url).data + video_urls = [] + videourl, label = scrapertools.find_single_match(data, 'file:"([^"]+).*?label:"([^"]+)') + video_urls.append([label + " [clipwatching]", videourl]) + + return video_urls From c4c63aed5303be88a0e8cfe1f04f070d4ef67f3c Mon Sep 17 00:00:00 2001 From: danielr460 Date: Sat, 20 Jan 2018 23:13:59 -0500 Subject: [PATCH 07/14] Arreglado AnitoonsTV --- plugin.video.alfa/channels/anitoonstv.py | 90 +++++++++++------------- 1 file changed, 41 insertions(+), 49 deletions(-) diff --git a/plugin.video.alfa/channels/anitoonstv.py b/plugin.video.alfa/channels/anitoonstv.py index 417ef1f1..909293f5 100644 --- a/plugin.video.alfa/channels/anitoonstv.py +++ b/plugin.video.alfa/channels/anitoonstv.py @@ -32,7 +32,7 @@ def mainlist(item): itemlist = list() - itemlist.append(Item(channel=item.channel, action="lista", title="Anime", url=host, + itemlist.append(Item(channel=item.channel, action="lista", title="Series", url=host+"/lista-de-anime.php", thumbnail=thumb_series)) itemlist.append(Item(channel=item.channel, action="lista", title="Series Animadas", url=host, thumbnail=thumb_series)) @@ -52,45 +52,38 @@ def lista(item): data = httptools.downloadpage(item.url).data data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - if 'Novedades' in item.title: - patron_cat = '

(.+?)<\/h2><\/a><\/div>' - patron = '

(.+?)<\/span>' - else: - patron_cat = '
  • ' - patron_cat += str(item.title) - patron_cat += '<\/a>
    (.+?)<\/div><\/li>' - patron = "(.+?)<\/a>" - data = scrapertools.find_single_match(data, patron_cat) + #logger.info("Pagina para regex "+data) + patron = '
    ' #Encabezado regex + patron +="" #scrapedurl + patron +="Titulo.+?<\/span>(.+?)
    ') scrapedthumbnail = scrapertools.find_single_match(data, "") @@ -150,29 +143,28 @@ def findvideos(item): data = httptools.downloadpage(item.url).data data1 = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - data_vid = scrapertools.find_single_match(data1, '
    (.+?)<\/div>
    ') - + data_vid = scrapertools.find_single_match(data1, 'var q = \[ \[(.+?)\] \]') + logger.info("h12ghcvh1 "+data_vid) # name = scrapertools.find_single_match(data,'Titulo.+?<\/span>([^<]+)
    ') scrapedplot = scrapertools.find_single_match(data, '
    Descrip.+?<\/span>([^<]+)
    ') scrapedthumbnail = scrapertools.find_single_match(data, '
    ') - itemla = scrapertools.find_multiple_matches(data_vid, '
    .+?-(.+?)-(.+?)<\/div><.+? src="(.+?)"') - for server, quality, url in itemla: - if "HQ" in quality: - quality = "HD" - if "Calidad Alta" in quality: - quality = "HQ" - if " Calidad media - Carga mas rapido" in quality: - quality = "360p" - server = server.lower().strip() - if "ok" in server: - server = 'okru' - if "rapid" in server: - server = 'rapidvideo' - if "netu" in server: - server = 'netutv' + itemla = scrapertools.find_multiple_matches(data_vid, '"(.+?)"') + for url in itemla: + url=url.replace('\/', '/') + server1=url.split('/') + server=server1[2] + if "." in server: + server1=server.split('.') + if len(server1)==3: + server=server1[1] + else: + server=server1[0] + if "goo" in url: url = googl(url) - itemlist.append(item.clone(url=url, action="play", server=server, contentQuality=quality, - thumbnail=scrapedthumbnail, plot=scrapedplot, + server='netutv' + quality="360p" + itemlist.append(item.clone(url=url, action="play", + thumbnail=scrapedthumbnail, server=server, plot=scrapedplot, title="Enlace encontrado en: %s [%s]" % (server.capitalize(), quality))) autoplay.start(itemlist, item) From 453b71bc7a27f119501fdb4a417f39bebea7b94c Mon Sep 17 00:00:00 2001 From: danielr460 Date: Sat, 20 Jan 2018 23:17:39 -0500 Subject: [PATCH 08/14] Eliminando opciones innecesarias --- plugin.video.alfa/channels/anitoonstv.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugin.video.alfa/channels/anitoonstv.py b/plugin.video.alfa/channels/anitoonstv.py index 909293f5..0de7af50 100644 --- a/plugin.video.alfa/channels/anitoonstv.py +++ b/plugin.video.alfa/channels/anitoonstv.py @@ -34,12 +34,12 @@ def mainlist(item): itemlist.append(Item(channel=item.channel, action="lista", title="Series", url=host+"/lista-de-anime.php", thumbnail=thumb_series)) - itemlist.append(Item(channel=item.channel, action="lista", title="Series Animadas", url=host, - thumbnail=thumb_series)) - itemlist.append(Item(channel=item.channel, action="lista", title="Novedades", url=host, - thumbnail=thumb_series)) - itemlist.append(Item(channel=item.channel, action="lista", title="Pokemon", url=host, - thumbnail=thumb_series)) + #itemlist.append(Item(channel=item.channel, action="lista", title="Series Animadas", url=host, + # thumbnail=thumb_series)) + #itemlist.append(Item(channel=item.channel, action="lista", title="Novedades", url=host, + # thumbnail=thumb_series)) + #itemlist.append(Item(channel=item.channel, action="lista", title="Pokemon", url=host, + # thumbnail=thumb_series)) itemlist = renumbertools.show_option(item.channel, itemlist) autoplay.show_option(item.channel, itemlist) return itemlist From b42aae2eb99a0ec8100296ebf81b1621e42a006a Mon Sep 17 00:00:00 2001 From: danielr460 Date: Sun, 21 Jan 2018 14:59:37 -0500 Subject: [PATCH 09/14] =?UTF-8?q?Mejora=20en=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/flashx.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugin.video.alfa/servers/flashx.py b/plugin.video.alfa/servers/flashx.py index cb325d53..6c33cac0 100644 --- a/plugin.video.alfa/servers/flashx.py +++ b/plugin.video.alfa/servers/flashx.py @@ -16,6 +16,8 @@ def test_video_exists(page_url): data = httptools.downloadpage(page_url, cookies=False).data if 'file was deleted' in data: return False, "[FlashX] El archivo no existe o ha sido borrado" + elif 'File Not Found' in data: + return False, "[FlashX] El archivo no existe" elif 'Video is processing now' in data: return False, "[FlashX] El archivo se está procesando" From 0d342552d3a98ad2a1420c9a226806987624051f Mon Sep 17 00:00:00 2001 From: danielr460 Date: Sun, 21 Jan 2018 15:00:35 -0500 Subject: [PATCH 10/14] Autoplay: Evitando Popup de enlace por medio de test_video_exists --- plugin.video.alfa/channels/autoplay.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/plugin.video.alfa/channels/autoplay.py b/plugin.video.alfa/channels/autoplay.py index 467d7621..9c0977f0 100644 --- a/plugin.video.alfa/channels/autoplay.py +++ b/plugin.video.alfa/channels/autoplay.py @@ -89,7 +89,6 @@ def start(itemlist, item): videoitem.contentTitle=item.contentTitle videoitem.contentType=item.contentType videoitem.episode_id=item.episode_id - videoitem.hasContentDetails=item.hasContentDetails #videoitem.infoLabels=item.infoLabels videoitem.thumbnail=item.thumbnail #videoitem.title=item.title @@ -276,11 +275,23 @@ def start(itemlist, item): videoitem = resolved_item[0] # si no directamente reproduce y marca como visto - from platformcode import xbmc_videolibrary - xbmc_videolibrary.mark_auto_as_watched(item) - #platformtools.play_video(videoitem) videoitem.contentChannel='videolibrary' - launcher.run(videoitem) + import importlib + actual_server="servers."+videoitem.server + i = importlib.import_module(actual_server) + #from servers import streamango + try: + testv=i.test_video_exists(videoitem.url) + logger.info(testv) + except: + testv=(True,'') + logger.debug("La funcion no existe en el conector "+videoitem.server) + testvideo=list(testv) + if testvideo[0]==True: + from platformcode import xbmc_videolibrary + xbmc_videolibrary.mark_auto_as_watched(item) + #platformtools.play_video(videoitem) + launcher.run(videoitem) try: if platformtools.is_playing(): From 4ef6efdc5da9d7e1cb9922fb5129f83a980300b5 Mon Sep 17 00:00:00 2001 From: danielr460 Date: Sun, 21 Jan 2018 16:24:46 -0500 Subject: [PATCH 11/14] Anitoonstv: Arreglo menor en servidor --- plugin.video.alfa/channels/anitoonstv.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/anitoonstv.py b/plugin.video.alfa/channels/anitoonstv.py index 0de7af50..70cc6fb8 100644 --- a/plugin.video.alfa/channels/anitoonstv.py +++ b/plugin.video.alfa/channels/anitoonstv.py @@ -144,7 +144,6 @@ def findvideos(item): data = httptools.downloadpage(item.url).data data1 = re.sub(r"\n|\r|\t|\s{2}| ", "", data) data_vid = scrapertools.find_single_match(data1, 'var q = \[ \[(.+?)\] \]') - logger.info("h12ghcvh1 "+data_vid) # name = scrapertools.find_single_match(data,'Titulo.+?<\/span>([^<]+)
    ') scrapedplot = scrapertools.find_single_match(data, '
    Descrip.+?<\/span>([^<]+)
    ') scrapedthumbnail = scrapertools.find_single_match(data, '
    ') @@ -162,6 +161,9 @@ def findvideos(item): if "goo" in url: url = googl(url) server='netutv' + if "ok" in url: + url = googl(url) + server='okru' quality="360p" itemlist.append(item.clone(url=url, action="play", thumbnail=scrapedthumbnail, server=server, plot=scrapedplot, From dc095616dc53e8aa45443a19822b389df005f653 Mon Sep 17 00:00:00 2001 From: danielr460 Date: Sun, 21 Jan 2018 16:50:40 -0500 Subject: [PATCH 12/14] Anitoonstv: Arreglo en okru --- plugin.video.alfa/channels/anitoonstv.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin.video.alfa/channels/anitoonstv.py b/plugin.video.alfa/channels/anitoonstv.py index 70cc6fb8..df815baa 100644 --- a/plugin.video.alfa/channels/anitoonstv.py +++ b/plugin.video.alfa/channels/anitoonstv.py @@ -121,7 +121,7 @@ def episodios(item): if config.get_videolibrary_support() and len(itemlist) > 0: itemlist.append(Item(channel=item.channel, title="[COLOR yellow]Añadir esta serie a la videoteca[/COLOR]", url=item.url, - action="add_serie_to_library", extra="episodios", show=show)) + action="add_serie_to_library", extra="episodios", show=item.title)) return itemlist @@ -162,7 +162,7 @@ def findvideos(item): url = googl(url) server='netutv' if "ok" in url: - url = googl(url) + url = "https:"+url server='okru' quality="360p" itemlist.append(item.clone(url=url, action="play", From 0bf51ab8e9a6da868c7072eb292a408ad9d7c36f Mon Sep 17 00:00:00 2001 From: alfa-addon Date: Mon, 22 Jan 2018 12:12:20 -0500 Subject: [PATCH 13/14] fixed --- plugin.video.alfa/channels/pelisgratis.py | 5 +- plugin.video.alfa/channels/plusdede.py | 8 +- plugin.video.alfa/servers/openload.py | 238 ++++++++++++---------- plugin.video.alfa/servers/powvideo.py | 74 ++++--- plugin.video.alfa/servers/streamplay.py | 85 ++++---- 5 files changed, 217 insertions(+), 193 deletions(-) diff --git a/plugin.video.alfa/channels/pelisgratis.py b/plugin.video.alfa/channels/pelisgratis.py index 4426a861..7b0036b5 100755 --- a/plugin.video.alfa/channels/pelisgratis.py +++ b/plugin.video.alfa/channels/pelisgratis.py @@ -135,9 +135,8 @@ def lista(item): logger.info() itemlist = [] data = get_source(item.url) - patron = 'class=(?:MvTbImg|TPostMv).*?href=(.*?)\/(?:>| class).*?src=(.*?) class=attachment.*?' - patron += '(?:strong|class=Title)>(.*?)<.*?(?:(.*?)<.*?' - patron += '(?:(.*?)<(?:\/td|\/p)>' + patron = 'class=(?:MvTbImg|TPostMv).*?href=(.*?)\/(?:>| class).*?src=(.*?) ' + patron += 'class=Title>(.*?)<.*?(?:(.*?)<.*?(?:(.*?)<(?:\/td|\/p)>' matches = re.compile(patron, re.DOTALL).findall(data) for scrapedurl, scrapedthumbnail, scrapedtitle, scrapedyear, scrapedplot in matches: diff --git a/plugin.video.alfa/channels/plusdede.py b/plugin.video.alfa/channels/plusdede.py index 4334ea4a..b3380d66 100644 --- a/plugin.video.alfa/channels/plusdede.py +++ b/plugin.video.alfa/channels/plusdede.py @@ -34,7 +34,7 @@ def login(): config.get_setting("plusdedeuser", "plusdede")) + "&password=" + str( config.get_setting("plusdedepassword", "plusdede")) + "&app=2131296469" url = "https://www.plusdede.com/" - headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " + headers = {"User-Agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/61.0.3163.100 Safari/537.36","Referer": url, "X-Requested-With": "XMLHttpRequest", "X-CSRF-TOKEN": token} data = httptools.downloadpage("https://www.plusdede.com/login", post=post, headers=headers, replace_headers=False).data @@ -772,13 +772,13 @@ def checkseen(item): if item.tipo == "8": url_temp = "https://www.plusdede.com/set/episode/" + item.data_id + "/seen" tipo_str = "series" - headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " + headers = {"User-Agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/61.0.3163.100 Safari/537.36", "Referer": "https://www.plusdede.com/serie/", "X-Requested-With": "XMLHttpRequest", "X-CSRF-TOKEN": item.token} else: url_temp = "https://www.plusdede.com/set/usermedia/" + item.tipo + "/" + item.data_id + "/seen" tipo_str = "pelis" - headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " + headers = {"User-Agent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/61.0.3163.100 Safari/537.36", "Referer": "https://www.plusdede.com/serie/", "X-Requested-With": "XMLHttpRequest", "X-CSRF-TOKEN": item.token} data = httptools.downloadpage(url_temp, post="id=" + item.idtemp, headers=headers, replace_headers=True).data @@ -931,7 +931,7 @@ def plusdede_check(item): tipo_str = "listas" else: tipo_str = "pelis" - headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " + headers = {"User-Agent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/61.0.3163.100 Safari/537.36","Referer": "https://www.plusdede.com/" + tipo_str, "X-Requested-With": "XMLHttpRequest", "X-CSRF-TOKEN": item.token} data = httptools.downloadpage(url_temp, post="id=" + item.idtemp, headers=headers, diff --git a/plugin.video.alfa/servers/openload.py b/plugin.video.alfa/servers/openload.py index 692f57c3..452355f6 100644 --- a/plugin.video.alfa/servers/openload.py +++ b/plugin.video.alfa/servers/openload.py @@ -3,9 +3,7 @@ from core import httptools from core import scrapertools from platformcode import config, logger - -headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'} - +from core import jsontools def test_video_exists(page_url): logger.info("(page_url='%s')" % page_url) @@ -22,132 +20,154 @@ def test_video_exists(page_url): return True, "" - def get_video_url(page_url, premium=False, user="", password="", video_password=""): - logger.info("url=" + page_url) - video_urls = [] + logger.info() + itemlist = [] + + data = httptools.downloadpage(page_url, cookies=False).data + - header = {} - if "|" in page_url: - page_url, referer = page_url.split("|", 1) - header = {'Referer': referer} - data = httptools.downloadpage(page_url, headers=header, cookies=False).data subtitle = scrapertools.find_single_match(data, ']+id="[^"]+">([^<]{40,})' ) + _0x59ce16 = eval(scrapertools.find_single_match(data, '_0x59ce16=([^;]+)').replace('parseInt', 'int')) + _1x4bfb36 = eval(scrapertools.find_single_match(data, '_1x4bfb36=([^;]+)').replace('parseInt', 'int')) + parseInt = eval(scrapertools.find_single_match(data, '_0x30725e,(\(parseInt.*?)\),').replace('parseInt', 'int')) + url = decode(code, parseInt, _0x59ce16, _1x4bfb36) + url = httptools.downloadpage(url, only_headers=True, follow_redirects=False).headers.get('location') + extension = scrapertools.find_single_match(url, '(\..{,3})\?') + itemlist.append([extension, url, 0,subtitle]) - text_encode = scrapertools.find_multiple_matches(data, '(゚ω゚.*?\(\'\_\'\));') - text_decode = "" - for t in text_encode: - text_decode += aadecode(t) + except Exception: + logger.info() + if config.get_setting('api', __file__): + url = get_link_api(page_url) + extension = scrapertools.find_single_match(url, '(\..{,3})\?') + if url: + itemlist.append([extension, url, 0,subtitle]) + logger.debug(itemlist) - var_r = scrapertools.find_single_match(text_decode, "window\.[A-z]+\s*=\s*['\"]([^'\"]+)['\"]") - var_encodes = scrapertools.find_multiple_matches(data, 'id="%s[^"]*">([^<]+)<' % var_r) - numeros = scrapertools.find_single_match(data, '_[A-f0-9]+x[A-f0-9]+\s*(?:=|\^)\s*([0-9]{4,}|0x[A-f0-9]{4,})') - op1, op2 = scrapertools.find_single_match(data, '\(0x(\d),0x(\d)\);') - idparse, hexparse = scrapertools.find_multiple_matches(data, "parseInt\('([0-9]+)'") - # numeros = [numeros, str(int(hexparse, 8))] - rangos, rangos2 = scrapertools.find_single_match(data, "\)-([0-9]+).0x4\)/\(([0-9]+)") - videourl = "" - for encode in var_encodes: - text_decode = "" - try: - mult = int(op1) * int(op2) - rango1 = encode[:mult] - decode1 = [] - for i in range(0, len(rango1), 8): - decode1.append(int(rango1[i:i + 8], 16)) - rango1 = encode[mult:] - j = 0 - i = 0 - while i < len(rango1): - index1 = 64 - value1 = 0 - value2 = 0 - value3 = 0 - while True: - if (i + 1) >= len(rango1): - index1 = 143 - value3 = int(rango1[i:i + 2], 16) - i += 2 - data = value3 & 63 - value2 += data << value1 - value1 += 6 - if value3 < index1: - break + return itemlist - # value4 = value2 ^ decode1[j % (mult / 8)] ^ int(idparse,8) - # for n in numeros: - # if not n.isdigit(): - # n = int(n, 16) - # value4 ^= int(n) - value4 = value2 ^ decode1[(j % 9)] ^ (int(idparse, 8) - int(rangos) + 4) / (int(rangos2) - 8) ^ int(hexparse, 8) - value5 = index1 * 2 + 127 - for h in range(4): - valorfinal = (value4 >> 8 * h) & (value5) - valorfinal = chr(valorfinal - 1) - if valorfinal != "%": - text_decode += valorfinal - j += 1 - except: - continue - videourl = "https://openload.co/stream/%s?mime=true" % text_decode - resp_headers = httptools.downloadpage(videourl, follow_redirects=False, only_headers=True) - videourl = resp_headers.headers["location"].replace("https", "http").replace("?mime=true", "") - extension = resp_headers.headers["content-type"] - break +def decode(code, parseInt, _0x59ce16, _1x4bfb36): + logger.info() + import math - # Falla el método, se utiliza la api aunque en horas punta no funciona - if not videourl: - videourl, extension = get_link_api(page_url) - except: - import traceback - logger.info(traceback.format_exc()) - # Falla el método, se utiliza la api aunque en horas punta no funciona - videourl, extension = get_link_api(page_url) + _0x1bf6e5 = '' + ke = [] - extension = extension.replace("video/", ".").replace("application/x-", ".") - if not extension: - try: - extension = scrapertools.find_single_match(data, '= len(code[9*8:]): + _0x5eb93a = 143; - return video_urls + _0x3c9d8e = int(code[9*8+_0x439a49:9*8+_0x439a49+2], 16) + _0x439a49 +=2 + + if _0x1a873b < 6*5: + _0x332549 = _0x3c9d8e & 63 + _0x896767 += _0x332549 << _0x1a873b + else: + _0x332549 = _0x3c9d8e & 63 + _0x896767 += int(_0x332549 * math.pow(2, _0x1a873b)) + + _0x1a873b += 6 + if not _0x3c9d8e >= _0x5eb93a: break + + # _0x30725e = _0x896767 ^ ke[_0x145894 % 9] ^ _0x59ce16 ^ parseInt ^ _1x4bfb36 + _0x30725e = _0x896767 ^ ke[_0x145894 % 9] ^ parseInt ^ _1x4bfb36 + _0x2de433 = _0x5eb93a * 2 + 127 + + for i in range(4): + _0x3fa834 = chr(((_0x30725e & _0x2de433) >> (9*8/ 9)* i) - 1) + if _0x3fa834 != '$': + _0x1bf6e5 += _0x3fa834 + _0x2de433 = (_0x2de433 << (9*8/ 9)) + + _0x145894 += 1 + + + url = "https://openload.co/stream/%s?mime=true" % _0x1bf6e5 + return url + + +def login(): + logger.info() + data = httptools.downloadpage('https://openload.co').data + _csrf = scrapertools.find_single_match(data, '') + + post = { + 'LoginForm[email]' : config.get_setting('user', __file__), + 'LoginForm[password]' : config.get_setting('passowrd', __file__), + 'LoginForm[rememberMe]' : 1, + '_csrf' : _csrf + } + data = httptools.downloadpage('https://openload.co/login', post = post).data + + if 'Login key has already been sent.' in data: + while True : + if 'Invalid login key.' in data: + platformtools.dialog_ok('openload', 'El código introducido no es válido\nrevisa tu correo e introduce el código correcto') + + code = platformtools.dialog_input( post.get('LoginForm[loginkey]', ''), + 'Introduzca el código que ha sido enviado a \'%s\'' % 'r_dav' + ) + if not code: + break + else: + post['LoginForm[loginkey]'] = code + data = httptools.downloadpage('https://openload.co/login', post = post).data + + if 'Welcome back,' in data: break + + +def get_api_keys(): + logger.info() + api_login = config.get_setting('api_login', __file__) + api_key = config.get_setting('api_key', __file__) + if not api_key or not api_login: + login() + data = httptools.downloadpage('https://openload.co/account').data + post = { + 'FTPKey[password]' : config.get_setting('password', __file__), + '_csrf' : scrapertools.find_single_match(data, '') + } + + + data = httptools.downloadpage('https://openload.co/account', post = post).data + api_login = scrapertools.find_single_match(data, 'ID:([^<]+)') + api_key = scrapertools.find_single_match(data, 'Your FTP Password/API Key is: ([^<]+)
    ') + config.set_setting('api_login', api_login, __file__) + config.set_setting('api_key', api_key, __file__) + + return api_login, api_key def get_link_api(page_url): - from core import jsontools - file_id = scrapertools.find_single_match(page_url, '(?:embed|f)/([0-9a-zA-Z-_]+)') - login = "97b2326d7db81f0f" - key = "AQFO3QJQ" - data = httptools.downloadpage( - "https://api.openload.co/1/file/dlticket?file=%s&login=%s&key=%s" % (file_id, login, key)).data - data = jsontools.load(data) + logger.info() + api_login, api_key = get_api_keys() + + file_id = scrapertools.find_single_match(page_url, '(?:embed|f)/([0-9a-zA-Z-_]+)') + + data = httptools.downloadpage("https://api.openload.co/1/file/dlticket?file=%s&login=%s&key=%s" % (file_id, api_login, api_key)).data + data = jsontools.load_json(data) + # logger.info(data) if data["status"] == 200: ticket = data["result"]["ticket"] data = httptools.downloadpage("https://api.openload.co/1/file/dl?file=%s&ticket=%s" % (file_id, ticket)).data data = jsontools.load(data) - extension = data["result"]["content_type"] - videourl = data['result']['url'] - videourl = videourl.replace("https", "http") - return videourl, extension - return "", "" + return data['result']['url'].replace("https", "http") diff --git a/plugin.video.alfa/servers/powvideo.py b/plugin.video.alfa/servers/powvideo.py index 51d18c9d..229681a9 100755 --- a/plugin.video.alfa/servers/powvideo.py +++ b/plugin.video.alfa/servers/powvideo.py @@ -10,7 +10,6 @@ from lib import jsunpack from platformcode import logger headers = [['User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0']] -host = "http://powvideo.net/" def test_video_exists(page_url): @@ -22,21 +21,28 @@ def test_video_exists(page_url): def get_video_url(page_url, premium=False, user="", password="", video_password=""): - #logger.info("(page_url='%s')" % page_url) + logger.info() + itemlist = [] referer = page_url.replace('iframe', 'preview') + data = httptools.downloadpage(page_url, headers={'referer': referer}).data - _0xa3e8 = scrapertools.find_single_match(data, 'var _0x[0-f]+=(\[[^;]+\]);') + + if data == "File was deleted": + return "El archivo no existe o ha sido borrado" + + if 'Video is processing now' in data: + return "El vídeo está siendo procesado, intentalo de nuevo mas tarde" + + var = scrapertools.find_single_match(data, 'var _0x[0-f]+=(\[[^;]+\]);') + packed = scrapertools.find_single_match(data, "") unpacked = jsunpack.unpack(packed) - video_urls = [] - url = scrapertools.find_single_match(unpacked, "(?:src):\\\\'([^\\\\]+.mp4)\\\\'") - video_urls.append([".mp4" + " [powvideo]", S(_0xa3e8).decode(url)]) - - video_urls.sort(key=lambda x: x[0], reverse=True) - return video_urls + itemlist.append([".mp4" + " [powvideo]", S(var).decode(url)]) + itemlist.sort(key=lambda x: x[0], reverse=True) + return itemlist class S: @@ -48,22 +54,23 @@ class S: self.c = None self.b = None self.d = None + var = eval(var) - for x in range(0x0ac, 0, -1): + for x in range(0xd3, 0, -1): var.append(var.pop(0)) self.var = var self.t( - self.decode_index('0x21', 'bGw%') + - self.decode_index('0x22', 'I&xf') + - self.decode_index('0x23', '[THM') + - self.decode_index('0x24', 'bGw%'), - self.decode_index('0x25', 'nLWZ') + self.decode_index('0xc') + + self.decode_index('0d') + + self.decode_index('0xe') + + self.decode_index('0xf'), + self.decode_index('0x10') ) - def decode_index(self, index, key): - b64_data = self.var[int(index, 16)]; + def decode_index(self, index, key=None): + b64_data = self.var[int(index, 16)] result = '' _0xb99338 = 0x0 _0x25e3f4 = 0x0 @@ -71,25 +78,28 @@ class S: data = base64.b64decode(b64_data) data = urllib.unquote(data).decode('utf8') - _0x5da081 = [x for x in range(0x100)] + if key: + _0x5da081 = [x for x in range(0x100)] - for x in range(0x100): - _0xb99338 = (_0xb99338 + _0x5da081[x] + ord(key[x % len(key)])) % 0x100 - _0x139847 = _0x5da081[x] - _0x5da081[x] = _0x5da081[_0xb99338] - _0x5da081[_0xb99338] = _0x139847 + for x in range(0x100): + _0xb99338 = (_0xb99338 + _0x5da081[x] + ord(key[x % len(key)])) % 0x100 + _0x139847 = _0x5da081[x] + _0x5da081[x] = _0x5da081[_0xb99338] + _0x5da081[_0xb99338] = _0x139847 - _0xb99338 = 0x0 + _0xb99338 = 0x0 - for _0x11ebc5 in range(len(data)): - _0x25e3f4 = (_0x25e3f4 + 0x1) % 0x100 - _0xb99338 = (_0xb99338 + _0x5da081[_0x25e3f4]) % 0x100 - _0x139847 = _0x5da081[_0x25e3f4] - _0x5da081[_0x25e3f4] = _0x5da081[_0xb99338] - _0x5da081[_0xb99338] = _0x139847 - result += chr(ord(data[_0x11ebc5]) ^ _0x5da081[(_0x5da081[_0x25e3f4] + _0x5da081[_0xb99338]) % 0x100]) + for _0x11ebc5 in range(len(data)): + _0x25e3f4 = (_0x25e3f4 + 0x1) % 0x100 + _0xb99338 = (_0xb99338 + _0x5da081[_0x25e3f4]) % 0x100 + _0x139847 = _0x5da081[_0x25e3f4] + _0x5da081[_0x25e3f4] = _0x5da081[_0xb99338] + _0x5da081[_0xb99338] = _0x139847 + result += chr(ord(data[_0x11ebc5]) ^ _0x5da081[(_0x5da081[_0x25e3f4] + _0x5da081[_0xb99338]) % 0x100]) - return result + return result + else: + return data def decode(self, url): _hash = re.compile('[A-z0-9_-]{40,}', re.DOTALL).findall(url)[0] diff --git a/plugin.video.alfa/servers/streamplay.py b/plugin.video.alfa/servers/streamplay.py index de9ae4ad..427762b3 100644 --- a/plugin.video.alfa/servers/streamplay.py +++ b/plugin.video.alfa/servers/streamplay.py @@ -4,14 +4,12 @@ import re import base64 import urllib - from core import httptools from core import scrapertools from lib import jsunpack from platformcode import logger headers = [['User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0']] -host = "http://streamplay.to/" def test_video_exists(page_url): @@ -26,38 +24,29 @@ def test_video_exists(page_url): def get_video_url(page_url, premium=False, user="", password="", video_password=""): - logger.info("(page_url='%s')" % page_url) + logger.info() + itemlist = [] + + referer = re.sub(r"embed-|player-", "", page_url)[:-5] - referer = page_url.replace('iframe', 'preview') data = httptools.downloadpage(page_url, headers={'Referer': referer}).data - _0xd003 = scrapertools.find_single_match(data, 'var _0x[0-f]+=(\[[^;]+\]);') - # `forShift` and `forIndex` for Class S ---------------- - regex = ";\}\([^,]+,([^\)]+)\)\);" - forShift = int(scrapertools.find_single_match(data, regex), 16) - regex = "new _0x[^\(]+\(_0x[^\(]+(\(.*?\))\);" - lineKey = scrapertools.find_single_match(data,regex) + if data == "File was deleted": + return "El archivo no existe o ha sido borrado" - regex = "\(\s*'([^']+)'\s*,\s*'([^']+)'\s*\)\s*([\+,]*)" - forIndex = scrapertools.find_multiple_matches(lineKey,regex) - # ------------------------------------------------------ packed = scrapertools.find_single_match(data, "") unpacked = jsunpack.unpack(packed) + var = scrapertools.find_single_match(data, 'var _0x[0-f]+=(\[[^;]+\]);') - video_urls = [] url = scrapertools.find_single_match(unpacked, '(http[^,]+\.mp4)') + itemlist.append([".mp4" + " [streamplay]", S(var).decode(url)]) + itemlist.sort(key=lambda x: x[0], reverse=True) - video_urls.append([".mp4" + " [streamplay]", S(_0xd003, forShift, forIndex).decode(url)]) - - video_urls.sort(key=lambda x: x[0], reverse=True) - for video_url in video_urls: - logger.info("%s - %s" % (video_url[0], video_url[1])) - - return video_urls + return itemlist class S: - def __init__(self, var, forShift, forIndex): + def __init__(self, var): self.r = None self.s = None self.k = None @@ -67,18 +56,21 @@ class S: self.d = None var = eval(var) - #for x in range(0x1f0, 0, -1): - for x in range(forShift, 0, -1): + for x in range(0xf8, 0, -1): var.append(var.pop(0)) self.var = var - _decode_index = "self.t(" - for i, v, o in forIndex: - _decode_index += "self.decode_index('" + i + "','" + v + "') " + o - exec _decode_index + ")" - def decode_index(self, index, key): - b64_data = self.var[int(index, 16)]; + self.t( + self.decode_index('0xb') + + self.decode_index('0xc') + + self.decode_index('0xd') + + self.decode_index('0xe'), + self.decode_index('0xf') + ) + + def decode_index(self, index, key=None): + b64_data = self.var[int(index, 16)] result = '' _0xb99338 = 0x0 _0x25e3f4 = 0x0 @@ -86,25 +78,28 @@ class S: data = base64.b64decode(b64_data) data = urllib.unquote(data).decode('utf8') - _0x5da081 = [x for x in range(0x100)] + if key: + _0x5da081 = [x for x in range(0x100)] - for x in range(0x100): - _0xb99338 = (_0xb99338 + _0x5da081[x] + ord(key[x % len(key)])) % 0x100 - _0x139847 = _0x5da081[x] - _0x5da081[x] = _0x5da081[_0xb99338] - _0x5da081[_0xb99338] = _0x139847 + for x in range(0x100): + _0xb99338 = (_0xb99338 + _0x5da081[x] + ord(key[x % len(key)])) % 0x100 + _0x139847 = _0x5da081[x] + _0x5da081[x] = _0x5da081[_0xb99338] + _0x5da081[_0xb99338] = _0x139847 - _0xb99338 = 0x0 + _0xb99338 = 0x0 - for _0x11ebc5 in range(len(data)): - _0x25e3f4 = (_0x25e3f4 + 0x1) % 0x100 - _0xb99338 = (_0xb99338 + _0x5da081[_0x25e3f4]) % 0x100 - _0x139847 = _0x5da081[_0x25e3f4] - _0x5da081[_0x25e3f4] = _0x5da081[_0xb99338] - _0x5da081[_0xb99338] = _0x139847 - result += chr(ord(data[_0x11ebc5]) ^ _0x5da081[(_0x5da081[_0x25e3f4] + _0x5da081[_0xb99338]) % 0x100]) + for _0x11ebc5 in range(len(data)): + _0x25e3f4 = (_0x25e3f4 + 0x1) % 0x100 + _0xb99338 = (_0xb99338 + _0x5da081[_0x25e3f4]) % 0x100 + _0x139847 = _0x5da081[_0x25e3f4] + _0x5da081[_0x25e3f4] = _0x5da081[_0xb99338] + _0x5da081[_0xb99338] = _0x139847 + result += chr(ord(data[_0x11ebc5]) ^ _0x5da081[(_0x5da081[_0x25e3f4] + _0x5da081[_0xb99338]) % 0x100]) - return result + return result + else: + return data def decode(self, url): _hash = re.compile('[A-z0-9_-]{40,}', re.DOTALL).findall(url)[0] From 19bbaa133e8a2de226d63e7b49ca69829965efc7 Mon Sep 17 00:00:00 2001 From: alfa-addon Date: Mon, 22 Jan 2018 12:12:33 -0500 Subject: [PATCH 14/14] v2.4.11 --- plugin.video.alfa/addon.xml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/plugin.video.alfa/addon.xml b/plugin.video.alfa/addon.xml index 66b650d0..f7feb66c 100755 --- a/plugin.video.alfa/addon.xml +++ b/plugin.video.alfa/addon.xml @@ -1,5 +1,5 @@  - + @@ -19,11 +19,12 @@ [B]Estos son los cambios para esta versión:[/B] [COLOR green][B]Canales agregados y arreglos[/B][/COLOR] - » pelisfox » pelisgratis - » gamovideo » doomtv - » usercloud » ciberpeliculashd - » pordede ¤ arreglos internos - [COLOR green]Gracias a [B][COLOR yellow]f_y_m[/COLOR][/B] por su colaboración en esta versión[/COLOR] + » plusdede » pelisgratis + » seriesblanco » anitoonstv + » openload » powvideo + » streamplay » clipwatching + » flashx ¤ arreglos internos + [COLOR green]Gracias a [B][COLOR yellow]danielr460[/COLOR][/B] por su colaboración en esta versión[/COLOR] Navega con Kodi por páginas web para ver sus videos de manera fácil. Browse web pages using Kodi