From 57ff5a1153b9e7d247d385a95a0ac6df99bee605 Mon Sep 17 00:00:00 2001 From: Danielr460 Date: Sun, 8 Oct 2017 15:02:22 -0500 Subject: [PATCH 01/21] Soporte de renumbertools para seriesblanco. --- plugin.video.alfa/channels/seriesblanco.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/plugin.video.alfa/channels/seriesblanco.py b/plugin.video.alfa/channels/seriesblanco.py index 3929998b..a8b4377c 100644 --- a/plugin.video.alfa/channels/seriesblanco.py +++ b/plugin.video.alfa/channels/seriesblanco.py @@ -3,6 +3,7 @@ import re import urlparse +from channels import renumbertools from channels import filtertools from channelselector import get_thumb from core import httptools @@ -63,6 +64,7 @@ def mainlist(item): thumbnail=thumb_buscar)) itemlist = filtertools.show_option(itemlist, item.channel, list_idiomas, CALIDADES) + itemlist = renumbertools.show_option(item.channel, itemlist) autoplay.show_option(item.channel, itemlist) return itemlist @@ -103,7 +105,7 @@ def extract_series_from_data(item, data): else: action = "findvideos" - context1=[filtertools.context(item, list_idiomas, CALIDADES), autoplay.context] + context1=[filtertools.context(item, list_idiomas, CALIDADES), autoplay.context,renumbertools.context(item)] itemlist.append(item.clone(title=name, url=urlparse.urljoin(HOST, url), action=action, show=name, thumbnail=img, @@ -212,13 +214,29 @@ def episodios(item): episodes = re.findall("[^'\"]+).+?>(?P.+?)</a>.*?<td>(?P<flags>.*?)</td>", data, re.MULTILINE | re.DOTALL) + cap=0 for url, title, flags in episodes: title = re.sub("<span[^>]+>", "", title).replace("</span>", "") idiomas = " ".join(["[%s]" % IDIOMAS.get(language, "OVOS") for language in re.findall("banderas/([^\.]+)", flags, re.MULTILINE)]) filter_lang = idiomas.replace("[", "").replace("]", "").split(" ") - display_title = "%s - %s %s" % (item.show, title, idiomas) # logger.debug("Episode found %s: %s" % (display_title, urlparse.urljoin(HOST, url))) + show=title + season = 1 + if cap==0: + season=0 + episode=cap + cap=cap+1 + else: + episode=cap + season, episode = renumbertools.numbered_for_tratk( + item.channel, item.show, season, episode) + cap=cap+1 + if episode<10: + display_title = "%sx0%s - %s %s" % (season, episode, item.title,idiomas) + else: + display_title = "%sx%s - %s %s" % (season, episode, item.title,idiomas) + itemlist.append(item.clone(title=display_title, url=urlparse.urljoin(HOST, url), action="findvideos", plot=plot, fanart=fanart, language=filter_lang)) From 8ce96f85a3ffe9f9a08fcb38ec0cd9a8cf57d4d2 Mon Sep 17 00:00:00 2001 From: Danielr460 <adrinconr@correo.udistrital.edu.co> Date: Sun, 8 Oct 2017 19:18:40 -0500 Subject: [PATCH 02/21] Nuevo Canal: Asialiveaction --- .../channels/asialiveaction.json | 20 ++ plugin.video.alfa/channels/asialiveaction.py | 190 ++++++++++++++++++ .../media/channels/banner/asialiveaction.png | Bin 0 -> 21518 bytes .../media/channels/thumb/asialiveaction.png | Bin 0 -> 13169 bytes 4 files changed, 210 insertions(+) create mode 100644 plugin.video.alfa/channels/asialiveaction.json create mode 100644 plugin.video.alfa/channels/asialiveaction.py create mode 100644 plugin.video.alfa/resources/media/channels/banner/asialiveaction.png create mode 100644 plugin.video.alfa/resources/media/channels/thumb/asialiveaction.png diff --git a/plugin.video.alfa/channels/asialiveaction.json b/plugin.video.alfa/channels/asialiveaction.json new file mode 100644 index 00000000..ca1692ff --- /dev/null +++ b/plugin.video.alfa/channels/asialiveaction.json @@ -0,0 +1,20 @@ +{ + "id": "asialiveaction", + "name": "Asialiveaction.", + "active": true, + "adult": false, + "language": ["cast", "lat"], + "thumbnail": "asialiveaction.png", + "banner": "https://imgur.com/B1IOAu4.png", + "version": 1, + "changes": [ + { + "date": "08/10/2017", + "description": "Primera versión del canal" + } + ], + "categories": [ + "movie", + "serie" + ] +} diff --git a/plugin.video.alfa/channels/asialiveaction.py b/plugin.video.alfa/channels/asialiveaction.py new file mode 100644 index 00000000..ef003b09 --- /dev/null +++ b/plugin.video.alfa/channels/asialiveaction.py @@ -0,0 +1,190 @@ +# -*- coding: UTF-8 -*- + +import re +import urlparse + +from core import httptools +from core import scrapertools +from core import servertools +from core.item import Item +from platformcode import config, logger + +host = "http://www.asialiveaction.com" + + +def mainlist(item): + logger.info() + + itemlist = list() + + itemlist.append(Item(channel=item.channel, action="estrenos", title="Estrenos", url=host)) + itemlist.append(Item(channel=item.channel, action="lista", title="Peliculas", + url=urlparse.urljoin(host, "p/peliculas.html"))) + itemlist.append(Item(channel=item.channel, action="lista", title="Series", + url=urlparse.urljoin(host, "p/series.html"))) + itemlist.append(Item(channel=item.channel, action="category", title="Orden Alfabético", url=host)) + itemlist.append(Item(channel=item.channel, action="category", title="Géneros", url=host)) + itemlist.append(Item(channel=item.channel, action="category", title="Año de Estreno", url=host)) + #itemlist.append(Item(channel=item.channel, title="Buscar", action="search", url=urlparse.urljoin(host, "/search?q="))) + return itemlist + + +def category(item): + logger.info() + itemlist = list() + data = httptools.downloadpage(host).data + data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) + patron_generos = "<h2 class='title'>"+item.title+"<\/h2><div class='.+?'><ul class='.+?'><(.+?)><\/ul><\/div>" + data_generos = scrapertools.find_single_match(data, patron_generos) + patron = "<a href='(.+?)'>(.+?)<\/a>" + matches = scrapertools.find_multiple_matches(data_generos, patron) + for scrapedurl, scrapedtitle in matches: + if scrapedtitle != 'Próximas Películas': + itemlist.append(item.clone(action='lista', title=scrapedtitle, url=host+scrapedurl)) + return itemlist + + +def search(item, texto): + logger.info() + texto = texto.replace(" ", "+") + item.url = item.url + texto + if texto != '': + return lista(item) + +def estrenos(item): + logger.info() + itemlist = list() + data = httptools.downloadpage(host).data + data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) + patron_estre = "<div class='widget HTML' data-version='1' id='HTML9'><h2 class='title'>(.+?)<\/a><\/li><\/ul>" + data_estre = scrapertools.find_single_match(data, patron_estre) + patron = '<i class="([^"]+)"><\/i><div class="calidad">.+?' #serie o peli + patron +='<img src="([^"]+)"\/>' #scrapedthumbnail + patron +='<h4>([^"]+)<\/h4>.+?' #scrapedtitle + patron +='<a href="([^"]+)">' #scrapedurl + matches = scrapertools.find_multiple_matches(data_estre, patron) + for scrapedtype, scrapedthumbnail,scrapedtitle,scrapedurl in matches: + title = "%s [%s]" % (scrapedtitle, scrapedtype) + if scrapedtype == "pelicula": + itemlist.append(item.clone(title=title, url=host+scrapedurl, action="bitly", extra=scrapedtitle, + show=scrapedtitle, thumbnail=scrapedthumbnail, contentType="movie", + context=["buscar_trailer"])) + else: + itemlist.append(item.clone(title=title, url=host+scrapedurl, show=scrapedtitle, + thumbnail=scrapedthumbnail, action="capitulos")) + return itemlist +def capitulos(item): + logger.info() + itemlist = list() + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) + patron_datos='<div class="output">(.+?)><\/section>' + data_caps = scrapertools.find_single_match(data, patron_datos) + patron_caps='<img alt=".+?" src="(.+?)"\/><a href="http:\/\/bit.ly\/(.+?)"' + matches = scrapertools.find_multiple_matches(data_caps, patron_caps) + cap=0 + for scrapedthumbnail,scrapedurl in matches: + link = scrapedurl + cap=cap+1 + link="http://www.trueurl.net/?q=http%3A%2F%2Fbit.ly%2F"+link+"&lucky=on&Uncloak=Find+True+URL" + data_other = httptools.downloadpage(link).data + data_other = re.sub(r"\n|\r|\t|\s{2}| ", "", data_other) + patron='<A title="http:\/\/privatelink.de\/\?(.+?)"' + url = scrapertools.find_single_match(data_other, patron) + if cap<10: + title="1x0" + else: + title="1x" + title="%s%s - %s" % (title,cap,item.show) + itemlist.append(item.clone(action='findvideos', title=title, + url=url,show=item.show,thumbnail=scrapedthumbnail)) + 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=item.show)) + return itemlist +def bitly(item): + logger.info() + itemlist = list() + logger.info("likingf "+item.url) + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) + patron = '<a href="http:\/\/bit.ly\/(.+?)"' + link = scrapertools.find_single_match(data, patron) + link="http://www.trueurl.net/?q=http%3A%2F%2Fbit.ly%2F"+link+"&lucky=on&Uncloak=Find+True+URL" + data_other = httptools.downloadpage(link).data + data_other = re.sub(r"\n|\r|\t|\s{2}| ", "", data_other) + patron='<A title="http:\/\/privatelink.de\/\?(.+?)"' + url = scrapertools.find_single_match(data_other, patron) + if item.contentType=="movie": + contentType="movie" + else: + contentType="serie" + itemlist.append(item.clone(action='findvideos', title="Click aqui para desencriptar "+item.title, + url=url,show=item.show,thumbnail=item.thumbnail,contentType=contentType)) + return itemlist + +def lista(item): + logger.info() + itemlist = [] + data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) + + patron = '<i class="(.+?)"><\/i>' # scrapedtype + patron +='<div class="calidad">(.+?)<\/div>' # scrapedquality + patron += '<img src="(.+?)"\/>' # scrapedthumbnail + patron += '<h4>(.+?)<\/h4>' # scrapedtitle + patron += "<h5>(.+?)<\/h5>" # scrapedyear + patron += '<a href="(.+?)"' # scrapedurl + #patron += "<\/a>.+?<div class='item-snippet'>(.+?)<" # scrapedplot + if item.title!="Peliculas": + pat='<div id="tab-1"><ul class="post-gallery">(.+?)<\/ul><\/div>' + data=scrapertools.find_single_match(data, pat) + matches = scrapertools.find_multiple_matches(data, patron) + for scrapedtype,scrapedquality,scrapedthumbnail,scrapedtitle,scrapedyear,scrapedurl in matches: + patron_quality="<span>(.+?)</span>" + quality = scrapertools.find_multiple_matches(scrapedquality, patron_quality) + qual="" + for calidad in quality: + qual=qual+"["+calidad+"] " + title="%s [%s] %s" % (scrapedtitle,scrapedyear,qual) + if item.title=="Series": + itemlist.append(item.clone(title=title, url=host+scrapedurl, extra=scrapedtitle, plot=scrapedtitle, + show=scrapedtitle, thumbnail=scrapedthumbnail, contentType="serie", action="capitulos")) + else: + itemlist.append( + item.clone(title=title, url=host+scrapedurl, action="bitly", extra=scrapedtitle, plot=scrapedtitle, + show=scrapedtitle, thumbnail=scrapedthumbnail, contentType="movie", context=["buscar_trailer"])) + + # Paginacion + patron_genero = '<h1>([^"]+)<\/h1>' + genero = scrapertools.find_single_match(data, patron_genero) + if genero == "Romance" or genero == "Drama": + patron = "<a rel='nofollow' class=previouspostslink' href='([^']+)'>Siguiente " + else: + patron = "<span class='current'>.+?href='(.+?)'>" + + next_page_url = scrapertools.find_single_match(data, patron) + + if next_page_url != "": + item.url = next_page_url + itemlist.append(Item(channel=item.channel, action="lista", title=">> Página siguiente", url=next_page_url, + thumbnail='https://s32.postimg.org/4zppxf5j9/siguiente.png')) + return itemlist + + +def findvideos(item): + logger.info() + + itemlist = [] + + data = httptools.downloadpage(item.url).data + itemlist.extend(servertools.find_video_items(data=data)) + show = item.show + for videoitem in itemlist: + videoitem.channel = item.channel + if config.get_videolibrary_support() and len(itemlist) > 0 and item.contentType=="movie": + itemlist.append( + Item(channel=item.channel, title='[COLOR yellow]Añadir esta pelicula a la videoteca[/COLOR]', url=item.url, + action="add_pelicula_to_library", extra="findvideos", contentTitle=show)) + + return itemlist diff --git a/plugin.video.alfa/resources/media/channels/banner/asialiveaction.png b/plugin.video.alfa/resources/media/channels/banner/asialiveaction.png new file mode 100644 index 0000000000000000000000000000000000000000..cbc1e375df3c00de23e84817c86499a3bb9c4acd GIT binary patch literal 21518 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�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 literal 0 HcmV?d00001 diff --git a/plugin.video.alfa/resources/media/channels/thumb/asialiveaction.png b/plugin.video.alfa/resources/media/channels/thumb/asialiveaction.png new file mode 100644 index 0000000000000000000000000000000000000000..75a1e52fed09eb9f89967698b0950b67d1cd09a7 GIT binary patch literal 13169 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 JuaY$l`5*URB`^R0 literal 0 HcmV?d00001 From 39a33359b55941ce9bba2618d9fa2dfba813cf8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Rinc=C3=B3n=20Rodr=C3=ADguez?= <adrinconr@correo.udistrital.edu.co> Date: Mon, 9 Oct 2017 12:58:54 -0500 Subject: [PATCH 03/21] reduccion de codigo quitar if y agregar zfill --- plugin.video.alfa/channels/seriesblanco.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plugin.video.alfa/channels/seriesblanco.py b/plugin.video.alfa/channels/seriesblanco.py index a8b4377c..57b82f8e 100644 --- a/plugin.video.alfa/channels/seriesblanco.py +++ b/plugin.video.alfa/channels/seriesblanco.py @@ -232,11 +232,9 @@ def episodios(item): season, episode = renumbertools.numbered_for_tratk( item.channel, item.show, season, episode) cap=cap+1 - if episode<10: - display_title = "%sx0%s - %s %s" % (season, episode, item.title,idiomas) - else: - display_title = "%sx%s - %s %s" % (season, episode, item.title,idiomas) - + episode=episode.zfill(2) + display_title = "%sx%s - %s %s" % (season, episode, item.title,idiomas) + itemlist.append(item.clone(title=display_title, url=urlparse.urljoin(HOST, url), action="findvideos", plot=plot, fanart=fanart, language=filter_lang)) From 1b02644233d819b3b0083e8935d8a1cea6f1ca27 Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Sun, 15 Oct 2017 09:22:17 -0500 Subject: [PATCH 04/21] Actualizado Nuevo canal: pelismundo --- plugin.video.alfa/channels/pelismundo.json | 61 ++++++ plugin.video.alfa/channels/pelismundo.py | 244 +++++++++++++++++++++ 2 files changed, 305 insertions(+) create mode 100644 plugin.video.alfa/channels/pelismundo.json create mode 100644 plugin.video.alfa/channels/pelismundo.py diff --git a/plugin.video.alfa/channels/pelismundo.json b/plugin.video.alfa/channels/pelismundo.json new file mode 100644 index 00000000..d570c0f6 --- /dev/null +++ b/plugin.video.alfa/channels/pelismundo.json @@ -0,0 +1,61 @@ +{ + "id": "pelismundo", + "name": "Pelismundo", + "active": true, + "adult": false, + "language": ["lat"], + "thumbnail": "https://s26.postimg.org/72c9mr3ux/pelismundo1.png", + "banner": "", + "version": 1, + "changes": [ + { + "date": "12/10/2017", + "description": "Primera version" + } + ], + "categories": [ + "movie" + ], + "settings": [ + { + "id": "modo_grafico", + "type": "bool", + "label": "Buscar información extra", + "default": true, + "enabled": true, + "visible": true + }, + { + "id": "include_in_global_search", + "type": "bool", + "label": "Incluir en busqueda global", + "default": true, + "enabled": true, + "visible": true + }, + { + "id": "include_in_newest_peliculas", + "type": "bool", + "label": "Incluir en Novedades - Peliculas", + "default": true, + "enabled": true, + "visible": true + }, + { + "id": "include_in_newest_infantiles", + "type": "bool", + "label": "Incluir en Novedades - Infantiles", + "default": true, + "enabled": true, + "visible": true + }, + { + "id": "include_in_newest_terror", + "type": "bool", + "label": "Incluir en Novedades - terror", + "default": true, + "enabled": true, + "visible": true + } + ] +} diff --git a/plugin.video.alfa/channels/pelismundo.py b/plugin.video.alfa/channels/pelismundo.py new file mode 100644 index 00000000..160f22f9 --- /dev/null +++ b/plugin.video.alfa/channels/pelismundo.py @@ -0,0 +1,244 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------ +# Alfa addon - KODI Plugin +# Canal para pelismundo +# https://github.com/alfa-addon +# ------------------------------------------------------------ + +from core import httptools +from core import scrapertools +from core import servertools +from core import tmdb +from core.item import Item +from platformcode import config, logger + +__channel__='allcalidad' + +host = "http://www.pelismundo.com/" + +try: + __modo_grafico__ = config.get_setting('modo_grafico', __channel__) +except: + __modo_grafico__ = True + + +def mainlist(item): + logger.info() + itemlist = [] + itemlist.append(Item(channel = item.channel, title = "Recientes", action = "peliculas", url = host)) + itemlist.append(Item(channel = item.channel, title = "Por audio", action = "filtro", url = host, filtro = "Películas por audio")) + itemlist.append(Item(channel = item.channel, title = "Por género", action = "filtro", url = host, filtro = "Películas por género")) + itemlist.append(Item(channel = item.channel)) + itemlist.append(Item(channel = item.channel, title = "Buscar", action = "search", url = host)) + return itemlist + + +def newest(categoria): + logger.info() + itemlist = [] + item = Item() + try: + if categoria == 'peliculas': + item.url = host + elif categoria == 'infantiles': + item.url = host + 'genero/infantil/' + elif categoria == 'terror': + item.url = host + 'genero/terror/' + itemlist = peliculas(item) + if "Pagina" in itemlist[-1].title: + itemlist.pop() + except: + import sys + for line in sys.exc_info(): + logger.error("{0}".format(line)) + return [] + + return itemlist + + +def search(item, texto): + logger.info() + item.url += "?s=" + texto = texto.replace(" ", "+") + item.url = item.url + texto + try: + return sub_search(item) + # Se captura la excepción, para no interrumpir al buscador global si un canal falla + except: + import sys + for line in sys.exc_info(): + logger.error("%s" % line) + return [] + + +def sub_search(item): + logger.info() + itemlist = [] + data = httptools.downloadpage(item.url).data + patron = 'search-results-content infinite.*?</ul>' + bloque = scrapertools.find_single_match(data, patron) + patron = '(?s)href="([^"]+)".*?' + patron += 'title="([^"]+)".*?' + patron += 'src="([^"]+)".*?' + patron += 'Idioma.*?tag">([^<]+).*?' + patron += 'Calidad(.*?<)\/' + match = scrapertools.find_multiple_matches(bloque, patron) + scrapertools.printMatches(match) + for scrapedurl, scrapedtitle, scrapedthumbnail, scrapedlanguages, scrapedquality in match: + year = scrapertools.find_single_match(scrapedtitle, '[0-9]{4}') + scrapedquality = scrapertools.find_single_match(scrapedquality, 'rel="tag">([^<]+)<') + st = scrapertools.find_single_match(scrapedtitle, 'Online.*') + scrapedtitle = scrapedtitle.replace(st, "") + st = scrapertools.find_single_match(scrapedtitle, '\(.*?\)') + scrapedtitle = scrapedtitle.replace(st, "") + title = scrapedtitle + if year: + title += " (" + year + ")" + if scrapedquality: + title += " (" + scrapedquality + ")" + patronidiomas = '' + idiomas_disponibles = [] + matchidioma = scrapertools.find_single_match(scrapedlanguages, 'Castellano') + if matchidioma: + idiomas_disponibles.append("ESP") + matchidioma = scrapertools.find_single_match(scrapedlanguages, 'Subtitulado') + if matchidioma: + idiomas_disponibles.append("VOSE") + matchidioma = scrapertools.find_single_match(scrapedlanguages, 'Latino') + if matchidioma: + idiomas_disponibles.append("LAT") + idiomas_disponibles1 = "" + if idiomas_disponibles: + idiomas_disponibles1 = "[" + "/".join(idiomas_disponibles) + "]" + title += " %s" %idiomas_disponibles1 + itemlist.append(Item(channel = item.channel, + action = "findvideos", + title = title, + contentTitle = scrapedtitle, + thumbnail = scrapedthumbnail, + quality = scrapedquality, + language = idiomas_disponibles, + infoLabels={"year": year}, + url = scrapedurl + )) + tmdb.set_infoLabels(itemlist) + url_pagina = scrapertools.find_single_match(data, 'next" href="([^"]+)') + if url_pagina != "": + pagina = "Pagina: " + scrapertools.find_single_match(url_pagina, "page/([0-9]+)") + itemlist.append(Item(channel = item.channel, action = "peliculas", title = pagina, url = url_pagina)) + return itemlist + + +def filtro(item): + logger.info() + itemlist = [] + data = httptools.downloadpage(item.url).data + patron = 'class="sbi-header">%s.*?</ul>' %item.filtro + bloque = scrapertools.find_single_match(data, patron) + patron = '(?s)href="([^"]+)".*?' + patron += '</span>([^<]+)</a>' + matches = scrapertools.find_multiple_matches(bloque, patron) + for url, title in matches: + if "eroti33cas" in title and config.get_setting("adult_mode") == 0: + continue + itemlist.append(item.clone(action = "peliculas", + title = title.title(), + url = url + )) + return itemlist + +def peliculas(item): + logger.info() + itemlist = [] + data = httptools.downloadpage(item.url).data + patron = 'movie-list" class="clearfix.*?pagination movie-pagination clearfix' + bloque = scrapertools.find_single_match(data, patron) + patron = '(?s)href="([^"]+)".*?' + patron += 'title="([^"]+)".*?' + patron += 'class="mq([^"]+)".*?' + patron += 'src="([^"]+)".*?' + patron += '_audio(.*?)class.*?' + patron += 'label_year">([^<]+)<' + match = scrapertools.find_multiple_matches(bloque, patron) + for scrapedurl, scrapedtitle, scrapedquality, scrapedthumbnail, scrapedlanguages, year in match: + year = scrapertools.find_single_match(year, '[0-9]{4}') + st = scrapertools.find_single_match(scrapedtitle, 'Online.*') + scrapedtitle = scrapedtitle.replace(st, "").strip() + st = scrapertools.find_single_match(scrapedtitle, '\(.*?\)') + scrapedtitle = scrapedtitle.replace(st, "") + title = scrapedtitle + if year: + title += " (" + year + ")" + if scrapedquality: + title += " (" + scrapedquality + ")" + patronidiomas = '' + idiomas_disponibles = [] + matchidioma = scrapertools.find_single_match(scrapedlanguages, 'Castellano') + if matchidioma: + idiomas_disponibles.append("ESP") + matchidioma = scrapertools.find_single_match(scrapedlanguages, 'Subtitulado') + if matchidioma: + idiomas_disponibles.append("VOSE") + matchidioma = scrapertools.find_single_match(scrapedlanguages, 'Latino') + if matchidioma: + idiomas_disponibles.append("LAT") + idiomas_disponibles1 = "" + if idiomas_disponibles: + idiomas_disponibles1 = "[" + "/".join(idiomas_disponibles) + "]" + title += " %s" %idiomas_disponibles1 + itemlist.append(Item(channel = item.channel, + action = "findvideos", + title = title, + contentTitle = scrapedtitle, + thumbnail = scrapedthumbnail, + quality = scrapedquality, + language = idiomas_disponibles, + infoLabels={"year": year}, + url = scrapedurl + )) + tmdb.set_infoLabels(itemlist) + url_pagina = scrapertools.find_single_match(data, 'next" href="([^"]+)') + if url_pagina != "": + pagina = "Pagina: " + scrapertools.find_single_match(url_pagina, "page/([0-9]+)") + itemlist.append(Item(channel = item.channel, action = "peliculas", title = pagina, url = url_pagina)) + return itemlist + + +def findvideos(item): + logger.info() + itemlist = [] + data = httptools.downloadpage(item.url).data + patron = 'SegundaParte.*?ventana-flotante' + bloque = scrapertools.find_single_match(data, patron) + patron = 'hand" rel="([^"]+)".*?' + patron += 'optxt"><span>([^<]+)</span>.*?' + matches = scrapertools.find_multiple_matches(bloque, patron) + for scrapedurl, scrapedlanguage in matches: + if "youtube" in scrapedurl: + scrapedurl += "&" + title = "Ver en: %s " + "(" + scrapedlanguage + ")" + itemlist.append(item.clone(action = "play", + title = title, + language = item.language, + quality = item.quality, + url = scrapedurl + )) + tmdb.set_infoLabels(itemlist) + itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) + if itemlist: + itemlist.append(Item(channel = item.channel)) + itemlist.append(item.clone(channel="trailertools", title="Buscar Tráiler", action="buscartrailer", context="", + text_color="magenta")) + # Opción "Añadir esta película a la biblioteca de KODI" + if item.extra != "library": + if config.get_videolibrary_support(): + itemlist.append(Item(channel=item.channel, title="Añadir a la videoteca", text_color="green", + action="add_pelicula_to_library", url=item.url, thumbnail = item.thumbnail, + fulltitle = item.contentTitle + )) + return itemlist + + +def play(item): + item.thumbnail = item.contentThumbnail + return [item] From fa0ddda0900b544881a4e43c14af50bc45a0d075 Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Sun, 15 Oct 2017 09:49:46 -0500 Subject: [PATCH 05/21] Update animeflv_me.py --- plugin.video.alfa/channels/animeflv_me.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/plugin.video.alfa/channels/animeflv_me.py b/plugin.video.alfa/channels/animeflv_me.py index b73b174f..34e395ca 100755 --- a/plugin.video.alfa/channels/animeflv_me.py +++ b/plugin.video.alfa/channels/animeflv_me.py @@ -58,10 +58,9 @@ def get_cookie_value(): return cookies_value -header_string = "|User-Agent=Mozilla/5.0&Referer=http://animeflv.me&Cookie=" + \ +header_string = "|User-Agent=Mozilla/5.0&Referer=http://animeflv.co&Cookie=" + \ get_cookie_value() - def __find_next_page(html): """ Busca el enlace a la pagina siguiente @@ -71,12 +70,6 @@ def __find_next_page(html): def __extract_info_from_serie(html): - """ - Extrae la información de una serie o pelicula desde su página - Util para cuando una busqueda devuelve un solo resultado y animeflv.me - redirecciona a la página de este. - """ - title = scrapertools.find_single_match(html, REGEX_TITLE) title = clean_title(title) url = scrapertools.find_single_match(html, REGEX_URL) @@ -156,7 +149,7 @@ def mainlist(item): def letras(item): logger.info() - base_url = 'http://animeflv.me/ListadeAnime?c=' + base_url = 'http://animeflv.co/ListadeAnime?c=' itemlist = list() itemlist.append(Item(channel=item.channel, action="series", title="#", url=base_url + "#")) From bff197700ad520c7178980a365fb3a9658619bf0 Mon Sep 17 00:00:00 2001 From: Danielr460 <adrinconr@correo.udistrital.edu.co> Date: Sun, 15 Oct 2017 11:43:43 -0500 Subject: [PATCH 06/21] Soporte Renumbertools Animeyt --- plugin.video.alfa/channels/animeyt.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugin.video.alfa/channels/animeyt.py b/plugin.video.alfa/channels/animeyt.py index bae04053..449ccd9d 100644 --- a/plugin.video.alfa/channels/animeyt.py +++ b/plugin.video.alfa/channels/animeyt.py @@ -3,7 +3,7 @@ import re import urlparse - +from channels import renumbertools from core import httptools from core import scrapertools from core import servertools @@ -28,6 +28,7 @@ def mainlist(item): itemlist.append(Item(channel=item.channel, title="Búsqueda", action="search", url=urlparse.urljoin(HOST, "busqueda?terminos="))) + itemlist = renumbertools.show_option(item.channel, itemlist) return itemlist @@ -113,7 +114,7 @@ def recientes(item): matches = scrapertools.find_multiple_matches(data_recientes, patron) for url, thumbnail, plot, title, cat in matches: - itemlist.append(item.clone(title=title, url=url, action="episodios", show=title, thumbnail=thumbnail, plot=plot, cat=cat)) + itemlist.append(item.clone(title=title, url=url, action="episodios", show=title, thumbnail=thumbnail, plot=plot, cat=cat, context=renumbertools.context(item))) tmdb.set_infoLabels_itemlist(itemlist, seekTmdb = True) @@ -137,8 +138,11 @@ def episodios(item): matches = scrapertools.find_multiple_matches(data, patron) for url, scrapedtitle, episode in matches: - - title = "1x" + episode + " " + "Episodio" + + season = 1 + episode = int(episode) + season, episode = renumbertools.numbered_for_tratk(item.channel, scrapedtitle, season, episode) + title = "%sx%s %s" % (season, str(episode).zfill(2), scrapedtitle) itemlist.append(item.clone(title=title, url=url, action='findvideos')) if config.get_videolibrary_support: From b4ac6520da613ee2232e4fef49520250e811b2e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Rinc=C3=B3n=20Rodr=C3=ADguez?= <adrinconr@correo.udistrital.edu.co> Date: Sun, 15 Oct 2017 12:35:44 -0500 Subject: [PATCH 07/21] Update seriesblanco.py arreglado fix menor --- 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 57b82f8e..b54fa0c4 100644 --- a/plugin.video.alfa/channels/seriesblanco.py +++ b/plugin.video.alfa/channels/seriesblanco.py @@ -225,7 +225,7 @@ def episodios(item): season = 1 if cap==0: season=0 - episode=cap + episode=cap+1 cap=cap+1 else: episode=cap From ea0183ad2e7115f58244a9da5c87b3bc0117aa4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Rinc=C3=B3n=20Rodr=C3=ADguez?= <adrinconr@correo.udistrital.edu.co> Date: Sun, 15 Oct 2017 13:47:52 -0500 Subject: [PATCH 08/21] arreglos de @alfa-beto --- plugin.video.alfa/channels/asialiveaction.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/plugin.video.alfa/channels/asialiveaction.py b/plugin.video.alfa/channels/asialiveaction.py index ef003b09..efaf28a0 100644 --- a/plugin.video.alfa/channels/asialiveaction.py +++ b/plugin.video.alfa/channels/asialiveaction.py @@ -1,4 +1,4 @@ -# -*- coding: UTF-8 -*- +# -*- coding: UTF-8 -*- import re import urlparse @@ -66,7 +66,7 @@ def estrenos(item): for scrapedtype, scrapedthumbnail,scrapedtitle,scrapedurl in matches: title = "%s [%s]" % (scrapedtitle, scrapedtype) if scrapedtype == "pelicula": - itemlist.append(item.clone(title=title, url=host+scrapedurl, action="bitly", extra=scrapedtitle, + itemlist.append(item.clone(title=title, url=host+scrapedurl, action="findvideos", extra=scrapedtype, show=scrapedtitle, thumbnail=scrapedthumbnail, contentType="movie", context=["buscar_trailer"])) else: @@ -102,6 +102,7 @@ def capitulos(item): 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=item.show)) return itemlist + def bitly(item): logger.info() itemlist = list() @@ -119,9 +120,8 @@ def bitly(item): contentType="movie" else: contentType="serie" - itemlist.append(item.clone(action='findvideos', title="Click aqui para desencriptar "+item.title, - url=url,show=item.show,thumbnail=item.thumbnail,contentType=contentType)) - return itemlist + item=(item.clone(action='findvideos',url=url,show=item.show, thumbnail=item.thumbnail, contentType=contentType)) + return item def lista(item): logger.info() @@ -147,12 +147,12 @@ def lista(item): for calidad in quality: qual=qual+"["+calidad+"] " title="%s [%s] %s" % (scrapedtitle,scrapedyear,qual) - if item.title=="Series": + if item.title =="Series": itemlist.append(item.clone(title=title, url=host+scrapedurl, extra=scrapedtitle, plot=scrapedtitle, show=scrapedtitle, thumbnail=scrapedthumbnail, contentType="serie", action="capitulos")) - else: + elif scrapedtype != 'serie': itemlist.append( - item.clone(title=title, url=host+scrapedurl, action="bitly", extra=scrapedtitle, plot=scrapedtitle, + item.clone(title=title, url=host+scrapedurl, action="findvideos", extra=scrapedtype, plot=scrapedtitle, show=scrapedtitle, thumbnail=scrapedthumbnail, contentType="movie", context=["buscar_trailer"])) # Paginacion @@ -177,6 +177,9 @@ def findvideos(item): itemlist = [] + if item.extra == 'pelicula': + item = bitly(item) + data = httptools.downloadpage(item.url).data itemlist.extend(servertools.find_video_items(data=data)) show = item.show From bd105504e70f5370db4354bb44500fa72b0021e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Rinc=C3=B3n=20Rodr=C3=ADguez?= <adrinconr@correo.udistrital.edu.co> Date: Sun, 15 Oct 2017 13:52:49 -0500 Subject: [PATCH 09/21] arreglo menor asialiveaction --- plugin.video.alfa/channels/asialiveaction.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugin.video.alfa/channels/asialiveaction.py b/plugin.video.alfa/channels/asialiveaction.py index efaf28a0..bc9cc60a 100644 --- a/plugin.video.alfa/channels/asialiveaction.py +++ b/plugin.video.alfa/channels/asialiveaction.py @@ -91,11 +91,7 @@ def capitulos(item): data_other = re.sub(r"\n|\r|\t|\s{2}| ", "", data_other) patron='<A title="http:\/\/privatelink.de\/\?(.+?)"' url = scrapertools.find_single_match(data_other, patron) - if cap<10: - title="1x0" - else: - title="1x" - title="%s%s - %s" % (title,cap,item.show) + title="%s%s - %s" % (title,str(cap).zfill(2),item.show) itemlist.append(item.clone(action='findvideos', title=title, url=url,show=item.show,thumbnail=scrapedthumbnail)) if config.get_videolibrary_support() and len(itemlist) > 0: From fb3de2d8b00118cd51aaa15bab3ba84768fb734f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Rinc=C3=B3n=20Rodr=C3=ADguez?= <adrinconr@correo.udistrital.edu.co> Date: Sun, 15 Oct 2017 18:54:27 -0500 Subject: [PATCH 10/21] =?UTF-8?q?Versi=C3=B3n=20original=20de=20SeriesBlan?= =?UTF-8?q?co?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.video.alfa/channels/seriesblanco.py | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/plugin.video.alfa/channels/seriesblanco.py b/plugin.video.alfa/channels/seriesblanco.py index b54fa0c4..7b7ea62a 100644 --- a/plugin.video.alfa/channels/seriesblanco.py +++ b/plugin.video.alfa/channels/seriesblanco.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- import re import urlparse -from channels import renumbertools from channels import filtertools from channelselector import get_thumb from core import httptools @@ -64,7 +63,6 @@ def mainlist(item): thumbnail=thumb_buscar)) itemlist = filtertools.show_option(itemlist, item.channel, list_idiomas, CALIDADES) - itemlist = renumbertools.show_option(item.channel, itemlist) autoplay.show_option(item.channel, itemlist) return itemlist @@ -105,7 +103,7 @@ def extract_series_from_data(item, data): else: action = "findvideos" - context1=[filtertools.context(item, list_idiomas, CALIDADES), autoplay.context,renumbertools.context(item)] + context1=[filtertools.context(item, list_idiomas, CALIDADES), autoplay.context] itemlist.append(item.clone(title=name, url=urlparse.urljoin(HOST, url), action=action, show=name, thumbnail=img, @@ -214,27 +212,13 @@ def episodios(item): episodes = re.findall("<tr.*?href=['\"](?P<url>[^'\"]+).+?>(?P<title>.+?)</a>.*?<td>(?P<flags>.*?)</td>", data, re.MULTILINE | re.DOTALL) - cap=0 for url, title, flags in episodes: title = re.sub("<span[^>]+>", "", title).replace("</span>", "") idiomas = " ".join(["[%s]" % IDIOMAS.get(language, "OVOS") for language in re.findall("banderas/([^\.]+)", flags, re.MULTILINE)]) filter_lang = idiomas.replace("[", "").replace("]", "").split(" ") + display_title = "%s - %s %s" % (item.show, title, idiomas) # logger.debug("Episode found %s: %s" % (display_title, urlparse.urljoin(HOST, url))) - show=title - season = 1 - if cap==0: - season=0 - episode=cap+1 - cap=cap+1 - else: - episode=cap - season, episode = renumbertools.numbered_for_tratk( - item.channel, item.show, season, episode) - cap=cap+1 - episode=episode.zfill(2) - display_title = "%sx%s - %s %s" % (season, episode, item.title,idiomas) - itemlist.append(item.clone(title=display_title, url=urlparse.urljoin(HOST, url), action="findvideos", plot=plot, fanart=fanart, language=filter_lang)) From e1517f20c9c7f604c28f8f386821f5dce75a6d05 Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Mon, 16 Oct 2017 11:16:49 -0500 Subject: [PATCH 11/21] Update gvideo.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cambio de patrón --- plugin.video.alfa/servers/gvideo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.video.alfa/servers/gvideo.json b/plugin.video.alfa/servers/gvideo.json index a5d78fe4..c4f0afb9 100644 --- a/plugin.video.alfa/servers/gvideo.json +++ b/plugin.video.alfa/servers/gvideo.json @@ -18,7 +18,7 @@ "url": "http://docs.google.com/get_video_info?docid=\\1" }, { - "pattern": "(?s)\"https://(?!docs)(.*?).googleusercontent.com/([^\"]+)", + "pattern": "(?s)\"https://(lh.*?).googleusercontent.com/([^\"]+)", "url": "https://\\1.googleusercontent.com/\\2" } ] From 155e54e01e4f685642d4b2fdc708b4fd96fec0fb Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Mon, 16 Oct 2017 11:38:57 -0500 Subject: [PATCH 12/21] Update animeflv_me.py --- plugin.video.alfa/channels/animeflv_me.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/plugin.video.alfa/channels/animeflv_me.py b/plugin.video.alfa/channels/animeflv_me.py index 34e395ca..52ba1639 100755 --- a/plugin.video.alfa/channels/animeflv_me.py +++ b/plugin.video.alfa/channels/animeflv_me.py @@ -298,18 +298,20 @@ def episodios(item): def findvideos(item): logger.info() - itemlist = [] - + encontrados = [] page_html = get_url_contents(item.url) regex_api = r'http://player\.animeflv\.co/[^\"]+' iframe_url = scrapertools.find_single_match(page_html, regex_api) iframe_html = get_url_contents(iframe_url) itemlist.extend(servertools.find_video_items(data=iframe_html)) - + qualities = ["360", "480", "720", "1080"] for videoitem in itemlist: + if videoitem.url in encontrados: + continue + encontrados.append(videoitem.url) videoitem.fulltitle = item.fulltitle videoitem.title = "%s en calidad [%s]" % (videoitem.server, qualities[1]) videoitem.channel = item.channel @@ -319,10 +321,11 @@ def findvideos(item): videos_html = scrapertools.find_single_match(iframe_html, regex_video_list) videos = re.findall('"([^"]+)"', videos_html, re.DOTALL) - for quality_id, video_url in enumerate(videos): + if video_url in encontrados: + continue + encontrados.append(video_url) itemlist.append(Item(channel=item.channel, action="play", url=video_url, show=re.escape(item.show), title="Ver en calidad [%s]" % (qualities[quality_id]), plot=item.plot, fulltitle=item.title)) - return __sort_by_quality(itemlist) From 9b2919b38f8469d87ca3b785f5d427a892bf9317 Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Mon, 16 Oct 2017 11:48:28 -0500 Subject: [PATCH 13/21] Update pelismundo.py --- plugin.video.alfa/channels/pelismundo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin.video.alfa/channels/pelismundo.py b/plugin.video.alfa/channels/pelismundo.py index 160f22f9..2e89c06e 100644 --- a/plugin.video.alfa/channels/pelismundo.py +++ b/plugin.video.alfa/channels/pelismundo.py @@ -87,7 +87,7 @@ def sub_search(item): for scrapedurl, scrapedtitle, scrapedthumbnail, scrapedlanguages, scrapedquality in match: year = scrapertools.find_single_match(scrapedtitle, '[0-9]{4}') scrapedquality = scrapertools.find_single_match(scrapedquality, 'rel="tag">([^<]+)<') - st = scrapertools.find_single_match(scrapedtitle, 'Online.*') + st = scrapertools.find_single_match(scrapedtitle, '(?i)Online.*') scrapedtitle = scrapedtitle.replace(st, "") st = scrapertools.find_single_match(scrapedtitle, '\(.*?\)') scrapedtitle = scrapedtitle.replace(st, "") @@ -162,7 +162,7 @@ def peliculas(item): match = scrapertools.find_multiple_matches(bloque, patron) for scrapedurl, scrapedtitle, scrapedquality, scrapedthumbnail, scrapedlanguages, year in match: year = scrapertools.find_single_match(year, '[0-9]{4}') - st = scrapertools.find_single_match(scrapedtitle, 'Online.*') + st = scrapertools.find_single_match(scrapedtitle, '(?i)Online.*') scrapedtitle = scrapedtitle.replace(st, "").strip() st = scrapertools.find_single_match(scrapedtitle, '\(.*?\)') scrapedtitle = scrapedtitle.replace(st, "") From 382d07c15630b17d6271f715a6a7b44f8434935b Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Mon, 16 Oct 2017 12:00:22 -0500 Subject: [PATCH 14/21] Update gvideo.json --- plugin.video.alfa/servers/gvideo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.video.alfa/servers/gvideo.json b/plugin.video.alfa/servers/gvideo.json index c4f0afb9..24bf7661 100644 --- a/plugin.video.alfa/servers/gvideo.json +++ b/plugin.video.alfa/servers/gvideo.json @@ -10,7 +10,7 @@ "ignore_urls": [], "patterns": [ { - "pattern": "(?s)https://youtube.googleapis.com.*?docid=([^(?:&|\")]+)", + "pattern": "(?s)https://youtube.googleapis.com.*?docid=([0-9a-zA-Z-_]+)", "url": "http://docs.google.com/get_video_info?docid=\\1" }, { From 23c16774f1c97ad2fd67cf0978b5f84623493b33 Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Mon, 16 Oct 2017 12:08:37 -0500 Subject: [PATCH 15/21] Update peliscity.py --- plugin.video.alfa/channels/peliscity.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugin.video.alfa/channels/peliscity.py b/plugin.video.alfa/channels/peliscity.py index f26ecb38..d871a39a 100755 --- a/plugin.video.alfa/channels/peliscity.py +++ b/plugin.video.alfa/channels/peliscity.py @@ -140,11 +140,8 @@ def findvideos(item): data = httptools.downloadpage(item.url).data patron = 'cursor: hand" rel="(.*?)".*?class="optxt"><span>(.*?)<.*?width.*?class="q">(.*?)</span' matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedidioma, scrapedcalidad in matches: title = "%s [" + scrapedcalidad + "][" + scrapedidioma +"]" - if "youtube" in scrapedurl: - scrapedurl += "&" quality = scrapedcalidad language = scrapedidioma if not ("omina.farlante1" in scrapedurl or "404" in scrapedurl): From a430eb8af019cc5c1cb6134fe304ccabddf438a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Rinc=C3=B3n=20Rodr=C3=ADguez?= <adrinconr@correo.udistrital.edu.co> Date: Mon, 16 Oct 2017 13:11:09 -0500 Subject: [PATCH 16/21] arreglado error en peliculas --- plugin.video.alfa/channels/asialiveaction.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.video.alfa/channels/asialiveaction.py b/plugin.video.alfa/channels/asialiveaction.py index bc9cc60a..d306b3da 100644 --- a/plugin.video.alfa/channels/asialiveaction.py +++ b/plugin.video.alfa/channels/asialiveaction.py @@ -132,7 +132,7 @@ def lista(item): patron += "<h5>(.+?)<\/h5>" # scrapedyear patron += '<a href="(.+?)"' # scrapedurl #patron += "<\/a>.+?<div class='item-snippet'>(.+?)<" # scrapedplot - if item.title!="Peliculas": + if item.title!="Prueba": pat='<div id="tab-1"><ul class="post-gallery">(.+?)<\/ul><\/div>' data=scrapertools.find_single_match(data, pat) matches = scrapertools.find_multiple_matches(data, patron) From c670ddcc58ba3e0ce83e9eb124acf27e72c631f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Rinc=C3=B3n=20Rodr=C3=ADguez?= <adrinconr@correo.udistrital.edu.co> Date: Mon, 16 Oct 2017 14:34:45 -0500 Subject: [PATCH 17/21] eliminar codigo innecesario --- plugin.video.alfa/channels/asialiveaction.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugin.video.alfa/channels/asialiveaction.py b/plugin.video.alfa/channels/asialiveaction.py index d306b3da..1277d2fb 100644 --- a/plugin.video.alfa/channels/asialiveaction.py +++ b/plugin.video.alfa/channels/asialiveaction.py @@ -102,7 +102,6 @@ def capitulos(item): def bitly(item): logger.info() itemlist = list() - logger.info("likingf "+item.url) data = httptools.downloadpage(item.url).data data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) patron = '<a href="http:\/\/bit.ly\/(.+?)"' From 41c1083acb4093ad65a7dfda123d03e5b3b17b2b Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Mon, 16 Oct 2017 14:45:43 -0500 Subject: [PATCH 18/21] fix by robalo --- plugin.video.alfa/servers/powvideo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.video.alfa/servers/powvideo.py b/plugin.video.alfa/servers/powvideo.py index 9f75449d..f21cdacf 100755 --- a/plugin.video.alfa/servers/powvideo.py +++ b/plugin.video.alfa/servers/powvideo.py @@ -58,7 +58,7 @@ def get_video_url(page_url, premium=False, user="", password="", video_password= matches = scrapertools.find_multiple_matches(data, "[src|file]:'([^']+)'") video_urls = [] for video_url in matches: - _hash = scrapertools.find_single_match(video_url, '[A-z0-9\_\-]{40,}') + _hash = scrapertools.find_single_match(video_url, '[A-z0-9\_\-]{78,}') hash = decrypt(_hash, key) video_url = video_url.replace(_hash, hash) From 7c8f5d95d588e6d855dfa8ea431877885e7707a2 Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Mon, 16 Oct 2017 14:51:50 -0500 Subject: [PATCH 19/21] fix newpct1 --- plugin.video.alfa/channels/newpct1.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/plugin.video.alfa/channels/newpct1.py b/plugin.video.alfa/channels/newpct1.py index d64b241b..ae393d51 100644 --- a/plugin.video.alfa/channels/newpct1.py +++ b/plugin.video.alfa/channels/newpct1.py @@ -98,10 +98,10 @@ def listado(item): fichas = data page_extra = item.extra - patron = '<li><a href="([^"]+).*?' # url - patron += 'title="([^"]+).*?' # titulo - patron += '<img src="([^"]+)"[^>]+>.*?' # thumbnail - patron += '<span>([^<]*)</span>' # calidad + patron = '<a href="([^"]+).*?' # la url + patron += 'title="([^"]+).*?' # el titulo + patron += '<img src="([^"]+)"[^>]+>.*?' # el thumbnail + patron += '<span>([^<].*?)<' # la calidad matches = re.compile(patron, re.DOTALL).findall(fichas) logger.debug('item.next_page: %s'%item.next_page) @@ -167,14 +167,12 @@ def listado(item): logger.debug('context: %s' % context) if not 'array' in title: - new_item = Item(channel=item.channel, action=action, title=title, url=url, thumbnail=thumbnail, + itemlist.append(Item(channel=item.channel, action=action, title=title, url=url, thumbnail=thumbnail, extra = extra, show = context_title, contentTitle=context_title, contentType=context, - context=["buscar_trailer"], infoLabels= {'year':year}) - if year: - tmdb.set_infoLabels_item(new_item, seekTmdb = True) - itemlist.append(new_item) + context=["buscar_trailer"], infoLabels= {'year':year})) + tmdb.set_infoLabels(itemlist, True) From 7f70c95bf5c97464e19d59aa4041fe54ce6bd4c8 Mon Sep 17 00:00:00 2001 From: Intel1 <25161862+Intel11@users.noreply.github.com> Date: Mon, 16 Oct 2017 15:56:51 -0500 Subject: [PATCH 20/21] wopelis fix enlaces --- plugin.video.alfa/channels/wopelis.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin.video.alfa/channels/wopelis.py b/plugin.video.alfa/channels/wopelis.py index 3f3f8785..99fd1111 100755 --- a/plugin.video.alfa/channels/wopelis.py +++ b/plugin.video.alfa/channels/wopelis.py @@ -255,10 +255,10 @@ def findvideos(item): dic_servers = {'ntfof': 'Servidor Desconocido', 'stramango': 'streamango', 'flasht': 'flashx'} data1 = downloadpage(item.url) - patron = 'onclick="redir\(([^\)]+).*?' + patron = '(?s)onclick="redir\(([^\)]+).*?' patron += '<img style="float:left" src="./[^/]+/([^\.]+).+?' patron += '<span[^>]+>([^<]+).*?' - patron += '<img(.*?)onerror' + patron += '<img(.*?)on' if "Descarga:</h1>" in data1: list_showlinks = [('Online:', 'Online:</h1>(.*?)Descarga:</h1>'), From 7f6ffd48ce784fb773024a40cf57676e76f0ed8b Mon Sep 17 00:00:00 2001 From: alfa-addon <inter95@protonmail.com> Date: Tue, 17 Oct 2017 06:32:22 -0400 Subject: [PATCH 21/21] v2.2.3 --- plugin.video.alfa/addon.xml | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/plugin.video.alfa/addon.xml b/plugin.video.alfa/addon.xml index ae32cdbb..7ce576a7 100755 --- a/plugin.video.alfa/addon.xml +++ b/plugin.video.alfa/addon.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<addon id="plugin.video.alfa" name="Alfa" version="2.2.2" provider-name="Alfa Addon"> +<addon id="plugin.video.alfa" name="Alfa" version="2.2.3" provider-name="Alfa Addon"> <requires> <import addon="xbmc.python" version="2.1.0"/> <import addon="script.module.libtorrent" optional="true"/> @@ -19,19 +19,12 @@ </assets> <news>[B]Estos son los cambios para esta versión:[/B] [COLOR green][B]Canales agregados y arreglos[/B][/COLOR] - » maxipelis » peliculasaudiolatino - » peliculasmx » peliscity - » repelis » seriesmeme - » seriesyonkis » verpeliculasnuevas - » zonatorrent » kabagi/diskokosmico - » tiotorrent » allcalidad - » areadocumental » cinetux - » hdfull » newpct1 - » ohpelis » animeyt - » flashx » kbagi - » gamovideo » vidup + » animeyt » pelismundo + » asialiveaction » animeflv_me + » newpct1 » wopelis + » gvideo » powvideo ¤ arreglos internos - [COLOR green]Gracias a [COLOR yellow]RIgodonius[/COLOR] por su colaboración en esta versión[/COLOR] + [COLOR green]Gracias a [COLOR yellow]Danielr460[/COLOR] y [COLOR yellow]robalo[/COLOR] por su colaboración en esta versión[/COLOR] </news> <description lang="es">Navega con Kodi por páginas web para ver sus videos de manera fácil.</description> <summary lang="en">Browse web pages using Kodi</summary>