diff --git a/mediaserver/IMPORTANTE LEEME en esta version.txt b/mediaserver/IMPORTANTE LEEME en esta version.txt new file mode 100644 index 00000000..f62ce233 --- /dev/null +++ b/mediaserver/IMPORTANTE LEEME en esta version.txt @@ -0,0 +1,2 @@ +Debe ejecutar primero el archivo "script.py". +Una vez realizado el proceso podrá ejecutar como siempre "alfa.py" para iniciar el addon. \ No newline at end of file diff --git a/mediaserver/alfa.py b/mediaserver/alfa.py index 9aced495..f90710ee 100644 --- a/mediaserver/alfa.py +++ b/mediaserver/alfa.py @@ -22,7 +22,7 @@ websocket_port = config.get_setting("websocket.port") myip = config.get_local_ip() -def ThreadNameWrap(func): +def thread_name_wrap(func): @wraps(func) def bar(*args, **kw): if "name" not in kw: @@ -32,7 +32,7 @@ def ThreadNameWrap(func): return bar -threading.Thread.__init__ = ThreadNameWrap(threading.Thread.__init__) +threading.Thread.__init__ = thread_name_wrap(threading.Thread.__init__) if sys.version_info < (2, 7, 11): import ssl @@ -40,7 +40,7 @@ if sys.version_info < (2, 7, 11): ssl._create_default_https_context = ssl._create_unverified_context -def MostrarInfo(): +def show_info(): os.system('cls' if os.name == 'nt' else 'clear') print ("--------------------------------------------------------------------") print ("Alfa Iniciado") @@ -54,7 +54,6 @@ def MostrarInfo(): print ("Bookmark Path : " + config.get_setting("bookmarkpath")) print ("Videolibrary Path : " + config.get_setting("videolibrarypath")) print ("--------------------------------------------------------------------") - conexiones = [] controllers = platformtools.controllers for a in controllers: try: @@ -68,8 +67,8 @@ def start(): logger.info("server init...") config.verify_directories_created() try: - HTTPServer.start(MostrarInfo) - WebSocket.start(MostrarInfo) + HTTPServer.start(show_info) + WebSocket.start(show_info) # Da por levantado el servicio logger.info("--------------------------------------------------------------------") @@ -84,10 +83,10 @@ def start(): logger.info("Bookmark Path : " + config.get_setting("bookmarkpath")) logger.info("VideoLibrary Path : " + config.get_setting("videolibrarypath")) logger.info("--------------------------------------------------------------------") - MostrarInfo() + show_info() - start = True - while start: + flag = True + while flag: time.sleep(1) except KeyboardInterrupt: @@ -96,7 +95,7 @@ def start(): print 'Deteniendo el servidor WebSocket...' WebSocket.stop() print 'Alfa Detenido' - start = False + flag = False # Inicia el programa diff --git a/mediaserver/platformcode/config.py b/mediaserver/platformcode/config.py index 50602a55..7376a814 100644 --- a/mediaserver/platformcode/config.py +++ b/mediaserver/platformcode/config.py @@ -5,13 +5,12 @@ import os import re -import threading +import sys PLATFORM_NAME = "mediaserver" PLUGIN_NAME = "alfa" settings_dic = {} -settings_types = {} adult_setting = {} @@ -52,14 +51,14 @@ def get_system_platform(): def open_settings(): - Opciones = [] + options = [] from xml.dom import minidom settings = open(menufilepath, 'rb').read() xmldoc = minidom.parseString(settings) for category in xmldoc.getElementsByTagName("category"): for setting in category.getElementsByTagName("setting"): - Opciones.append(dict(setting.attributes.items() + [(u"category", category.getAttribute("label")), - (u"value", get_setting(setting.getAttribute("id")))])) + options.append(dict(setting.attributes.items() + [(u"category", category.getAttribute("label")), + (u"value", get_setting(setting.getAttribute("id")))])) from platformcode import platformtools global adult_setting @@ -69,7 +68,7 @@ def open_settings(): adult_mode = get_setting('adult_mode') adult_request_password = get_setting('adult_request_password') - platformtools.open_settings(Opciones) + platformtools.open_settings(options) # Hemos accedido a la seccion de Canales para adultos if get_setting('adult_aux_intro_password'): @@ -82,22 +81,8 @@ def open_settings(): set_setting('adult_password', get_setting('adult_aux_new_password1')) else: platformtools.dialog_ok("Canales para adultos", - "Los campos 'Nueva contraseña' y 'Confirmar nueva contraseña' no coinciden.", - "Entre de nuevo en 'Preferencias' para cambiar la contraseña") - - # Fijar adult_pin - adult_pin = "" - if get_setting("adult_request_password") == True: - adult_pin = get_setting("adult_password") - set_setting("adult_pin", adult_pin) - - # Solo esta sesion: - id = threading.current_thread().name - if get_setting("adult_mode") == 2: - adult_setting[id] = True - set_setting("adult_mode", "0") - else: - adult_setting = {} + "Los campos 'Nueva contraseña' y 'Confirmar nueva contraseña' no coinciden." + , "Entre de nuevo en 'Preferencias' para cambiar la contraseña") else: platformtools.dialog_ok("Canales para adultos", "La contraseña no es correcta.", @@ -112,24 +97,30 @@ def open_settings(): set_setting('adult_aux_new_password2', '') -def get_setting(name, channel="", server=""): +def get_setting(name, channel="", server="", default=None): """ Retorna el valor de configuracion del parametro solicitado. - Devuelve el valor del parametro 'name' en la configuracion global o en la configuracion propia del canal 'channel'. + Devuelve el valor del parametro 'name' en la configuracion global, en la configuracion propia del canal 'channel' + o en la del servidor 'server'. - Si se especifica el nombre del canal busca en la ruta \addon_data\plugin.video.alfa\settings_channels el - archivo channel_data.json y lee el valor del parametro 'name'. Si el archivo channel_data.json no existe busca en la - carpeta channels el archivo channel.xml y crea un archivo channel_data.json antes de retornar el valor solicitado. - Si el parametro 'name' no existe en channel_data.json lo busca en la configuracion global y si ahi tampoco existe - devuelve un str vacio. + Los parametros channel y server no deben usarse simultaneamente. Si se especifica el nombre del canal se devolvera + el resultado de llamar a channeltools.get_channel_setting(name, channel, default). Si se especifica el nombre del + servidor se devolvera el resultado de llamar a servertools.get_channel_setting(name, server, default). Si no se + especifica ninguno de los anteriores se devolvera el valor del parametro en la configuracion global si existe o + el valor default en caso contrario. - Parametros: - name -- nombre del parametro - channel [opcional] -- nombre del canal + @param name: nombre del parametro + @type name: str + @param channel: nombre del canal + @type channel: str + @param server: nombre del servidor + @type server: str + @param default: valor devuelto en caso de que no exista el parametro name + @type default: any - Retorna: - value -- El valor del parametro 'name' + @return: El valor del parametro 'name' + @rtype: any """ @@ -138,7 +129,7 @@ def get_setting(name, channel="", server=""): # logger.info("config.get_setting reading channel setting '"+name+"' from channel json") from core import channeltools - value = channeltools.get_channel_setting(name, channel) + value = channeltools.get_channel_setting(name, channel, default) # logger.info("config.get_setting -> '"+repr(value)+"'") return value @@ -146,7 +137,7 @@ def get_setting(name, channel="", server=""): elif server: # logger.info("config.get_setting reading server setting '"+name+"' from server json") from core import servertools - value = servertools.get_server_setting(name, server) + value = servertools.get_server_setting(name, server, default) # logger.info("config.get_setting -> '"+repr(value)+"'") return value @@ -155,31 +146,28 @@ def get_setting(name, channel="", server=""): else: # logger.info("config.get_setting reading main setting '"+name+"'") global settings_dic - value = settings_dic.get(name, "") - - if name == "adult_mode": - global adult_setting - id = threading.current_thread().name - if adult_setting.get(id) == True: - value = "2" + value = settings_dic.get(name, default) + if value == default: + return value + # logger.info("config.get_setting -> '"+value+"'") # hack para devolver el tipo correspondiente - global settings_types + if value == "true": + return True + elif value == "false": + return False + else: + # special case return as str + if name in ["adult_password", "adult_aux_intro_password", "adult_aux_new_password1", + "adult_aux_new_password2"]: + return value + else: + try: + value = int(value) + except ValueError: + pass - if settings_types.get(name) in ['enum', 'number']: - value = int(value) - - elif settings_types.get(name) == 'bool': - value = value == 'true' - - elif not settings_types.has_key(name): - try: - t = eval(value) - value = t[0](t[1]) - except: - value = None - - return value + return value def set_setting(name, value, channel="", server=""): @@ -214,25 +202,16 @@ def set_setting(name, value, channel="", server=""): return servertools.set_server_setting(name, value, server) else: global settings_dic - global settings_types - if settings_types.get(name) == 'bool': + if isinstance(value, bool): if value: - new_value = "true" + value = "true" else: - new_value = "false" - - elif settings_types.get(name): - new_value = str(value) - - else: - if isinstance(value, basestring): - new_value = "(%s, %s)" % (type(value).__name__, repr(value)) - else: - new_value = "(%s, %s)" % (type(value).__name__, value) - - settings_dic[name] = new_value + value = "false" + elif isinstance(value, (int, long)): + value = str(value) + settings_dic[name] = value from xml.dom import minidom # Crea un Nuevo XML vacio new_settings = minidom.getDOMImplementation().createDocument(None, "settings", None) @@ -339,11 +318,9 @@ def get_local_ip(): def load_settings(): global settings_dic - global settings_types defaults = {} from xml.etree import ElementTree - encontrado = False # Lee el archivo XML (si existe) if os.path.exists(configfilepath): settings = open(configfilepath, 'rb').read() @@ -357,10 +334,9 @@ def load_settings(): for target in category.findall("setting"): if target.get("id"): defaults[target.get("id")] = target.get("default") - settings_types[target.get("id")] = target.get("type") for key in defaults: - if not key in settings_dic: + if key not in settings_dic: settings_dic[key] = defaults[key] set_settings(settings_dic) @@ -387,7 +363,14 @@ def set_settings(JsonRespuesta): # Fichero de configuración menufilepath = os.path.join(get_runtime_path(), "resources", "settings.xml") configfilepath = os.path.join(get_data_path(), "settings.xml") -if not os.path.exists(get_data_path()): os.mkdir(get_data_path()) +if not os.path.exists(get_data_path()): + os.mkdir(get_data_path()) # Literales TRANSLATION_FILE_PATH = os.path.join(get_runtime_path(), "resources", "language", "Spanish", "strings.xml") load_settings() + +# modo adulto: +# sistema actual 0: Nunca, 1:Siempre, 2:Solo hasta que se reinicie sesión +# si es == 2 lo desactivamos. +if get_setting("adult_mode") == 2: + set_setting("adult_mode", 0) diff --git a/mediaserver/platformcode/launcher.py b/mediaserver/platformcode/launcher.py index b8dfe6b3..81549e38 100644 --- a/mediaserver/platformcode/launcher.py +++ b/mediaserver/platformcode/launcher.py @@ -29,19 +29,20 @@ def start(): def run(item): itemlist = [] # Muestra el item en el log: - PrintItems(item) + print_items(item) # Control Parental, comprueba si es adulto o no if item.action == "mainlist": # Parental control - if channeltools.is_adult(item.channel) and config.get_setting("adult_pin") != "": + if channeltools.is_adult(item.channel) and config.get_setting("adult_request_password"): tecleado = platformtools.dialog_input("", "Contraseña para canales de adultos", True) - if tecleado is None or tecleado != config.get_setting("adult_pin"): + if tecleado is None or tecleado != config.get_setting("adult_password"): platformtools.render_items(None, item) return # Importa el canal para el item, todo item debe tener un canal, sino sale de la función - if item.channel: channelmodule = ImportarCanal(item) + if item.channel: + channelmodule = import_channel(item) # If item has no action, stops here if item.action == "": @@ -153,13 +154,13 @@ def run(item): itemlist = [Item(title="No hay elementos para mostrar", thumbnail=get_thumb("error.png"))] # Imprime en el log el resultado - PrintItems(itemlist) + print_items(itemlist) # Muestra los resultados en pantalla platformtools.render_items(itemlist, item) -def ImportarCanal(item): +def import_channel(item): channel = item.channel channelmodule = "" if os.path.exists(os.path.join(config.get_runtime_path(), "channels", channel + ".py")): @@ -171,7 +172,7 @@ def ImportarCanal(item): return channelmodule -def PrintItems(itemlist): +def print_items(itemlist): if type(itemlist) == list: if len(itemlist) > 0: logger.info("Items devueltos") @@ -197,13 +198,13 @@ def add_pelicula_to_library(item): def add_serie_to_library(item): - channel = ImportarCanal(item) + channel = import_channel(item) videolibrarytools.add_tvshow(item, channel) def download_all_episodes(item, first_episode="", preferred_server="vidspot", filter_language=""): logger.info("show=" + item.show) - channel = ImportarCanal(item) + channel = import_channel(item) show_title = item.show # Obtiene el listado desde el que se llamó diff --git a/mediaserver/resources/settings.xml b/mediaserver/resources/settings.xml index 368aa850..5607fedd 100644 --- a/mediaserver/resources/settings.xml +++ b/mediaserver/resources/settings.xml @@ -16,15 +16,14 @@ - + - + - @@ -32,20 +31,14 @@ - + - - - + + + - \ No newline at end of file + diff --git a/mediaserver/script.py b/mediaserver/script.py new file mode 100644 index 00000000..5936fd82 --- /dev/null +++ b/mediaserver/script.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- +import os +import re +import shutil + +from platformcode import config, logger, platformtools + + +def conversion(): + logger.info() + data = "" + + try: + # do a backup + path_settings = os.path.join(config.get_data_path(), "settings.xml") + path_settings_backup = os.path.join(config.get_data_path(), "settings.backup.xml") + shutil.copy(path_settings, path_settings_backup) + + # open file + f = open(path_settings, "r") + # copy = open(path_settings2, "w") + + logger.info(" ---") + logger.info(" --- 1") + logger.info(" --- 2") + logger.info(" --- 3") + data_aux = "" + + begin_tag = "\n" + end_tag = "\n" + + adult_data = ' \n' + adult_data += ' \n' + adult_data += ' \n' + adult_data += ' \n' + adult_data += ' \n' + adult_data += ' \n' + + for line in f: + matches = re.findall(' tag + # data += line + else: + logger.info("Matches") + for _id, value in matches: + logger.info(" dentro del for") + logger.info(" _id:%s value:%s" % (_id, value)) + + if _id not in ["adult_aux_intro_password", "adult_aux_new_password1", "adult_aux_new_password2", + "adult_mode", "adult_password", "adult_request_password", "adult_pin"]: + logger.info(" linea %s" % line) + logger.info(" value %s" % value) + if value: + # logger.info(" type value!! %s" % type(value)) + logger.info(" antes value!! %s" % value) + if "(str, " in value: + if "(str, '" in value: + value = value.replace("(str, '", "") + value = value.replace("')", "") + elif "(str, '": + value = value.replace("(str, '", "") + value = value.replace("')", "") + elif "(bool, " in value: + value = value.replace("(bool, ", "") + if value == "True)": + value = "true" + else: + value = "false" + value = value.replace('\\\\', '\\') + logger.info(" despues value!! %s" % value) + + aux_line = '\n' % (_id, value) + logger.info(" aux_line %s" % aux_line) + data_aux += " " + aux_line + f.close() + + data = begin_tag + adult_data + data_aux + end_tag + + copy_file = open(path_settings, "w") + copy_file.write(data) + copy_file.close() + + while True: + import sys + logger.info("sys ve %s" % sys.version_info) + if sys.version_info > (3, 0): + value = input("Alfa\nCorregido un error en la seccion adultos, se ha reseteado la contrasena a por " + "defecto, tendra que cambiarla de nuevo si lo desea.\n Escriba 's', si lo ha entendido: ") + else: + value = raw_input("Alfa\nCorregido un error en la seccion adultos, se ha reseteado la contrasena a por " + "defecto, tendra que cambiarla de nuevo si lo desea.\n Escriba 's', si lo ha entendido: ") + logger.debug("value %s" % value) + if value.lower() == 's': + break + logger.info("En disclaimer clickó 'No'") + + logger.info("En disclaimer clickó 'Si'") + + except Exception, ex: + template = "An exception of type %s occured. Arguments:\n%r" + message = template % (type(ex).__name__, ex.args) + logger.info(message) + print("Alfa", "Error, en conversión") + logger.info("Datos a guardar %s" % data) + +if __name__ == "__main__": + conversion() diff --git a/plugin.video.alfa/addon.xml b/plugin.video.alfa/addon.xml index bda36ebd..2a4efa22 100755 --- a/plugin.video.alfa/addon.xml +++ b/plugin.video.alfa/addon.xml @@ -1,5 +1,5 @@  - + @@ -19,10 +19,11 @@ [B]Estos son los cambios para esta versión:[/B] [COLOR green][B]Arreglos[/B][/COLOR] - [I]- streamix.cloud - - tvseriesdk - - newpct - - fix internos[/I] + [I]- arreglo sección adultos + [I]- flashx + - fixes internos[/I] + + [COLOR green]Gracias a [COLOR yellow][B]msdos[/B][/COLOR] por su colaboración en esta versión[/COLOR] Navega con Kodi por páginas web para ver sus videos de manera fácil. Browse web pages using Kodi diff --git a/plugin.video.alfa/channels/animeflv.py b/plugin.video.alfa/channels/animeflv.py old mode 100755 new mode 100644 index 67ad3f07..ec68dd95 --- a/plugin.video.alfa/channels/animeflv.py +++ b/plugin.video.alfa/channels/animeflv.py @@ -223,7 +223,7 @@ def episodios(item): item.plot = scrapertools.find_single_match(data, 'Description[^>]+>

