diff --git a/plugin.video.alfa/channels/pasateatorrent.json b/plugin.video.alfa/channels/grantorrent.json old mode 100755 new mode 100644 similarity index 70% rename from plugin.video.alfa/channels/pasateatorrent.json rename to plugin.video.alfa/channels/grantorrent.json index 5b0b90b9..fe8c7bd7 --- a/plugin.video.alfa/channels/pasateatorrent.json +++ b/plugin.video.alfa/channels/grantorrent.json @@ -1,33 +1,33 @@ -{ - "id": "pasateatorrent", - "name": "PasateaTorrent", - "active": true, - "adult": false, - "language": ["cast"], - "thumbnail": "http://imgur.com/iLeISt0.png", - "banner": "pasateatorrent.png", - "fanart": "http://imgur.com/uexmGEg.png", - "categories": [ - "torrent", - "movie", - "tvshow" - ], - "settings": [ - { - "id": "include_in_global_search", - "type": "bool", - "label": "Incluir en busqueda global", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "modo_grafico", - "type": "bool", - "label": "Buscar información extra (TMDB)", - "default": true, - "enabled": true, - "visible": true - } - ] -} +{ + "id": "grantorrent", + "name": "GranTorrent", + "active": true, + "adult": false, + "language": ["cast"], + "thumbnail": "grantorrent.jpg", + "banner": "grantorrent.png", + "fanart": "grantorrent.png", + "categories": [ + "torrent", + "movie", + "tvshow" + ], + "settings": [ + { + "id": "include_in_global_search", + "type": "bool", + "label": "Incluir en busqueda global", + "default": true, + "enabled": true, + "visible": true + }, + { + "id": "modo_grafico", + "type": "bool", + "label": "Buscar información extra (TMDB)", + "default": true, + "enabled": true, + "visible": true + } + ] +} diff --git a/plugin.video.alfa/channels/pasateatorrent.py b/plugin.video.alfa/channels/grantorrent.py old mode 100755 new mode 100644 similarity index 83% rename from plugin.video.alfa/channels/pasateatorrent.py rename to plugin.video.alfa/channels/grantorrent.py index 5e2671ea..30da6635 --- a/plugin.video.alfa/channels/pasateatorrent.py +++ b/plugin.video.alfa/channels/grantorrent.py @@ -1,273 +1,273 @@ -# -*- coding: utf-8 -*- - -import re - -from channelselector import get_thumb -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import config, logger - -host = "https://pasateatorrent.com/" - -dict_url_seasons = dict() -__modo_grafico__ = config.get_setting('modo_grafico', 'pasateatorrent') - - -def mainlist(item): - logger.info() - - thumb_movie = get_thumb("channels_movie.png") - thumb_tvshow = get_thumb("channels_tvshow.png") - - itemlist = list() - itemlist.append( - Item(channel=item.channel, title="Peliculas", action="peliculas", thumbnail=thumb_movie)) - itemlist.append( - Item(channel=item.channel, title="Series", action="series", thumbnail=thumb_tvshow)) - - return itemlist - - -def peliculas(item): - logger.info() - - thumb_search = get_thumb("search.png") - - itemlist = list() - itemlist.append(item.clone(channel=item.channel, title="Novedades", action="listado", url=host)) - # itemlist.append(item.clone(channel=item.channel, title="Filtrar películas", action="listado", url=host)) - itemlist.append(item.clone(channel=item.channel, title="Buscar", action="search", url=host, media="película", - thumbnail=thumb_search)) - - return itemlist - - -def series(item): - logger.info() - - thumb_search = get_thumb("search.png") - - itemlist = list() - itemlist.append(item.clone(channel=item.channel, title="Novedades", action="listado", url=host + "series/")) - # itemlist.append(item.clone(channel=item.channel, title="Filtrar series", action="listado", url=host)) - itemlist.append(item.clone(channel=item.channel, title="Buscar", action="search", url=host + "series/", - media="serie", thumbnail=thumb_search)) - - return itemlist - - -def search(item, texto): - logger.info("texto:" + texto) - texto = texto.replace(" ", "+") - itemlist = [] - - try: - url = "%s?s=%s&post_type=Buscar+%s" % (item.url, texto, item.media) - data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url).data) - # logger.debug("data %s \n\n" % data) - - video_section = scrapertools.find_single_match(data, '
(.*?)
') - - pattern = '.*?[^"]+)".*?class="bloque_inferior">' \ - '(?P.*?)</div>' - - matches = re.compile(pattern, re.DOTALL).findall(video_section) - - for url, thumb, title in matches: - if item.media == "serie": - action = "episodios" - else: - action = "findvideos" - itemlist.append(Item(channel=item.channel, action=action, title=title, url=url, thumbnail=thumb, - contentTitle=title, contentType="movie")) - - return itemlist - - # 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 listado(item): - logger.info() - - itemlist = [] - - data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) - # logger.debug("data %s \n\n" % data) - - video_section = scrapertools.find_single_match(data, '<div class="contenedor_imagenes">(.*?)</div><center>') - # logger.debug("data %s \n\n" % video_section) - - pattern = '<a href="(?P<url>[^"]+)">.*?<img.*?src="(?P<thumb>[^"]+)".*?class="bloque_superior">\s*' \ - '(?P<quality>.*?)\s*</div>.*?src="(?P<lang>[^"]+)".*?class="bloque_inferior">\s*(?P<title>.*?)\s*' \ - '</div>.*?class="div_inferior_date">\s*(?P<date>.*?)\s*</div>' - - matches = re.compile(pattern, re.DOTALL).findall(video_section) - - for url, thumb, quality, lang, title, date in matches: - title = scrapertools.htmlclean(title) - title = re.sub(r"\s{2}", " ", title) - - if "/series" in item.url: - if quality: - title2 = "%s [%s]" % (title, quality) - - itemlist.append(Item(channel=item.channel, action="episodios", title=title2, url=url, thumbnail=thumb, - quality=quality, contentTitle=title, contentType="tvshow")) - else: - - if quality: - title2 = "%s [%s]" % (title, quality) - - itemlist.append(Item(channel=item.channel, action="findvideos", title=title2, url=url, thumbnail=thumb, - quality=quality, contentTitle=title, contentType="movie")) - - pagination = scrapertools.find_single_match(data, '<div class="navigation">(.*?)</ul>') - if pagination: - next_page = scrapertools.find_single_match(pagination, 'class="active"><a.*?<a.*?href="([^"]+)') - # logger.debug("next %s" % next_page) - if next_page: - itemlist.append(Item(channel=item.channel, action="listado", title=">> Página siguiente", url=next_page, - thumbnail=get_thumb("next.png"))) - - return itemlist - - -def episodios(item): - logger.info() - - itemlist = [] - dict_data = dict() - dict_data, item = get_episodes(item, dict_data) - - for key in dict_data.keys(): - d = dict_data[key] - quality = "[%s]" % "][".join(d["quality"]) - - d["s_e"] = re.sub(r"\(Contrase.*?\)\s*", "NO REPRODUCIBLE-RAR", d["s_e"]) - title = "%s [%s] %s" % (d["s_e"], d["lang"], quality) - logger.debug("bla %s" % d["s_e"]) - - if "temporada" in d["s_e"].lower(): - regex = re.compile('temporada\s*', re.I) - d["s_e"] = regex.sub("", d["s_e"]) - season = scrapertools.find_single_match(d["s_e"], "(\d+)") - episode = 1 - else: - season, episode = scrapertools.find_single_match(d["s_e"], "(\d+)×(\d+)") - - itemlist.append(item.clone(action="findvideos", title=title, thumbnail=item.thumbnail, url=d["url"], - server="torrent", contentSeason=season, contentEpisodeNumber=episode, - contentType="tvshow", fulltitle=item.title, quality=d["quality"], lang=d["lang"])) - - # order list - if len(itemlist) > 1: - itemlist = sorted(itemlist, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber))) - - try: - from core import tmdb - tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) - except: - pass - - return itemlist - - -def get_episodes(item, dict_data): - global dict_url_seasons - - data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) - # logger.debug("data %s \n\n" % data) - if item.contentTitle != "": - title = scrapertools.find_single_match(data, '<div class="titulo_page_exit">(.*?)[.]</div>') - year = scrapertools.find_single_match(data, '<div class="ano_page_exit">(\d+)</div>') - # logger.debug("title es %s" % title) - if title: - item.contentTitle = title - item.show = title - if year: - item.infoLabels['year'] = year - - links_section = scrapertools.find_single_match(data, 'div id="Tokyo" [^>]+>(.*?)</div>') - # logger.debug("data %s \n\n" % data) - - pattern = 'icono_.*?png" title="(?P<lang>.*?)" [^>]+></td><td>(?P<s_e>.*?)</td><td>(?P<quality>.*?)</td><td>' \ - '<a href="(?P<url>[^"]+)"' - matches = re.compile(pattern, re.DOTALL).findall(links_section) - for lang, s_e, quality, url in matches: - if s_e + lang not in dict_data: - dict_data[s_e + lang] = {"url": [url], "lang": lang, "s_e": s_e, - "quality": [quality]} - else: - if quality not in dict_data[s_e+lang]["quality"]: - dict_data[s_e + lang]["quality"].append(quality) - dict_data[s_e + lang]["url"].append(url) - - url_to_check = scrapertools.find_single_match(links_section, '</table><p><a .*?href="([^"]+)">Temporada.*?</a>') - # logger.debug("url es %s " % url_to_check) - - # if url doesn't exist we add it into the dict - if url_to_check not in dict_url_seasons: - dict_url_seasons[url_to_check] = False - - for key, value in dict_url_seasons.items(): - if not value: - item.url = key - dict_url_seasons[key] = True - dict_data, item = get_episodes(item, dict_data) - - # logger.debug("URL_LIST es %s " % dict_url_seasons) - - return dict_data, item - - -def findvideos(item): - logger.info() - itemlist = [] - - if item.contentType == "movie": - - data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) - # logger.debug("data %s \n\n" % data) - - if item.contentTitle != "": - title = scrapertools.find_single_match(data, '<div class="titulo_page_exit">(.*?)[.]</div>') - year = scrapertools.find_single_match(data, '<div class="ano_page_exit">(\d+)</div>') - logger.debug("title es %s" % title) - if title: - item.contentTitle = title - item.show = title - if year: - item.infoLabels['year'] = year - - links_section = scrapertools.find_single_match(data, 'div id="Tokyo" [^>]+>(.*?)</div>') - # logger.debug("data %s \n\n" % data) - - pattern = 'icono_.*?png" title="(?P<lang>.*?)" [^>]+></td><td>(?P<quality>.*?)</td><td>(?P<size>.*?)</td><td>' \ - '<a href="(?P<url>[^"]+)"' - matches = re.compile(pattern, re.DOTALL).findall(links_section) - - for lang, quality, size, url in matches: - title = "[%s] [%s] (%s)" % (lang, quality, size) - - itemlist.append(item.clone(action="play", title=title, url=url, thumbnail=item.thumbnail, server="torrent", - fulltitle=item.title)) - - try: - from core import tmdb - tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) - except: - pass - - else: - for index, url in enumerate(item.url): - title = "%sx%s [%s] [%s]" % (item.contentSeason, item.contentEpisodeNumber, item.lang, item.quality[index]) - itemlist.append(item.clone(action="play", title=title, url=url, thumbnail=item.thumbnail, server="torrent", - quality=item.quality[index])) - - return itemlist +# -*- coding: utf-8 -*- + +import re + +from channelselector import get_thumb +from core import httptools +from core import scrapertools +from core.item import Item +from platformcode import config, logger + +host = "https://grantorrent.com/" + +dict_url_seasons = dict() +__modo_grafico__ = config.get_setting('modo_grafico', 'grantorrent') + + +def mainlist(item): + logger.info() + + thumb_movie = get_thumb("channels_movie.png") + thumb_tvshow = get_thumb("channels_tvshow.png") + + itemlist = list() + itemlist.append( + Item(channel=item.channel, title="Peliculas", action="peliculas", thumbnail=thumb_movie)) + itemlist.append( + Item(channel=item.channel, title="Series", action="series", thumbnail=thumb_tvshow)) + + return itemlist + + +def peliculas(item): + logger.info() + + thumb_search = get_thumb("search.png") + + itemlist = list() + itemlist.append(item.clone(channel=item.channel, title="Novedades", action="listado", url=host)) + # itemlist.append(item.clone(channel=item.channel, title="Filtrar películas", action="listado", url=host)) + itemlist.append(item.clone(channel=item.channel, title="Buscar", action="search", url=host, media="película", + thumbnail=thumb_search)) + + return itemlist + + +def series(item): + logger.info() + + thumb_search = get_thumb("search.png") + + itemlist = list() + itemlist.append(item.clone(channel=item.channel, title="Novedades", action="listado", url=host + "series/")) + # itemlist.append(item.clone(channel=item.channel, title="Filtrar series", action="listado", url=host)) + itemlist.append(item.clone(channel=item.channel, title="Buscar", action="search", url=host + "series/", + media="serie", thumbnail=thumb_search)) + + return itemlist + + +def search(item, texto): + logger.info("texto:" + texto) + texto = texto.replace(" ", "+") + itemlist = [] + + try: + url = "%s?s=%s" % (item.url, texto) + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(url).data) + # logger.debug("data %s \n\n" % data) + + video_section = scrapertools.find_single_match(data, '<div class="contenedor-imagen">(.*?</div>)</div></div>') + + pattern = '<a href="(?P<url>[^"]+)"><img.*?src="(?P<thumb>[^"]+)".*?class="bloque-inferior">' \ + '\s*(?P<title>.*?)\s*</div>' + + matches = re.compile(pattern, re.DOTALL).findall(video_section) + + for url, thumb, title in matches: + if item.media == "serie": + action = "episodios" + else: + action = "findvideos" + itemlist.append(Item(channel=item.channel, action=action, title=title, url=url, thumbnail=thumb, + contentTitle=title, contentType="movie")) + + return itemlist + + # 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 listado(item): + logger.info() + + itemlist = [] + + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) + # logger.debug("data %s \n\n" % data) + + video_section = scrapertools.find_single_match(data, '<br><div class="contenedor-home">(.*?</div>)</div></div>') + # logger.debug("data %s \n\n" % video_section) + + pattern = '<a href="(?P<url>[^"]+)"><img.*?src="(?P<thumb>[^"]+)".*?.*?class="bloque-superior">\s*' \ + '(?P<quality>.*?)\s*<div class="imagen-idioma">\s*<img src=".*?icono_(?P<lang>[^\.]+).*?<div class=' \ + '"bloque-inferior">\s*(?P<title>.*?)\s*</div><div class="bloque-date">\s*(?P<date>.*?)\s*</div>' + + matches = re.compile(pattern, re.DOTALL).findall(video_section) + + for url, thumb, quality, lang, title, date in matches: + title = scrapertools.htmlclean(title) + title = re.sub(r"\s{2}", " ", title) + + if "/series" in item.url: + if quality: + title2 = "%s [%s]" % (title, quality) + + itemlist.append(Item(channel=item.channel, action="episodios", title=title2, url=url, thumbnail=thumb, + quality=quality, contentTitle=title, contentType="tvshow")) + else: + + if quality: + title2 = "%s [%s]" % (title, quality) + + itemlist.append(Item(channel=item.channel, action="findvideos", title=title2, url=url, thumbnail=thumb, + quality=quality, contentTitle=title, contentType="movie")) + + pagination = scrapertools.find_single_match(data, '<div class="nav-links">(.*?)</ul>') + if pagination: + next_page = scrapertools.find_single_match(pagination, "class='page-numbers current'.*?<a.*?href='([^']+)'") + # logger.debug("next %s" % next_page) + if next_page: + itemlist.append(Item(channel=item.channel, action="listado", title=">> Página siguiente", url=next_page, + thumbnail=get_thumb("next.png"))) + + return itemlist + + +def episodios(item): + logger.info() + + itemlist = [] + dict_data = dict() + dict_data, item = get_episodes(item, dict_data) + + for key in dict_data.keys(): + d = dict_data[key] + quality = "[%s]" % "][".join(d["quality"]) + + d["s_e"] = re.sub(r"\(Contrase.*?\)\s*", "NO REPRODUCIBLE-RAR", d["s_e"]) + title = "%s [%s] %s" % (d["s_e"], d["lang"], quality) + # logger.debug("%s" % d["s_e"]) + + if "temporada" in d["s_e"].lower(): + regex = re.compile('temporada\s*', re.I) + d["s_e"] = regex.sub("", d["s_e"]) + season = scrapertools.find_single_match(d["s_e"], "(\d+)") + episode = 1 + else: + season, episode = scrapertools.find_single_match(d["s_e"], "(\d+)×(\d+)") + + itemlist.append(item.clone(action="findvideos", title=title, thumbnail=item.thumbnail, url=d["url"], + server="torrent", contentSeason=season, contentEpisodeNumber=episode, + contentType="tvshow", fulltitle=item.title, quality=d["quality"], lang=d["lang"])) + + # order list + if len(itemlist) > 1: + itemlist = sorted(itemlist, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber))) + + try: + from core import tmdb + tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) + except: + pass + + return itemlist + + +def get_episodes(item, dict_data): + global dict_url_seasons + + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) + # logger.debug("data %s \n\n" % data) + if item.contentTitle != "": + title = scrapertools.find_single_match(data, '<h3 class="bold">.*?original:\s*(.*?)[.]</h3>') + year = scrapertools.find_single_match(data, '<h3 class="bold">\s*Estreno:\s*(\d+)[.]</h') + # logger.debug("title es %s" % title) + if title: + item.contentTitle = title + item.show = title + if year: + item.infoLabels['year'] = year + + links_section = scrapertools.find_single_match(data, 'div id="Tokyo" [^>]+>(.*?)</div>') + logger.debug("data %s \n\n" % links_section) + + pattern = 'icono_.*?png" title="(?P<lang>.*?)" [^>]+></td><td>(?P<s_e>.*?)</td><td>(?P<quality>.*?)</td><td>' \ + '<a class="link" href="(?P<url>[^"]+)"' + matches = re.compile(pattern, re.DOTALL).findall(links_section) + for lang, s_e, quality, url in matches: + if s_e + lang not in dict_data: + dict_data[s_e + lang] = {"url": [url], "lang": lang, "s_e": s_e, + "quality": [quality]} + else: + if quality not in dict_data[s_e+lang]["quality"]: + dict_data[s_e + lang]["quality"].append(quality) + dict_data[s_e + lang]["url"].append(url) + + url_to_check = scrapertools.find_single_match(links_section, '</table><p><a.*?href="([^"]+)".*?>\s*Temporada.*?</a>') + logger.debug("url es %s " % url_to_check) + + # if url doesn't exist we add it into the dict + if url_to_check and url_to_check not in dict_url_seasons: + dict_url_seasons[url_to_check] = False + + for key, value in dict_url_seasons.items(): + if not value: + item.url = key + dict_url_seasons[key] = True + dict_data, item = get_episodes(item, dict_data) + + # logger.debug("URL_LIST es %s " % dict_url_seasons) + + return dict_data, item + + +def findvideos(item): + logger.info() + itemlist = [] + + if item.contentType == "movie": + + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url).data) + # logger.debug("data %s \n\n" % data) + + if item.contentTitle != "": + title = scrapertools.find_single_match(data, '<div class="titulo_page_exit">(.*?)[.]</div>') + year = scrapertools.find_single_match(data, '<div class="ano_page_exit">(\d+)</div>') + logger.debug("title es %s" % title) + if title: + item.contentTitle = title + item.show = title + if year: + item.infoLabels['year'] = year + + links_section = scrapertools.find_single_match(data, 'div id="Tokyo" [^>]+>(.*?)</div>') + # logger.debug("data %s \n\n" % data) + + pattern = 'icono_.*?png" title="(?P<lang>.*?)" [^>]+></td><td>(?P<quality>.*?)</td><td>(?P<size>.*?)</td><td>' \ + '<a class="link" href="(?P<url>[^"]+)"' + matches = re.compile(pattern, re.DOTALL).findall(links_section) + + for lang, quality, size, url in matches: + title = "[%s] [%s] (%s)" % (lang, quality, size) + + itemlist.append(item.clone(action="play", title=title, url=url, thumbnail=item.thumbnail, server="torrent", + fulltitle=item.title)) + + try: + from core import tmdb + tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) + except: + pass + + else: + for index, url in enumerate(item.url): + title = "%sx%s [%s] [%s]" % (item.contentSeason, item.contentEpisodeNumber, item.lang, item.quality[index]) + itemlist.append(item.clone(action="play", title=title, url=url, thumbnail=item.thumbnail, server="torrent", + quality=item.quality[index])) + + return itemlist diff --git a/plugin.video.alfa/channels/playmax.json b/plugin.video.alfa/channels/playmax.json deleted file mode 100755 index d671f521..00000000 --- a/plugin.video.alfa/channels/playmax.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "id": "playmax", - "name": "PlayMax", - "language": ["cast", "lat"], - "active": false, - "adult": false, - "thumbnail": "playmax.png", - "banner": "playmax.png", - "categories": [ - "movie", - "tvshow" - ], - "settings": [ - { - "id": "playmaxuser", - "type": "text", - "color": "0xFF25AA48", - "label": "@30014", - "enabled": true, - "visible": true - }, - { - "id": "playmaxpassword", - "type": "text", - "color": "0xFF25AA48", - "hidden": true, - "label": "@30015", - "enabled": "!eq(-1,'')", - "visible": true - }, - { - "id": "include_in_global_search", - "type": "bool", - "label": "Incluir en búsqueda global", - "default": false, - "enabled": true, - "visible": true - }, - { - "id": "include_in_newest_peliculas", - "type": "bool", - "label": "Incluir en Novedades - Películas", - "default": false, - "enabled": true, - "visible": true - }, - { - "id": "include_in_newest_infantiles", - "type": "bool", - "label": "Incluir en Novedades - Infantiles", - "default": false, - "enabled": true, - "visible": true - }, - { - "id": "include_in_newest_series", - "type": "bool", - "label": "Incluir en Novedades - Series", - "default": false, - "enabled": true, - "visible": true - }, - { - "id": "modo_grafico", - "type": "bool", - "color": "0xFFd50b0b", - "label": "Buscar información extra", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "menu_info", - "type": "bool", - "color": "0xFFd50b0b", - "label": "Mostrar menú intermedio película/episodio", - "default": true, - "enabled": 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": "last_page", - "type": "bool", - "color": "0xFFd50b0b", - "label": "Ocultar opción elegir página en películas (Kodi)", - "default": false, - "enabled": true, - "visible": true - }, - { - "id": "order_web", - "type": "bool", - "color": "0xFFd50b0b", - "label": "Usar el mismo orden de los enlaces que la web", - "default": false, - "enabled": true, - "visible": true - } - ] -} diff --git a/plugin.video.alfa/channels/playmax.py b/plugin.video.alfa/channels/playmax.py deleted file mode 100644 index 64481b86..00000000 --- a/plugin.video.alfa/channels/playmax.py +++ /dev/null @@ -1,979 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from core import httptools -from core import scrapertools -from core import tmdb -from core.item import Item -from platformcode import config, logger - -sid = config.get_setting("sid_playmax", "playmax") -apikey = "0ea143087685e9e0a23f98ae" -__modo_grafico__ = config.get_setting('modo_grafico', 'playmax') -__perfil__ = config.get_setting('perfil', "playmax") -__menu_info__ = config.get_setting('menu_info', 'playmax') - -# Fijar perfil de color -perfil = [['0xFFFFE6CC', '0xFFFFCE9C', '0xFF994D00', '0xFFFE2E2E', '0xFF088A08'], - ['0xFFA5F6AF', '0xFF5FDA6D', '0xFF11811E', '0xFFFE2E2E', '0xFF088A08'], - ['0xFF58D3F7', '0xFF2E9AFE', '0xFF2E64FE', '0xFFFE2E2E', '0xFF088A08']] - -if __perfil__ - 1 >= 0: - color1, color2, color3, color4, color5 = perfil[__perfil__ - 1] -else: - color1 = color2 = color3 = color4 = color5 = "" - -host = "https://playmax.mx" - - -def login(): - logger.info() - - try: - user = config.get_setting("playmaxuser", "playmax") - password = config.get_setting("playmaxpassword", "playmax") - if user == "" and password == "": - return False, "Para ver los enlaces de este canal es necesario registrarse en playmax.mx" - elif user == "" or password == "": - return False, "Usuario o contraseña en blanco. Revisa tus credenciales" - - data = httptools.downloadpage("https://playmax.mx/ucp.php?mode=login").data - if re.search(r'(?i)class="hb_user_data" title="%s"' % user, data): - if not config.get_setting("sid_playmax", "playmax"): - sid_ = scrapertools.find_single_match(data, 'sid=([^"]+)"') - if not sid_: - sid_ = scrapertools.find_single_match(config.get_cookie_data(), 'playmax.*?_sid\s*([A-z0-9]+)') - config.set_setting("sid_playmax", sid_, "playmax") - return True, "" - - confirm_id = scrapertools.find_single_match(data, 'name="confirm_id" value="([^"]+)"') - sid_log = scrapertools.find_single_match(data, 'name="sid" value="([^"]+)"') - post = "username=%s&password=%s&autologin=on&agreed=true&change_lang=0&confirm_id=%s&login=&sid=%s" \ - "&redirect=index.php&login=Entrar" % (user, password, confirm_id, sid_log) - data = httptools.downloadpage("https://playmax.mx/ucp.php?mode=login", post=post).data - if "contraseña incorrecta" in data: - logger.error("Error en el login") - return False, "Contraseña errónea. Comprueba tus credenciales" - elif "nombre de usuario incorrecto" in data: - logger.error("Error en el login") - return False, "Nombre de usuario no válido. Comprueba tus credenciales" - else: - logger.info("Login correcto") - sid_ = scrapertools.find_single_match(data, 'sid=([^"]+)"') - if not sid_: - sid_ = scrapertools.find_single_match(config.get_cookie_data(), 'playmax.*?_sid\s*([A-z0-9]+)') - config.set_setting("sid_playmax", sid_, "playmax") - # En el primer logueo se activa la busqueda global y la seccion novedades - if not config.get_setting("primer_log", "playmax"): - config.set_setting("include_in_global_search", True, "playmax") - config.set_setting("include_in_newest_peliculas", True, "playmax") - config.set_setting("include_in_newest_series", True, "playmax") - config.set_setting("include_in_newest_infantiles", True, "playmax") - config.set_setting("primer_log", False, "playmax") - return True, "" - except: - import traceback - logger.error(traceback.format_exc()) - return False, "Error en el login. Comprueba tus credenciales o si la web está operativa" - - -def mainlist(item): - logger.info() - itemlist = [] - item.text_color = color1 - - logueado, error_message = login() - - if not logueado: - config.set_setting("include_in_global_search", False, "playmax") - itemlist.append(item.clone(title=error_message, action="configuracion", folder=False)) - return itemlist - - itemlist.append(item.clone(title="Películas", action="", text_color=color2)) - item.contentType = "movie" - itemlist.append( - item.clone(title=" Novedades", action="fichas", url=host + "/catalogo.php?tipo[]=2&ad=2&ordenar=" - "novedades&con_dis=on")) - itemlist.append( - item.clone(title=" Populares", action="fichas", url=host + "/catalogo.php?tipo[]=2&ad=2&ordenar=" - "pop&con_dis=on")) - itemlist.append(item.clone(title=" Índices", action="indices")) - - itemlist.append(item.clone(title="Series", action="", text_color=color2)) - item.contentType = "tvshow" - itemlist.append(item.clone(title=" Nuevos capítulos", action="fichas", url=host + "/catalogo.php?tipo[]=1&ad=2&" - "ordenar=novedades&con_dis=on")) - itemlist.append(item.clone(title=" Nuevas series", action="fichas", url=host + "/catalogo.php?tipo[]=1&ad=2&" - "ordenar=año&con_dis=on")) - itemlist.append(item.clone(title=" Índices", action="indices")) - - item.contentType = "movie" - itemlist.append(item.clone(title="Documentales", action="fichas", text_color=color2, - url=host + "/catalogo.php?&tipo[]=3&ad=2&ordenar=novedades&con_dis=on")) - itemlist.append(item.clone(title="Listas", action="listas", text_color=color2, - url=host + "/listas.php?apikey=%s&sid=%s&start=0" % (apikey, sid), extra="listas")) - itemlist.append(item.clone(action="search", title="Buscar...", text_color=color2)) - itemlist.append(item.clone(action="acciones_cuenta", title="Tus fichas", text_color=color4)) - itemlist.append(item.clone(title="Configuración del canal", action="configuracion", text_color="gold")) - - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "%20") - item.url = "%s/buscar.php?apikey=%s&sid=%s&buscar=%s&modo=[fichas]&start=0" % (host, apikey, sid, texto) - try: - return busqueda(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def busqueda(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url).data - data = xml2dict(data) - if type(data["Data"]["Fichas"]["Ficha"]) == dict: - searched_data = [data["Data"]["Fichas"]["Ficha"]] - else: - searched_data = data["Data"]["Fichas"]["Ficha"] - - for f in searched_data: - f["Title"] = f["Title"].replace("<![CDATA[", "").replace("]]>", "") - title = "%s (%s)" % (f["Title"], f["Year"]) - infolab = {'year': f["Year"]} - thumbnail = f["Poster"] - url = "%s/ficha.php?f=%s" % (host, f["Id"]) - action = "findvideos" - if __menu_info__: - action = "menu_info" - if f["IsSerie"] == "1": - tipo = "tvshow" - show = f["Title"] - if not __menu_info__: - action = "episodios" - else: - tipo = "movie" - show = "" - itemlist.append(Item(channel=item.channel, action=action, title=title, url=url, text_color=color2, - contentTitle=f["Title"], show=show, contentType=tipo, infoLabels=infolab, - thumbnail=thumbnail)) - - if __modo_grafico__: - tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) - - total = int(data["Data"]["totalResultsFichas"]) - actualpage = int(scrapertools.find_single_match(item.url, "start=(\d+)")) - if actualpage + 20 < total: - next_page = item.url.replace("start=%s" % actualpage, "start=%s" % (actualpage + 20)) - itemlist.append(Item(channel=item.channel, action="busqueda", title=">> Página Siguiente", - url=next_page, thumbnail=item.thumbnail)) - - return itemlist - - -def configuracion(item): - from platformcode import platformtools - ret = platformtools.show_channel_settings() - platformtools.itemlist_refresh() - return ret - - -def newest(categoria): - logger.info() - itemlist = [] - item = Item() - try: - if categoria == 'series': - item.channel = "playmax" - item.extra = "newest" - item.url = host + "/catalogo.php?tipo[]=1&ad=2&ordenar=novedades&con_dis=on" - item.contentType = "tvshow" - itemlist = fichas(item) - - if itemlist[-1].action == "fichas": - itemlist.pop() - elif categoria == 'peliculas': - item.channel = "playmax" - item.extra = "newest" - item.url = host + "/catalogo.php?tipo[]=2&ad=2&ordenar=novedades&con_dis=on" - item.contentType = "movie" - itemlist = fichas(item) - - if itemlist[-1].action == "fichas": - itemlist.pop() - elif categoria == 'infantiles': - item.channel = "playmax" - item.extra = "newest" - item.url = host + "/catalogo.php?tipo[]=2&generos[]=60&ad=2&ordenar=novedades&con_dis=on" - item.contentType = "movie" - itemlist = fichas(item) - - if itemlist[-1].action == "fichas": - itemlist.pop() - - # Se captura la excepción, para no interrumpir al canal novedades si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - return itemlist - - -def indices(item): - logger.info() - itemlist = [] - - tipo = "2" - if item.contentType == "tvshow": - tipo = "1" - if "Índices" in item.title: - if item.contentType == "tvshow": - itemlist.append(item.clone(title="Populares", action="fichas", url=host + "/catalogo.php?tipo[]=1&ad=2&" - "ordenar=pop&con_dis=on")) - itemlist.append(item.clone(title="Más vistas", action="fichas", url=host + "/catalogo.php?tipo[]=%s&ad=2&" - "ordenar=siempre&con_dis=on" % tipo)) - itemlist.append(item.clone(title="Mejor valoradas", action="fichas", url=host + "/catalogo.php?tipo[]=%s&ad=2&" - "ordenar=valoracion&con_dis=on" % tipo)) - itemlist.append(item.clone(title="Géneros", url=host + "/catalogo.php")) - itemlist.append(item.clone(title="Idiomas", url=host + "/catalogo.php")) - if item.contentType == "movie": - itemlist.append(item.clone(title="Por calidad", url=host + "/catalogo.php")) - itemlist.append(item.clone(title="Por año")) - itemlist.append(item.clone(title="Por país", url=host + "/catalogo.php")) - - return itemlist - - if "Géneros" in item.title: - data = httptools.downloadpage(item.url).data - patron = '<div class="sel gen" value="([^"]+)">([^<]+)</div>' - matches = scrapertools.find_multiple_matches(data, patron) - for value, genero in matches: - url = item.url + "?tipo[]=%s&generos[]=%s&ad=2&ordenar=novedades&con_dis=on" % (tipo, value) - itemlist.append(item.clone(action="fichas", title=genero, url=url)) - elif "Idiomas" in item.title: - data = httptools.downloadpage(item.url).data - bloque = scrapertools.find_single_match(data, 'oname="Idioma">Cualquier(.*?)<input') - patron = '<div class="sel" value="([^"]+)">([^<]+)</div>' - matches = scrapertools.find_multiple_matches(bloque, patron) - for value, idioma in matches: - url = item.url + "?tipo[]=%s&ad=2&ordenar=novedades&con_dis=on&e_idioma=%s" % (tipo, value) - itemlist.append(item.clone(action="fichas", title=idioma, url=url)) - elif "calidad" in item.title: - data = httptools.downloadpage(item.url).data - bloque = scrapertools.find_single_match(data, 'oname="Calidad">Cualquier(.*?)<input') - patron = '<div class="sel" value="([^"]+)">([^<]+)</div>' - matches = scrapertools.find_multiple_matches(bloque, patron) - for value, calidad in matches: - url = item.url + "?tipo[]=%s&ad=2&ordenar=novedades&con_dis=on&e_calidad=%s" % (tipo, value) - itemlist.append(item.clone(action="fichas", title=calidad, url=url)) - elif "país" in item.title: - data = httptools.downloadpage(item.url).data - bloque = scrapertools.find_single_match(data, 'oname="País">Todos(.*?)<input') - patron = '<div class="sel" value="([^"]+)">([^<]+)</div>' - matches = scrapertools.find_multiple_matches(bloque, patron) - for value, pais in matches: - url = item.url + "?tipo[]=%s&ad=2&ordenar=novedades&con_dis=on&pais=%s" % (tipo, value) - itemlist.append(item.clone(action="fichas", title=pais, url=url)) - else: - from datetime import datetime - year = datetime.now().year - for i in range(year, 1899, -1): - url = "%s/catalogo.php?tipo[]=%s&del=%s&al=%s&año=personal&ad=2&ordenar=novedades&con_dis=on" \ - % (host, tipo, i, i) - itemlist.append(item.clone(action="fichas", title=str(i), url=url)) - - return itemlist - - -def fichas(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url).data - # data = re.sub(r"\n|\r|\t|\s{2}|-\s", "", data) - - fichas_marca = {'1': 'Siguiendo', '2': 'Pendiente', '3': 'Favorita', '4': 'Vista', '5': 'Abandonada'} - patron = '<div class="c_fichas_image"[^>]*>[^<]*<[^>]+href="\.([^"]+)".*?src-data="([^"]+)".*?' \ - '<div class="c_fichas_data".*?marked="([^"]*)".*?serie="([^"]*)".*?' \ - '<div class="c_fichas_title">(?:<div class="c_fichas_episode">([^<]+)</div>|)([^<]+)</div>' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedthumbnail, marca, serie, episodio, scrapedtitle in matches: - tipo = "movie" - scrapedurl = host + scrapedurl.rsplit("-dc=")[0] - if not "-dc=" in scrapedurl: - scrapedurl += "-dc=" - action = "findvideos" - if __menu_info__: - action = "menu_info" - if serie: - tipo = "tvshow" - if episodio: - title = "%s - %s" % (episodio.replace("X", "x"), scrapedtitle) - else: - title = scrapedtitle - - if marca: - title += " [COLOR %s][%s][/COLOR]" % (color4, fichas_marca[marca]) - - new_item = Item(channel=item.channel, action=action, title=title, url=scrapedurl, - thumbnail=scrapedthumbnail, contentTitle=scrapedtitle, contentType=tipo, - text_color=color2) - if new_item.contentType == "tvshow": - new_item.show = scrapedtitle - if not __menu_info__: - new_item.action = "episodios" - - itemlist.append(new_item) - - if itemlist and (item.extra == "listas_plus" or item.extra == "sigo"): - follow = scrapertools.find_single_match(data, '<div onclick="seguir_lista.*?>(.*?)<') - title = "Seguir Lista" - if follow == "Siguiendo": - title = "Dejar de seguir lista" - item.extra = "" - url = host + "/data.php?mode=seguir_lista&apikey=%s&sid=%s&lista=%s" % ( - apikey, sid, item.url.rsplit("/l", 1)[1]) - itemlist.insert(0, item.clone(action="acciones_cuenta", title=title, url=url, text_color=color4, - lista=item.title, folder=False)) - - next_page = scrapertools.find_single_match(data, 'href="([^"]+)" class="next"') - if next_page: - next_page = host + next_page.replace("&", "&") - itemlist.append(Item(channel=item.channel, action="fichas", title=">> Página Siguiente", url=next_page)) - - try: - total = int(scrapertools.find_single_match(data, '<span class="page-dots">.*href.*?>(\d+)')) - except: - total = 0 - if not config.get_setting("last_page", item.channel) and config.is_xbmc() and total > 2 \ - and item.extra != "newest": - itemlist.append(item.clone(action="select_page", title="Ir a página... (Total:%s)" % total, url=next_page, - text_color=color5)) - - return itemlist - - -def episodios(item): - logger.info() - itemlist = [] - - # Descarga la página - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| |<br>", "", data) - - if not item.infoLabels["tmdb_id"]: - item.infoLabels["tmdb_id"] = scrapertools.find_single_match(data, - '<a href="https://www.themoviedb.org/[^/]+/(\d+)') - item.infoLabels["year"] = scrapertools.find_single_match(data, 'class="e_new">(\d{4})') - if not item.infoLabels["genre"]: - item.infoLabels["genre"] = ", ".join(scrapertools.find_multiple_matches(data, - '<a itemprop="genre"[^>]+>([^<]+)</a>')) - if not item.infoLabels["plot"]: - item.infoLabels["plot"] = scrapertools.find_single_match(data, 'itemprop="description">([^<]+)</div>') - - dc = scrapertools.find_single_match(data, "var dc_ic = '\?dc=([^']+)'") - patron = '<div class="f_cl_l_c f_cl_l_c_id[^"]+" c_id="([^"]+)" .*?c_num="([^"]+)" c_name="([^"]+)"' \ - '.*?load_f_links\(\d+\s*,\s*(\d+).*?<div class="([^"]+)" onclick="marcar_capitulo' - matches = scrapertools.find_multiple_matches(data, patron) - lista_epis = [] - for c_id, episodio, title, ficha, status in matches: - episodio = episodio.replace("X", "x") - if episodio in lista_epis: - continue - lista_epis.append(episodio) - url = "https://playmax.mx/c_enlaces_n.php?ficha=%s&c_id=%s&dc=%s" % (ficha, c_id, dc) - title = "%s - %s" % (episodio, title) - if "_mc a" in status: - title = "[COLOR %s]%s[/COLOR] %s" % (color5, u"\u0474".encode('utf-8'), title) - - new_item = Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=item.thumbnail, - fanart=item.fanart, show=item.show, infoLabels=item.infoLabels, text_color=color2, - referer=item.url, contentType="episode") - try: - new_item.infoLabels["season"], new_item.infoLabels["episode"] = episodio.split('x', 1) - except: - pass - itemlist.append(new_item) - - itemlist.sort(key=lambda it: (it.infoLabels["season"], it.infoLabels["episode"]), reverse=True) - if __modo_grafico__: - tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__) - - library_path = config.get_videolibrary_path() - if config.get_videolibrary_support() and not item.extra: - title = "Añadir serie a la videoteca" - if item.infoLabels["imdb_id"] and not library_path.lower().startswith("smb://"): - try: - from core import filetools - path = filetools.join(library_path, "SERIES") - files = filetools.walk(path) - for dirpath, dirname, filename in files: - if item.infoLabels["imdb_id"] in dirpath: - for f in filename: - if f != "tvshow.nfo": - continue - from core import videolibrarytools - head_nfo, it = videolibrarytools.read_nfo(filetools.join(dirpath, dirname, f)) - canales = it.library_urls.keys() - canales.sort() - if "playmax" in canales: - canales.pop(canales.index("playmax")) - canales.insert(0, "[COLOR red]playmax[/COLOR]") - title = "Serie ya en tu videoteca. [%s] ¿Añadir?" % ",".join(canales) - break - except: - import traceback - logger.error(traceback.format_exc()) - pass - - itemlist.append(item.clone(action="add_serie_to_library", title=title, text_color=color5, - extra="episodios###library")) - if itemlist and not __menu_info__: - ficha = scrapertools.find_single_match(item.url, '-f(\d+)-') - itemlist.extend(acciones_fichas(item, sid, ficha)) - - return itemlist - - -def findvideos(item): - logger.info() - itemlist = [] - - if item.contentType == "movie": - # Descarga la página - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| |<br>", "", data) - - if not item.infoLabels["tmdb_id"]: - item.infoLabels["tmdb_id"] = scrapertools.find_single_match(data, '<a href="https://www.themoviedb.org/' - '[^/]+/(\d+)') - item.infoLabels["year"] = scrapertools.find_single_match(data, 'class="e_new">(\d{4})') - - if __modo_grafico__: - tmdb.set_infoLabels_item(item, __modo_grafico__) - if not item.infoLabels["plot"]: - item.infoLabels["plot"] = scrapertools.find_single_match(data, 'itemprop="description">([^<]+)</div>') - if not item.infoLabels["genre"]: - item.infoLabels["genre"] = ", ".join(scrapertools.find_multiple_matches(data, '<a itemprop="genre"[^>]+>' - '([^<]+)</a>')) - - ficha = scrapertools.find_single_match(item.url, '-f(\d+)-') - if not ficha: - ficha = scrapertools.find_single_match(item.url, 'f=(\d+)') - cid = "0" - else: - ficha, cid = scrapertools.find_single_match(item.url, 'ficha=(\d+)&c_id=(\d+)') - - url = "https://playmax.mx/c_enlaces_n.php?apikey=%s&sid=%s&ficha=%s&cid=%s" % (apikey, sid, ficha, cid) - data = httptools.downloadpage(url).data - data = xml2dict(data) - - for k, v in data["Data"].items(): - try: - if type(v) is dict: - if k == "Online": - order = 1 - elif k == "Download": - order = 0 - else: - order = 2 - - itemlist.append(item.clone(action="", title=k, text_color=color3, order=order)) - if type(v["Item"]) is str: - continue - elif type(v["Item"]) is dict: - v["Item"] = [v["Item"]] - for it in v["Item"]: - try: - thumbnail = "%s/styles/prosilver/imageset/%s.png" % (host, it['Host']) - title = " %s - %s/%s" % (it['Host'].capitalize(), it['Quality'], it['Lang']) - calidad = int(scrapertools.find_single_match(it['Quality'], '(\d+)p')) - calidadaudio = it['QualityA'].replace("...", "") - subtitulos = it['Subtitles'].replace("Sin subtítulos", "") - if subtitulos: - title += " (%s)" % subtitulos - if calidadaudio: - title += " [Audio:%s]" % calidadaudio - - likes = 0 - if it["Likes"] != "0" or it["Dislikes"] != "0": - likes = int(it["Likes"]) - int(it["Dislikes"]) - title += " (%s ok, %s ko)" % (it["Likes"], it["Dislikes"]) - if type(it["Url"]) is dict: - for i, enlace in enumerate(it["Url"]["Item"]): - titulo = title + " (Parte %s)" % (i + 1) - itemlist.append(item.clone(title=titulo, url=enlace, action="play", calidad=calidad, - thumbnail=thumbnail, order=order, like=likes, ficha=ficha, - cid=cid, folder=False)) - else: - url = it["Url"] - itemlist.append(item.clone(title=title, url=url, action="play", calidad=calidad, - thumbnail=thumbnail, order=order, like=likes, ficha=ficha, - cid=cid, folder=False)) - except: - pass - except: - pass - - if not config.get_setting("order_web", "playmax"): - itemlist.sort(key=lambda it: (it.order, it.calidad, it.like), reverse=True) - else: - itemlist.sort(key=lambda it: it.order, reverse=True) - if itemlist: - itemlist.extend(acciones_fichas(item, sid, ficha)) - - if not itemlist and item.contentType != "movie": - url = url.replace("apikey=%s&" % apikey, "") - data = httptools.downloadpage(url).data - data = re.sub(r"\n|\r|\t|\s{2}| |<br>", "", data) - - patron = '<div id="f_fde_c"[^>]+>(.*?update_fecha\(\d+\)">)</div>' - estrenos = scrapertools.find_multiple_matches(data, patron) - for info in estrenos: - info = "Estreno en " + scrapertools.htmlclean(info) - itemlist.append(item.clone(action="", title=info)) - - if not itemlist: - itemlist.append(item.clone(action="", title="No hay enlaces disponibles")) - - return itemlist - - -def menu_info(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| |<br>", "", data) - - item.infoLabels["tmdb_id"] = scrapertools.find_single_match(data, '<a href="https://www.themoviedb.org/[^/]+/(\d+)') - item.infoLabels["year"] = scrapertools.find_single_match(data, 'class="e_new">(\d{4})') - item.infoLabels["plot"] = scrapertools.find_single_match(data, 'itemprop="description">([^<]+)</div>') - item.infoLabels["genre"] = ", ".join(scrapertools.find_multiple_matches(data, - '<a itemprop="genre"[^>]+>([^<]+)</a>')) - if __modo_grafico__: - tmdb.set_infoLabels_item(item, __modo_grafico__) - - action = "findvideos" - title = "Ver enlaces" - if item.contentType == "tvshow": - action = "episodios" - title = "Ver capítulos" - itemlist.append(item.clone(action=action, title=title)) - - carpeta = "CINE" - tipo = "película" - action = "add_pelicula_to_library" - extra = "" - if item.contentType == "tvshow": - carpeta = "SERIES" - tipo = "serie" - action = "add_serie_to_library" - extra = "episodios###library" - - library_path = config.get_videolibrary_path() - if config.get_videolibrary_support(): - title = "Añadir %s a la videoteca" % tipo - if item.infoLabels["imdb_id"] and not library_path.lower().startswith("smb://"): - try: - from core import filetools - path = filetools.join(library_path, carpeta) - files = filetools.walk(path) - for dirpath, dirname, filename in files: - if item.infoLabels["imdb_id"] in dirpath: - namedir = dirpath.replace(path, '')[1:] - for f in filename: - if f != namedir + ".nfo" and f != "tvshow.nfo": - continue - from core import videolibrarytools - head_nfo, it = videolibrarytools.read_nfo(filetools.join(dirpath, f)) - canales = it.library_urls.keys() - canales.sort() - if "playmax" in canales: - canales.pop(canales.index("playmax")) - canales.insert(0, "[COLOR red]playmax[/COLOR]") - title = "%s ya en tu videoteca. [%s] ¿Añadir?" % (tipo.capitalize(), ",".join(canales)) - break - except: - import traceback - logger.error(traceback.format_exc()) - pass - - itemlist.append(item.clone(action=action, title=title, text_color=color5, extra=extra)) - - token_auth = config.get_setting("token_trakt", "tvmoviedb") - if token_auth and item.infoLabels["tmdb_id"]: - extra = "movie" - if item.contentType != "movie": - extra = "tv" - itemlist.append(item.clone(channel="tvmoviedb", title="[Trakt] Gestionar con tu cuenta", action="menu_trakt", - extra=extra)) - itemlist.append(item.clone(channel="trailertools", action="buscartrailer", title="Buscar Tráiler", - text_color="magenta", context="")) - - itemlist.append(item.clone(action="", title="")) - ficha = scrapertools.find_single_match(item.url, '-f(\d+)-') - if not ficha: - ficha = scrapertools.find_single_match(item.url, 'f=(\d+)') - - itemlist.extend(acciones_fichas(item, sid, ficha, season=True)) - itemlist.append(item.clone(action="acciones_cuenta", title="Añadir a una lista", text_color=color3, ficha=ficha)) - - return itemlist - - -def acciones_fichas(item, sid, ficha, season=False): - marcarlist = [] - new_item = item.clone() - new_item.infoLabels.pop("duration", None) - estados = [{'following': 'seguir'}, {'favorite': 'favorita'}, {'view': 'vista'}, {'slope': 'pendiente'}] - url = "https://playmax.mx/ficha.php?apikey=%s&sid=%s&f=%s" % (apikey, sid, ficha) - data = httptools.downloadpage(url).data - data = xml2dict(data) - - try: - marked = data["Data"]["User"]["Marked"] - if new_item.contentType == "episode": - for epi in data["Data"]["Episodes"]["Season_%s" % new_item.infoLabels["season"]]["Item"]: - if int(epi["Episode"]) == new_item.infoLabels["episode"]: - epi_marked = epi["EpisodeViewed"].replace("yes", "ya") - epi_id = epi["Id"] - marcarlist.append(new_item.clone(action="marcar", title="Capítulo %s visto. ¿Cambiar?" % epi_marked, - text_color=color3, epi_id=epi_id)) - break - except: - pass - - try: - tipo = new_item.contentType.replace("movie", "Película").replace("episode", "Serie").replace("tvshow", "Serie") - for status in estados: - for k, v in status.items(): - if k != marked: - title = "Marcar %s como %s" % (tipo.lower(), v) - action = "marcar" - else: - title = "%s marcada como %s" % (tipo, v) - action = "" - if k == "following" and tipo == "Película": - continue - elif k == "following" and tipo == "Serie": - title = title.replace("seguir", "seguida") - if k != marked: - title = "Seguir serie" - action = "marcar" - marcarlist.insert(1, new_item.clone(action=action, title=title, text_color=color4, ficha=ficha, - folder=False)) - continue - - marcarlist.append(new_item.clone(action="marcar", title=title, text_color=color3, ficha=ficha, - folder=False)) - except: - pass - - try: - if season and item.contentType == "tvshow": - seasonlist = [] - for k, v in data["Data"]["Episodes"].items(): - vistos = False - season = k.rsplit("_", 1)[1] - if type(v) is str: - continue - elif type(v["Item"]) is not list: - v["Item"] = [v["Item"]] - - for epi in v["Item"]: - if epi["EpisodeViewed"] == "no": - vistos = True - seasonlist.append( - new_item.clone(action="marcar", title="Marcar temporada %s como vista" % season, - text_color=color1, season=int(season), ficha=ficha, folder=False)) - break - - if not vistos: - seasonlist.append( - new_item.clone(action="marcar", title="Temporada %s ya vista. ¿Revertir?" % season, - text_color=color1, season=int(season), ficha=ficha, folder=False)) - - seasonlist.sort(key=lambda it: it.season, reverse=True) - marcarlist.extend(seasonlist) - except: - pass - return marcarlist - - -def acciones_cuenta(item): - logger.info() - itemlist = [] - - if "Tus fichas" in item.title: - itemlist.append(item.clone(title="Capítulos", url="tf_block_c a", contentType="tvshow")) - itemlist.append(item.clone(title="Series", url="tf_block_s", contentType="tvshow")) - itemlist.append(item.clone(title="Películas", url="tf_block_p")) - itemlist.append(item.clone(title="Documentales", url="tf_block_d")) - return itemlist - elif "Añadir a una lista" in item.title: - data = httptools.downloadpage(host + "/c_listas.php?apikey=%s&sid=%s" % (apikey, sid)).data - data = xml2dict(data) - itemlist.append(item.clone(title="Crear nueva lista", folder=False)) - if data["Data"]["TusListas"] != "\t": - import random - data = data["Data"]["TusListas"]["Item"] - if type(data) is not list: - data = [data] - for child in data: - image = "" - title = "%s (%s fichas)" % (child["Title"], child["FichasInList"]) - images = [] - for i in range(1, 5): - if "sinimagen.png" not in child["Poster%s" % i]: - images.append(child["Poster%s" % i].replace("/100/", "/400/")) - if images: - image = images[random.randint(0, len(images) - 1)] - url = host + "/data.php?mode=add_listas&apikey=%s&sid=%s&ficha_id=%s" % (apikey, sid, item.ficha) - post = "lista_id[]=%s" % child["Id"] - itemlist.append(item.clone(title=title, url=url, post=post, thumbnail=image, folder=False)) - - return itemlist - elif "Crear nueva lista" in item.title: - from platformcode import platformtools - nombre = platformtools.dialog_input("", "Introduce un nombre para la lista") - if nombre: - dict_priv = {0: 'Pública', 1: 'Privada'} - priv = platformtools.dialog_select("Privacidad de la lista", ['Pública', 'Privada']) - if priv != -1: - url = host + "/data.php?mode=create_list&apikey=%s&sid=%s" % (apikey, sid) - post = "name=%s&private=%s" % (nombre, priv) - data = httptools.downloadpage(url, post) - platformtools.dialog_notification("Lista creada correctamente", - "Nombre: %s - %s" % (nombre, dict_priv[priv])) - platformtools.itemlist_refresh() - return - elif re.search(r"(?i)Seguir Lista", item.title): - from platformcode import platformtools - data = httptools.downloadpage(item.url) - platformtools.dialog_notification("Operación realizada con éxito", "Lista: %s" % item.lista) - return - elif item.post: - from platformcode import platformtools - data = httptools.downloadpage(item.url, item.post).data - platformtools.dialog_notification("Ficha añadida a la lista", "Lista: %s" % item.title) - platformtools.itemlist_refresh() - return - - data = httptools.downloadpage("https://playmax.mx/tusfichas.php").data - data = re.sub(r"\n|\r|\t|\s{2}| |<br>", "", data) - - bloque = scrapertools.find_single_match(data, item.url + '">(.*?)(?:<div class="tf_blocks|<div class="tf_o_move">)') - matches = scrapertools.find_multiple_matches(bloque, '<div class="tf_menu_mini">([^<]+)<(.*?)<cb></cb></div>') - for category, contenido in matches: - itemlist.append(item.clone(action="", title=category, text_color=color3)) - - patron = '<div class="c_fichas_image"[^>]*>[^<]*<[^>]+href="\.([^"]+)".*?src="([^"]+)".*?serie="([^"]*)".*?' \ - '<div class="c_fichas_title">(?:<div class="c_fichas_episode">([^<]+)</div>|)([^<]+)</div>' - entradas = scrapertools.find_multiple_matches(contenido, patron) - for scrapedurl, scrapedthumbnail, serie, episodio, scrapedtitle in entradas: - tipo = "movie" - scrapedurl = host + scrapedurl - scrapedthumbnail = host + scrapedthumbnail - action = "findvideos" - if __menu_info__: - action = "menu_info" - if serie: - tipo = "tvshow" - if episodio: - title = " %s - %s" % (episodio.replace("X", "x"), scrapedtitle) - else: - title = " " + scrapedtitle - - new_item = Item(channel=item.channel, action=action, title=title, url=scrapedurl, - thumbnail=scrapedthumbnail, contentTitle=scrapedtitle, contentType=tipo, - text_color=color2) - if new_item.contentType == "tvshow": - new_item.show = scrapedtitle - if not __menu_info__: - new_item.action = "episodios" - - itemlist.append(new_item) - - return itemlist - - -def marcar(item): - logger.info() - - if "Capítulo" in item.title: - url = "%s/data.php?mode=capitulo_visto&apikey=%s&sid=%s&c_id=%s" % (host, apikey, sid, item.epi_id) - message = item.title.replace("no", "marcado como").replace("ya", "cambiado a no").replace(" ¿Cambiar?", "") - elif "temporada" in item.title.lower(): - type_marcado = "1" - if "como vista" in item.title: - message = "Temporada %s marcada como vista" % item.season - else: - type_marcado = "2" - message = "Temporada %s marcada como no vista" % item.season - url = "%s/data.php?mode=temporada_vista&apikey=%s&sid=%s&ficha=%s&t_id=%s&type=%s" \ - % (host, apikey, sid, item.ficha, item.season, type_marcado) - else: - message = item.title.replace("Marcar ", "Marcada ").replace("Seguir serie", "Serie en seguimiento") - if "favorita" in item.title: - url = "%s/data.php?mode=marcar_ficha&apikey=%s&sid=%s&ficha=%s&tipo=%s" \ - % (host, apikey, sid, item.ficha, "3") - elif "pendiente" in item.title: - url = "%s/data.php?mode=marcar_ficha&apikey=%s&sid=%s&ficha=%s&tipo=%s" \ - % (host, apikey, sid, item.ficha, "2") - elif "vista" in item.title: - url = "%s/data.php?mode=marcar_ficha&apikey=%s&sid=%s&ficha=%s&tipo=%s" \ - % (host, apikey, sid, item.ficha, "4") - elif "Seguir" in item.title: - url = "%s/data.php?mode=marcar_ficha&apikey=%s&sid=%s&ficha=%s&tipo=%s" \ - % (host, apikey, sid, item.ficha, "2") - data = httptools.downloadpage(url) - url = "%s/data.php?mode=marcar_ficha&apikey=%s&sid=%s&ficha=%s&tipo=%s" \ - % (host, apikey, sid, item.ficha, "1") - - data = httptools.downloadpage(url) - if data.sucess and config.get_platform() != "plex" and item.action != "play": - from platformcode import platformtools - platformtools.dialog_notification("Acción correcta", message) - - -def listas(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url).data - data = xml2dict(data) - if item.extra == "listas": - itemlist.append(Item(channel=item.channel, title="Listas más seguidas", action="listas", text_color=color1, - url=item.url + "&orden=1", extra="listas_plus")) - itemlist.append(Item(channel=item.channel, title="Listas con más fichas", action="listas", text_color=color1, - url=item.url + "&orden=2", extra="listas_plus")) - itemlist.append(Item(channel=item.channel, title="Listas aleatorias", action="listas", text_color=color1, - url=item.url + "&orden=3", extra="listas_plus")) - if data["Data"]["ListasSiguiendo"] != "\t": - itemlist.append(Item(channel=item.channel, title="Listas que sigo", action="listas", text_color=color1, - url=item.url, extra="sigo")) - if data["Data"]["TusListas"] != "\t": - itemlist.append(Item(channel=item.channel, title="Mis listas", action="listas", text_color=color1, - url=item.url, extra="mislistas")) - - return itemlist - - elif item.extra == "sigo": - data = data["Data"]["ListasSiguiendo"]["Item"] - elif item.extra == "mislistas": - data = data["Data"]["TusListas"]["Item"] - else: - data = data["Data"]["Listas"]["Item"] - - if type(data) is not list: - data = [data] - import random - for child in data: - image = "" - title = "%s (%s fichas)" % (child["Title"], child["FichasInList"]) - images = [] - for i in range(1, 5): - if "sinimagen.png" not in child["Poster%s" % i]: - images.append(child["Poster%s" % i].replace("/100/", "/400/")) - if images: - image = images[random.randint(0, len(images) - 1)] - url = host + "/l%s" % child["Id"] - itemlist.append(Item(channel=item.channel, action="fichas", url=url, text_color=color3, - thumbnail=image, title=title, extra=item.extra)) - - if len(itemlist) == 20: - start = scrapertools.find_single_match(item.url, 'start=(\d+)') - end = int(start) + 20 - url = re.sub(r'start=%s' % start, 'start=%s' % end, item.url) - itemlist.append(item.clone(title=">> Página Siguiente", url=url)) - - return itemlist - - -def play(item): - logger.info() - from core import servertools - - devuelve = servertools.findvideos(item.url, True) - if devuelve: - item.url = devuelve[0][1] - item.server = devuelve[0][2] - - if config.get_setting("mark_play", "playmax"): - if item.contentType == "movie": - marcar(item.clone(title="marcar como vista")) - else: - marcar(item.clone(title="Capítulo", epi_id=item.cid)) - - return [item] - - -def select_page(item): - import xbmcgui - dialog = xbmcgui.Dialog() - number = dialog.numeric(0, "Introduce el número de página") - if number != "": - number = int(number) * 60 - item.url = re.sub(r'start=(\d+)', "start=%s" % number, item.url) - - return fichas(item) - - -def xml2dict(xmldata): - """ - Lee un fichero o texto XML y retorna un diccionario json - - Parametros: - file (str) -- Ruta completa al archivo XML que se desea convertir en JSON. - xmldata (str) -- Texto XML que se desea convertir en JSON. - - Retorna: - Un diccionario construido a partir de los campos del XML. - - """ - import sys - parse = globals().get(sys._getframe().f_code.co_name) - - matches = re.compile("<(?P<tag>[^>]+)>[\n]*[\s]*[\t]*(?P<value>.*?)[\n]*[\s]*[\t]*<\/(?P=tag)\s*>", - re.DOTALL).findall(xmldata) - - return_dict = {} - for tag, value in matches: - # Si tiene elementos - if "<" and "</" in value: - if tag in return_dict: - if type(return_dict[tag]) == list: - return_dict[tag].append(parse(value)) - else: - return_dict[tag] = [return_dict[tag]] - return_dict[tag].append(parse(value)) - else: - return_dict[tag] = parse(value) - - else: - if tag in return_dict: - if type(return_dict[tag]) == list: - return_dict[tag].append(value) - else: - return_dict[tag] = [return_dict[tag]] - return_dict[tag].append(value) - else: - if value in ["true", "false"]: - if value == "true": - value = True - else: - value = False - - return_dict[tag] = value - - return return_dict diff --git a/plugin.video.alfa/resources/media/channels/banner/grantorrent.png b/plugin.video.alfa/resources/media/channels/banner/grantorrent.png new file mode 100644 index 00000000..613bb77a Binary files /dev/null and b/plugin.video.alfa/resources/media/channels/banner/grantorrent.png differ diff --git a/plugin.video.alfa/resources/media/channels/banner/playmax.png b/plugin.video.alfa/resources/media/channels/banner/playmax.png deleted file mode 100755 index 195a4458..00000000 Binary files a/plugin.video.alfa/resources/media/channels/banner/playmax.png and /dev/null differ diff --git a/plugin.video.alfa/resources/media/channels/fanart/grantorrent.png b/plugin.video.alfa/resources/media/channels/fanart/grantorrent.png new file mode 100644 index 00000000..c6df9302 Binary files /dev/null and b/plugin.video.alfa/resources/media/channels/fanart/grantorrent.png differ diff --git a/plugin.video.alfa/resources/media/channels/thumb/grantorrent.jpg b/plugin.video.alfa/resources/media/channels/thumb/grantorrent.jpg new file mode 100644 index 00000000..cc43f6f4 Binary files /dev/null and b/plugin.video.alfa/resources/media/channels/thumb/grantorrent.jpg differ diff --git a/plugin.video.alfa/resources/media/channels/thumb/playmax.png b/plugin.video.alfa/resources/media/channels/thumb/playmax.png deleted file mode 100644 index 6a78b473..00000000 Binary files a/plugin.video.alfa/resources/media/channels/thumb/playmax.png and /dev/null differ