Merge pull request #264 from pipcat/master

Correcciones pelispedia
This commit is contained in:
Alfa
2018-05-23 17:00:57 -05:00
committed by GitHub
3 changed files with 333 additions and 262 deletions
-14
View File
@@ -21,20 +21,6 @@
"enabled": true, "enabled": true,
"visible": true "visible": true
}, },
{
"id": "perfil",
"type": "list",
"label": "Perfil de color",
"default": 3,
"enabled": true,
"visible": true,
"lvalues": [
"Sin color",
"Perfil 3",
"Perfil 2",
"Perfil 1"
]
},
{ {
"id": "orden_episodios", "id": "orden_episodios",
"type": "bool", "type": "bool",
+326 -245
View File
@@ -3,6 +3,7 @@
import re import re
import urllib import urllib
import urlparse import urlparse
import json
from channelselector import get_thumb from channelselector import get_thumb
from core import channeltools from core import channeltools
@@ -13,6 +14,7 @@ from core import tmdb
from core.item import Item from core.item import Item
from platformcode import config, logger from platformcode import config, logger
from platformcode import platformtools from platformcode import platformtools
from core import filetools
__channel__ = "pelispedia" __channel__ = "pelispedia"
@@ -21,20 +23,9 @@ CHANNEL_HOST = "http://www.pelispedia.tv/"
# Configuracion del canal # Configuracion del canal
try: try:
__modo_grafico__ = config.get_setting('modo_grafico', __channel__) __modo_grafico__ = config.get_setting('modo_grafico', __channel__)
__perfil__ = config.get_setting('perfil', __channel__)
except: except:
__modo_grafico__ = True __modo_grafico__ = True
__perfil__ = 0
# Fijar perfil de color
perfil = [['0xFF6E2802', '0xFFFAA171', '0xFFE9D7940'],
['0xFFA5F6AF', '0xFF5FDA6D', '0xFF11811E'],
['0xFF58D3F7', '0xFF2E64FE', '0xFF0404B4']]
if __perfil__ - 1 >= 0:
color1, color2, color3 = perfil[__perfil__ - 1]
else:
color1 = color2 = color3 = ""
parameters = channeltools.get_channel_parameters(__channel__) parameters = channeltools.get_channel_parameters(__channel__)
fanart_host = parameters['fanart'] fanart_host = parameters['fanart']
@@ -45,52 +36,68 @@ def mainlist(item):
logger.info() logger.info()
itemlist = list() itemlist = list()
itemlist.append(Item(channel=__channel__, title="Películas", text_color=color1, fanart=fanart_host, folder=False, itemlist.append(Item(channel=__channel__, title="Películas", fanart=fanart_host, folder=False,
thumbnail=thumbnail_host, text_bold=True)) thumbnail=thumbnail_host, text_bold=True))
itemlist.append(
Item(channel=__channel__, action="listado", title=" Novedades", text_color=color2, viewcontent="movies", itemlist.append(Item(channel=__channel__, action="listado", title=" Novedades",
url=urlparse.urljoin(CHANNEL_HOST, "movies/all/"), fanart=fanart_host, extra="movies", url=urlparse.urljoin(CHANNEL_HOST, "movies/all/"), extra="movies",
viewmode="movie_with_plot", viewcontent="movies", viewmode="movie_with_plot", fanart=fanart_host,
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Directors%20Chair.png")) thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Directors%20Chair.png"))
itemlist.append(
Item(channel=__channel__, action="listado_alfabetico", title=" Por orden alfabético", text_color=color2, itemlist.append(Item(channel=__channel__, action="listado_alfabetico", title=" Por orden alfabético",
url=urlparse.urljoin(CHANNEL_HOST, "movies/all/"), extra="movies", fanart=fanart_host, url=urlparse.urljoin(CHANNEL_HOST, "movies/all/"), extra="movies",
viewmode="thumbnails", viewmode="thumbnails", fanart=fanart_host,
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/A-Z.png")) thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/A-Z.png"))
itemlist.append(Item(channel=__channel__, action="listado_genero", title=" Por género", text_color=color2,
url=urlparse.urljoin(CHANNEL_HOST, "movies/all/"), extra="movies", fanart=fanart_host,
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Genre.png"))
itemlist.append(Item(channel=__channel__, action="listado_anio", title=" Por año", text_color=color2,
url=urlparse.urljoin(CHANNEL_HOST, "movies/all/"), extra="movies", fanart=fanart_host,
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Year.png"))
# itemlist.append(Item(channel=__channel__, action="search", title=" Buscar...", text_color=color2,
# url=urlparse.urljoin(CHANNEL_HOST, "buscar/?s="), extra="movies", fanart=fanart_host))
itemlist.append(Item(channel=__channel__, title="Series", text_color=color1, fanart=fanart_host, folder=False, itemlist.append(Item(channel=__channel__, action="listado_genero", title=" Por género",
thumbnail=thumbnail_host, text_bold=True)) url=urlparse.urljoin(CHANNEL_HOST, "movies/all/"), extra="movies",
itemlist.append( fanart=fanart_host,
Item(channel=__channel__, action="listado", title=" Novedades", text_color=color2, viewcontent="tvshows", thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Genre.png"))
url=urlparse.urljoin(CHANNEL_HOST, "series/all/"), extra="serie", fanart=fanart_host,
viewmode="movie_with_plot", itemlist.append(Item(channel=__channel__, action="listado_anio", title=" Por año",
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/TV%20Series.png")) url=urlparse.urljoin(CHANNEL_HOST, "movies/all/"), extra="movies",
itemlist.append(Item(channel=__channel__, action="listado_alfabetico", title=" Por orden alfabético", fanart=fanart_host,
text_color=color2, extra="serie", fanart=fanart_host, viewmode="thumbnails",
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/A-Z.png"))
itemlist.append(Item(channel=__channel__, action="listado_genero", title=" Por género", extra="serie",
text_color=color2, fanart=fanart_host, url=urlparse.urljoin(CHANNEL_HOST, "series/all/"),
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Genre.png"))
itemlist.append(
Item(channel=__channel__, action="listado_anio", title=" Por año", extra="serie", text_color=color2,
fanart=fanart_host, url=urlparse.urljoin(CHANNEL_HOST, "series/all/"),
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Year.png")) thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Year.png"))
# itemlist.append(Item(channel=__channel__, action="search", title=" Buscar...", text_color=color2,
# url=urlparse.urljoin(CHANNEL_HOST, "series/buscar/?s="), extra="serie", fanart=fanart_host))
itemlist.append(Item(channel=__channel__, title="", fanart=fanart_host, folder=False, thumbnail=thumbnail_host)) itemlist.append(Item(channel=__channel__, action="local_search", title=" Buscar...",
url=urlparse.urljoin(CHANNEL_HOST, "buscar/?sitesearch=pelispedia.tv&q="), extra="movies",
fanart=fanart_host, thumbnail=get_thumb('search', auto=True)))
itemlist.append(Item(channel=__channel__, action="settings", title="Configuración", text_color=color1,
fanart=fanart_host, text_bold=True, itemlist.append(Item(channel=__channel__, title="Series", fanart=fanart_host, folder=False,
thumbnail=get_thumb("setting_0.png"))) thumbnail=thumbnail_host, text_bold=True))
itemlist.append(
Item(channel=__channel__, action="listado", title=" Novedades",
url=urlparse.urljoin(CHANNEL_HOST, "series/all/"), extra="serie",
viewcontent="tvshows", viewmode="movie_with_plot", fanart=fanart_host,
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/TV%20Series.png"))
itemlist.append(Item(channel=__channel__, action="listado_alfabetico", title=" Por orden alfabético",
url=urlparse.urljoin(CHANNEL_HOST, "series/all/"), extra="serie",
viewmode="thumbnails", fanart=fanart_host,
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/A-Z.png"))
itemlist.append(Item(channel=__channel__, action="listado_genero", title=" Por género",
url=urlparse.urljoin(CHANNEL_HOST, "series/all/"), extra="serie",
fanart=fanart_host,
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Genre.png"))
itemlist.append(Item(channel=__channel__, action="listado_anio", title=" Por año",
url=urlparse.urljoin(CHANNEL_HOST, "series/all/"), extra="serie",
fanart=fanart_host,
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Year.png"))
itemlist.append(Item(channel=__channel__, action="local_search", title=" Buscar...",
url=urlparse.urljoin(CHANNEL_HOST, "series/buscar/?sitesearch=pelispedia.tv&q="), extra="serie",
fanart=fanart_host, thumbnail=get_thumb('search', auto=True)))
# ~ itemlist.append(Item(channel=__channel__, title="", fanart=fanart_host, folder=False, thumbnail=thumbnail_host))
# ~ itemlist.append(Item(channel=__channel__, action="settings", title="Configuración",
# ~ fanart=fanart_host, text_bold=True,
# ~ thumbnail=get_thumb("setting_0.png")))
return itemlist return itemlist
@@ -123,7 +130,7 @@ def listado_alfabetico(item):
itemlist.append( itemlist.append(
Item(channel=__channel__, action="listado", title=letra, url=urlparse.urljoin(CHANNEL_HOST, cadena), Item(channel=__channel__, action="listado", title=letra, url=urlparse.urljoin(CHANNEL_HOST, cadena),
extra=item.extra, text_color=color2, viewcontent=viewcontent, extra=item.extra, fanart=fanart_host, viewcontent=viewcontent,
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/A-Z.png")) thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/A-Z.png"))
return itemlist return itemlist
@@ -160,7 +167,7 @@ def listado_genero(item):
itemlist.append( itemlist.append(
Item(channel=__channel__, action="listado", title=value, url=urlparse.urljoin(CHANNEL_HOST, cadena2), Item(channel=__channel__, action="listado", title=value, url=urlparse.urljoin(CHANNEL_HOST, cadena2),
extra=item.extra, text_color=color2, fanart=fanart_host, viewcontent=viewcontent, extra=item.extra, fanart=fanart_host, viewcontent=viewcontent,
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Genre.png")) thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Genre.png"))
return itemlist return itemlist
@@ -197,23 +204,40 @@ def listado_anio(item):
if item.extra != "movies": if item.extra != "movies":
cadena2 += "/" cadena2 += "/"
itemlist.append(Item(channel=__channel__, action="listado", title=titulo + value, extra=item.extra, itemlist.append(
url=urlparse.urljoin(CHANNEL_HOST, cadena2), text_color=color2, fanart=fanart_host, Item(channel=__channel__, action="listado", title=titulo + value, url=urlparse.urljoin(CHANNEL_HOST, cadena2),
thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Year.png", extra=item.extra, fanart=fanart_host, viewcontent=viewcontent,
viewcontent=viewcontent)) thumbnail="https://raw.githubusercontent.com/master-1970/resources/master/images/genres/0/Year.png"))
return itemlist return itemlist
def search(item, texto): def local_search(item):
# Funcion de busqueda desactivada logger.info()
logger.info("texto=%s" % texto) text = ""
# ~ if config.get_setting("save_last_search", item.channel):
# ~ text = config.get_setting("last_search", item.channel)
item.url = item.url + "%" + texto.replace(' ', '+') + "%" from platformcode import platformtools
texto = platformtools.dialog_input(default=text, heading="Buscar en Pelispedia")
if texto is None:
return
# ~ if config.get_setting("save_last_search", item.channel):
# ~ config.set_setting("last_search", texto, item.channel)
return search(item, texto)
def search(item, texto):
logger.info()
if '/buscar/?' not in item.url:
item.url = CHANNEL_HOST if item.extra == 'movies' else CHANNEL_HOST + 'series/'
item.url += 'buscar/?sitesearch=pelispedia.tv&q='
item.url += texto.replace(" ", "+")
try: try:
return listado(item) return listado(item)
# Se captura la excepción, para no interrumpir al buscador global si un canal falla # Se captura la excepción, para no interrumpir al buscador global si un canal falla
except: except:
import sys import sys
@@ -257,7 +281,8 @@ def listado(item):
action = "temporadas" action = "temporadas"
content_type = "tvshow" content_type = "tvshow"
data = httptools.downloadpage(item.url).data # ~ data = httptools.downloadpage(item.url).data
data = obtener_data(item.url)
data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<Br>|<BR>|<br>|<br/>|<br />|-\s", "", data) data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<Br>|<BR>|<br>|<br/>|<br />|-\s", "", data)
# logger.info("data -- {}".format(data)) # logger.info("data -- {}".format(data))
@@ -270,7 +295,7 @@ def listado(item):
plot = scrapertools.entityunescape(scrapedplot) plot = scrapertools.entityunescape(scrapedplot)
new_item = Item(channel=__channel__, title=title, url=urlparse.urljoin(CHANNEL_HOST, scrapedurl), action=action, new_item = Item(channel=__channel__, title=title, url=urlparse.urljoin(CHANNEL_HOST, scrapedurl), action=action,
thumbnail=scrapedthumbnail, plot=plot, context="", extra=item.extra, text_color=color3, thumbnail=scrapedthumbnail, plot=plot, context="", extra=item.extra,
contentType=content_type, fulltitle=title) contentType=content_type, fulltitle=title)
if item.extra == 'serie': if item.extra == 'serie':
@@ -288,7 +313,7 @@ def listado(item):
tmdb.set_infoLabels(itemlist, __modo_grafico__) tmdb.set_infoLabels(itemlist, __modo_grafico__)
# numero de registros que se muestran por página, se fija a 28 por cada paginación # numero de registros que se muestran por página, se fija a 28 por cada paginación
if len(matches) >= 28: if len(matches) >= 28 and '/buscar/?' not in item.url:
file_php = "666more" file_php = "666more"
tipo_serie = "" tipo_serie = ""
@@ -325,7 +350,7 @@ def listado(item):
url = item.url.replace("rangeStart=" + ant_inicio, "rangeStart=" + inicio) url = item.url.replace("rangeStart=" + ant_inicio, "rangeStart=" + inicio)
itemlist.append(Item(channel=__channel__, action="listado", title=">> Página siguiente", extra=item.extra, itemlist.append(Item(channel=__channel__, action="listado", title=">> Página siguiente", extra=item.extra,
url=url, thumbnail=thumbnail_host, fanart=fanart_host, text_color=color2)) url=url, thumbnail=thumbnail_host, fanart=fanart_host))
return itemlist return itemlist
@@ -335,8 +360,8 @@ def episodios(item):
itemlist = [] itemlist = []
# Descarga la página # ~ data = httptools.downloadpage(item.url).data
data = httptools.downloadpage(item.url).data data = obtener_data(item.url)
data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<Br>|<BR>|<br>|<br/>|<br />|-\s", "", data) data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<Br>|<BR>|<br>|<br/>|<br />|-\s", "", data)
patron = '<li class="clearfix gutterVertical20"><a href="([^"]+)".*?><small>(.*?)</small>.*?' \ patron = '<li class="clearfix gutterVertical20"><a href="([^"]+)".*?><small>(.*?)</small>.*?' \
@@ -353,7 +378,7 @@ def episodios(item):
continue continue
title = "%sx%s: %s" % (season, episode.zfill(2), scrapertools.unescape(scrapedname)) title = "%sx%s: %s" % (season, episode.zfill(2), scrapertools.unescape(scrapedname))
new_item = item.clone(title=title, url=scrapedurl, action="findvideos", text_color=color3, fulltitle=title, new_item = item.clone(title=title, url=scrapedurl, action="findvideos", fulltitle=title,
contentType="episode") contentType="episode")
if 'infoLabels' not in new_item: if 'infoLabels' not in new_item:
new_item.infoLabels = {} new_item.infoLabels = {}
@@ -382,7 +407,7 @@ def episodios(item):
if config.get_videolibrary_support() and len(itemlist) > 0: if config.get_videolibrary_support() and len(itemlist) > 0:
itemlist.append(Item(channel=__channel__, title="Añadir esta serie a la videoteca", url=item.url, itemlist.append(Item(channel=__channel__, title="Añadir esta serie a la videoteca", url=item.url,
action="add_serie_to_library", extra="episodios", show=item.show, category="Series", action="add_serie_to_library", extra="episodios", show=item.show, category="Series",
text_color=color1, thumbnail=thumbnail_host, fanart=fanart_host)) thumbnail=thumbnail_host, fanart=fanart_host))
return itemlist return itemlist
@@ -391,9 +416,8 @@ def temporadas(item):
logger.info() logger.info()
itemlist = [] itemlist = []
# Descarga la página # ~ data = httptools.downloadpage(item.url).data
data = httptools.downloadpage(item.url).data data = obtener_data(item.url)
data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<Br>|<BR>|<br>|<br/>|<br />|-\s", "", data) data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<Br>|<BR>|<br>|<br/>|<br />|-\s", "", data)
if not item.fanart: if not item.fanart:
@@ -407,7 +431,7 @@ def temporadas(item):
if len(matches) > 1: if len(matches) > 1:
for scrapedseason, scrapedthumbnail in matches: for scrapedseason, scrapedthumbnail in matches:
temporada = scrapertools.find_single_match(scrapedseason, '(\d+)') temporada = scrapertools.find_single_match(scrapedseason, '(\d+)')
new_item = item.clone(text_color=color2, action="episodios", season=temporada, thumbnail=scrapedthumbnail) new_item = item.clone(action="episodios", season=temporada, thumbnail=scrapedthumbnail)
new_item.infoLabels['season'] = temporada new_item.infoLabels['season'] = temporada
new_item.extra = "" new_item.extra = ""
itemlist.append(new_item) itemlist.append(new_item)
@@ -429,7 +453,7 @@ def temporadas(item):
if config.get_videolibrary_support() and len(itemlist) > 0: if config.get_videolibrary_support() and len(itemlist) > 0:
itemlist.append(Item(channel=__channel__, title="Añadir esta serie a la videoteca", url=item.url, itemlist.append(Item(channel=__channel__, title="Añadir esta serie a la videoteca", url=item.url,
action="add_serie_to_library", extra="episodios", show=item.show, category="Series", action="add_serie_to_library", extra="episodios", show=item.show, category="Series",
text_color=color1, thumbnail=thumbnail_host, fanart=fanart_host)) thumbnail=thumbnail_host, fanart=fanart_host))
return itemlist return itemlist
else: else:
@@ -441,8 +465,8 @@ def findvideos(item):
logger.info("item.url %s" % item.url) logger.info("item.url %s" % item.url)
itemlist = [] itemlist = []
# Descarga la página # ~ data = httptools.downloadpage(item.url).data
data = httptools.downloadpage(item.url).data data = obtener_data(item.url)
data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<Br>|<BR>|<br>|<br/>|<br />|-\s", "", data) data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<Br>|<BR>|<br>|<br/>|<br />|-\s", "", data)
patron = '<iframe src=".+?id=(\d+)' patron = '<iframe src=".+?id=(\d+)'
@@ -453,186 +477,119 @@ def findvideos(item):
headers["Referer"] = item.url headers["Referer"] = item.url
data = httptools.downloadpage(url, headers=headers).data data = httptools.downloadpage(url, headers=headers).data
# Descarta la opción descarga que es de publicidad patron = '<a href="([^"]+)".+?><img src="/api/img/([^.]+)'
patron = '<a href="(?!http://go.ad2up.com)([^"]+)".+?><img src="/api/img/([^.]+)'
matches = scrapertools.find_multiple_matches(data, patron) matches = scrapertools.find_multiple_matches(data, patron)
for scrapedurl, scrapedtitle in matches: for scrapedurl, scrapedtitle in matches:
# En algunos vídeos hay opción flash "vip" con varias calidades
if "api/vip.php" in scrapedurl: if scrapedurl.startswith("https://cloud.pelispedia.vip/html5.php"):
data_vip = httptools.downloadpage(scrapedurl).data parms = dict(re.findall('[&|\?]{1}([^=]*)=([^&]*)', scrapedurl))
patron = '<a href="([^"]+)".+?><img src="/api/img/([^.]+).*?<span class="text">([^<]+)<' for cal in ['360', '480', '720', '1080']:
matches_vip = re.compile(patron, re.DOTALL).findall(data_vip) if parms[cal]:
for url, titlevip, calidad in matches_vip: url_v = 'https://pelispedia.video/v.php?id=%s&sub=%s&active=%s' % (parms[cal], parms['sub'], cal)
title = "Ver vídeo en [" + titlevip + "] " + calidad title = "Ver video en [HTML5 " + cal + "p]"
itemlist.append(item.clone(title=title, url=url, action="play")) new_item = item.clone(title=title, url=url_v, action="play", referer=item.url)
# fix se ignora esta url ya que no devuelve videos itemlist.append(new_item)
elif "http://www.pelispedia.tv/Pe_Player_Html6/index.php?" in scrapedurl:
continue elif scrapedurl.startswith("https://load.pelispedia.vip/embed/"):
else: if scrapedtitle == 'vid': scrapedtitle = 'vidoza'
title = "Ver vídeo en [" + scrapedtitle + "]" elif scrapedtitle == 'fast': scrapedtitle = 'fastplay'
new_item = item.clone(title=title, url=scrapedurl, action="play", extra=item.url, referer=url) title = "Ver video en [" + scrapedtitle + "]"
new_item = item.clone(title=title, url=scrapedurl, action="play", referer=item.url)
itemlist.append(new_item) itemlist.append(new_item)
# Opción "Añadir esta pelicula a la videoteca" # Opción "Añadir esta pelicula a la videoteca"
if item.extra == "movies" and config.get_videolibrary_support() and len(itemlist) > 0: if item.extra == "movies" and config.get_videolibrary_support() and len(itemlist) > 0:
itemlist.append(Item(channel=__channel__, title="Añadir esta película a la videoteca", url=item.url, itemlist.append(Item(channel=__channel__, title="Añadir esta película a la videoteca", url=item.url,
infoLabels=item.infoLabels, action="add_pelicula_to_library", extra="findvideos", infoLabels=item.infoLabels, action="add_pelicula_to_library", extra="findvideos",
fulltitle=item.title, text_color=color2)) fulltitle=item.title))
return itemlist return itemlist
def play(item): def play(item):
logger.info("url=%s" % item.url) logger.info("url=%s" % item.url)
itemlist = [] itemlist = []
subtitle = "" if item.url.startswith("https://pelispedia.video/v.php"):
# html5 - http://www.pelispedia.vip headers = {'Referer': item.referer}
if item.url.startswith("http://www.pelispedia.vip"): resp = httptools.downloadpage(item.url, headers=headers, cookies=False)
for h in resp.headers:
ck = scrapertools.find_single_match(resp.headers[h], '__cfduid=([^;]*)')
if ck:
gsv = scrapertools.find_single_match(resp.data, '<meta name="google-site-verification" content="([^"]*)"')
token = generar_token(gsv, 'b0a8c83650f18ccc7c87b16e3c460474'+'yt'+'b0a8c83650f18ccc7c87b16e3c460474'+'2653')
playparms = scrapertools.find_single_match(resp.data, 'Play\("([^"]*)","([^"]*)","([^"]*)"')
if playparms:
link = playparms[0]
subtitle = '' if playparms[1] == '' or playparms[2] == '' else playparms[2] + playparms[1] + '.srt'
else:
link = scrapertools.find_single_match(item.url, 'id=([^;]*)')
subtitle = ''
# ~ logger.info("gsv: %s token: %s ck: %s link: %s" % (gsv, token, ck, link))
headers = dict() post = "link=%s&token=%s" % (link, token)
headers["Referer"] = item.referer headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': '__cfduid=' + ck}
data = httptools.downloadpage(item.url, headers=headers).data data = httptools.downloadpage("https://pelispedia.video/plugins/gkpedia.php", post=post, headers=headers, cookies=False).data
data = re.sub(r"\n|\r|\t|\s{2}|-\s", "", data)
mp4 = scrapertools.find_single_match(data, '"link":"([^"]*)')
if mp4:
mp4 = mp4.replace('\/', '/')
if 'chomikuj.pl/' in mp4: mp4 += "|Referer=%s" % item.referer
itemlist.append(['.mp4', mp4, 0, subtitle])
break
from lib import jsunpack
match = scrapertools.find_single_match(data, '\.</div><script type="text/rocketscript">(.*?)</script>')
data = jsunpack.unpack(match)
data = data.replace("\\'", "'")
subtitle = scrapertools.find_single_match(data, "tracks:\[{file:'([^']+)',label:'Spanish'") elif item.url.startswith("https://load.pelispedia.vip/embed/"):
media_urls = scrapertools.find_multiple_matches(data, "{file:'(.+?)',label:'(.+?)',type:'video/mp4'")
headers = {'Referer': item.referer}
resp = httptools.downloadpage(item.url, headers=headers, cookies=False)
# la calidad más baja tiene que ir primero for h in resp.headers:
media_urls = sorted(media_urls, key=lambda k: k[1]) ck = scrapertools.find_single_match(resp.headers[h], '__cfduid=([^;]*)')
if ck:
gsv = scrapertools.find_single_match(resp.data, '<meta name="google-site-verification" content="([^"]*)"')
token = generar_token(gsv, '4fe554b59d760c9986c903b07af8b7a4'+'yt'+'4fe554b59d760c9986c903b07af8b7a4'+'785446346')
url = item.url.replace('/embed/', '/stream/') + '/' + token
# ~ logger.info("gsv: %s token: %s ck: %s" % (gsv, token, ck))
if len(media_urls) > 0: headers = {'Referer': item.url, 'Cookie': '__cfduid=' + ck}
for url, desc in media_urls: data = httptools.downloadpage(url, headers=headers, cookies=False).data
itemlist.append([desc, url, 0, subtitle])
url = scrapertools.find_single_match(data, '<meta (?:name|property)="og:url" content="([^"]+)"')
srv = scrapertools.find_single_match(data, '<meta (?:name|property)="og:sitename" content="([^"]+)"')
if srv == '' and 'rapidvideo.com/' in url: srv = 'rapidvideo'
# otro html5 - https://pelispedia.co/ver/f.php if url != '' and srv != '':
elif item.url.startswith("https://pelispedia.co/ver/f.php"): itemlist.append(item.clone(url=url, server=srv.lower()))
headers = dict() elif '<title>Vidoza</title>' in data or '|fastplay|' in data:
headers["Referer"] = item.referer if '|fastplay|' in data:
data = httptools.downloadpage(item.url, headers=headers).data packed = scrapertools.find_single_match(data, "<script type='text/javascript'>(eval\(.*?)</script>")
from lib import jsunpack
data = jsunpack.unpack(packed)
data = data.replace("\\'", "'")
sub = scrapertools.find_single_match(data, "subtitulo='([^']+)'") matches = scrapertools.find_multiple_matches(data, 'file\s*:\s*"([^"]+)"\s*,\s*label\s*:\s*"([^"]+)"')
data_sub = httptools.downloadpage(sub).data subtitle = ''
subtitle = save_sub(data_sub) for fil, lbl in matches:
if fil.endswith('.srt') and not fil.endswith('empty.srt'):
subtitle = fil
if not subtitle.startswith('http'):
domi = scrapertools.find_single_match(data, 'aboutlink\s*:\s*"([^"]*)')
subtitle = domi + subtitle
break
from lib import jsunpack for fil, lbl in matches:
match = scrapertools.find_single_match(data, '<script type="text/rocketscript">(.*?)</script>') if not fil.endswith('.srt'):
data = jsunpack.unpack(match) itemlist.append([lbl, fil, 0, subtitle])
data = data.replace("\\'", "'")
media_urls = scrapertools.find_multiple_matches(data, "{file:'(.+?)',label:'(.+?)'") break
# la calidad más baja tiene que ir primero
media_urls = sorted(media_urls, key=lambda k: k[1])
if len(media_urls) > 0:
for url, desc in media_urls:
itemlist.append([desc, url, 0, subtitle])
# NUEVO
# otro html5 - http://player.pelispedia.tv/ver?v=
elif item.url.startswith("http://player.pelispedia.tv/ver?v="):
_id = scrapertools.find_single_match(item.url, 'ver\?v=(.+?)$')
headers = dict()
headers["Referer"] = item.referer
data = httptools.downloadpage(item.url, headers=headers).data
sub = scrapertools.find_single_match(data, 'var parametros = "\?pic=20&id=([^&]+)&sub=ES";')
sub = "http://player.pelispedia.tv/cdn" + sub
data_sub = httptools.downloadpage(sub).data
subtitle = save_sub(data_sub)
csrf_token = scrapertools.find_single_match(data, '<meta name="csrf-token" content="([^"]+)">')
ct = ""
iv = ""
s = ""
pre_token = '{"ct": %s,"iv": %s,"s":%s}' % (ct, iv, s)
import base64
token = base64.b64encode(pre_token)
url = "http://player.pelispedia.tv/template/protected.php"
post = "fv=%s&url=%s&sou=%s&token=%s" % ("0", _id, "pic", token)
# eyJjdCI6IkVNYUd3Z2IwS2szSURzSGFGdkxGWlE9PSIsIml2IjoiZDI0NzhlYzU0OTZlYTJkNWFlOTFkZjAzZTVhZTNlNmEiLCJzIjoiOWM3MTM3MjNhMTkyMjFiOSJ9
data = httptools.downloadpage(url, post=post).data
logger.debug("datito %s " % data)
media_urls = scrapertools.find_multiple_matches(data, '"url":"([^"]+)".*?"width":([^,]+),')
# la calidad más baja tiene que ir primero
media_urls = sorted(media_urls, key=lambda k: int(k[1]))
if len(media_urls) > 0:
for url, desc in media_urls:
itemlist.append([desc, url, 0, subtitle])
# netu
elif item.url.startswith("http://www.pelispedia.tv/netu.html?"):
url = item.url.replace("http://www.pelispedia.tv/netu.html?url=", "")
from servers import netutv
media_urls = netutv.get_video_url(urllib.unquote(url))
itemlist.append(media_urls[0])
# flash
elif item.url.startswith("http://www.pelispedia.tv"):
key = scrapertools.find_single_match(item.url, 'index.php\?id=([^&]+).+?sub=([^&]+)&.+?imagen=([^&]+)')
# if len(key) > 2:
# thumbnail = key[2]
if key[1] != "":
url_sub = "http://www.pelispedia.tv/sub/%s.srt" % key[1]
data_sub = httptools.downloadpage(url_sub).data
subtitle = save_sub(data_sub)
url = "http://www.pelispedia.tv/gkphp_flv/plugins/gkpluginsphp.php"
post = "link=" + urllib.quote(key[0])
data = httptools.downloadpage(url, post=post).data
media_urls = scrapertools.find_multiple_matches(data, 'link":"([^"]+)","type":"([^"]+)"')
# la calidad más baja tiene que ir primero
media_urls = sorted(media_urls, key=lambda k: k[1])
if len(media_urls) > 0:
for url, desc in media_urls:
url = url.replace("\\", "")
itemlist.append([desc, url, 0, subtitle])
# openload
elif item.url.startswith("https://load.pelispedia.co/embed/openload.co"):
url = item.url.replace("/embed/", "/stream/")
data = httptools.downloadpage(url).data
url = scrapertools.find_single_match(data, '<meta name="og:url" content="([^"]+)"')
from servers import openload
media_urls = openload.get_video_url(url)
itemlist.append(media_urls[0])
# raptu
elif item.url.startswith("https://load.pelispedia.co/embed/raptu.com"):
url = item.url.replace("/embed/", "/stream/")
data = httptools.downloadpage(url).data
url = scrapertools.find_single_match(data, '<meta property="og:url" content="([^"]+)"')
from servers import raptu
media_urls = raptu.get_video_url(url)
if len(media_urls) > 0:
for desc, url, numero, subtitle in media_urls:
itemlist.append([desc, url, numero, subtitle])
else: else:
itemlist = servertools.find_video_items(data=item.url) itemlist = servertools.find_video_items(data=item.url)
@@ -640,26 +597,150 @@ def play(item):
videoitem.title = item.title videoitem.title = item.title
videoitem.channel = __channel__ videoitem.channel = __channel__
logger.info("retorna itemlist: %s" % itemlist)
return itemlist return itemlist
def save_sub(data):
import os
try:
ficherosubtitulo = os.path.join(config.get_data_path(), 'subtitulo_pelispedia.srt')
if os.path.exists(ficherosubtitulo):
try:
os.remove(ficherosubtitulo)
except IOError:
logger.error("Error al eliminar el archivo " + ficherosubtitulo)
raise
fichero = open(ficherosubtitulo, "wb") # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fichero.write(data)
fichero.close()
subtitle = ficherosubtitulo
except:
subtitle = ""
logger.error("Error al descargar el subtítulo")
return subtitle def obtener_data(url, referer=''):
headers = {}
if referer != '': headers['Referer'] = referer
data = httptools.downloadpage(url, headers=headers).data
if "Javascript is required" in data:
ck = decodificar_cookie(data)
logger.info("Javascript is required. Cookie necesaria %s" % ck)
headers['Cookie'] = ck
data = httptools.downloadpage(url, headers=headers).data
# Guardar la cookie y eliminar la que pudiera haber anterior
cks = ck.split("=")
cookie_file = filetools.join(config.get_data_path(), 'cookies.dat')
cookie_data = filetools.read(cookie_file)
cookie_data = re.sub(r"www\.pelispedia\.tv\tFALSE\t/\tFALSE\t\tsucuri_(.*)\n", "", cookie_data)
cookie_data += "www.pelispedia.tv\tFALSE\t/\tFALSE\t\t%s\t%s\n" % (cks[0], cks[1])
filetools.write(cookie_file, cookie_data)
logger.info("Añadida cookie %s con valor %s" % (cks[0], cks[1]))
return data
def rshift(val, n): return val>>n if val >= 0 else (val+0x100000000)>>n
def decodificar_cookie(data):
S = re.compile("S='([^']*)'").findall(data)[0]
A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
s = {}
l = 0
U = 0
L = len(S)
r = ''
for u in range(0, 64):
s[A[u]] = u
for i in range(0, L):
if S[i] == '=': continue
c = s[S[i]]
U = (U << 6) + c
l += 6
while (l >= 8):
l -= 8
a = rshift(U, l) & 0xff
r += chr(a)
r = re.sub(r"\s+|/\*.*?\*/", "", r)
r = re.sub("\.substr\(([0-9]*),([0-9*])\)", r"[\1:(\1+\2)]", r)
r = re.sub("\.charAt\(([0-9]*)\)", r"[\1]", r)
r = re.sub("\.slice\(([0-9]*),([0-9*])\)", r"[\1:\2]", r)
r = r.replace("String.fromCharCode", "chr")
r = r.replace("location.reload();", "")
pos = r.find("document.cookie")
nomvar = r[0]
l1 = r[2:pos-1]
l2 = r[pos:-1].replace("document.cookie=", "").replace("+"+nomvar+"+", "+g+")
g = eval(l1)
return eval(l2).replace(";path=/;max-age=86400", "")
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def evpKDF(passwd, salt, key_size=8, iv_size=4, iterations=1, hash_algorithm="md5"):
import hashlib
target_key_size = key_size + iv_size
derived_bytes = ""
number_of_derived_words = 0
block = None
hasher = hashlib.new(hash_algorithm)
while number_of_derived_words < target_key_size:
if block is not None:
hasher.update(block)
hasher.update(passwd)
hasher.update(salt)
block = hasher.digest()
hasher = hashlib.new(hash_algorithm)
for i in range(1, iterations):
hasher.update(block)
block = hasher.digest()
hasher = hashlib.new(hash_algorithm)
derived_bytes += block[0: min(len(block), (target_key_size - number_of_derived_words) * 4)]
number_of_derived_words += len(block)/4
return {
"key": derived_bytes[0: key_size * 4],
"iv": derived_bytes[key_size * 4:]
}
def obtener_cripto(password, plaintext):
import os, base64, json
SALT_LENGTH = 8
BLOCK_SIZE = 16
KEY_SIZE = 32
salt = os.urandom(SALT_LENGTH)
iv = os.urandom(BLOCK_SIZE)
paddingLength = 16 - (len(plaintext) % 16)
paddedPlaintext = plaintext+chr(paddingLength)*paddingLength
kdf = evpKDF(password, salt)
try: # Intentar con librería AES del sistema
from Crypto.Cipher import AES
cipherSpec = AES.new(kdf['key'], AES.MODE_CBC, iv)
except: # Si falla intentar con librería del addon
import jscrypto
cipherSpec = jscrypto.new(kdf['key'], jscrypto.MODE_CBC, iv)
ciphertext = cipherSpec.encrypt(paddedPlaintext)
return json.dumps({'ct': base64.b64encode(ciphertext), 'iv': iv.encode("hex"), 's': salt.encode("hex")}, sort_keys=True, separators=(',', ':'))
def generar_token(gsv, pwd):
txt = obtener_cripto(pwd, gsv)
_0x382d28 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
valors = [0, 0, 0]
cicle = 0
retorn = ''
for ch in txt:
valors[cicle] = ord(ch)
cicle += 1
if cicle == 3:
primer = _0x382d28[valors[0] >> 0x2]
segon = _0x382d28[((valors[0] & 0x3) << 0x4) | (valors[1] >> 0x4)]
tercer = _0x382d28[((valors[1] & 0xf) << 0x2) | (valors[2] >> 0x6)]
quart = _0x382d28[valors[2] & 0x3f]
retorn += primer + segon + tercer + quart
valors = [0, 0, 0]
cicle = 0
return retorn
+7 -3
View File
@@ -6,7 +6,6 @@ import time
import urllib import urllib
from threading import Thread from threading import Thread
from Crypto.Cipher import AES
from file import File from file import File
from handler import Handler from handler import Handler
from platformcode import logger from platformcode import logger
@@ -164,8 +163,13 @@ class Client(object):
return self.base64urlencode(self.a32_to_str(a)) return self.base64urlencode(self.a32_to_str(a))
def aes_cbc_decrypt(self, data, key): def aes_cbc_decrypt(self, data, key):
decryptor = AES.new(key, AES.MODE_CBC, '\0' * 16) try:
#decryptor = aes.AESModeOfOperationCBC(key, iv='\0' * 16) from Crypto.Cipher import AES
decryptor = AES.new(key, AES.MODE_CBC, '\0' * 16)
#decryptor = aes.AESModeOfOperationCBC(key, iv='\0' * 16)
except:
import jscrypto
decryptor = jscrypto.new(key, AES.MODE_CBC, '\0' * 16)
return decryptor.decrypt(data) return decryptor.decrypt(data)
def aes_cbc_decrypt_a32(self,data, key): def aes_cbc_decrypt_a32(self,data, key):