(.*?)

') matches = re.compile('href="([^"]+)">
' - '

(.*?)

', re.DOTALL).findall(data) + '\s*

(.*?)

', re.DOTALL).findall(data) if matches: for url, thumb, title in matches: diff --git a/plugin.video.alfa/channels/autoplay.py b/plugin.video.alfa/channels/autoplay.py index f42a46d5..450b134e 100755 --- a/plugin.video.alfa/channels/autoplay.py +++ b/plugin.video.alfa/channels/autoplay.py @@ -381,10 +381,10 @@ def check_value(channel, itemlist): quality_list = channel_node['quality'] = list() for item in itemlist: - if item.server not in server_list: + if item.server not in server_list and item.server !='': server_list.append(item.server) change = True - if item.quality not in quality_list: + if item.quality not in quality_list and item.quality !='': quality_list.append(item.quality) change = True diff --git a/plugin.video.alfa/channels/datoporn.py b/plugin.video.alfa/channels/datoporn.py index cdf9f300..1afb3615 100755 --- a/plugin.video.alfa/channels/datoporn.py +++ b/plugin.video.alfa/channels/datoporn.py @@ -40,7 +40,7 @@ def lista(item): server="datoporn", fanart=scrapedthumbnail.replace("_t.jpg", ".jpg"))) # Extrae la marca de siguiente página - next_page = scrapertools.find_single_match(data, "Next") + next_page = scrapertools.find_single_match(data, 'Next') if next_page and itemlist: itemlist.append(item.clone(action="lista", title=">> Página Siguiente", url=next_page)) diff --git a/plugin.video.alfa/channels/hentaienespanol.py b/plugin.video.alfa/channels/hentaienespanol.py index c329affe..4551f015 100755 --- a/plugin.video.alfa/channels/hentaienespanol.py +++ b/plugin.video.alfa/channels/hentaienespanol.py @@ -61,30 +61,3 @@ def search(item, texto): return todas(item) else: return [] - - -def findvideos(item): - logger.info() - - itemlist = [] - - data = httptools.downloadpage(item.url).data - patron = '<\/i>Ver.*?<\/span><\/a> <\/li>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl in matches: - title = item.title - url = scrapedurl - itemlist.append(item.clone(title=title, url=url, action="play")) - - return itemlist - - -def play(item): - logger.info() - itemlist = [] - item.url = item.url.replace(' ', '%20') - data = httptools.downloadpage(item.url, add_referer=True).data - url = scrapertools.find_single_match(data, '(.*?)
") - patron = "(.*?)" + pattern = 'id="hentai2">]+>(.*?)
' + data = scrapertools.find_single_match(data, pattern) + + patron = 'href="([^"]+)"[^>]+>(.*?)' matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle in matches: - title = scrapertools.entityunescape(scrapedtitle) - url = urlparse.urljoin(item.url, scrapedurl) + for url, title in matches: # logger.debug("title=[{0}], url=[{1}]".format(title, url)) - itemlist.append(Item(channel=item.channel, action="series", title=title, url=url)) return itemlist -def search(item, texto): - logger.info() - if item.url == "": - item.url = urlparse.urljoin(CHANNEL_HOST, "animes/?buscar=") - texto = texto.replace(" ", "+") - item.url = "%s%s" % (item.url, texto) - - try: - return series(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - def series(item): logger.info() - data = httptools.downloadpage(item.url).data + data = re.sub(r"\n|\r|\t|\s{2}", "", httptools.downloadpage(item.url).data) - patron = '

' \ - '(.*?)[^<]+

[^<]+[^<]+ 0: - scrapedurl = match - scrapedtitle = ">> Pagina Siguiente" + if pagination: + page = scrapertools.find_single_match(pagination, '>Página\s*(\d+)\s*de\s*\d+<') + pattern = 'href="([^"]+)">%s<' % (int(page) + 1) + url_page = scrapertools.find_single_match(pagination, pattern) - itemlist.append(Item(channel=item.channel, action="series", title=scrapedtitle, url=scrapedurl, - folder=True, viewmode="movies_with_plot")) + if url_page: + itemlist.append(Item(channel=item.channel, action="series", title=">> Página Siguiente", url=url_page)) return itemlist @@ -124,9 +89,11 @@ def episodios(item): logger.info() itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data, '
(.*?)
') - patron = '([^<]+)' + data = re.sub(r"\n|\r|\t|\s{2}", "", httptools.downloadpage(item.url).data) + pattern = '
Lista de Capítulos
(.*?)
' + + data = scrapertools.find_single_match(data, pattern) + patron = ']+>([^<]+)' matches = re.compile(patron, re.DOTALL).findall(data) for scrapedurl, scrapedtitle in matches: @@ -136,10 +103,9 @@ def episodios(item): plot = item.plot # logger.debug("title=[{0}], url=[{1}], thumbnail=[{2}]".format(title, url, thumbnail)) - itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, plot=plot, show=item.show, fulltitle="%s %s" % (item.show, title), - fanart=thumbnail, viewmode="movies_with_plot", folder=True)) + fanart=thumbnail)) return itemlist @@ -148,7 +114,8 @@ def findvideos(item): logger.info() data = httptools.downloadpage(item.url).data - patron = '
[^<]+<[iframe|IFRAME].*?[src|SRC]="([^"]+)"' + + patron = '<(?:iframe)?(?:IFRAME)?\s*(?:src)?(?:SRC)?="([^"]+)"' matches = re.compile(patron, re.DOTALL).findall(data) for url in matches: diff --git a/plugin.video.alfa/channels/inkapelis.py b/plugin.video.alfa/channels/inkapelis.py index ca8863cf..29d7bf2f 100755 --- a/plugin.video.alfa/channels/inkapelis.py +++ b/plugin.video.alfa/channels/inkapelis.py @@ -101,7 +101,7 @@ def generos(item): matches = scrapertools.find_multiple_matches(data, '
  • (.*?)') for scrapedurl, scrapedtitle in matches: - if scrapedtitle == "Eroticas +18 " and config.get_setting("adult_mode") != "0": + if scrapedtitle == "Eroticas +18 " and config.get_setting("adult_mode") != 0: itemlist.append(item.clone(action="eroticas", title=scrapedtitle, url=scrapedurl)) elif (scrapedtitle != "Estrenos ") and (scrapedtitle != "Próximos Estrenos "): itemlist.append(item.clone(action="entradas", title=scrapedtitle, url=scrapedurl)) diff --git a/plugin.video.alfa/channels/locopelis.json b/plugin.video.alfa/channels/locopelis.json index 728a30dd..d5df7370 100755 --- a/plugin.video.alfa/channels/locopelis.json +++ b/plugin.video.alfa/channels/locopelis.json @@ -52,7 +52,7 @@ "default": 0, "enabled": true, "visible": true, - "llvalues": [ + "lvalues": [ "No filtrar", "Latino", "Español", @@ -76,4 +76,4 @@ "visible": true } ] -} \ No newline at end of file +} diff --git a/plugin.video.alfa/channels/mundoflv.py b/plugin.video.alfa/channels/mundoflv.py index f00e27a0..8eeb1dae 100755 --- a/plugin.video.alfa/channels/mundoflv.py +++ b/plugin.video.alfa/channels/mundoflv.py @@ -345,13 +345,13 @@ def temporadas(item): itemlist = [] templist = [] data = httptools.downloadpage(item.url).data + data = data.replace ('"',"'") realplot = '' - patron = "" + patron = "