Advertisement
Guest User

launcher wiimc

a guest
Aug 19th, 2012
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 21.86 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. #------------------------------------------------------------
  3. # pelisalacarta
  4. # Launcher
  5. # http://blog.tvalacarta.info/plugin-xbmc/pelisalacarta/
  6. #------------------------------------------------------------
  7. import urllib
  8. import base64
  9. import os
  10. import binascii
  11. import md5
  12.  
  13. from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
  14.  
  15. from core import config
  16. from core import wiideoteca
  17. from core.item import Item
  18. from pelisalacarta import buscador
  19.  
  20. import logging.config
  21. import logging
  22. logging_conf = os.path.join( os.path.dirname(__file__) , ".." , ".." , "logging.conf")
  23. print "logging_conf=",logging_conf
  24. logging.config.fileConfig( logging_conf )
  25. logger=logging.getLogger("wiimc")
  26.  
  27. #TODO: Pasar esto a ¿config?
  28. VERSIONTAG = "3.2.18"
  29.  
  30. #from lib import cerealizer
  31. #cerealizer.register(Item)
  32.  
  33. def get_content_type():
  34.     return "text/plain"
  35.  
  36. def controller(plugin_name,port,host,path,headers):
  37.  
  38.     respuesta = ""
  39.  
  40.     respuesta += "version=7\n"
  41.     respuesta += "logo=http://pelisalacarta.mimediacenter.info/icon.png\n"
  42.     respuesta += "title="+plugin_name+" "+VERSIONTAG+" (WiiMC)\n"
  43.     respuesta += "\n"
  44.  
  45.     if path == "/wiimc/" or path=="/wiimc":
  46.         import channelselector
  47.         channelslist = channelselector.getmainlist()
  48.  
  49.         # Actualización automática de canales, actualiza la lista
  50.         if config.get_setting("updatechannels")=="true":
  51.             logger.info("Verificando actualización del channelselector")
  52.             try:
  53.                 from core import updater
  54.                 actualizado = updater.updatechannel("channelselector")
  55.  
  56.                 if actualizado:
  57.                     respuesta += "type=playlist\n"
  58.                     respuesta += "name=¡Lista de canales actualizada!\n"
  59.                     respuesta += "thumb=\n"
  60.                     respuesta += "URL=http://"+host+"/wiimc/\n"
  61.                     respuesta += "\n"
  62.             except:
  63.                 import sys
  64.                 for line in sys.exc_info():
  65.                     logger.error( "%s" % line )
  66.  
  67.         for channel in channelslist:
  68.  
  69.             # Quita el canal de ayuda y el de configuración, no sirven en WiiMC
  70.             if channel.channel!="configuracion" and channel.channel!="ayuda" and channel.channel!="trailertools":
  71.                
  72.                 if channel.channel!="buscador":
  73.                     respuesta += "type=playlist\n"
  74.                 else:
  75.                     respuesta += "type=search\n"
  76.                 respuesta += "name="+channel.title+"\n"
  77.                 respuesta += "thumb=http://"+plugin_name+".mimediacenter.info/wiimc/"+channel.channel+".png\n"
  78.                 respuesta += "URL=http://"+host+"/wiimc/"+base64.b64encode(channel.serialize()).replace("/","%2F")+"/playlist.plx\n"
  79.                 respuesta += "\n"
  80.     else:
  81.        
  82.         item = extract_item_from_url(path)
  83.    
  84.         if item.channel=="channelselector" and item.action=="channeltypes":
  85.            
  86.             import channelselector
  87.             channelslist = channelselector.getchanneltypes()
  88.            
  89.             for channel in channelslist:
  90.                 if channel.category!="M" and channel.category!="G":
  91.                     respuesta += "type=playlist\n"
  92.                     respuesta += "name="+channel.title+"\n"
  93.                     respuesta += "thumb=http://"+plugin_name+".mimediacenter.info/wiimc/"+channel.channel+".png\n"
  94.                     respuesta += "URL=http://"+host+"/wiimc/"+base64.b64encode(channel.serialize()).replace("/","%2F")+"/playlist.plx\n"
  95.                     respuesta += "\n"
  96.        
  97.         elif item.channel=="channelselector" and item.action=="listchannels":
  98.            
  99.             import channelselector
  100.             channelslist = channelselector.filterchannels(item.category)
  101.            
  102.             for channel in channelslist:
  103.                 if channel.type=="generic" or channel.type=="wiimc":
  104.                     channel.action="mainlist"
  105.                     respuesta += "type=playlist\n"
  106.                     respuesta += "name="+channel.title+"\n"
  107.                     respuesta += "thumb=http://"+plugin_name+".mimediacenter.info/wiimc/"+channel.channel+".png\n"
  108.                     respuesta += "URL=http://"+host+"/wiimc/"+base64.b64encode(channel.serialize()).replace("/","%2F")+"/playlist.plx\n"
  109.                     respuesta += "\n"
  110.    
  111.         else:
  112.             itemlist,channel = getitems(item,path)
  113.            
  114.             # Las listas vacías son problemáticas, añade un elemento dummy
  115.             if len(itemlist)==0:
  116.                 itemlist.append( Item(title="(No hay elementos)") )
  117.            
  118.             for item in itemlist:
  119.                 if item.action=="search":
  120.                     if item.server=="": item.server="none"
  121.                     if item.url=="": item.url="none"
  122.                     url = "http://%s/%s/playlist.plx" % ( host+"/wiimc" , base64.b64encode( item.serialize() ).replace("/","%2F") )
  123.                     respuesta += "type=search\n"
  124.                     respuesta += "name=%s\n" % item.title
  125.                     if item.thumbnail != "":
  126.                         respuesta += "thumb=%s\n" % item.thumbnail
  127.                     respuesta += "URL=%s\n" % url
  128.                     respuesta += "\n"
  129.                     if item.action=="search":
  130.                         logger.info("  Buscador "+url)
  131.                     else:
  132.                         logger.info("  Login "+url)
  133.      
  134.                 elif item.folder or item.action=="play" or item.action=="downloadall":
  135.                     if item.server=="": item.server="none"
  136.                     if item.url=="": item.url="none"
  137.                     if item.title=="": item.title="Ver el video-"
  138.  
  139.                     url = "http://%s/%s/playlist.plx" % ( host+"/wiimc" , base64.b64encode( item.serialize() ).replace("/","%2F") )
  140.                     respuesta += "type=playlist\n"
  141.                     respuesta += "name=%s\n" % item.title
  142.                     if item.thumbnail != "":
  143.                         respuesta += "thumb=%s\n" % item.thumbnail
  144.                     respuesta += "URL=%s\n" % url
  145.                     respuesta += "\n"
  146.                     logger.info("  Nivel intermedio "+url)
  147.                 else:
  148.                     respuesta += "type=video\n"
  149.                     respuesta += "name=%s\n" % item.title
  150.                     respuesta += "URL=%s\n" % item.url
  151.                     respuesta += "\n"
  152.                     logger.info("  Video "+item.url)
  153.  
  154.     return respuesta
  155.  
  156. def extract_item_from_url(requestpath):
  157.     logger.info("extract_item_from_url()")
  158.     # La ruta empleada en la petición
  159.     ruta = requestpath.split("?")[0]
  160.     logger.info("ruta="+ruta)
  161.  
  162.     # El item serializado está codificado en base64
  163.     itemserializado = ruta.split("/")[2]
  164.     itemserializado = itemserializado.replace("%2F","/")
  165.     itemserializado = itemserializado.replace("%2f","/")
  166.     logger.info("item base64="+itemserializado)
  167.     import base64
  168.     item = Item()
  169.     item.deserialize(base64.b64decode(itemserializado))
  170.     logger.info("item: channel="+item.channel+", action="+item.action+", title="+item.title+", url="+item.url+", server="+item.server+", category="+item.category)
  171.  
  172.     return item
  173.  
  174. def getitems(item,requestpath):
  175.     logger.info("getitems")
  176.     itemlist = []
  177.    
  178.     # Extrae los parámetros
  179.     channel = item.channel
  180.     accion = item.action
  181.     url = item.url
  182.     if url!="none":
  183.         if not "filenium" in url:
  184.             url = urllib.unquote_plus(url)
  185.     server = item.server
  186.     title = item.title
  187.     extra = item.extra
  188.     category = item.category
  189.     fulltitle = item.fulltitle
  190.  
  191.     try:
  192.         if accion=="mainlist" and config.get_setting("updatechannels")=="true":
  193.             try:
  194.                 logger.info("Verificando actualización del canal")
  195.                 from core import updater
  196.                 actualizado = updater.updatechannel(channel)
  197.        
  198.                 if actualizado:
  199.                     itemlist.append( Item(title="¡Canal descargado y actualizado!") )
  200.             except:
  201.                 import sys
  202.                 for line in sys.exc_info():
  203.                     logger.error( "%s" % line )
  204.    
  205.         '''
  206.        # Obtiene un nombre válido para la cache
  207.        hashed_url = binascii.hexlify(md5.new(requestpath).digest())
  208.        cached_file = os.path.join( config.get_data_path() , "tmp" , "cache" , hashed_url )
  209.        logger.info( "Cache file must be "+cached_file )
  210.        
  211.        # Si el fichero está en cache
  212.        if os.path.exists(cached_file):
  213.            logger.info( "Reading from cache" )
  214.            fichero = open( cached_file ,"rb")
  215.            itemlist = cerealizer.load(fichero)
  216.            fichero.close()
  217.            
  218.        # Si no está en cache
  219.        else:
  220.        '''
  221.         logger.info( "Not cached" )
  222.    
  223.         # El item que invocó es importante para obtener el siguiente
  224.         senderitem = Item( title=title , channel=channel, action=accion, url=url , server=server, extra=extra, category=category, fulltitle=fulltitle )
  225.         if "|" in url:
  226.             partes = urllib.unquote_plus(senderitem.url).split("|")
  227.             refered_item = Item(title=partes[0],url=partes[2],thumbnail="",server=partes[1],plot="",extra=partes[3])
  228.             logger.info( "refered_item title="+refered_item.title+", url="+refered_item.url+", server="+refered_item.server+", extra="+refered_item.extra)
  229.    
  230.         else:
  231.             refered_item = Item()
  232.    
  233.         # Importa el canal y ejecuta la función
  234.         try:
  235.             exec "from pelisalacarta.channels import "+channel+" as channelmodule"
  236.         except:
  237.             import sys
  238.             for line in sys.exc_info():
  239.                 logger.error( "%s" % line )
  240.             try:
  241.                 exec "from pelisalacarta import "+channel+" as channelmodule"
  242.             except:
  243.                 import sys
  244.                 for line in sys.exc_info():
  245.                     logger.error( "%s" % line )
  246.                 try:
  247.                     exec "from core import "+channel+" as channelmodule"
  248.                 except:
  249.                     pass
  250.    
  251.         # play - es el menú de reproducción de un vídeo
  252.         if accion=="play":
  253.             logger.info("ACCION PLAY")
  254.             if hasattr(channelmodule, 'play'):
  255.                 logger.info("[launcher.py] executing channel 'play' method")
  256.                 logger.info(channelmodule.__file__)
  257.                 itemlist = channelmodule.play(senderitem)
  258.                 logger.info("itemlist"+str(itemlist))
  259.                 senderitem = itemlist[0]
  260.                 senderitem.folder=False
  261.             else:
  262.                 logger.info("[launcher.py] no channel 'play' method, executing core method")
  263.             itemlist = menu_video(senderitem)
  264.    
  265.         # play_video - genera una playlist con una sola entrada para que wiimc la reproduzca
  266.         elif accion=="play_video":
  267.             logger.info("ACCION PLAY_VIDEO")
  268.             logger.info("url="+senderitem.url)
  269.             senderitem.folder=False
  270.             itemlist.append( senderitem )
  271.    
  272.         # search - es el buscador
  273.         elif channel=="buscador" and accion=="mainlist":
  274.             logger.info("ACCION SEARCH (buscador)")
  275.             texto = requestpath.split("plx")[1]
  276.             exec "itemlist = buscador.do_search_results(texto)"
  277.            
  278.         elif accion=="search":
  279.             logger.info("ACCION SEARCH")
  280.             texto = requestpath.split("plx")[1]
  281.             exec "itemlist = channelmodule."+accion+"(senderitem,texto)"
  282.    
  283.         # findvideos - debe encontrar videos reproducibles
  284.         elif accion=="findvideos":
  285.             logger.info("ACCION FINDVIDEOS")
  286.             try:
  287.                 exec "itemlist = channelmodule."+accion+"(senderitem)"
  288.             except:
  289.                 import sys
  290.                 for line in sys.exc_info():
  291.                     logger.error( "%s" % line )
  292.                 itemlist = findvideos(senderitem,channel)
  293.        
  294.         elif accion=="descargar":
  295.             itemlist = download_item(senderitem,refered_item)
  296.         elif accion=="download_all":
  297.             itemlist = download_all(senderitem,refered_item)
  298.         elif accion=="add_to_favorites":
  299.             itemlist = add_to_favorites(senderitem,refered_item)
  300.         elif accion=="remove_from_favorites":
  301.             itemlist = remove_from_favorites(senderitem,refered_item)
  302.         elif accion=="add_to_downloads":
  303.             itemlist = add_to_downloads(senderitem,refered_item)
  304.         elif accion=="remove_from_downloads":
  305.             itemlist = remove_from_downloads(senderitem,refered_item)
  306.    
  307.         elif accion=="remove_from_error_downloads":
  308.             itemlist = remove_from_error_downloads(senderitem,refered_item)
  309.         elif accion=="add_again_to_downloads":
  310.             itemlist = add_again_to_downloads(senderitem,refered_item)
  311.         elif accion=="send_to_jdownloader":
  312.             itemlist = send_to_jdownloader(senderitem,refered_item)
  313.         elif accion=="search_trailer":
  314.             itemlist = search_trailer(senderitem,refered_item)
  315.         elif accion=="add_serie_to_wiideoteca":
  316.             itemlist = wiideoteca.AgregarSerie(senderitem)
  317.         elif accion=="UltimoVisto":
  318.             itemlist = wiideoteca.UltimoVisto(senderitem)
  319.    
  320.         else:
  321.             if senderitem.url=="none":
  322.                 senderitem.url=""
  323.             exec "itemlist.extend( channelmodule."+accion+"(senderitem) )"
  324.        
  325.         '''
  326.        # Lo almacena en cache
  327.        fichero = open( cached_file ,"wb")
  328.        cerealizer.dump(itemlist,fichero)
  329.        fichero.close()
  330.        '''
  331.    
  332.         logger.info("Items devueltos ")
  333.         for item in itemlist:
  334.             logger.info( " " + item.title + " | " + item.url + " | " + item.action)
  335.     except:
  336.         import traceback,sys
  337.         from pprint import pprint
  338.         exc_type, exc_value, exc_tb = sys.exc_info()
  339.         lines = traceback.format_exception(exc_type, exc_value, exc_tb)
  340.         for line in lines:
  341.             line_splits = line.split("\n")
  342.             for line_split in line_splits:
  343.                 logger.error(line_split)
  344.  
  345.     return itemlist,channel
  346.  
  347. def download_item(senderitem,refered_item):
  348.     itemlist = []
  349.  
  350.     # Extrae todos los enlaces posibles
  351.     exec "from servers import "+refered_item.server+" as server_connector"
  352.     video_urls = server_connector.get_video_url( page_url=refered_item.url , premium=(config.get_setting("megavideopremium")=="true") , user=config.get_setting("megavideouser") , password=config.get_setting("megavideopassword") )
  353.  
  354.     if len(video_urls)>0:
  355.         from core import downloadtools
  356.         titulo = senderitem.fulltitle
  357.         if titulo=="": titulo=refered_item.title
  358.         downloadtools.downloadtitle(video_urls[len(video_urls)-1][1],titulo)
  359.         itemlist.append( Item( title="Descarga finalizada" ) )
  360.     else:
  361.         itemlist.append( Item( title="El video ya no está disponible" ) )
  362.    
  363.     return itemlist
  364.  
  365. def send_to_jdownloader(senderitem,refered_item):
  366.     itemlist = []
  367.     itemlist.append( Item( title="Opcion no disponible" ) )
  368.  
  369.     return itemlist
  370.  
  371. def search_trailer(senderitem,refered_item):
  372.     itemlist = []
  373.     itemlist.append( Item( title="Opcion no disponible" ) )
  374.  
  375.     return itemlist
  376.  
  377. def add_to_favorites(senderitem,refered_item):
  378.     from core import favoritos
  379.     favoritos.savebookmark(titulo=refered_item.title,url=refered_item.url,thumbnail="",server=refered_item.server,fulltitle=senderitem.fulltitle,plot="")
  380.  
  381.     itemlist = []
  382.     itemlist.append( Item( title="El video %s" % senderitem.fulltitle ) )
  383.     itemlist.append( Item( title="ha sido añadido a favoritos" ) )
  384.    
  385.     return itemlist
  386.  
  387. def remove_from_favorites(senderitem,refered_item):
  388.     from core import favoritos
  389.     favoritos.deletebookmark(refered_item.extra)
  390.    
  391.     itemlist = []
  392.     itemlist.append( Item( title="El video %s" % refered_item.title ) )
  393.     itemlist.append( Item( title="ha sido eliminado de favoritos" ) )
  394.    
  395.     return itemlist
  396.  
  397. def download_all(senderitem,refered_item):
  398.     from core import descargas
  399.     descargas.downloadall(senderitem)
  400.    
  401.     itemlist = []
  402.     itemlist.append( Item( title="Fin de todas las descargas pendientes" ) )
  403.    
  404.     return itemlist
  405.  
  406. def add_to_downloads(senderitem,refered_item):
  407.     from core import descargas
  408.     descargas.savebookmark(titulo=refered_item.title,url=refered_item.url,thumbnail="",server=refered_item.server,plot="")
  409.    
  410.     itemlist = []
  411.     itemlist.append( Item( title="El video %s" % refered_item.title ) )
  412.     itemlist.append( Item( title="ha sido añadido a la lista" ) )
  413.     itemlist.append( Item( title="de descargas" ) )
  414.    
  415.     return itemlist
  416.  
  417. def remove_from_downloads(senderitem,refered_item):
  418.     from core import descargas
  419.     descargas.deletebookmark(refered_item.extra)
  420.    
  421.     itemlist = []
  422.     itemlist.append( Item( title="El video %s" % refered_item.title ) )
  423.     itemlist.append( Item( title="ha sido eliminado de la lista" ) )
  424.     itemlist.append( Item( title="de descargas" ) )
  425.    
  426.     return itemlist
  427.  
  428. def remove_from_error_downloads(senderitem,refered_item):
  429.     from core import descargas
  430.     descargas.delete_error_bookmark(refered_item.extra)
  431.    
  432.     itemlist = []
  433.     itemlist.append( Item( title="El video %s" % refered_item.title ) )
  434.     itemlist.append( Item( title="ha sido eliminado definitivamente" ) )
  435.    
  436.     return itemlist
  437.  
  438. def add_again_to_downloads(senderitem,refered_item):
  439.     from core import descargas
  440.     descargas.mover_descarga_error_a_pendiente(refered_item.extra)
  441.    
  442.     itemlist = []
  443.     itemlist.append( Item( title="El video %s" % refered_item.title ) )
  444.     itemlist.append( Item( title="ha sido movido a la lista" ) )
  445.     itemlist.append( Item( title="de descargas de nuevo" ) )
  446.    
  447.     return itemlist
  448.  
  449. def menu_video(item):
  450.     itemlist = []
  451.     logger.info("menu_video item=[url="+item.url+", server="+item.server+", fulltitle="+item.fulltitle+"]")
  452.  
  453.     from servers import servertools
  454.     video_urls,puede,motivo = servertools.resolve_video_urls_for_playing( item.server , item.url , video_password="" , muestra_dialogo=False)
  455.  
  456.     if puede:
  457.         for video_url in video_urls:
  458.             itemlist.append( Item(channel=item.channel, title="Ver "+video_url[0], url=video_url[1], action="play_video") )
  459.        
  460.         refered_item_encoded = urllib.quote(item.title.replace("|","-"))+"|"+urllib.quote(item.server)+"|"+urllib.quote(item.url)+"|"+urllib.quote(item.extra)
  461.        
  462.         itemlist.append( Item(channel=item.channel, title="Descargar",action="descargar",url=refered_item_encoded,fulltitle=urllib.quote(item.fulltitle) ) )
  463.        
  464.         if item.channel!="favoritos":
  465.             itemlist.append( Item(channel=item.channel, title="Añadir a favoritos",action="add_to_favorites",url=refered_item_encoded,fulltitle=urllib.quote(item.fulltitle) ) )
  466.         else:
  467.             itemlist.append( Item(channel=item.channel, title="Quitar de favoritos",action="remove_from_favorites",url=refered_item_encoded,fulltitle=urllib.quote(item.fulltitle) ) )
  468.        
  469.         if item.channel!="descargas":
  470.             itemlist.append( Item(channel=item.channel, title="Añadir a la lista de descargas",action="add_to_downloads",url=refered_item_encoded,fulltitle=urllib.quote(item.fulltitle) ) )
  471.         else:
  472.             if item.category=="errores":
  473.                 itemlist.append( Item(channel=item.channel, title="Quitar definitivamente de la lista de descargas",action="remove_from_error_downloads",url=refered_item_encoded ) )
  474.                 itemlist.append( Item(channel=item.channel, title="Pasar de nuevo a la lista de descargas",action="add_again_to_downloads",url=refered_item_encoded ) )
  475.             else:
  476.                 itemlist.append( Item(channel=item.channel, title="Quitar de la lista de descargas",action="remove_from_downloads",url=refered_item_encoded ) )
  477.    
  478.         itemlist.append( Item(channel=item.channel, title="Enviar a jdownloader",action="send_to_jdownloader",url=refered_item_encoded ) )
  479.         itemlist.append( Item(channel=item.channel, title="Buscar trailer",action="search_trailer",url=refered_item_encoded ) )
  480.         if item.category=="wiideoteca":
  481.             itemlist.append( Item(channel=item.channel, title="Marcar como Ultimo Episodio Visto",action="UltimoVisto",url=item.extra,fulltitle=item.fulltitle ) )
  482.  
  483.     # Si no puedes ver el vídeo te informa
  484.     else:
  485.         itemlist.append( Item(title="No puedes ver ese vídeo porque...") )
  486.         if item.server!="":
  487.             if "<br/>" in motivo:
  488.                 itemlist.append( Item(title=motivo.split("<br/>")[0]) )
  489.                 itemlist.append( Item(title=motivo.split("<br/>")[1]) )
  490.                 itemlist.append( Item(title=item.url) )
  491.             else:
  492.                 itemlist.append( Item(title=motivo) )
  493.                 itemlist.append( Item(title=item.url) )
  494.         else:
  495.             itemlist.append( Item(title="El servidor donde está alojado no está") )
  496.             itemlist.append( Item(title="soportado en pelisalacarta todavía") )
  497.             itemlist.append( Item(title=item.url) )
  498.  
  499.     return itemlist
  500.  
  501. def findvideos(item,channel):
  502.     logger.info("findvideos")
  503.  
  504.     url = item.url
  505.     title = item.title
  506.     thumbnail = item.thumbnail
  507.     plot = item.plot
  508.     fulltitle = item.fulltitle
  509.     # Descarga la pagina
  510.     from core import scrapertools
  511.     data = scrapertools.cachePage(url)
  512.    
  513.     from servers import servertools
  514.     listavideos = servertools.findvideos(data)
  515.    
  516.     itemlist = []
  517.     for video in listavideos:
  518.         scrapedtitle = video[0]
  519.         scrapedurl = video[1]
  520.         server = video[2]
  521.  
  522.         itemlist.append( Item(channel=channel, action="play" , title=scrapedtitle , url=scrapedurl, thumbnail=item.thumbnail, plot=item.plot, server=server, fulltitle=fulltitle, folder=False))
  523.  
  524.     return itemlist
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement