def listar_busquedas(params,url,category): print "listar_busquedas()" channel2 = "" # Despliega las busquedas anteriormente guardadas try: presets = config.get_setting("presets_buscados") channel_preset = params.get("channel") if channel_preset != CHANNELNAME: channel2 = channel_preset print "channel_preset :%s" %channel_preset accion = params.get("action") matches = "" if "|" in presets: matches = presets.split("|") addfolder( "buscador" , config.get_localized_string(30103)+"..." , matches[0] , "por_teclado", channel2 ) # Buscar else: addfolder( "buscador" , config.get_localized_string(30103)+"..." , "" , "por_teclado", channel2 ) if len(matches)>0: for match in matches: title=scrapedurl = match addfolder( channel_preset , title , scrapedurl , "searchresults" ) elif presets != "": title = scrapedurl = presets addfolder( channel_preset , title , scrapedurl , "searchresults" ) except: addfolder( "buscador" , config.get_localized_string(30103)+"..." , "" , "por_teclado" , channel2 ) # Cierra el directorio xbmcplugin.setPluginCategory( handle=int( sys.argv[ 1 ] ), category=category ) xbmcplugin.addSortMethod( handle=int( sys.argv[ 1 ] ), sortMethod=xbmcplugin.SORT_METHOD_NONE ) xbmcplugin.endOfDirectory( handle=int( sys.argv[ 1 ] ), succeeded=True )
def alertnoencontrado(titulo): advertencia = xbmcgui.Dialog() #'Trailer no encontrado' #'El Trailer para "%s"' #'no se ha podido localizar.' #'�Deseas seguir buscando con el teclado?' tituloq = '"'+titulo+'"' resultado = advertencia.yesno(config.get_localized_string(30114), config.get_localized_string(30115) % tituloq, config.get_localized_string(30116),config.get_localized_string(30117)) return(resultado)
def set_opcion(item, seleccion, opciones, video_urls): logger.info() # logger.debug(item.tostring('\n')) salir = False # No ha elegido nada, lo más probable porque haya dado al ESC if seleccion == -1: # Para evitar el error "Uno o más elementos fallaron" al cancelar la selección desde fichero strm listitem = xbmcgui.ListItem(item.title, iconImage="DefaultVideo.png", thumbnailImage=item.thumbnail) xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, listitem) # "Descargar" elif opciones[seleccion] == config.get_localized_string(30153): from channels import downloads if item.contentType == "list" or item.contentType == "tvshow": item.contentType = "video" item.play_menu = True downloads.save_download(item) salir = True # "Quitar de favoritos" elif opciones[seleccion] == config.get_localized_string(30154): from channels import favorites favorites.delFavourite(item) salir = True # "Añadir a favoritos": elif opciones[seleccion] == config.get_localized_string(30155): from channels import favorites item.from_channel = "favorites" favorites.addFavourite(item) salir = True # "Añadir a videoteca": elif opciones[seleccion] == config.get_localized_string(30161): titulo = item.fulltitle if titulo == "": titulo = item.title new_item = item.clone(title=titulo, action="play_from_library", category="Cine", fulltitle=item.fulltitle, channel=item.channel) from core import videolibrarytools videolibrarytools.add_movie(new_item) salir = True # "Buscar Trailer": elif opciones[seleccion] == config.get_localized_string(30162): config.set_setting("subtitulo", False) xbmc.executebuiltin("XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(channel="trailertools", action="buscartrailer", contextual=True).tourl())) salir = True return salir
def AbrirConfig(self, Opciones): from core import config SetData(None) JsonData = {} JsonOpciones = {} JsonOpciones["Count"] = 0 for Opcion in Opciones: try: Opcion[0] = config.get_localized_string(int(Opcion[0])) except: pass try: ops = Opcion[3].split("|") for x, op in enumerate(ops): ops[x] = config.get_localized_string(int(ops[x])) Opcion[3] = "|".join(ops) except: pass try: Opcion[8] = config.get_localized_string(int(Opcion[8])) except: pass JsonOpciones["Label" + str(JsonOpciones["Count"])] = Opcion[0] JsonOpciones["Id" + str(JsonOpciones["Count"])] = Opcion[1] JsonOpciones["Type" + str(JsonOpciones["Count"])] = Opcion[2] JsonOpciones["Lvalues" + str(JsonOpciones["Count"])] = Opcion[3] JsonOpciones["Values" + str(JsonOpciones["Count"])] = Opcion[4] JsonOpciones["Value" + str(JsonOpciones["Count"])] = Opcion[5] JsonOpciones["Option" + str(JsonOpciones["Count"])] = Opcion[6] JsonOpciones["Enabled" + str(JsonOpciones["Count"])] = Opcion[7] JsonOpciones["Category" + str(JsonOpciones["Count"])] = Opcion[8] JsonOpciones["Count"] += 1 JsonData["Action"] = "OpenConfig" JsonData["Options"] = JsonOpciones SendMessage(json.dumps(JsonData)) # logger.info("-----------------------------------------------------------------------") # logger.info("Petición de 'OpenConfig' enviada") while GetData() == None: continue # logger.info("Respuesta Recibida: " + GetData()) # logger.info("-----------------------------------------------------------------------") if GetData(): if GetData() <> "-1": JsonRespuesta = json.loads(GetData()) import config config.set_settings(JsonRespuesta) JsonData = {} JsonData["Action"] = "HideLoading" SendMessage(json.dumps(JsonData))
def set_opcion(item, seleccion, opciones, video_urls): logger.info() # logger.debug(item.tostring('\n')) salir = False # No ha elegido nada, lo más probable porque haya dado al ESC if seleccion == -1: # Para evitar el error "Uno o más elementos fallaron" al cancelar la selección desde fichero strm listitem = xbmcgui.ListItem(item.title) if config.get_platform(True)['num_version'] >= 16.0: listitem.setArt({ 'icon': "DefaultVideo.png", 'thumb': item.thumbnail }) else: listitem.setIconImage("DefaultVideo.png") listitem.setThumbnailImage(item.thumbnail) xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, listitem) # "Descargar" elif opciones[seleccion] == config.get_localized_string(30153): from channels import downloads if item.contentType == "list" or item.contentType == "tvshow": item.contentType = "video" item.play_menu = True downloads.save_download(item) salir = True # "Quitar de favoritos" elif opciones[seleccion] == config.get_localized_string(30154): from channels import favorites favorites.delFavourite(item) salir = True # "Añadir a favoritos": elif opciones[seleccion] == config.get_localized_string(30155): from channels import favorites item.from_channel = "favorites" favorites.addFavourite(item) salir = True # "Buscar Trailer": elif opciones[seleccion] == config.get_localized_string(30162): config.set_setting("subtitulo", False) xbmc.executebuiltin("XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(channel="trailertools", action="buscartrailer", contextual=True).tourl())) salir = True return salir
def GetTrailerbyKeyboard(titulo,category): print "[trailertools.py] Modulo: GetTrailerbyKeyboard(titulo = %s , category = %s)" % (titulo,category) devuelve = [] keyboard = xbmc.Keyboard('default','heading') keyboard.setDefault(titulo) if titulo == "": keyboard.setHeading(config.get_localized_string(30112)) #"Introduce el Titulo a buscar" else: keyboard.setHeading(config.get_localized_string(30113)) #'Puedes recortar el titulo � bien cambiar a otro idioma' keyboard.doModal() if (keyboard.isConfirmed()): tecleado = keyboard.getText() if len(tecleado)>0: devuelve = gettrailer(tecleado,category) return devuelve else:return [] else:return []
def listar_busquedas(params, url, category): print "listar_busquedas()" channel2 = "" # Despliega las busquedas anteriormente guardadas try: presets = config.get_setting("presets_buscados") channel_preset = params.get("channel") if channel_preset != CHANNELNAME: channel2 = channel_preset print "channel_preset :%s" % channel_preset accion = params.get("action") matches = "" if "|" in presets: matches = presets.split("|") addfolder("buscador", config.get_localized_string(30103) + "...", matches[0], "por_teclado", channel2) # Buscar else: addfolder("buscador", config.get_localized_string(30103) + "...", "", "por_teclado", channel2) if len(matches) > 0: for match in matches: title = scrapedurl = match addfolder(channel_preset, title, scrapedurl, "searchresults") elif presets != "": title = scrapedurl = presets addfolder(channel_preset, title, scrapedurl, "searchresults") except: addfolder("buscador", config.get_localized_string(30103) + "...", "", "por_teclado", channel2) # Cierra el directorio xbmcplugin.setPluginCategory(handle=int(sys.argv[1]), category=category) xbmcplugin.addSortMethod(handle=int(sys.argv[1]), sortMethod=xbmcplugin.SORT_METHOD_NONE) xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True)
def addfolder( canal , nombre , url , accion , channel2 = "" ): logger.info('[buscador.py] addfolder( "'+nombre+'" , "' + url + '" , "'+accion+'")"') listitem = xbmcgui.ListItem( nombre , iconImage="DefaultFolder.png") itemurl = '%s?channel=%s&action=%s&category=%s&url=%s&channel2=%s' % ( sys.argv[ 0 ] , canal , accion , urllib.quote_plus(nombre) , urllib.quote_plus(url),channel2 ) if accion != "por_teclado": contextCommands = [] DeleteCommand = "XBMC.RunPlugin(%s?channel=buscador&action=borrar_busqueda&title=%s&url=%s)" % ( sys.argv[ 0 ] , urllib.quote_plus( nombre ) , urllib.quote_plus( url ) ) contextCommands.append((config.get_localized_string( 30300 ),DeleteCommand)) listitem.addContextMenuItems ( contextCommands, replaceItems=False) xbmcplugin.addDirectoryItem( handle = pluginhandle, url = itemurl , listitem=listitem, isFolder=True)
def get_seleccion(default_action, opciones, seleccion, video_urls): # preguntar if default_action == 0: # "Elige una opción" seleccion = dialog_select(config.get_localized_string(30163), opciones) # Ver en calidad baja elif default_action == 1: seleccion = 0 # Ver en alta calidad elif default_action == 2: seleccion = len(video_urls) - 1 else: seleccion = 0 return seleccion
def buscartrailer(params,url,category): print "[trailertools.py] Modulo: buscartrailer()" thumbnail = "" videotitle = title = urllib.unquote_plus( params.get("title") ).strip() if config.get_localized_string(30110) in videotitle: #"Buscar tailer para" videotitle = videotitle.replace(config.get_localized_string(30110),"").strip() if config.get_localized_string(30111) in videotitle: #"Insatisfecho?, busca otra vez : " videotitle = videotitle.replace(config.get_localized_string(30111),"").strip() listavideos = GetTrailerbyKeyboard(videotitle.strip(),category) else: listavideos = gettrailer(videotitle.strip().strip(),category) if len(listavideos)>0: for video in listavideos: titulo = video[1] url = video[0] thumbnail = video[2] xbmctools.addnewvideo( "trailertools" , "youtubeplay" , category , "Directo" , titulo , url , thumbnail , "Ver Video" ) xbmctools.addnewfolder( CHANNELNAME , "buscartrailer" , category , config.get_localized_string(30111)+" "+videotitle , url , os.path.join(IMAGES_PATH, 'trailertools.png'), "" ) #"Insatisfecho?, busca otra vez : " # Propiedades xbmcplugin.setPluginCategory( handle=int( sys.argv[ 1 ] ), category=category ) xbmcplugin.addSortMethod( handle=int( sys.argv[ 1 ] ), sortMethod=xbmcplugin.SORT_METHOD_NONE ) xbmcplugin.endOfDirectory( handle=int( sys.argv[ 1 ] ), succeeded=True )
def addfolder(canal, nombre, url, accion, channel2=""): logger.info('[buscador.py] addfolder( "' + nombre + '" , "' + url + '" , "' + accion + '")"') listitem = xbmcgui.ListItem(nombre, iconImage="DefaultFolder.png") itemurl = '%s?channel=%s&action=%s&category=%s&url=%s&channel2=%s' % ( sys.argv[0], canal, accion, urllib.quote_plus(nombre), urllib.quote_plus(url), channel2) if accion != "por_teclado": contextCommands = [] DeleteCommand = "XBMC.RunPlugin(%s?channel=buscador&action=borrar_busqueda&title=%s&url=%s)" % ( sys.argv[0], urllib.quote_plus(nombre), urllib.quote_plus(url)) contextCommands.append( (config.get_localized_string(30300), DeleteCommand)) listitem.addContextMenuItems(contextCommands, replaceItems=False) xbmcplugin.addDirectoryItem(handle=pluginhandle, url=itemurl, listitem=listitem, isFolder=True)
def get_dialogo_opciones(item, default_action, strm): logger.info() # logger.debug(item.tostring('\n')) from core import servertools opciones = [] error = False try: item.server = item.server.lower() except AttributeError: item.server = "" if item.server == "": item.server = "directo" # Si no es el modo normal, no muestra el diálogo porque cuelga XBMC muestra_dialogo = (config.get_setting("player_mode") == 0 and not strm) # Extrae las URL de los vídeos, y si no puedes verlo te dice el motivo # Permitir varias calidades para server "directo" if item.video_urls: video_urls, puedes, motivo = item.video_urls, True, "" else: video_urls, puedes, motivo = servertools.resolve_video_urls_for_playing( item.server, item.url, item.password, muestra_dialogo) seleccion = 0 # Si puedes ver el vídeo, presenta las opciones if puedes: for video_url in video_urls: opciones.append( config.get_localized_string(30151) + " " + video_url[0]) if item.server == "local": opciones.append(config.get_localized_string(30164)) else: # "Descargar" opcion = config.get_localized_string(30153) opciones.append(opcion) if item.isFavourite: # "Quitar de favoritos" opciones.append(config.get_localized_string(30154)) else: # "Añadir a favoritos" opciones.append(config.get_localized_string(30155)) if not strm and item.contentType == 'movie': # "Añadir a videoteca" opciones.append(config.get_localized_string(30161)) if default_action == 3: seleccion = len(opciones) - 1 # Busqueda de trailers en youtube if item.channel not in ["Trailer", "ecarteleratrailers"]: # "Buscar Trailer" opciones.append(config.get_localized_string(30162)) # Si no puedes ver el vídeo te informa else: if item.server != "": if "<br/>" in motivo: dialog_ok("No puedes ver ese vídeo porque...", motivo.split("<br/>")[0], motivo.split("<br/>")[1], item.url) else: dialog_ok("No puedes ver ese vídeo porque...", motivo, item.url) else: dialog_ok("No puedes ver ese vídeo porque...", "El servidor donde está alojado no está", "soportado en alfa todavía", item.url) if item.channel == "favorites": # "Quitar de favoritos" opciones.append(config.get_localized_string(30154)) if len(opciones) == 0: error = True return opciones, video_urls, seleccion, error
def alert_unsopported_server(): # 'Servidor no soportado o desconocido' , 'Prueba en otro servidor o en otro canal' dialog_ok(config.get_localized_string(30065), config.get_localized_string(30058))
def alert_no_disponible_server(server): # 'El vídeo ya no está en %s' , 'Prueba en otro servidor o en otro canal' dialog_ok(config.get_localized_string(30055), (config.get_localized_string(30057) % server), config.get_localized_string(30058))
def set_context_commands(item, parent_item): """ Función para generar los menus contextuales. 1. Partiendo de los datos de item.context a. Metodo antiguo item.context tipo str separando las opciones por "|" (ejemplo: item.context = "1|2|3") (solo predefinidos) b. Metodo list: item.context es un list con las diferentes opciones del menu: - Predefinidos: Se cargara una opcion predefinida con un nombre. item.context = ["1","2","3"] - dict(): Se cargara el item actual modificando los campos que se incluyan en el dict() en caso de modificar los campos channel y action estos serán guardados en from_channel y from_action. item.context = [{"title":"Nombre del menu", "action": "action del menu", "channel":"channel del menu"}, {...}] 2. Añadiendo opciones segun criterios Se pueden añadir opciones al menu contextual a items que cumplan ciertas condiciones. 3. Añadiendo opciones a todos los items Se pueden añadir opciones al menu contextual para todos los items 4. Se pueden deshabilitar las opciones del menu contextual añadiendo un comando 'no_context' al item.context. Las opciones que Kodi, el skin u otro añadido añada al menu contextual no se pueden deshabilitar. @param item: elemento que contiene los menu contextuales @type item: item @param parent_item: @type parent_item: item """ context_commands = [] num_version_xbmc = config.get_platform(True)['num_version'] # Creamos un list con las diferentes opciones incluidas en item.context if type(item.context) == str: context = item.context.split("|") elif type(item.context) == list: context = item.context else: context = [] # Opciones segun item.context for command in context: # Predefinidos if type(command) == str: if command == "no_context": return [] # Formato dict if type(command) == dict: # Los parametros del dict, se sobreescriben al nuevo context_item en caso de sobreescribir "action" y # "channel", los datos originales se guardan en "from_action" y "from_channel" if "action" in command: command["from_action"] = item.action if "channel" in command: command["from_channel"] = item.channel if "goto" in command: context_commands.append( (command["title"], "XBMC.Container.Refresh (%s?%s)" % (sys.argv[0], item.clone(**command).tourl()))) else: context_commands.append( (command["title"], "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(**command).tourl()))) # Opciones segun criterios, solo si el item no es un tag (etiqueta), ni es "Añadir a la videoteca", etc... if item.action and item.action not in [ "add_pelicula_to_library", "add_serie_to_library", "buscartrailer" ]: # Mostrar informacion: si el item tiene plot suponemos q es una serie, temporada, capitulo o pelicula if item.infoLabels['plot'] and (num_version_xbmc < 17.0 or item.contentType == 'season'): context_commands.append(("Información", "XBMC.Action(Info)")) # ExtendedInfo: Si esta instalado el addon y se cumplen una serie de condiciones if xbmc.getCondVisibility('System.HasAddon(script.extendedinfo)') \ and config.get_setting("extended_info") == True: if item.contentType == "episode" and item.contentEpisodeNumber and item.contentSeason \ and (item.infoLabels['tmdb_id'] or item.contentSerieName): param = "tvshow_id =%s, tvshow=%s, season=%s, episode=%s" \ % (item.infoLabels['tmdb_id'], item.contentSerieName, item.contentSeason, item.contentEpisodeNumber) context_commands.append(( "ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=extendedepisodeinfo,%s)" % param)) elif item.contentType == "season" and item.contentSeason \ and (item.infoLabels['tmdb_id'] or item.contentSerieName): param = "tvshow_id =%s,tvshow=%s, season=%s" \ % (item.infoLabels['tmdb_id'], item.contentSerieName, item.contentSeason) context_commands.append( ("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=seasoninfo,%s)" % param)) elif item.contentType == "tvshow" and ( item.infoLabels['tmdb_id'] or item.infoLabels['tvdb_id'] or item.infoLabels['imdb_id'] or item.contentSerieName): param = "id =%s,tvdb_id=%s,imdb_id=%s,name=%s" \ % (item.infoLabels['tmdb_id'], item.infoLabels['tvdb_id'], item.infoLabels['imdb_id'], item.contentSerieName) context_commands.append(( "ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=extendedtvinfo,%s)" % param)) elif item.contentType == "movie" and (item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.contentTitle): param = "id =%s,imdb_id=%s,name=%s" \ % (item.infoLabels['tmdb_id'], item.infoLabels['imdb_id'], item.contentTitle) context_commands.append( ("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=extendedinfo,%s)" % param)) # InfoPlus if config.get_setting("infoplus") == True: if item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.infoLabels['tvdb_id'] or \ (item.contentTitle and item.infoLabels["year"]) or item.contentSerieName: context_commands.append( ("InfoPlus", "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(channel="infoplus", action="start", from_channel=item.channel).tourl()))) # Ir al Menu Principal (channel.mainlist) if parent_item.channel not in ["news", "channelselector"] and item.action != "mainlist" \ and parent_item.action != "mainlist": context_commands.append( ("Ir al Menu Principal", "XBMC.Container.Refresh (%s?%s)" % (sys.argv[0], Item(channel=item.channel, action="mainlist").tourl()))) # Añadir a Favoritos if num_version_xbmc < 17.0 and \ ((item.channel not in ["favorites", "videolibrary", "help", ""] or item.action in ["update_videolibrary"]) and parent_item.channel != "favorites"): context_commands.append( (config.get_localized_string(30155), "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(channel="favorites", action="addFavourite", from_channel=item.channel, from_action=item.action).tourl()))) #Buscar en otros canales if item.contentType in ['movie', 'tvshow' ] and item.channel != 'search': # Buscar en otros canales if item.contentSerieName != '': item.wanted = item.contentSerieName else: item.wanted = item.contentTitle context_commands.append( ("[COLOR yellow]Buscar en otros canales[/COLOR]", "XBMC.Container.Update (%s?%s)" % (sys.argv[0], item.clone(channel='search', action="do_search", from_channel=item.channel, contextual=True).tourl()))) #Definir como Pagina de inicio if config.get_setting('start_page'): if item.action not in ['findvideos', 'play']: context_commands.insert( 0, ("[COLOR 0xffccff00]Definir como pagina de inicio[/COLOR]", "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], Item(channel='side_menu', action="set_custom_start", parent=item.tourl()).tourl()))) if item.channel != "videolibrary": # Añadir Serie a la videoteca if item.action in ["episodios", "get_episodios" ] and item.contentSerieName: context_commands.append( ("Añadir Serie a Videoteca", "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(action="add_serie_to_library", from_action=item.action).tourl()))) # Añadir Pelicula a videoteca elif item.action in [ "detail", "findvideos" ] and item.contentType == 'movie' and item.contentTitle: context_commands.append( ("Añadir Pelicula a Videoteca", "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(action="add_pelicula_to_library", from_action=item.action).tourl()))) if item.channel != "downloads": # Descargar pelicula if item.contentType == "movie" and item.contentTitle: context_commands.append( ("Descargar Pelicula", "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(channel="downloads", action="save_download", from_channel=item.channel, from_action=item.action).tourl()))) elif item.contentSerieName: # Descargar serie if item.contentType == "tvshow": context_commands.append( ("Descargar Serie", "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(channel="downloads", action="save_download", from_channel=item.channel, from_action=item.action).tourl()))) # Descargar episodio if item.contentType == "episode": context_commands.append( ("Descargar Episodio", "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(channel="downloads", action="save_download", from_channel=item.channel, from_action=item.action).tourl()))) # Descargar temporada if item.contentType == "season": context_commands.append( ("Descargar Temporada", "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(channel="downloads", action="save_download", from_channel=item.channel, from_action=item.action).tourl()))) # Abrir configuración if parent_item.channel not in ["setting", "news", "search"]: context_commands.append( ("Abrir Configuración", "XBMC.Container.Update(%s?%s)" % (sys.argv[0], Item(channel="setting", action="mainlist").tourl()))) # Buscar Trailer if item.action == "findvideos" or "buscar_trailer" in context: context_commands.append( ("Buscar Trailer", "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(channel="trailertools", action="buscartrailer", contextual=True).tourl()))) # Añadir SuperFavourites al menu contextual (1.0.53 o superior necesario) sf_file_path = xbmc.translatePath( "special://home/addons/plugin.program.super.favourites/LaunchSFMenu.py" ) check_sf = os.path.exists(sf_file_path) if check_sf and xbmc.getCondVisibility( 'System.HasAddon("plugin.program.super.favourites")'): context_commands.append(( "Super Favourites Menu", "XBMC.RunScript(special://home/addons/plugin.program.super.favourites/LaunchSFMenu.py)" )) context_commands = sorted(context_commands, key=lambda comand: comand[0]) # Menu Rapido context_commands.insert(0, ("[COLOR 0xffccff00]<Menú Rápido>[/COLOR]", "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(channel='side_menu', action="open_menu", parent=parent_item.tourl()).tourl()))) return context_commands