Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 42.01 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. # ------------------------------------------------------------
  3. # pelisalacarta - XBMC Plugin
  4. # Canal para playmax
  5. # http://blog.tvalacarta.info/plugin-xbmc/pelisalacarta/
  6. # ------------------------------------------------------------
  7.  
  8. import re
  9.  
  10. from core import config
  11. from core import httptools
  12. from core import jsontools as json
  13. from core import logger
  14. from core import scrapertools
  15. from core import tmdb
  16. from core.item import Item
  17.  
  18. sid = config.get_setting("sid_playmax", "playmax")
  19. apikey = "0ea143087685e9e0a23f98ae"
  20. __modo_grafico__ = config.get_setting('modo_grafico', 'playmax')
  21. __perfil__ = config.get_setting('perfil', "playmax")
  22. __menu_info__ = config.get_setting('menu_info', 'playmax')
  23.  
  24. # Fijar perfil de color            
  25. perfil = [['0xFFFFE6CC', '0xFFFFCE9C', '0xFF994D00', '0xFFFE2E2E', '0xFF088A08'],
  26.           ['0xFFA5F6AF', '0xFF5FDA6D', '0xFF11811E', '0xFFFE2E2E', '0xFF088A08'],
  27.           ['0xFF58D3F7', '0xFF2E9AFE', '0xFF2E64FE', '0xFFFE2E2E', '0xFF088A08']]
  28.  
  29. if __perfil__ - 1 >= 0:
  30.     color1, color2, color3, color4, color5 = perfil[__perfil__-1]
  31. else:
  32.     color1 = color2 = color3 = color4 = color5 = ""
  33.  
  34. host = "https://playmax.mx"
  35.  
  36.  
  37. def login():
  38.     logger.info()
  39.  
  40.     try:
  41.         user = config.get_setting("playmaxuser", "playmax")
  42.         password = config.get_setting("playmaxpassword", "playmax")
  43.         if user == "" and password == "":
  44.             return False, "Para ver los enlaces de este canal es necesario registrarse en playmax.mx"
  45.         elif user == "" or password == "":
  46.             return False, "Usuario o contraseña en blanco. Revisa tus credenciales"
  47.  
  48.         data = httptools.downloadpage("https://playmax.mx/ucp.php?mode=login").data
  49.         if re.search(r'(?i)class="hb_user_data" title="%s"' % user, data):
  50.             if not config.get_setting("sid_playmax", "playmax"):
  51.                 sid_ = scrapertools.find_single_match(data, 'sid=([^"]+)"')
  52.                 if not sid_:
  53.                     sid_ = scrapertools.find_single_match(config.get_cookie_data(), 'playmax.*?_sid\s*([A-z0-9]+)')
  54.                 config.set_setting("sid_playmax", sid_, "playmax")
  55.             return True, ""
  56.  
  57.         confirm_id = scrapertools.find_single_match(data, 'name="confirm_id" value="([^"]+)"')
  58.         sid_log = scrapertools.find_single_match(data, 'name="sid" value="([^"]+)"')
  59.         post = "username=%s&password=%s&autologin=on&agreed=true&change_lang=0&confirm_id=%s&login=&sid=%s" \
  60.                "&redirect=index.php&login=Entrar" % (user, password, confirm_id, sid_log)
  61.         data = httptools.downloadpage("https://playmax.mx/ucp.php?mode=login", post=post).data
  62.         if "contraseña incorrecta" in data:
  63.             logger.error("Error en el login")
  64.             return False, "Contraseña errónea. Comprueba tus credenciales"
  65.         elif "nombre de usuario incorrecto" in data:
  66.             logger.error("Error en el login")
  67.             return False, "Nombre de usuario no válido. Comprueba tus credenciales"            
  68.         else:
  69.             logger.info("Login correcto")
  70.             sid_ = scrapertools.find_single_match(data, 'sid=([^"]+)"')
  71.             if not sid_:
  72.                 sid_ = scrapertools.find_single_match(config.get_cookie_data(), 'playmax.*?_sid\s*([A-z0-9]+)')
  73.             config.set_setting("sid_playmax", sid_, "playmax")
  74.             # En el primer logueo se activa la busqueda global y la seccion novedades
  75.             if not config.get_setting("primer_log", "playmax"):
  76.                 config.set_setting("include_in_global_search", True, "playmax")
  77.                 config.set_setting("include_in_newest_peliculas", True, "playmax")
  78.                 config.set_setting("include_in_newest_series", True, "playmax")
  79.                 config.set_setting("include_in_newest_infantiles", True, "playmax")
  80.                 config.set_setting("primer_log", False, "playmax")
  81.             return True, ""
  82.     except:
  83.         import traceback
  84.         logger.error(traceback.format_exc())
  85.         return False, "Error en el login. Comprueba tus credenciales o si la web está operativa"
  86.  
  87.  
  88. def mainlist(item):
  89.     logger.info()
  90.     itemlist = []
  91.     item.text_color = color1
  92.  
  93.     logueado, error_message = login()
  94.  
  95.     if not logueado:
  96.         config.set_setting("include_in_global_search", False, "playmax")
  97.         itemlist.append(item.clone(title=error_message, action="configuracion", folder=False))
  98.         return itemlist
  99.  
  100.     itemlist.append(item.clone(title="Películas", action="", text_color=color2))
  101.     item.contentType = "movie"
  102.     itemlist.append(item.clone(title="     Novedades", action="fichas", url=host+"/catalogo.php?tipo[]=2&ad=2&ordenar="
  103.                                                                                  "novedades&con_dis=on"))
  104.     itemlist.append(item.clone(title="     Populares", action="fichas", url=host+"/catalogo.php?tipo[]=2&ad=2&ordenar="
  105.                                                                                  "pop&con_dis=on"))
  106.     itemlist.append(item.clone(title="     Índices", action="indices"))
  107.  
  108.     itemlist.append(item.clone(title="Series", action="", text_color=color2))
  109.     item.contentType = "tvshow"
  110.     itemlist.append(item.clone(title="     Nuevos capítulos", action="fichas", url=host+"/catalogo.php?tipo[]=1&ad=2&"
  111.                                                                                         "ordenar=novedades&con_dis=on"))
  112.     itemlist.append(item.clone(title="     Nuevas series", action="fichas", url=host+"/catalogo.php?tipo[]=1&ad=2&"
  113.                                                                                      "ordenar=año&con_dis=on"))
  114.     itemlist.append(item.clone(title="     Índices", action="indices"))
  115.  
  116.     item.contentType = "movie"
  117.     itemlist.append(item.clone(title="Documentales", action="fichas", text_color=color2,
  118.                                url=host+"/catalogo.php?&tipo[]=3&ad=2&ordenar=novedades&con_dis=on"))
  119.     itemlist.append(item.clone(title="Listas", action="listas", text_color=color2,
  120.                                url=host+"/listas.php?apikey=%s&sid=%s&start=0" % (apikey, sid), extra="listas"))
  121.     itemlist.append(item.clone(action="search", title="Buscar...", text_color=color2))
  122.     itemlist.append(item.clone(action="acciones_cuenta", title="Tus fichas", text_color=color4))
  123.     itemlist.append(item.clone(title="Configuración del canal", action="configuracion", text_color="gold"))
  124.  
  125.     return itemlist
  126.  
  127.  
  128. def search(item, texto):
  129.     logger.info()
  130.     item.url = "%s/buscar.php?apikey=%s&sid=%s&buscar=%s&modo=[fichas]&start=0" % (host, apikey, sid, texto)
  131.     try:
  132.         return busqueda(item)
  133.     except:
  134.         import sys
  135.         for line in sys.exc_info():
  136.             logger.error("%s" % line)
  137.         return []
  138.  
  139.  
  140. def busqueda(item):
  141.     logger.info()
  142.     itemlist = []
  143.  
  144.     data = httptools.downloadpage(item.url).data
  145.     data = json.xmlTojson(xmldata = data)
  146.  
  147.     for f in data["Data"]["Fichas"]["Ficha"]:
  148.         f["Title"] = f["Title"].replace("<![CDATA[", "").replace("]]>", "")
  149.         title = "%s  (%s)" % (f["Title"], f["Year"])
  150.         infolab = {'year': f["Year"]}
  151.         thumbnail = f["Poster"]
  152.         url = "%s/ficha.php?f=%s" % (host, f["Id"])
  153.         action = "findvideos"
  154.         if __menu_info__:
  155.             action = "menu_info"
  156.         if f["IsSerie"] == "1":
  157.             tipo = "tvshow"
  158.             show = f["Title"]
  159.             if not __menu_info__:
  160.                 action = "episodios"
  161.         else:
  162.             tipo = "movie"
  163.             show = ""
  164.  
  165.         itemlist.append(Item(channel=item.channel, action=action, title=title, url=url, text_color=color2,
  166.                              contentTitle=f["Title"], show=show, contentType=tipo, infoLabels=infolab,
  167.                              thumbnail=thumbnail))
  168.  
  169.     if __modo_grafico__:
  170.         tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__)
  171.  
  172.     total = int(data["Data"]["totalResultsFichas"])
  173.     actualpage = int(scrapertools.find_single_match(item.url, "start=(\d+)"))
  174.     if actualpage + 20 < total:
  175.         next_page = item.url.replace("start=%s" % actualpage, "start=%s" % (actualpage+20))
  176.         itemlist.append(Item(channel=item.channel, action="busqueda", title=">> Página Siguiente",
  177.                              url=next_page, thumbnail=item.thumbnail))
  178.  
  179.     return itemlist
  180.  
  181.  
  182. def configuracion(item):
  183.     from platformcode import platformtools
  184.     ret = platformtools.show_channel_settings()
  185.     platformtools.itemlist_refresh()
  186.     return ret
  187.  
  188.  
  189. def newest(categoria):
  190.     logger.info()
  191.     itemlist = []
  192.     item = Item()
  193.     try:
  194.         if categoria == 'series':
  195.             item.channel = "playmax"
  196.             item.extra = "newest"
  197.             item.url = host+"/catalogo.php?tipo[]=1&ad=2&ordenar=novedades&con_dis=on"
  198.             item.contentType = "tvshow"
  199.             itemlist = fichas(item)
  200.  
  201.             if itemlist[-1].action == "fichas":
  202.                 itemlist.pop()
  203.         elif categoria == 'peliculas':
  204.             item.channel = "playmax"
  205.             item.extra = "newest"
  206.             item.url = host+"/catalogo.php?tipo[]=2&ad=2&ordenar=novedades&con_dis=on"
  207.             item.contentType = "movie"
  208.             itemlist = fichas(item)
  209.  
  210.             if itemlist[-1].action == "fichas":
  211.                 itemlist.pop()
  212.         elif categoria == 'infantiles':
  213.             item.channel = "playmax"
  214.             item.extra = "newest"
  215.             item.url = host+"/catalogo.php?tipo[]=2&genero[]=60&ad=2&ordenar=novedades&con_dis=on"
  216.             item.contentType = "movie"
  217.             itemlist = fichas(item)
  218.  
  219.             if itemlist[-1].action == "fichas":
  220.                 itemlist.pop()
  221.  
  222.     # Se captura la excepción, para no interrumpir al canal novedades si un canal falla
  223.     except:
  224.         import sys
  225.         for line in sys.exc_info():
  226.             logger.error("{0}".format(line))
  227.         return []
  228.  
  229.     return itemlist
  230.  
  231.  
  232. def indices(item):
  233.     logger.info()
  234.     itemlist = []
  235.  
  236.     tipo = "2"
  237.     if item.contentType == "tvshow":
  238.         tipo = "1"
  239.     if "Índices" in item.title:
  240.         if item.contentType == "tvshow":
  241.             itemlist.append(item.clone(title="Populares", action="fichas", url=host+"/catalogo.php?tipo[]=1&ad=2&"
  242.                                                                                     "ordenar=pop&con_dis=on"))
  243.         itemlist.append(item.clone(title="Más vistas", action="fichas", url=host+"/catalogo.php?tipo[]=%s&ad=2&"
  244.                                                                                  "ordenar=siempre&con_dis=on" % tipo))
  245.         itemlist.append(item.clone(title="Mejor valoradas", action="fichas", url=host+"/catalogo.php?tipo[]=%s&ad=2&"
  246.                                                                                  "ordenar=valoracion&con_dis=on" % tipo))
  247.         itemlist.append(item.clone(title="Géneros", url=host+"/catalogo.php"))
  248.         itemlist.append(item.clone(title="Idiomas", url=host+"/catalogo.php"))
  249.         if item.contentType == "movie":
  250.             itemlist.append(item.clone(title="Por calidad", url=host+"/catalogo.php"))
  251.         itemlist.append(item.clone(title="Por año"))
  252.         itemlist.append(item.clone(title="Por país", url=host+"/catalogo.php"))
  253.  
  254.         return itemlist
  255.  
  256.     if "Géneros" in item.title:
  257.         data = httptools.downloadpage(item.url).data
  258.         patron = '<div class="sel gen" value="([^"]+)">([^<]+)</div>'
  259.         matches = scrapertools.find_multiple_matches(data, patron)
  260.         for value, genero in matches:
  261.             url = item.url + "?tipo[]=%s&generos[]=%s&ad=2&ordenar=novedades&con_dis=on" % (tipo, value)
  262.             itemlist.append(item.clone(action="fichas", title=genero, url=url))
  263.     elif "Idiomas" in item.title:
  264.         data = httptools.downloadpage(item.url).data
  265.         bloque = scrapertools.find_single_match(data, 'oname="Idioma">Cualquier(.*?)<input')
  266.         patron = '<div class="sel" value="([^"]+)">([^<]+)</div>'
  267.         matches = scrapertools.find_multiple_matches(bloque, patron)
  268.         for value, idioma in matches:
  269.             url = item.url + "?tipo[]=%s&ad=2&ordenar=novedades&con_dis=on&e_idioma=%s" % (tipo, value)
  270.             itemlist.append(item.clone(action="fichas", title=idioma, url=url))
  271.     elif "calidad" in item.title:
  272.         data = httptools.downloadpage(item.url).data
  273.         bloque = scrapertools.find_single_match(data, 'oname="Calidad">Cualquier(.*?)<input')
  274.         patron = '<div class="sel" value="([^"]+)">([^<]+)</div>'
  275.         matches = scrapertools.find_multiple_matches(bloque, patron)
  276.         for value, calidad in matches:
  277.             url = item.url + "?tipo[]=%s&ad=2&ordenar=novedades&con_dis=on&e_calidad=%s" % (tipo, value)
  278.             itemlist.append(item.clone(action="fichas", title=calidad, url=url))
  279.     elif "país" in item.title:
  280.         data = httptools.downloadpage(item.url).data
  281.         bloque = scrapertools.find_single_match(data, 'oname="País">Todos(.*?)<input')
  282.         patron = '<div class="sel" value="([^"]+)">([^<]+)</div>'
  283.         matches = scrapertools.find_multiple_matches(bloque, patron)
  284.         for value, pais in matches:
  285.             url = item.url + "?tipo[]=%s&ad=2&ordenar=novedades&con_dis=on&pais=%s" % (tipo, value)
  286.             itemlist.append(item.clone(action="fichas", title=pais, url=url))
  287.     else:
  288.         from datetime import datetime
  289.         year = datetime.now().year
  290.         for i in range(year, 1899, -1):
  291.             url = "%s/catalogo.php?tipo[]=%s&del=%s&al=%s&año=personal&ad=2&ordenar=novedades&con_dis=on" \
  292.                   % (host, tipo, i, i)
  293.             itemlist.append(item.clone(action="fichas", title=str(i), url=url))
  294.  
  295.     return itemlist
  296.  
  297.  
  298. def fichas(item):
  299.     logger.info()
  300.     itemlist = []
  301.  
  302.     data = httptools.downloadpage(item.url).data
  303.  
  304.     fichas_marca = {'1': 'Siguiendo', '2': 'Pendiente', '3': 'Favorita', '4': 'Vista', '5': 'Abandonada'}
  305.     patron = '<div class="c_fichas_image"[^>]*>[^<]*<[^>]+href="\.([^"]+)".*?src="\.([^"]+)".*?' \
  306.              '<div class="c_fichas_data".*?marked="([^"]*)".*?serie="([^"]*)".*?' \
  307.              '<div class="c_fichas_title">(?:<div class="c_fichas_episode">([^<]+)</div>|)([^<]+)</div>'
  308.     matches = scrapertools.find_multiple_matches(data, patron)
  309.     for scrapedurl, scrapedthumbnail, marca, serie, episodio, scrapedtitle in matches:
  310.         tipo = "movie"
  311.         scrapedurl = host + scrapedurl.rsplit("-dc=")[0]
  312.         if not "-dc=" in scrapedurl:
  313.             scrapedurl += "-dc="
  314.         scrapedthumbnail = host + scrapedthumbnail
  315.         action = "findvideos"
  316.         if __menu_info__:
  317.             action = "menu_info"
  318.         if serie:
  319.             tipo = "tvshow"
  320.         if episodio:
  321.             title = "%s - %s" % (episodio.replace("X", "x"), scrapedtitle)
  322.         else:
  323.             title = scrapedtitle
  324.  
  325.         if marca:
  326.             title += "  [COLOR %s][%s][/COLOR]" % (color4, fichas_marca[marca])
  327.  
  328.         new_item = Item(channel=item.channel, action=action, title=title, url=scrapedurl,
  329.                         thumbnail=scrapedthumbnail, contentTitle=scrapedtitle, contentType=tipo,
  330.                         text_color=color2)
  331.         if new_item.contentType == "tvshow":
  332.             new_item.show = scrapedtitle
  333.             if not __menu_info__:
  334.                 new_item.action = "episodios"
  335.  
  336.         itemlist.append(new_item)
  337.  
  338.     if itemlist and (item.extra == "listas_plus" or item.extra == "sigo"):
  339.         follow = scrapertools.find_single_match(data, '<div onclick="seguir_lista.*?>(.*?)<')
  340.         title = "Seguir Lista"
  341.         if follow == "Siguiendo":
  342.             title = "Dejar de seguir lista"
  343.         item.extra = ""
  344.         url = host + "/data.php?mode=seguir_lista&apikey=%s&sid=%s&lista=%s" % (apikey, sid, item.url.rsplit("/l", 1)[1])
  345.         itemlist.insert(0, item.clone(action="acciones_cuenta", title=title, url=url, text_color=color4,
  346.                                       lista=item.title, folder=False))
  347.  
  348.     next_page = scrapertools.find_single_match(data, 'href="([^"]+)" class="next"')
  349.     if next_page:
  350.         next_page = host + next_page.replace("&amp;", "&")
  351.         itemlist.append(Item(channel=item.channel, action="fichas", title=">> Página Siguiente", url=next_page))
  352.  
  353.         try:
  354.             total = int(scrapertools.find_single_match(data, '<span class="page-dots">.*href.*?>(\d+)'))
  355.         except:
  356.             total = 0
  357.         if not config.get_setting("last_page", item.channel) and config.is_xbmc() and total > 2 \
  358.                 and item.extra != "newest":
  359.             itemlist.append(item.clone(action="select_page", title="Ir a página... (Total:%s)" % total, url=next_page,
  360.                                        text_color=color5))
  361.  
  362.     return itemlist
  363.  
  364.  
  365. def episodios(item):
  366.     logger.info()
  367.     itemlist = []
  368.  
  369.     # Descarga la página
  370.     data = httptools.downloadpage(item.url).data
  371.     data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<br>", "", data)
  372.  
  373.     if not item.infoLabels["tmdb_id"]:
  374.         item.infoLabels["tmdb_id"] = scrapertools.find_single_match(data,
  375.                                                                     '<a href="https://www.themoviedb.org/[^/]+/(\d+)')
  376.         item.infoLabels["year"] = scrapertools.find_single_match(data, 'class="e_new">(\d{4})')
  377.     if not item.infoLabels["genre"]:
  378.         item.infoLabels["genre"] = ", ".join(scrapertools.find_multiple_matches(data,
  379.                                                                                 '<a itemprop="genre"[^>]+>([^<]+)</a>'))
  380.     if not item.infoLabels["plot"]:
  381.         item.infoLabels["plot"] = scrapertools.find_single_match(data, 'itemprop="description">([^<]+)</div>')
  382.  
  383.     dc = scrapertools.find_single_match(data, "var dc_ic = '\?dc=([^']+)'")
  384.     patron = '<div class="f_cl_l_c f_cl_l_c_id[^"]+" c_id="([^"]+)" .*?c_num="([^"]+)" c_name="([^"]+)"' \
  385.              '.*?load_f_links\(\d+\s*,\s*(\d+).*?<div class="([^"]+)" onclick="marcar_capitulo'
  386.     matches = scrapertools.find_multiple_matches(data, patron)
  387.     lista_epis = []
  388.     for c_id, episodio, title, ficha, status in matches:
  389.         episodio = episodio.replace("X", "x")
  390.         if episodio in lista_epis:
  391.             continue
  392.         lista_epis.append(episodio)
  393.         url = "https://playmax.mx/c_enlaces_n.php?ficha=%s&c_id=%s&dc=%s" % (ficha, c_id, dc)
  394.         title = "%s - %s" % (episodio, title)
  395.         if "_mc a" in status:
  396.             title = "[COLOR %s]%s[/COLOR] %s"  % (color5, u"\u0474".encode('utf-8'), title)
  397.  
  398.         new_item = Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=item.thumbnail,
  399.                         fanart=item.fanart, show=item.show, infoLabels=item.infoLabels, text_color=color2,
  400.                         referer=item.url, contentType="episode")
  401.         try:
  402.             new_item.infoLabels["season"], new_item.infoLabels["episode"] = episodio.split('x', 1)
  403.         except:
  404.             pass
  405.         itemlist.append(new_item)
  406.  
  407.     itemlist.sort(key=lambda it: (it.infoLabels["season"], it.infoLabels["episode"]), reverse=True)
  408.     if __modo_grafico__:
  409.         tmdb.set_infoLabels_itemlist(itemlist, __modo_grafico__)
  410.  
  411.     library_path = config.get_library_path()
  412.     if config.get_library_support() and not item.extra:
  413.         title = "Añadir serie a la biblioteca"
  414.         if item.infoLabels["imdb_id"] and not library_path.lower().startswith("smb://"):
  415.             try:
  416.                 from core import filetools
  417.                 path = filetools.join(library_path, "SERIES")
  418.                 files = filetools.walk(path)
  419.                 for dirpath, dirname, filename in files:
  420.                     if item.infoLabels["imdb_id"] in dirpath:
  421.                         for f in filename:
  422.                             if f != "tvshow.nfo":
  423.                                 continue
  424.                             from core import library
  425.                             head_nfo, it = library.read_nfo(filetools.join(dirpath, dirname, f))
  426.                             canales = it.library_urls.keys()
  427.                             canales.sort()
  428.                             if "playmax" in canales:
  429.                                 canales.pop(canales.index("playmax"))
  430.                                 canales.insert(0, "[COLOR red]playmax[/COLOR]")
  431.                             title = "Serie ya en tu biblioteca. [%s] ¿Añadir?" % ",".join(canales)
  432.                             break
  433.             except:
  434.                 import traceback
  435.                 logger.error(traceback.format_exc())
  436.                 pass
  437.        
  438.         itemlist.append(item.clone(action="add_serie_to_library", title=title, text_color=color5,
  439.                                    extra="episodios###library"))
  440.     if itemlist and not __menu_info__:
  441.         ficha = scrapertools.find_single_match(item.url, '-f(\d+)-')
  442.         itemlist.extend(acciones_fichas(item, sid, ficha))
  443.  
  444.     return itemlist
  445.  
  446.  
  447. def findvideos(item):
  448.     logger.info()
  449.     itemlist = []
  450.  
  451.     if item.contentType == "movie":
  452.         # Descarga la página
  453.         data = httptools.downloadpage(item.url).data
  454.         data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<br>", "", data)
  455.        
  456.         if not item.infoLabels["tmdb_id"]:
  457.             item.infoLabels["tmdb_id"] = scrapertools.find_single_match(data, '<a href="https://www.themoviedb.org/'
  458.                                                                               '[^/]+/(\d+)')
  459.             item.infoLabels["year"] = scrapertools.find_single_match(data, 'class="e_new">(\d{4})')
  460.  
  461.         if __modo_grafico__:
  462.             tmdb.set_infoLabels_item(item, __modo_grafico__)
  463.         if not item.infoLabels["plot"]:
  464.             item.infoLabels["plot"] = scrapertools.find_single_match(data, 'itemprop="description">([^<]+)</div>')
  465.         if not item.infoLabels["genre"]:
  466.             item.infoLabels["genre"] = ", ".join(scrapertools.find_multiple_matches(data, '<a itemprop="genre"[^>]+>'
  467.                                                                                           '([^<]+)</a>'))
  468.  
  469.         ficha = scrapertools.find_single_match(item.url, '-f(\d+)-')
  470.         if not ficha:
  471.             ficha = scrapertools.find_single_match(item.url, 'f=(\d+)')
  472.         cid = "0"
  473.     else:
  474.         ficha, cid = scrapertools.find_single_match(item.url, 'ficha=(\d+)&c_id=(\d+)')
  475.  
  476.     url = "https://playmax.mx/c_enlaces_n.php?apikey=%s&sid=%s&ficha=%s&cid=%s" % (apikey, sid, ficha, cid)
  477.     data = httptools.downloadpage(url).data
  478.     data = json.xmlTojson(xmldata = data)
  479.  
  480.     for k, v in data["Data"].items():
  481.         try:
  482.             if type(v) is dict:
  483.                 if k == "Online":
  484.                     order = 1
  485.                 elif k == "Download":
  486.                     order = 0
  487.                 else:
  488.                     order = 2
  489.  
  490.                 itemlist.append(item.clone(action="", title=k, text_color=color3, order=order))
  491.                 if type(v["Item"]) is str:
  492.                     continue
  493.                 elif type(v["Item"]) is dict:
  494.                     v["Item"] = [v["Item"]]
  495.                 for it in v["Item"]:
  496.                     thumbnail = "%s/styles/prosilver/imageset/%s.png" % (host, it['Host'])
  497.                     title = "   %s - %s/%s" % (it['Host'].capitalize(), it['Quality'], it['Lang'])
  498.                     calidad = int(scrapertools.find_single_match(it['Quality'], '(\d+)p'))
  499.                     calidadaudio = it['QualityA'].replace("...", "")
  500.                     subtitulos = it['Subtitles'].replace("Sin subtítulos", "")
  501.                     if subtitulos:
  502.                         title += " (%s)" % subtitulos
  503.                     if calidadaudio:
  504.                         title += "  [Audio:%s]" % calidadaudio
  505.  
  506.                     likes = 0
  507.                     if it["Likes"] != "0" or it["Dislikes"] != "0":
  508.                         likes = int(it["Likes"]) - int(it["Dislikes"])
  509.                         title += "  (%s ok, %s ko)" % (it["Likes"], it["Dislikes"])
  510.                     if type(it["Url"]) is dict:
  511.                         for i, enlace in enumerate(it["Url"]["Item"]):
  512.                             titulo = title + "  (Parte %s)" % (i + 1)
  513.                             itemlist.append(item.clone(title=titulo, url=enlace, action="play", calidad=calidad,
  514.                                                        thumbnail=thumbnail, order=order, like=likes, ficha=ficha,
  515.                                                        cid=cid, folder=False))
  516.                     else:
  517.                         url = it["Url"]
  518.                         itemlist.append(item.clone(title=title, url=url, action="play", calidad=calidad,
  519.                                                    thumbnail=thumbnail, order=order, like=likes, ficha=ficha,
  520.                                                    cid=cid, folder=False))
  521.         except:
  522.             pass
  523.  
  524.     if not config.get_setting("order_web", "playmax"):
  525.         itemlist.sort(key=lambda it: (it.order, it.calidad, it.like), reverse=True)
  526.     else:
  527.         itemlist.sort(key=lambda it: it.order, reverse=True)
  528.     if itemlist:
  529.         itemlist.extend(acciones_fichas(item, sid, ficha))
  530.  
  531.     if not itemlist and item.contentType != "movie":
  532.         url = url.replace("apikey=%s&" % apikey, "")
  533.         data = httptools.downloadpage(url).data
  534.         data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<br>", "", data)
  535.  
  536.         patron = '<div id="f_fde_c"[^>]+>(.*?update_fecha\(\d+\)">)</div>'
  537.         estrenos = scrapertools.find_multiple_matches(data, patron)
  538.         for info in estrenos:
  539.             info = "Estreno en " + scrapertools.htmlclean(info)
  540.             itemlist.append(item.clone(action="", title=info))
  541.  
  542.     if not itemlist:
  543.         itemlist.append(item.clone(action="", title="No hay enlaces disponibles"))
  544.            
  545.     return itemlist
  546.  
  547.  
  548. def menu_info(item):
  549.     logger.info()
  550.     itemlist = []
  551.  
  552.     data = httptools.downloadpage(item.url).data
  553.     data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<br>", "", data)
  554.  
  555.     item.infoLabels["tmdb_id"] = scrapertools.find_single_match(data, '<a href="https://www.themoviedb.org/[^/]+/(\d+)')
  556.     item.infoLabels["year"] = scrapertools.find_single_match(data, 'class="e_new">(\d{4})')
  557.     item.infoLabels["plot"] = scrapertools.find_single_match(data, 'itemprop="description">([^<]+)</div>')
  558.     item.infoLabels["genre"] = ", ".join(scrapertools.find_multiple_matches(data,
  559.                                                                             '<a itemprop="genre"[^>]+>([^<]+)</a>'))
  560.     if __modo_grafico__:
  561.         tmdb.set_infoLabels_item(item, __modo_grafico__)
  562.  
  563.     action = "findvideos"
  564.     title = "Ver enlaces"
  565.     if item.contentType == "tvshow":
  566.         action = "episodios"
  567.         title = "Ver capítulos"
  568.     itemlist.append(item.clone(action=action, title=title))
  569.  
  570.     carpeta = "CINE"
  571.     tipo = "película"
  572.     action = "add_pelicula_to_library"
  573.     extra = ""
  574.     if item.contentType == "tvshow":
  575.         carpeta = "SERIES"
  576.         tipo = "serie"
  577.         action = "add_serie_to_library"
  578.         extra = "episodios###library"
  579.  
  580.     library_path = config.get_library_path()
  581.     if config.get_library_support():
  582.         title = "Añadir %s a la biblioteca" % tipo
  583.         if item.infoLabels["imdb_id"] and not library_path.lower().startswith("smb://"):
  584.             try:
  585.                 from core import filetools
  586.                 path = filetools.join(library_path, carpeta)
  587.                 files = filetools.walk(path)
  588.                 for dirpath, dirname, filename in files:
  589.                     if item.infoLabels["imdb_id"] in dirpath:
  590.                         namedir = dirpath.replace(path, '')[1:]
  591.                         for f in filename:
  592.                             if f != namedir+".nfo" and f != "tvshow.nfo":
  593.                                 continue
  594.                             from core import library
  595.                             head_nfo, it = library.read_nfo(filetools.join(dirpath, f))
  596.                             canales = it.library_urls.keys()
  597.                             canales.sort()
  598.                             if "playmax" in canales:
  599.                                 canales.pop(canales.index("playmax"))
  600.                                 canales.insert(0, "[COLOR red]playmax[/COLOR]")
  601.                             title = "%s ya en tu biblioteca. [%s] ¿Añadir?" % (tipo.capitalize(), ",".join(canales))
  602.                             break
  603.             except:
  604.                 import traceback
  605.                 logger.error(traceback.format_exc())
  606.                 pass
  607.  
  608.         itemlist.append(item.clone(action=action, title=title, text_color=color5, extra=extra))
  609.  
  610.     token_auth = config.get_setting("token_trakt", "tvmoviedb")
  611.     if token_auth and item.infoLabels["tmdb_id"]:
  612.         extra = "movie"
  613.         if item.contentType != "movie":
  614.             extra = "tv"
  615.         itemlist.append(item.clone(channel="tvmoviedb", title="[Trakt] Gestionar con tu cuenta", action="menu_trakt",
  616.                                    extra=extra))
  617.     itemlist.append(item.clone(channel="trailertools", action="buscartrailer", title="Buscar Tráiler",
  618.                                text_color="magenta", context=""))
  619.  
  620.     itemlist.append(item.clone(action="", title=""))
  621.     ficha = scrapertools.find_single_match(item.url, '-f(\d+)-')
  622.     if not ficha:
  623.         ficha = scrapertools.find_single_match(item.url, 'f=(\d+)')
  624.  
  625.     itemlist.extend(acciones_fichas(item, sid, ficha, season=True))
  626.     itemlist.append(item.clone(action="acciones_cuenta", title="Añadir a una lista", text_color=color3, ficha=ficha))
  627.    
  628.     return itemlist
  629.  
  630.  
  631. def acciones_fichas(item, sid, ficha, season=False):
  632.     marcarlist = []
  633.     new_item = item.clone()
  634.     new_item.infoLabels.pop("duration", None)
  635.     estados = [{'following': 'seguir'}, {'favorite': 'favorita'}, {'view': 'vista'}, {'slope': 'pendiente'}]
  636.     url = "https://playmax.mx/ficha.php?apikey=%s&sid=%s&f=%s" % (apikey, sid, ficha)
  637.     data = httptools.downloadpage(url).data
  638.     data = json.xmlTojson(xmldata = data)
  639.  
  640.     try:
  641.         marked = data["Data"]["User"]["Marked"]
  642.         if new_item.contentType == "episode":
  643.             for epi in data["Data"]["Episodes"]["Season_%s" % new_item.infoLabels["season"]]["Item"]:
  644.                 if int(epi["Episode"]) == new_item.infoLabels["episode"]:
  645.                     epi_marked = epi["EpisodeViewed"].replace("yes", "ya")
  646.                     epi_id = epi["Id"]
  647.                     marcarlist.append(new_item.clone(action="marcar", title="Capítulo %s visto. ¿Cambiar?" % epi_marked,
  648.                                                  text_color=color3, epi_id=epi_id))
  649.                     break
  650.     except:
  651.         pass
  652.  
  653.     try:
  654.         tipo = new_item.contentType.replace("movie", "Película").replace("episode", "Serie").replace("tvshow", "Serie")
  655.         for status in estados:
  656.             for k, v in status.items():
  657.                 if k != marked:
  658.                     title = "Marcar %s como %s" % (tipo.lower(), v)
  659.                     action = "marcar"
  660.                 else:
  661.                     title = "%s marcada como %s" % (tipo, v)
  662.                     action = ""
  663.                 if k == "following" and tipo == "Película":
  664.                     continue
  665.                 elif k == "following" and tipo == "Serie":
  666.                     title = title.replace("seguir", "seguida")
  667.                     if k != marked:
  668.                         title = "Seguir serie"
  669.                         action = "marcar"
  670.                     marcarlist.insert(1, new_item.clone(action=action, title=title, text_color=color4, ficha=ficha,
  671.                                                     folder=False))
  672.                     continue
  673.  
  674.                 marcarlist.append(new_item.clone(action="marcar", title=title, text_color=color3, ficha=ficha,
  675.                                              folder=False))
  676.     except:
  677.         pass
  678.  
  679.     try:
  680.         if season and item.contentType == "tvshow":
  681.             seasonlist = []
  682.             for k, v in data["Data"]["Episodes"].items():
  683.                 vistos = False
  684.                 season = k.rsplit("_", 1)[1]
  685.                 if type(v) is str:
  686.                     continue
  687.                 elif type(v["Item"]) is not list:
  688.                     v["Item"] = [v["Item"]]
  689.                    
  690.                 for epi in v["Item"]:
  691.                     if epi["EpisodeViewed"] == "no":
  692.                         vistos = True
  693.                         seasonlist.append(new_item.clone(action="marcar", title="Marcar temporada %s como vista" % season,
  694.                                                      text_color=color1, season=int(season), ficha=ficha, folder=False))
  695.                         break
  696.  
  697.                 if not vistos:
  698.                     seasonlist.append(new_item.clone(action="marcar", title="Temporada %s ya vista. ¿Revertir?" % season,
  699.                                                  text_color=color1, season=int(season), ficha=ficha, folder=False))
  700.  
  701.             seasonlist.sort(key=lambda it: it.season, reverse=True)
  702.             marcarlist.extend(seasonlist)
  703.     except:
  704.         pass
  705.     return marcarlist
  706.  
  707.  
  708. def acciones_cuenta(item):
  709.     logger.info()
  710.     itemlist = []
  711.  
  712.     if "Tus fichas" in item.title:
  713.         itemlist.append(item.clone(title="Capítulos", url="tf_block_c a", contentType="tvshow"))
  714.         itemlist.append(item.clone(title="Series", url="tf_block_s", contentType="tvshow"))
  715.         itemlist.append(item.clone(title="Películas", url="tf_block_p"))
  716.         itemlist.append(item.clone(title="Documentales", url="tf_block_d"))
  717.         return itemlist
  718.     elif "Añadir a una lista" in item.title:
  719.         data = httptools.downloadpage(host+"/c_listas.php?apikey=%s&sid=%s" % (apikey, sid)).data
  720.         data = json.xmlTojson(xmldata = data)
  721.         itemlist.append(item.clone(title="Crear nueva lista", folder=False))
  722.         if data["Data"]["TusListas"] != "\t":
  723.             import random
  724.             data = data["Data"]["TusListas"]["Item"]
  725.             if type(data) is not list:
  726.                 data = [data]
  727.             for child in data:
  728.                 image = ""
  729.                 title = "%s (%s fichas)" % (child["Title"], child["FichasInList"])
  730.                 images = []
  731.                 for i in range(1, 5):
  732.                     if "sinimagen.png" not in child["Poster%s" % i]:
  733.                         images.append(child["Poster%s" % i].replace("/100/", "/400/"))
  734.                 if images:
  735.                     image = images[random.randint(0, len(images)-1)]
  736.                 url = host + "/data.php?mode=add_listas&apikey=%s&sid=%s&ficha_id=%s" % (apikey, sid, item.ficha)
  737.                 post = "lista_id[]=%s" % child["Id"]
  738.                 itemlist.append(item.clone(title=title, url=url, post=post, thumbnail=image, folder=False))
  739.  
  740.         return itemlist
  741.     elif "Crear nueva lista" in item.title:
  742.         from platformcode import platformtools
  743.         nombre = platformtools.dialog_input("", "Introduce un nombre para la lista")
  744.         if nombre:
  745.             dict_priv = {0: 'Pública', 1: 'Privada'}
  746.             priv = platformtools.dialog_select("Privacidad de la lista", ['Pública', 'Privada'])
  747.             if priv != -1:
  748.                 url = host + "/data.php?mode=create_list&apikey=%s&sid=%s" % (apikey, sid)
  749.                 post = "name=%s&private=%s" % (nombre, priv)
  750.                 data = httptools.downloadpage(url, post)
  751.                 platformtools.dialog_notification("Lista creada correctamente", "Nombre: %s - %s" % (nombre, dict_priv[priv]))
  752.                 platformtools.itemlist_refresh()
  753.         return
  754.     elif re.search(r"(?i)Seguir Lista", item.title):
  755.         from platformcode import platformtools
  756.         data = httptools.downloadpage(item.url)
  757.         platformtools.dialog_notification("Operación realizada con éxito", "Lista: %s" % item.lista)
  758.         return
  759.     elif item.post:
  760.         from platformcode import platformtools
  761.         data = httptools.downloadpage(item.url, item.post).data
  762.         platformtools.dialog_notification("Ficha añadida a la lista", "Lista: %s" % item.title)
  763.         platformtools.itemlist_refresh()
  764.         return
  765.        
  766.     data = httptools.downloadpage("https://playmax.mx/tusfichas.php").data
  767.     data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;|<br>", "", data)
  768.  
  769.     bloque = scrapertools.find_single_match(data, item.url+'">(.*?)(?:<div class="tf_blocks|<div class="tf_o_move">)')
  770.     matches = scrapertools.find_multiple_matches(bloque, '<div class="tf_menu_mini">([^<]+)<(.*?)<cb></cb></div>')
  771.     for category, contenido in matches:
  772.         itemlist.append(item.clone(action="", title=category, text_color=color3))
  773.  
  774.         patron = '<div class="c_fichas_image"[^>]*>[^<]*<[^>]+href="\.([^"]+)".*?src="\.([^"]+)".*?serie="([^"]*)".*?' \
  775.                  '<div class="c_fichas_title">(?:<div class="c_fichas_episode">([^<]+)</div>|)([^<]+)</div>'
  776.         entradas = scrapertools.find_multiple_matches(contenido, patron)
  777.         for scrapedurl, scrapedthumbnail, serie, episodio, scrapedtitle in entradas:
  778.             tipo = "movie"
  779.             scrapedurl = host + scrapedurl
  780.             scrapedthumbnail = host + scrapedthumbnail
  781.             action = "findvideos"
  782.             if __menu_info__:
  783.                 action = "menu_info"
  784.             if serie:
  785.                 tipo = "tvshow"
  786.             if episodio:
  787.                 title = "      %s - %s" % (episodio.replace("X", "x"), scrapedtitle)
  788.             else:
  789.                 title = "      " + scrapedtitle
  790.  
  791.             new_item = Item(channel=item.channel, action=action, title=title, url=scrapedurl,
  792.                             thumbnail=scrapedthumbnail, contentTitle=scrapedtitle, contentType=tipo,
  793.                             text_color=color2)
  794.             if new_item.contentType == "tvshow":
  795.                 new_item.show = scrapedtitle
  796.                 if not __menu_info__:
  797.                     new_item.action = "episodios"
  798.  
  799.             itemlist.append(new_item)
  800.  
  801.     return itemlist
  802.  
  803.  
  804. def marcar(item):
  805.     logger.info()
  806.  
  807.     if "Capítulo" in item.title:
  808.         url = "%s/data.php?mode=capitulo_visto&apikey=%s&sid=%s&c_id=%s" % (host, apikey, sid, item.epi_id)
  809.         message = item.title.replace("no", "marcado como").replace("ya", "cambiado a no").replace(" ¿Cambiar?", "")
  810.     elif "temporada" in item.title.lower():
  811.         type_marcado = "1"
  812.         if "como vista" in item.title:
  813.             message = "Temporada %s marcada como vista" % item.season
  814.         else:
  815.             type_marcado = "2"
  816.             message = "Temporada %s marcada como no vista" % item.season
  817.         url = "%s/data.php?mode=temporada_vista&apikey=%s&sid=%s&ficha=%s&t_id=%s&type=%s" \
  818.               % (host, apikey, sid, item.ficha, item.season, type_marcado)
  819.     else:
  820.         message = item.title.replace("Marcar ", "Marcada ").replace("Seguir serie", "Serie en seguimiento")
  821.         if "favorita" in item.title:
  822.             url = "%s/data.php?mode=marcar_ficha&apikey=%s&sid=%s&ficha=%s&tipo=%s" \
  823.                   % (host, apikey, sid, item.ficha, "3")
  824.         elif "pendiente" in item.title:
  825.             url = "%s/data.php?mode=marcar_ficha&apikey=%s&sid=%s&ficha=%s&tipo=%s" \
  826.                   % (host, apikey, sid, item.ficha, "2")
  827.         elif "vista" in item.title:
  828.             url = "%s/data.php?mode=marcar_ficha&apikey=%s&sid=%s&ficha=%s&tipo=%s" \
  829.                   % (host, apikey, sid, item.ficha, "4")
  830.         elif "Seguir" in item.title:
  831.             url = "%s/data.php?mode=marcar_ficha&apikey=%s&sid=%s&ficha=%s&tipo=%s" \
  832.                   % (host, apikey, sid, item.ficha, "2")
  833.             data = httptools.downloadpage(url)
  834.             url = "%s/data.php?mode=marcar_ficha&apikey=%s&sid=%s&ficha=%s&tipo=%s" \
  835.                   % (host, apikey, sid, item.ficha, "1")
  836.  
  837.     data = httptools.downloadpage(url)
  838.     if data.sucess and config.get_platform() != "plex" and item.action != "play":
  839.         from platformcode import platformtools
  840.         platformtools.dialog_notification("Acción correcta", message)
  841.  
  842.  
  843. def listas(item):
  844.     logger.info()
  845.     itemlist = []
  846.  
  847.     data = httptools.downloadpage(item.url).data
  848.     data = json.xmlTojson(xmldata = data)
  849.     if item.extra == "listas":
  850.         itemlist.append(Item(channel=item.channel, title="Listas más seguidas", action="listas", text_color=color1,
  851.                              url=item.url+"&orden=1", extra="listas_plus"))
  852.         itemlist.append(Item(channel=item.channel, title="Listas con más fichas", action="listas", text_color=color1,
  853.                              url=item.url+"&orden=2", extra="listas_plus"))
  854.         itemlist.append(Item(channel=item.channel, title="Listas aleatorias", action="listas", text_color=color1,
  855.                              url=item.url+"&orden=3", extra="listas_plus"))
  856.         if data["Data"]["ListasSiguiendo"] != "\t":
  857.             itemlist.append(Item(channel=item.channel, title="Listas que sigo", action="listas", text_color=color1,
  858.                                  url=item.url, extra="sigo"))
  859.         if data["Data"]["TusListas"] != "\t":
  860.             itemlist.append(Item(channel=item.channel, title="Mis listas", action="listas", text_color=color1,
  861.                                  url=item.url, extra="mislistas"))
  862.  
  863.         return itemlist
  864.  
  865.     elif item.extra == "sigo":
  866.         data = data["Data"]["ListasSiguiendo"]["Item"]
  867.     elif item.extra == "mislistas":
  868.         data = data["Data"]["TusListas"]["Item"]
  869.     else:
  870.         data = data["Data"]["Listas"]["Item"]
  871.  
  872.     if type(data) is not list:
  873.         data = [data]
  874.     import random
  875.     for child in data:
  876.         image = ""
  877.         title = "%s (%s fichas)" % (child["Title"], child["FichasInList"])
  878.         images = []
  879.         for i in range(1, 5):
  880.             if "sinimagen.png" not in child["Poster%s" % i]:
  881.                 images.append(child["Poster%s" % i].replace("/100/", "/400/"))
  882.         if images:
  883.             image = images[random.randint(0, len(images)-1)]
  884.         url = host + "/l%s" % child["Id"]
  885.         itemlist.append(Item(channel=item.channel, action="fichas", url=url, text_color=color3,
  886.                              thumbnail=image, title=title, extra=item.extra))
  887.  
  888.     if len(itemlist) == 20:
  889.         start = scrapertools.find_single_match(item.url, 'start=(\d+)')
  890.         end = int(start) + 20
  891.         url = re.sub(r'start=%s' % start, 'start=%s' % end, item.url)
  892.         itemlist.append(item.clone(title=">> Página Siguiente", url=url))
  893.  
  894.     return itemlist
  895.  
  896.  
  897. def play(item):
  898.     logger.info()
  899.     from core import servertools
  900.  
  901.     devuelve = servertools.findvideos(item.url, True)
  902.     if devuelve:
  903.         item.url = devuelve[0][1]
  904.         item.server = devuelve[0][2]
  905.  
  906.     if config.get_setting("mark_play", "playmax"):
  907.         if item.contentType == "movie":
  908.             marcar(item.clone(title="marcar como vista"))
  909.         else:
  910.             marcar(item.clone(title="Capítulo", epi_id=item.cid))
  911.  
  912.     return [item]
  913.  
  914.  
  915. def select_page(item):
  916.     import xbmcgui
  917.     dialog = xbmcgui.Dialog()
  918.     number = dialog.numeric(0, "Introduce el número de página")
  919.     if number != "":
  920.         number = int(number) * 60
  921.         item.url = re.sub(r'start=(\d+)', "start=%s" % number, item.url)
  922.  
  923.     return fichas(item)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement