def save_download_movie(item): logger.info("pelisalacarta.channels.descargas save_download_movie") progreso = platformtools.dialog_progress("Descargas", "Obteniendo datos de la pelicula") tmdb.find_and_set_infoLabels_tmdb(item) progreso.update(0, "Añadiendo pelicula...") item.action = "menu" item.channel = "descargas" item.downloadStatus = 0 item.downloadProgress = 0 item.downloadSize = 0 item.downloadCompleted = 0 item.downloadFilename = "%s [%s]" % (item.contentTitle.strip(), item.contentChannel) if item.text_color: del item.text_color if item.text_bold: del item.text_bold if item.text_italic: del item.text_italic item.path = filetools.encode(os.path.join(config.get_setting("downloadlistpath"), str(time.time()) + ".json")) filetools.write(item.path, item.tojson()) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "¿Iniciar la descarga ahora?"): platformtools.dialog_ok(config.get_localized_string(30101), item.contentTitle, config.get_localized_string(30109)) else: start_download(item)
def save_download_tvshow(item): logger.info("contentAction: %s | contentChannel: %s | contentType: %s | contentSerieName: %s" % ( item.contentAction, item.contentChannel, item.contentType, item.contentSerieName)) progreso = platformtools.dialog_progress("Download", "Recupero della serie") scraper.find_and_set_infoLabels(item) item.downloadFilename = filetools.validate_path("%s [%s]" % (item.contentSerieName, item.contentChannel)) progreso.update(0, "Recupero episodi...", "connessione a %s..." % item.contentChannel) episodes = get_episodes(item) progreso.update(0, "Aggiunta capitoli...", " ") for x, i in enumerate(episodes): progreso.update(x * 100 / len(episodes), "%dx%0.2d: %s" % (i.contentSeason, i.contentEpisodeNumber, i.contentTitle)) write_json(i) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "Avviare il download adesso?"): platformtools.dialog_ok(config.get_localized_string(30101), str(len(episodes)) + " capitoli di: " + item.contentSerieName, config.get_localized_string(30109)) else: for i in episodes: res = start_download(i) if res == STATUS_CODES.canceled: break
def play_(item): logger.info("pelisalacarta.channels.documaniatv play_") itemlist = [] try: import xbmc if not xbmc.getCondVisibility('System.HasAddon(script.cnubis)'): from platformcode import platformtools platformtools.dialog_ok("Addon no encontrado", "Para ver vídeos alojados en cnubis necesitas tener su instalado su add-on", line3="Descárgalo en http://cnubis.com/kodi-pelisalacarta.html" ) return itemlist except: pass # Descarga la pagina data = scrapertools.cachePage(item.url, headers=headers) # Busca enlace directo video_url = scrapertools.find_single_match(data, 'class="embedded-video"[^<]+<iframe.*?src="([^"]+)"') if config.get_platform() == "plex" or config.get_platform() == "mediaserver": code = scrapertools.find_single_match(video_url, 'u=([A-z0-9]+)') url = "http://cnubis.com/plugins/mediaplayer/embeder/_embedkodi.php?u=%s" % code data = scrapertools.downloadpage(url, headers=headers) video_url = scrapertools.find_single_match(data, 'file\s*:\s*"([^"]+)"') itemlist.append(item.clone(action="play", url=video_url, server="directo")) return itemlist cnubis_script = xbmc.translatePath("special://home/addons/script.cnubis/default.py") xbmc.executebuiltin("XBMC.RunScript(%s, url=%s&referer=%s&title=%s)" % (cnubis_script, urllib.quote_plus(video_url), urllib.quote_plus(item.url), item.fulltitle)) return itemlist
def save_download_tvshow(item): logger.info("pelisalacarta.channels.descargas save_download_tvshow") logger.info("Tipo: %s" % item.contentType) progreso = platformtools.dialog_progress("Descargas", "Obteniendo datos de la serie") tmdb.find_and_set_infoLabels_tmdb(item) item.downloadFilename = item.downloadFilename = "%s [%s]" % (item.contentSerieName, item.contentChannel) episodes = get_episodes(item) progreso.update(0, "Añadiendo capitulos...") for x, i in enumerate(episodes): progreso.update(x * 100 / len(episodes), os.path.basename(i.downloadFilename)) i.path = os.path.join(config.get_setting("downloadlistpath"), str(time.time()) + ".json") filetools.write(i.path, i.tojson()) time.sleep(0.1) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "¿Iniciar la descarga ahora?"): platformtools.dialog_ok(config.get_localized_string(30101), str(len(episodes)) + " capitulos de: " + item.contentSerieName, config.get_localized_string(30109)) else: for i in episodes: res = start_download(i) if res == 1: break
def create_tvshows_from_json(_actualizado): logger.info("pelisalacarta.platformcode.library_service create_tvshows_from_json") fname = filetools.join(config.get_data_path(), library.TVSHOW_FILE) if filetools.exists(fname): if not _actualizado: platformtools.dialog_ok("Biblioteca: Actualizando formato", "Espere por favor mientras se completa el proceso") try: data = jsontools.loads(filetools.read(fname)) for tvshow in data: for channel in data[tvshow]["channels"]: serie = Item(contentSerieName=data[tvshow]["channels"][channel]["tvshow"], url=data[tvshow]["channels"][channel]["url"], channel=channel, action="episodios", title=data[tvshow]["name"], active=True) if not tvshow.startswith("t_"): serie.infoLabels["tmdb_id"] = tvshow library.save_library_tvshow(serie, list()) filetools.rename(fname, "series.json.old") except EnvironmentError: logger.info("ERROR al leer el archivo: {0}".format(fname))
def force_creation_advancedsettings(item): # Ruta del advancedsettings advancedsettings = xbmc.translatePath("special://userdata/advancedsettings.xml") itemlist = [] try: risp = platformtools.dialog_select('Scegli settaggio cache', [ram[0], ram[1], ram[2], ram[3]]) logger.info(str(risp)) if risp == 0: valore = opt[0] testo = "\n[COLOR orange]Cache Impostata per 512 Mega di RAM[/COLOR]" if risp == 1: valore = opt[1] testo = "\n[COLOR orange]Cache Impostata per 1 Gb di RAM[/COLOR]" if risp == 2: valore = opt[2] testo = "\n[COLOR orange]Cache Impostata per 2 Gb di RAM[/COLOR]" if risp == 3: valore = opt[3] testo = "\n[COLOR orange]Cache Impostata a superiore di 2 Gb di RAM[/COLOR]" if risp < 0: return itemlist file = '''<advancedsettings> <network> <buffermode>1</buffermode> <cachemembuffersize>''' + valore + '''</cachemembuffersize> <readbufferfactor>10</readbufferfactor> <autodetectpingtime>30</autodetectpingtime> <curlclienttimeout>60</curlclienttimeout> <curllowspeedtime>60</curllowspeedtime> <curlretries>2</curlretries> <disableipv6>true</disableipv6> </network> <gui> <algorithmdirtyregions>0</algorithmdirtyregions> <nofliptimeout>0</nofliptimeout> </gui> <playlistasfolders1>false</playlistasfolders1> <audio> <defaultplayer>dvdplayer</defaultplayer> </audio> <imageres>540</imageres> <fanartres>720</fanartres> <splash>false</splash> <handlemounting>0</handlemounting> <samba> <clienttimeout>30</clienttimeout> </samba> </advancedsettings>''' logger.info(file) salva = open(advancedsettings, "w") salva.write(file) salva.close() except: pass platformtools.dialog_ok("plugin", "E' stato creato un file advancedsettings.xml","con la configurazione ideale per lo streaming.", testo) return itemlist
def add_pelicula_to_library(item): """ guarda una pelicula en la libreria de cine. La pelicula puede ser un enlace dentro de un canal o un video descargado previamente. Para añadir episodios descargados en local, el item debe tener exclusivamente: - contentTitle: titulo de la pelicula - title: titulo a mostrar junto al listado de enlaces -findvideos- ("Reproducir video local HD") - infoLabels["tmdb_id"] o infoLabels["imdb_id"] - contentType == "movie" - channel = "descargas" - url : ruta local al video @type item: item @param item: elemento que se va a guardar. """ logger.info("pelisalacarta.platformcode.library add_pelicula_to_library") new_item = item.clone(action="findvideos") insertados, sobreescritos, fallidos = save_library_movie(new_item) if fallidos == 0: platformtools.dialog_ok(config.get_localized_string(30131), new_item.contentTitle, config.get_localized_string(30135)) # 'se ha añadido a la biblioteca' else: platformtools.dialog_ok(config.get_localized_string(30131), "ERROR, la pelicula NO se ha añadido a la biblioteca")
def remove_from_downloads_error(item): from core import descargas descargas.mover_descarga_error_a_pendiente(item.extra) platformtools.dialog_ok("Pelisalacarta", config.get_localized_string(30101) +"\n"+ item.title +"\n"+ config.get_localized_string(30107)) platformtools.itemlist_refresh() return
def backups(item): from platformcode import platformtools logger.info("pelisalacarta.channel.configuracion backups") ruta = filetools.join(config.get_data_path(), "backups") ruta_split = "" if "ruta" in item.title: heading = "Ruta de copias de seguridad" if not filetools.exists(ruta): folders = "Carpeta no creada" else: folders = str(len(filetools.listdir(ruta))) + " copia/s de seguridad guardadas" if len(ruta) > 55: ruta_split = ruta[55:] ruta = ruta[:55] platformtools.dialog_ok(heading, ruta, ruta_split, folders) else: if not filetools.exists(ruta): platformtools.dialog_ok("La carpeta no existe", "No hay copias de seguridad guardadas") else: dyesno = platformtools.dialog_yesno("Las copias de seguridad se eliminarán", "¿Está seguro?") if dyesno: import shutil shutil.rmtree(ruta, ignore_errors=True)
def remove_from_favorites(item): from channels import favoritos # En "extra" está el nombre del fichero en favoritos favoritos.delFavourite(item.extra) platformtools.dialog_ok("Pelisalacarta", config.get_localized_string(30102) +"\n"+ item.title +"\n"+ config.get_localized_string(30105)) platformtools.itemlist_refresh() return
def save_download_tvshow(item): logger.info("contentAction: %s | contentChannel: %s | contentType: %s | contentSerieName: %s" % (item.contentAction, item.contentChannel, item.contentType, item.contentSerieName)) progreso = platformtools.dialog_progress("Descargas", "Obteniendo datos de la serie") tmdb.find_and_set_infoLabels_tmdb(item) item.downloadFilename = item.downloadFilename = "%s [%s]" % (item.contentSerieName, item.contentChannel) progreso.update(0, "Obteniendo episodios...", "conectando con %s..." % item.contentChannel) episodes = get_episodes(item) progreso.update(0, "Añadiendo capitulos...", " ") for x, i in enumerate(episodes): progreso.update(x * 100 / len(episodes), "%dx%0.2d: %s" % (i.contentSeason, i.contentEpisodeNumber, i.contentTitle)) write_json(i) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "¿Iniciar la descarga ahora?"): platformtools.dialog_ok(config.get_localized_string(30101), str(len(episodes)) + " capitulos de: " + item.contentSerieName, config.get_localized_string(30109)) else: for i in episodes: res = start_download(i) if res == STATUS_CODES.canceled: break
def save_download_movie(item): logger.info("contentAction: %s | contentChannel: %s | contentTitle: %s" % ( item.contentAction, item.contentChannel, item.contentTitle)) progreso = platformtools.dialog_progress("Download", "Recupero del film") result = scraper.find_and_set_infoLabels(item) if not result: progreso.close() item.contentType = "video" return save_download_video(item) progreso.update(0, "Aggiunta del film...") item.downloadFilename = filetools.validate_path("%s [%s]" % (item.contentTitle.strip(), item.contentChannel)) write_json(item) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "Avviare il download adesso?"): platformtools.dialog_ok(config.get_localized_string(30101), item.contentTitle, config.get_localized_string(30109)) else: start_download(item)
def start(thread = True): if thread: t = threading.Thread(target=start, args=[False]) t.setDaemon(True) t.start() else: import time updatelibrary_wait = [0, 10000, 20000, 30000, 60000] wait = updatelibrary_wait[int(config.get_setting("updatelibrary_wait", "biblioteca"))] if wait > 0: time.sleep(wait) # Comprobar version de la bilbioteca y actualizar si es necesario if config.get_setting("library_version") != 'v4': platformtools.dialog_ok(config.PLUGIN_NAME.capitalize(), "Se va a actualizar la biblioteca al nuevo formato", "Seleccione el nombre correcto de cada serie o película, si no está seguro pulse 'Cancelar'.") if not convert_old_to_v4(): platformtools.dialog_ok(config.PLUGIN_NAME.capitalize(), "ERROR, al actualizar la biblioteca al nuevo formato") else: # La opcion 2 es "Una sola vez al dia" if not config.get_setting("updatelibrary", "biblioteca") == 2: check_for_update(overwrite=False) else: if not config.get_setting("updatelibrary", "biblioteca") == 2: check_for_update(overwrite=False) # Se ejecuta ciclicamente while True: monitor_update() time.sleep(3600) # cada hora
def remove_from_downloads(item): from core import descargas # La categoría es el nombre del fichero en la lista de descargas descargas.deletebookmark(item.extra) platformtools.dialog_ok("Pelisalacarta", config.get_localized_string(30101) +"\n"+ item.title +"\n"+ config.get_localized_string(30106)) platformtools.itemlist_refresh() return
def open_settings(): Opciones =[] 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")))])) from platformcode import platformtools global adult_setting adult_password = get_setting('adult_password') if not adult_password: adult_password = set_setting('adult_password', '1111') adult_mode = get_setting('adult_mode') adult_request_password = get_setting('adult_request_password') platformtools.open_settings(Opciones) # Hemos accedido a la seccion de Canales para adultos if get_setting('adult_aux_intro_password'): # La contraseña de acceso es correcta if get_setting('adult_aux_intro_password') == adult_password: # Cambio de contraseña if get_setting('adult_aux_new_password1'): if get_setting('adult_aux_new_password1') == get_setting('adult_aux_new_password2'): 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 = {} else: platformtools.dialog_ok("Canales para adultos", "La contraseña no es correcta.", "Los cambios realizados en esta sección no se guardaran.") # Deshacer cambios set_setting("adult_mode", adult_mode) set_setting("adult_request_password", adult_request_password) # Borramos settings auxiliares set_setting('adult_aux_intro_password', '') set_setting('adult_aux_new_password1', '') set_setting('adult_aux_new_password2', '')
def add_pelicula_to_library(item): logger.info("pelisalacarta.platformcode.library add_pelicula_to_library") new_item = item.clone(action="findvideos") insertados, sobreescritos, fallidos = save_library_movie(new_item) if fallidos == 0: platformtools.dialog_ok("Biblioteca", "La pelicula se ha añadido a la biblioteca") else: platformtools.dialog_ok("Biblioteca", "ERROR, la pelicula NO se ha añadido a la biblioteca")
def add_pelicula_to_library(item): logger.info("streamondemand.platformcode.library add_pelicula_to_library") new_item = item.clone(action="findvideos") insertados, sobreescritos, fallidos = save_library_movie(new_item) if fallidos == 0: platformtools.dialog_ok("Libreria", "Il film è stato aggiunto alla libreria") else: itemlist.append(Item(title="ERRORE, il film non è stato aggiunto alla libreria", channel=item.channel)) platformtools.dialog_ok("Libreria", "ERRORE, il film non è stato aggiunto alla libreria")
def add_to_library(item): if "item_action" in item: item.action = item.item_action del item.item_action if not item.fulltitle=="": item.title = item.fulltitle library.savelibrary(item) platformtools.dialog_ok("Pelisalacarta", config.get_localized_string(30101) +"\n"+ item.title +"\n"+ config.get_localized_string(30135)) return
def create_tvshows_from_xml(): logger.info("pelisalacarta.platformcode.library_service create_tvshows_from_xml") fname = filetools.join(config.get_data_path(), library.TVSHOW_FILE_OLD) if filetools.exists(fname): platformtools.dialog_ok("Biblioteca: Se va a actualizar al nuevo formato", "Seleccione el nombre correcto de cada serie, si no está seguro pulse 'Cancelar'.", "Hay nuevas opciones en 'Biblioteca' y en la 'configuración' del addon.") filetools.rename(library.TVSHOWS_PATH, "SERIES_OLD") if not filetools.exists(library.TVSHOWS_PATH): filetools.mkdir(library.TVSHOWS_PATH) if filetools.exists(library.TVSHOWS_PATH): try: data = filetools.read(fname) for line in data.splitlines(): aux = line.rstrip('\n').split(",") tvshow = aux[0].strip() url = aux[1].strip() channel = aux[2].strip() serie = Item(contentSerieName=tvshow, url=url, channel=channel, action="episodios", title=tvshow, active=True) patron = "^(.+)[\s]\((\d{4})\)$" matches = re.compile(patron, re.DOTALL).findall(serie.contentSerieName) if matches: serie.infoLabels['title'] = matches[0][0] serie.infoLabels['year'] = matches[0][1] else: serie.infoLabels['title'] = tvshow library.save_library_tvshow(serie, list()) filetools.rename(fname, "series.xml.old") # Por ultimo limpia la libreria, por que las rutas anteriores ya no existen library.clean() except EnvironmentError: logger.info("ERROR al leer el archivo: {0}".format(fname)) else: logger.info("ERROR, no se ha podido crear la nueva carpeta de SERIES") else: logger.info("ERROR, no se ha podido renombrar la antigua carpeta de SERIES") return True return False
def create_tvshows_from_xml(): logger.info("fusionse.platformcode.library_service create_tvshows_from_xml") fname = filetools.join(config.get_data_path(), library.TVSHOW_FILE_OLD) if filetools.exists(fname): platformtools.dialog_ok("Libreria: Si aggiornerà al nuovo formato", "Selezionare il nome corretto di ogni serie, se non siete sicuri potete 'Annulla'.", "Ci sono nuove opzioni per la 'Libreria' in 'configurazione'.") filetools.rename(library.TVSHOWS_PATH, "SERIES_OLD") if not filetools.exists(library.TVSHOWS_PATH): filetools.mkdir(library.TVSHOWS_PATH) if filetools.exists(library.TVSHOWS_PATH): try: data = filetools.read(fname) for line in data.splitlines(): aux = line.rstrip('\n').split(",") tvshow = aux[0].strip() url = aux[1].strip() channel = aux[2].strip() serie = Item(contentSerieName=tvshow, url=url, channel=channel, action="episodios", title=tvshow, active=True) patron = "^(.+)[\s]\((\d{4})\)$" matches = re.compile(patron, re.DOTALL).findall(serie.contentSerieName) if matches: serie.infoLabels['title'] = matches[0][0] serie.infoLabels['year'] = matches[0][1] else: serie.infoLabels['title'] = tvshow library.save_library_tvshow(serie, list()) filetools.rename(fname, "series.xml.old") # Por ultimo limpia la libreria, por que las rutas anteriores ya no existen library.clean() except EnvironmentError: logger.info("ERROR al leer el archivo: {0}".format(fname)) else: logger.info("ERROR, no se ha podido crear la nueva carpeta de SERIES") else: logger.info("ERROR, no se ha podido renombrar la antigua carpeta de SERIES") return True return False
def get_all_versions(item): logger.info() itemlist = [] # Lee la versión local from core import updater from core import versiontools # Descarga la lista de versiones from core import api api_response = api.plugins_get_all_packages() if api_response["error"]: platformtools.dialog_ok("Error", "Se ha producido un error al descargar la lista de versiones") return for entry in api_response["body"]: if entry["package"]=="plugin": title = "pelisalacarta "+entry["tag"]+" (Publicada "+entry["date"]+")" local_version_number = versiontools.get_current_plugin_version() elif entry["package"]=="channels": title = "Canales (Publicada "+entry["date"]+")" local_version_number = versiontools.get_current_channels_version() elif entry["package"]=="servers": title = "Servidores (Publicada "+entry["date"]+")" local_version_number = versiontools.get_current_servers_version() else: title = entry["package"]+" (Publicada "+entry["date"]+")" local_version_number = None title_color = "" if local_version_number is None: title = title elif entry["version"] == local_version_number: title = title + " ACTUAL" elif entry["version"] > local_version_number: title_color = "yellow" else: title_color = "0xFF666666" itemlist.append(Item(channel=CHANNELNAME, title=title, url=entry["url"], filename=entry["filename"], package=entry["package"], version=str(entry["version"]), text_color=title_color, action="download_and_install_package", folder=False)) return itemlist
def update_from_conf(): """ Se trata de una funcion que tiene como objetivo evitar el loop infinito al hacer la llamada desde ayuda.py """ if platformtools.dialog_yesno("pelisalacarta", "Seguro que desea actualizar los enlaces y la biblioteca?") == 1: main() platformtools.dialog_ok("pelisalacarta", "Proceso completado") # TODO: Mejorarlo else: platformtools.dialog_notification("Plugin", "Proceso abortado")
def recover_advancedsettings(item): logger.info("pelisalacarta.channels.ayuda recover_advancedsettings") fichero_backup = os.path.join(config.get_data_path(), "original_advancedsettings_backup.xml") advancedsettings_kodi = xbmc.translatePath("special://userdata/advancedsettings.xml") if platformtools.dialog_yesno("pelisalacarta", "Deseas restaurar el backup de advancedsettings.xml?") == 1: if os.path.exists(fichero_backup): logger.info("pelisalacarta.channels.ayuda Existe un backup de advancedsettings.xml") f_backup = open(fichero_backup) f_original = open(advancedsettings_kodi, "w") for line in f_backup: f_original.write(line) f_backup.close() f_original.close() platformtools.dialog_ok("pelislacarta", "Backup restaurado correctamente") else: logger.info("pelisalacarta.channels.ayuda No hay ningun backup disponible") if platformtools.dialog_yesno("pelisalacarta", "No hay ningun backup disponible." "Deseas crearlo?") == 1: f_origen = open(advancedsettings_kodi) f_backup = open(fichero_backup, "w") for line in f_origen: f_backup.write(line) f_origen.close() f_backup.close() platformtools.dialog_notification("pelisalacarta", "Backup hecho!") logger.info("pelisalacarta.channels.ayuda Backup terminado!") else: platformtools.dialog_notification("pelisalacarta", "Backup no hecho!") logger.info("pelisalacarta.channels.ayuda Backup no hecho!") else: platformtools.dialog_notification("pelisalacarta", "Operacion cancelada por el usuario") logger.info("pelisalacarta.channels.ayuda Optimizacion de adavancedsettings.xml cancelada!") return []
def save_download_video(item): logger.info("contentAction: %s | contentChannel: %s | contentTitle: %s" % (item.contentAction, item.contentChannel, item.contentTitle)) set_movie_title(item) item.downloadFilename = filetools.validate_path("%s [%s]" % (item.contentTitle.strip(), item.contentChannel)) write_json(item) if not platformtools.dialog_yesno(config.get_localized_string(30101), "Avviare il download adesso?"): platformtools.dialog_ok(config.get_localized_string(30101), item.contentTitle, config.get_localized_string(30109)) else: start_download(item)
def add_to_downloads(item): if "item_action" in item: item.action = item.item_action del item.item_action from core import descargas from core import downloadtools if not item.fulltitle: item.fulltitle = item.title title = platformtools.dialog_input(default=downloadtools.limpia_nombre_excepto_1(item.fulltitle)) if title is not None: item.title = title descargas.savebookmark(item) platformtools.dialog_ok("Pelisalacarta", config.get_localized_string(30101) +"\n"+ item.title +"\n"+ config.get_localized_string(30109)) return
def renameFavourite(item): logger.info("pelisalacarta.core.favoritos renameFavourite") #logger.debug(item.tostring('\n')) #Buscar el item q queremos renombrar en favourites.xml favourites_list = read_favourites() for i,fav in enumerate(favourites_list): if fav[0] == item.from_title: # abrir el teclado new_title = platformtools.dialog_input(item.from_title, item.title) if new_title: favourites_list[i] = (new_title, fav[1], fav[2]) if save_favourites(favourites_list): platformtools.dialog_ok(config.get_localized_string(30102), item.from_title, "se ha renombrado como:",new_title) # 'Se ha quitado de favoritos' platformtools.itemlist_refresh()
def add_to_favorites(item): #Proviene del menu contextual: if "item_action" in item: item.action = item.item_action del item.item_action item.context=[] from channels import favoritos from core import downloadtools if not item.fulltitle: item.fulltitle = item.title title = platformtools.dialog_input(default=downloadtools.limpia_nombre_excepto_1(item.fulltitle)+" ["+item.channel+"]") if title is not None: item.title = title favoritos.addFavourite(item) platformtools.dialog_ok("Pelisalacarta", config.get_localized_string(30102) +"\n"+ item.title +"\n"+ config.get_localized_string(30108)) return
def show_error_message(err_info): from core import scrapertools patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + '([^.]+)\.py"' canal = scrapertools.find_single_match(err_info, patron) if canal: platformtools.dialog_ok( "Se ha producido un error en el canal " + canal, "Esto puede ser devido a varias razones: \n \ - El servidor no está disponible, o no esta respondiendo.\n \ - Cambios en el diseño de la web.\n \ - Etc...\n \ Comprueba el log para ver mas detalles del error.") else: platformtools.dialog_ok( "Se ha producido un error en pelisalacarta", "Comprueba el log para ver mas detalles del error.")
def recover_advancedsettings(item): logger.info() fichero_backup = os.path.join(config.get_data_path(), "original_advancedsettings_backup.xml") advancedsettings_kodi = xbmc.translatePath("special://profile/advancedsettings.xml") if platformtools.dialog_yesno("pelisalacarta", "¿Deseas restaurar el backup de advancedsettings.xml?") == 1: if os.path.exists(fichero_backup): logger.info("Existe un backup de advancedsettings.xml") f_backup = open(fichero_backup) open(os.path.join(advancedsettings_kodi), "w").close() f_original = open(os.path.join(advancedsettings_kodi), "w") for line in f_backup: if "</advancedsettings>" in line: line = os.linesep.join([s for s in line.splitlines() if s]) f_original.write(line) f_backup.close() f_original.close() platformtools.dialog_ok("pelislacarta", "Backup restaurado correctamente.") else: logger.info("No hay ningun backup disponible") if platformtools.dialog_yesno("pelisalacarta", "No hay ningun backup disponible. " "¿Deseas crearlo?") == 1: f_origen = open(advancedsettings_kodi) f_backup = open(fichero_backup, "w") for line in f_origen: f_backup.write(line) f_origen.close() f_backup.close() platformtools.dialog_notification("pelisalacarta", "Backup completado") else: platformtools.dialog_notification("pelisalacarta", "Backup no creado") else: platformtools.dialog_notification("pelisalacarta", "Operacion cancelada por el usuario") logger.info("Restauracion de adavancedsettings.xml cancelada")
def play_menu(item): if item.server=="": item.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,True) if not "strmfile" in item: item.strmfile=False #TODO: unificar show y Serie ya que se usan indistintamente. if not "Serie" in item: item.Serie = item.show if item.server=="": item.server="directo" opciones = check_video_options(item, video_urls) if not puedes: if item.server!="directo": motivo = motivo.replace("<br/>", "\n") platformtools.dialog_ok("No puedes ver ese vídeo porque...",motivo+"\n"+item.url) else: platformtools.dialog_ok("No puedes ver ese vídeo porque...","El servidor donde está alojado no está\nsoportado en pelisalacarta todavía\n"+item.url) if len(opciones)==0: return default_action = config.get_setting("default_action") logger.info("default_action="+default_action) # Si la accion por defecto es "Preguntar", pregunta if default_action=="0": seleccion = platformtools.dialog_select(config.get_localized_string(30163), [opcion.option for opcion in opciones]) elif default_action=="1": seleccion = 0 elif default_action=="2": seleccion = len(video_urls)-1 elif default_action=="3": seleccion = seleccion else: seleccion=0 if seleccion > -1: logger.info("seleccion=%d" % seleccion) logger.info("seleccion=%s" % opciones[seleccion].option) selecteditem = opciones[seleccion] del selecteditem.option run(opciones[seleccion]) return
def descargar_lista(item, url): logger.info() from core import httptools, scrapertools if 'tinyupload.com/' in url: try: from urllib.parse import urlparse data = httptools.downloadpage(url).data logger.debug(data) down_url, url_name = scrapertools.find_single_match( data, ' href="(download\.php[^"]*)"><b>([^<]*)') url_json = '{uri.scheme}://{uri.netloc}/'.format( uri=urlparse(url)) + down_url except: platformtools.dialog_ok('Alfa', config.get_localized_string(70655), url) return False elif 'zippyshare.com/' in url: from core import servertools video_urls, puedes, motivo = servertools.resolve_video_urls_for_playing( 'zippyshare', url) if not puedes: platformtools.dialog_ok('Alfa', config.get_localized_string(70655), motivo) return False url_json = video_urls[0][ 1] # https://www58.zippyshare.com/d/qPzzQ0UM/25460/kodfavourites-testeanding.json url_name = url_json[url_json.rfind('/') + 1:] elif 'friendpaste.com/' in url: url_json = url if url.endswith('/raw') else url + '/raw' url_name = 'friendpaste' else: url_json = url url_name = url[url.rfind('/') + 1:] # Download json data = httptools.downloadpage(url_json).data # Verificar formato json de kodfavourites y añadir info de la descarga jsondata = jsontools.load(data) if 'user_favorites' not in jsondata or 'info_lista' not in jsondata: logger.debug(data) platformtools.dialog_ok('Alfa', config.get_localized_string(70656)) return False jsondata['info_lista']['downloaded_date'] = fechahora_actual() jsondata['info_lista']['downloaded_from'] = url data = jsontools.dump(jsondata) # Pedir nombre para la lista descargada nombre = get_name_from_filename(url_name) titulo = platformtools.dialog_input( default=nombre, heading=config.get_localized_string(70657)) if titulo is None or titulo == '': return False titulo = text_clean(titulo, blank_char='_') filename = get_filename_from_name(titulo) fullfilename = os.path.join(config.get_data_path(), filename) # Si el nuevo nombre ya existe pedir confirmación para sobrescribir if os.path.exists(fullfilename): if not platformtools.dialog_yesno( 'Alfa', config.get_localized_string(70613), config.get_localized_string(70658), filename): return False if not filetools.write(fullfilename, data): platformtools.dialog_ok('Alfa', config.get_localized_string(70659), filename) platformtools.dialog_ok('Alfa', config.get_localized_string(70660), filename) platformtools.itemlist_refresh() return True
def clear_saved_searches(item): config.set_setting("saved_searches_list", list(), "search") platformtools.dialog_ok(config.get_localized_string(60329), config.get_localized_string(60424))
def compartir_lista(item): logger.info() fullfilename = os.path.join(config.get_data_path(), item.lista) if not os.path.exists(fullfilename): platformtools.dialog_ok('Alfa', config.get_localized_string(70630), fullfilename) return False try: progreso = platformtools.dialog_progress_bg( config.get_localized_string(70643), config.get_localized_string(70644)) # Acceso a la página principal de tinyupload para obtener datos necesarios from core import httptools, scrapertools data = httptools.downloadpage( 'http://s000.tinyupload.com/index.php').data upload_url = scrapertools.find_single_match(data, 'form action="([^"]+)') sessionid = scrapertools.find_single_match(upload_url, 'sid=(.+)') progreso.update(10, config.get_localized_string(70645), config.get_localized_string(70646)) # Envío del fichero a tinyupload mediante multipart/form-data from future import standard_library standard_library.install_aliases() from lib import MultipartPostHandler import urllib.request, urllib.error opener = urllib.request.build_opener( MultipartPostHandler.MultipartPostHandler) params = { 'MAX_FILE_SIZE': '52428800', 'file_description': '', 'sessionid': sessionid, 'uploaded_file': open(fullfilename, 'rb') } handle = opener.open(upload_url, params) data = handle.read() progreso.close() if not 'File was uploaded successfuly' in data: logger.debug(data) platformtools.dialog_ok('Alfa', config.get_localized_string(70647)) return False codigo = scrapertools.find_single_match( data, 'href="index\.php\?file_id=([^"]+)') except: platformtools.dialog_ok('Alfa', config.get_localized_string(70647), item.lista) return False # Apuntar código en fichero de log y dentro de la lista save_log_lista_shared( config.get_localized_string(70648) + ' ' + item.lista + ' ' + codigo + ' ' + config.get_localized_string(70649)) alfav = KodfavouritesData(item.lista) alfav.info_lista['tinyupload_date'] = fechahora_actual() alfav.info_lista['tinyupload_code'] = codigo alfav.save() platformtools.dialog_ok('Alfa', config.get_localized_string(70650), codigo) return True
def open_settings(): settings_pre = get_all_settings_addon() __settings__.openSettings() settings_post = get_all_settings_addon() # cb_validate_config (util para validar cambios realizados en el cuadro de dialogo) if settings_post.get('adult_aux_intro_password', None): # Hemos accedido a la seccion de Canales para adultos from platformcode import platformtools if 'adult_password' not in settings_pre: adult_password = set_setting('adult_password', '0000') else: adult_password = settings_pre['adult_password'] if settings_post['adult_aux_intro_password'] == adult_password: # La contraseña de acceso es correcta # Cambio de contraseña if settings_post['adult_aux_new_password1']: if settings_post['adult_aux_new_password1'] == settings_post[ 'adult_aux_new_password2']: adult_password = set_setting( 'adult_password', settings_post['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 settings_post["adult_request_password"] == True: adult_pin = adult_password set_setting("adult_pin", adult_pin) else: platformtools.dialog_ok( "Canales para adultos", "La contraseña no es correcta.", "Los cambios realizados en esta sección no se guardaran.") # Deshacer cambios set_setting("adult_mode", settings_pre.get("adult_mode", 0)) set_setting("adult_request_password", settings_pre.get("adult_request_password", True)) # Borramos settings auxiliares set_setting('adult_aux_intro_password', '') set_setting('adult_aux_new_password1', '') set_setting('adult_aux_new_password2', '') # si se ha cambiado la ruta de la videoteca llamamos a comprobar directorios para que lo cree y pregunte # automaticamente si configurar la videoteca if settings_pre.get("videolibrarypath", None) != settings_post.get("videolibrarypath", None) or \ settings_pre.get("folder_movies", None) != settings_post.get("folder_movies", None) or \ settings_pre.get("folder_tvshows", None) != settings_post.get("folder_tvshows", None): verify_directories_created() else: # si se ha puesto que se quiere autoconfigurar y se había creado el directorio de la videoteca if not settings_pre.get("videolibrary_kodi", None) and settings_post.get("videolibrary_kodi", None) \ and settings_post.get("videolibrary_kodi_flag", None) == 1: from platformcode import xbmc_videolibrary xbmc_videolibrary.ask_set_content(2, silent=True)
def clear_saved_searches(item): config.set_setting("saved_searches_list", list(), "search") platformtools.dialog_ok("Buscador", "Búsquedas borradas correctamente")
def run(item): itemlist = [] #Muestra el item en el log: PrintItems(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") != "": tecleado = platformtools.dialog_input( "", "PIN para canales de adultos", True) if not tecleado == config.get_setting("adult_pin"): 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 has no action, stops here if item.action == "": logger.info("pelisalacarta.platformcode.launcher Item sin accion") itemlist = None #Action Play, para mostrar el menú con las opciones de reproduccion. elif item.action == "play": logger.info("pelisalacarta.platformcode.launcher play") # Si el canal tiene una acción "play" tiene prioridad if hasattr(channelmodule, 'play'): logger.info( "pelisalacarta.platformcode.launcher executing channel 'play' method" ) itemlist = channelmodule.play(item) b_favourite = item.isFavourite if len(itemlist) > 0 and isinstance(itemlist[0], Item): item = itemlist[0] if b_favourite: item.isFavourite = True play_menu(item) elif len(itemlist) > 0 and isinstance(itemlist[0], list): item.video_urls = itemlist play_menu(item) else: platformtools.dialog_ok("plugin", "No hay nada para reproducir") else: logger.info( "pelisalacarta.platformcode.launcher no channel 'play' method, executing core method" ) play_menu(item) itemlist = None #Action Search, para mostrar el teclado y lanzar la busqueda con el texto indicado. elif item.action == "search": logger.info("pelisalacarta.platformcode.launcher search") tecleado = platformtools.dialog_input() if not tecleado is None: itemlist = channelmodule.search(item, tecleado) else: itemlist = [] elif item.channel == "channelselector": import channelselector if item.action == "mainlist": itemlist = channelselector.getmainlist("bannermenu") if config.get_setting("check_for_plugin_updates") == "true": logger.info( "channelselector.mainlist Verificar actualizaciones activado" ) from core import updater try: version = updater.checkforupdates() if version: platformtools.dialog_ok( "Versión " + version + " disponible", "Ya puedes descargar la nueva versión del plugin\ndesde el listado principal" ) itemlist.insert( 0, Item( title="Actualizadr pelisalacarta a la versión " + version, version=version, channel="updater", action="update", thumbnail=os.path.join( config.get_runtime_path(), "resources", "images", "bannermenu", "thumb_update.png"))) except: platformtools.dialog_ok("No se puede conectar", "No ha sido posible comprobar", "si hay actualizaciones") logger.info( "channelselector.mainlist Fallo al verificar la actualización" ) else: logger.info( "channelselector.mainlist Verificar actualizaciones desactivado" ) if item.action == "getchanneltypes": itemlist = channelselector.getchanneltypes("bannermenu") if item.action == "filterchannels": itemlist = channelselector.filterchannels(item.channel_type, "bannermenu") #Todas las demas las intenta ejecturaren el siguiente orden: # 1. En el canal # 2. En el launcher # 3. Si no existe en el canal ni en el launcher guarda un error en el log else: #Si existe la funcion en el canal la ejecuta if hasattr(channelmodule, item.action): logger.info("Ejectuando accion: " + item.channel + "." + item.action + "(item)") exec "itemlist = channelmodule." + item.action + "(item)" #Si existe la funcion en el launcher la ejecuta elif hasattr(sys.modules[__name__], item.action): logger.info("Ejectuando accion: " + item.action + "(item)") exec "itemlist =" + item.action + "(item)" #Si no existe devuelve un error else: logger.info("No se ha encontrado la accion [" + item.action + "] en el canal [" + item.channel + "] ni en el launcher") #Llegados a este punto ya tenemos que tener el itemlist con los resultados correspondientes #Pueden darse 3 escenarios distintos: # 1. la función ha generado resultados y estan en el itemlist # 2. la función no ha generado resultados y por tanto el itemlist contiene 0 items, itemlist = [] # 3. la función realiza alguna accion con la cual no se generan nuevos items, en ese caso el resultado deve ser: itemlist = None para que no modifique el listado #A partir de aquí ya se ha ejecutado la funcion en el lugar adecuado, si queremos realizar alguna acción sobre los resultados, este es el lugar. #Filtrado de Servers if item.action == "findvideos" and config.get_setting( 'filter_servers') == 'true': server_white_list, server_black_list = set_server_list() itemlist = filtered_servers(itemlist, server_white_list, server_black_list) #Si la accion no ha devuelto ningún resultado, añade un item con el texto "No hay elementos para mostrar" if type(itemlist) == list: if len(itemlist) == 0: itemlist = [ Item( title="No hay elementos para mostrar", thumbnail= "http://media.tvalacarta.info/pelisalacarta/thumb_error.png" ) ] #Imprime en el log el resultado PrintItems(itemlist) #Muestra los resultados en pantalla platformtools.render_items(itemlist, item)
def run(item): itemlist = [] # Muestra el item en el log: 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_request_password"): tecleado = platformtools.dialog_input( "", config.get_localized_string(60334), True) if tecleado is None or tecleado != config.get_setting( "adult_password"): platformtools.render_items(None, item) return channelmodule = None # Importa el canal para el item, todo item debe tener un canal, sino sale de la función if item.channel: channelmodule = import_channel(item) # If item has no action, stops here if item.action == "": logger.info("Item sin accion") itemlist = None # Action Play, para mostrar el menú con las opciones de reproduccion. elif item.action == "play": logger.info("play") # Si el canal tiene una acción "play" tiene prioridad if hasattr(channelmodule, 'play'): logger.info("executing channel 'play' method") itemlist = channelmodule.play(item) b_favourite = item.isFavourite if len(itemlist) > 0 and isinstance(itemlist[0], Item): item = itemlist[0] if b_favourite: item.isFavourite = True play_menu(item) elif len(itemlist) > 0 and isinstance(itemlist[0], list): item.video_urls = itemlist play_menu(item) else: platformtools.dialog_ok("plugin", "No hay nada para reproducir") else: logger.info("no channel 'play' method, executing core method") play_menu(item) itemlist = None # Action Search, para mostrar el teclado y lanzar la busqueda con el texto indicado. elif item.action == "search": logger.info("search") tecleado = platformtools.dialog_input() if tecleado: itemlist = channelmodule.search(item, tecleado) else: itemlist = [] elif item.channel == "channelselector": import channelselector if item.action == "mainlist": itemlist = channelselector.getmainlist("banner_") if item.action == "getchanneltypes": itemlist = channelselector.getchanneltypes("banner_") if item.action == "filterchannels": itemlist = channelselector.filterchannels(item.channel_type, "banner_") elif item.action == "script": from core import tmdb if tmdb.drop_bd(): platformtools.dialog_notification("kod", "caché eliminada", time=2000, sound=False) # Todas las demas las intenta ejecturaren el siguiente orden: # 1. En el canal # 2. En el launcher # 3. Si no existe en el canal ni en el launcher guarda un error en el log else: # Si existe la funcion en el canal la ejecuta if hasattr(channelmodule, item.action): logger.info("Ejectuando accion: " + item.channel + "." + item.action + "(item)") exec "itemlist = channelmodule." + item.action + "(item)" # Si existe la funcion en el launcher la ejecuta elif hasattr(sys.modules[__name__], item.action): logger.info("Ejectuando accion: " + item.action + "(item)") exec "itemlist =" + item.action + "(item)" # Si no existe devuelve un error else: logger.info("No se ha encontrado la accion [" + item.action + "] en el canal [" + item.channel + "] ni en el launcher") # Llegados a este punto ya tenemos que tener el itemlist con los resultados correspondientes # Pueden darse 3 escenarios distintos: # 1. la función ha generado resultados y estan en el itemlist # 2. la función no ha generado resultados y por tanto el itemlist contiene 0 items, itemlist = [] # 3. la función realiza alguna accion con la cual no se generan nuevos items, en ese caso el resultado deve ser: itemlist = None para que no modifique el listado # A partir de aquí ya se ha ejecutado la funcion en el lugar adecuado, si queremos realizar alguna acción sobre los resultados, este es el lugar. # Filtrado de Servers if item.action == "findvideos": itemlist = servertools.filter_servers(itemlist) # Si la accion no ha devuelto ningún resultado, añade un item con el texto "No hay elementos para mostrar" if type(itemlist) == list: if len(itemlist) == 0: from channelselector import get_thumb itemlist = [ Item(title="No hay elementos para mostrar", thumbnail=get_thumb("error.png")) ] # Imprime en el log el resultado print_items(itemlist) # Muestra los resultados en pantalla platformtools.render_items(itemlist, item)
def addchannel(item): import os import time logger.info() tecleado = platformtools.dialog_input("", "Introduzca la URL") if not tecleado: return logger.info("url=%s" % tecleado) local_folder = config.get_runtime_path() if "canal" in item.title: local_folder = filetools.join(local_folder, 'channels') folder_to_extract = "channels" info_accion = "canal" else: local_folder = filetools.join(local_folder, 'servers') folder_to_extract = "servers" info_accion = "conector" # Detecta si es un enlace a un .py o .xml (pensado sobre todo para enlaces de github) try: extension = tecleado.rsplit(".", 1)[1] except: extension = "" files = [] zip = False if extension == "py" or extension == "xml": filename = tecleado.rsplit("/", 1)[1] localfilename = filetools.join(local_folder, filename) files.append([tecleado, localfilename, filename]) else: import re from core import scrapertools # Comprueba si la url apunta a una carpeta completa (channels o servers) de github if re.search(r'https://github.com/[^\s]+/' + folder_to_extract, tecleado): try: data = scrapertools.downloadpage(tecleado) matches = scrapertools.find_multiple_matches( data, '<td class="content">.*?href="([^"]+)".*?title="([^"]+)"') for url, filename in matches: url = "https://raw.githubusercontent.com" + url.replace( "/blob/", "/") localfilename = filetools.join(local_folder, filename) files.append([url, localfilename, filename]) except: import traceback logger.info("Detalle del error: %s" % traceback.format_exc()) platformtools.dialog_ok( "Error", "La url no es correcta o no está disponible") return else: filename = 'new%s.zip' % info_accion localfilename = filetools.join(config.get_data_path(), filename) files.append([tecleado, localfilename, filename]) zip = True logger.info("localfilename=%s" % localfilename) logger.info("descarga fichero...") try: if len(files) > 1: lista_opciones = ["No", "Sí", "Sí (Sobrescribir todos)"] overwrite_all = False from core import downloadtools for url, localfilename, filename in files: result = downloadtools.downloadfile(url, localfilename, continuar=False, resumir=False) if result == -3: if len(files) == 1: dyesno = platformtools.dialog_yesno( "El archivo ya existe", "Ya existe el %s %s. " "¿Desea sobrescribirlo?" % (info_accion, filename)) else: if not overwrite_all: dyesno = platformtools.dialog_select( "El archivo %s ya existe, ¿desea sobrescribirlo?" % filename, lista_opciones) else: dyesno = 1 # Diálogo cancelado if dyesno == -1: return # Caso de carpeta github, opción sobrescribir todos elif dyesno == 2: overwrite_all = True elif dyesno: hora_folder = "Copia seguridad [%s]" % time.strftime( "%d-%m_%H-%M", time.localtime()) backup = filetools.join(config.get_data_path(), 'backups', hora_folder, folder_to_extract) if not filetools.exists(backup): os.makedirs(backup) import shutil shutil.copy2(localfilename, filetools.join(backup, filename)) downloadtools.downloadfile(url, localfilename, continuar=True, resumir=False) else: if len(files) == 1: return else: continue except: import traceback logger.info("Detalle del error: %s" % traceback.format_exc()) return if zip: try: # Lo descomprime logger.info("descomprime fichero...") from core import ziptools unzipper = ziptools.ziptools() logger.info("destpathname=%s" % local_folder) unzipper.extract(localfilename, local_folder, folder_to_extract, True, True) except: import traceback logger.error("Detalle del error: %s" % traceback.format_exc()) # Borra el zip descargado filetools.remove(localfilename) platformtools.dialog_ok( "Error", "Se ha producido un error extrayendo el archivo") return # Borra el zip descargado logger.info("borra fichero...") filetools.remove(localfilename) logger.info("...fichero borrado") platformtools.dialog_ok( "Éxito", "Actualización/Instalación realizada correctamente")
def actualiza(item): logger.info("deportesalacarta.channels.update_sports actualiza") local_folder = os.path.join(xbmc.translatePath("special://home"), "addons") error = False if not item.url: url = "https://github.com/CmosGit/Mod_pelisalacarta_deportes/raw/addon/plugin.video.deportesalacarta-%s.zip" % item.version else: import servertools urls, puede, msg = servertools.resolve_video_urls_for_playing( item.server, item.url, "", False, True) if puede: data_ = httptools.downloadpage(urls[0], hide=True).data url = scrapertools.find_single_match( data_, '"downloadUrl"\s*:\s*"([^"]+)"') if not url: url = scrapertools.find_single_match( data_, '<a id="download_button".*?href="([^"]+)"') if not item.server and not url: try: name, value = scrapertools.find_single_match( data_, 'method="post">.*?name="([^"]+)" value="([^"]+)"') post = "%s=%s" % (name, value) data_ = httptools.downloadpage(urls[0], post, hide=True).data url = scrapertools.find_single_match( data_, '"downloadUrl"\s*:\s*"([^"]+)"') except: pass if not url: urls, puede, msg = servertools.resolve_video_urls_for_playing( item.server, base64.b64decode(item.url)) url = urls[0][1] progreso = platformtools.dialog_progress("Progreso de la actualización", "Descargando...") filename = 'deportesalacarta-%s.zip' % item.version localfilename = filetools.join(config.get_data_path(), filename) try: result = downloadtools.downloadfile(url, localfilename, [], False, True, False) progreso.update(50, "Descargando archivo", "Descargando...") # Lo descomprime logger.info( "deportesalacarta.channels.configuracion descomprime fichero...") from core import ziptools unzipper = ziptools.ziptools() logger.info("deportesalacarta.channels.configuracion destpathname=%s" % local_folder) unzipper.extract(localfilename, local_folder, update=True) progreso.close() except: import traceback logger.info("Detalle del error: %s" % traceback.format_exc()) # Borra el zip descargado try: filetools.remove(localfilename) except: pass progreso.close() platformtools.dialog_ok( "Error", "Se ha producido un error extrayendo el archivo") return # Borra el zip descargado logger.info("deportesalacarta.channels.configuracion borra fichero...") try: filetools.remove(localfilename) except: pass logger.info("deportesalacarta.channels.configuracion ...fichero borrado") platformtools.dialog_notification( "Actualizado correctamente", "Versión %s instalada con éxito" % item.version) xbmc.executebuiltin("Container.Refresh")
def novedades(item): logger.info() global list_newest threads = [] list_newest = [] start_time = time.time() mode = item.mode if mode == '': mode = 'normal' if mode == 'get_cached': if os.path.exists(menu_cache_path): return get_from_cache(item) multithread = config.get_setting("multithread", "news") logger.info("multithread= " + str(multithread)) if not multithread: if platformtools.dialog_yesno(config.get_localized_string(60515), config.get_localized_string(60516), config.get_localized_string(60517), config.get_localized_string(60518)): if config.set_setting("multithread", True, "news"): multithread = True if mode == 'normal': progreso = platformtools.dialog_progress( item.category, config.get_localized_string(60519)) list_canales, any_active = get_channels_list() if config.is_xbmc(): from channels import side_menu if mode == 'silent' and any_active and len( list_canales[item.extra]) > 0: side_menu.set_menu_settings(item) aux_list = [] for canal in list_canales[item.extra]: if len(aux_list) < 2: aux_list.append(canal) list_canales[item.extra] = aux_list if mode == 'set_cache': list_canales[item.extra] = list_canales[item.extra][2:] if any_active and len(list_canales[item.extra]) > 0: import math # fix float porque la division se hace mal en python 2.x number_of_channels = float(100) / len(list_canales[item.extra]) for index, channel in enumerate(list_canales[item.extra]): channel_id, channel_title = channel percentage = int(math.ceil((index + 1) * number_of_channels)) # if progreso.iscanceled(): # progreso.close() # logger.info("Búsqueda cancelada") # return itemlist # Modo Multi Thread if multithread: t = Thread(target=get_newest, args=[channel_id, item.extra], name=channel_title) t.start() threads.append(t) if mode == 'normal': progreso.update( percentage, "", config.get_localized_string(60520) % channel_title) # Modo single Thread else: if mode == 'normal': logger.info("Obteniendo novedades de channel_id=" + channel_id) progreso.update( percentage, "", config.get_localized_string(60520) % channel_title) get_newest(channel_id, item.extra) # Modo Multi Thread: esperar q todos los hilos terminen if multithread: pendent = [a for a in threads if a.isAlive()] t = float(100) / len(pendent) while pendent: index = (len(threads) - len(pendent)) + 1 percentage = int(math.ceil(index * t)) list_pendent_names = [a.getName() for a in pendent] if mode == 'normal': mensaje = config.get_localized_string(30994) % ( ", ".join(list_pendent_names)) progreso.update( percentage, config.get_localized_string(60521) % (len(threads) - len(pendent), len(threads)), mensaje) logger.debug(mensaje) if progreso.iscanceled(): logger.info("Busqueda de novedades cancelada") break time.sleep(0.5) pendent = [a for a in threads if a.isAlive()] if mode == 'normal': mensaje = config.get_localized_string(60522) % ( len(list_newest), time.time() - start_time) progreso.update(100, mensaje, " ", " ") logger.info(mensaje) start_time = time.time() # logger.debug(start_time) result_mode = config.get_setting("result_mode", "news") if mode != 'normal': result_mode = 0 if result_mode == 0: # Agrupados por contenido ret = group_by_content(list_newest) elif result_mode == 1: # Agrupados por canales ret = group_by_channel(list_newest) else: # Sin agrupar ret = no_group(list_newest) while time.time() - start_time < 2: # mostrar cuadro de progreso con el tiempo empleado durante almenos 2 segundos time.sleep(0.5) if mode == 'normal': progreso.close() if mode == 'silent': set_cache(item) item.mode = 'set_cache' ret = add_menu_items(item, ret) if mode != 'set_cache': return ret else: if mode != 'set_cache': no_channels = platformtools.dialog_ok( config.get_localized_string(30130) + ' - ' + item.extra, config.get_localized_string(70661), config.get_localized_string(70662)) return
def run(item=None): logger.info() if not item: # Extract item from sys.argv if sys.argv[2]: item = Item().fromurl(sys.argv[2]) # If no item, this is mainlist else: if config.get_setting("start_page"): if not config.get_setting("custom_start"): category = config.get_setting("category").lower() item = Item(channel="news", action="novedades", extra=category, mode = 'silent') else: from channels import side_menu item= Item() item = side_menu.check_user_home(item) item.start = True; else: item = Item(channel="channelselector", action="getmainlist", viewmode="movie") if not config.get_setting('show_once'): from platformcode import xbmc_videolibrary xbmc_videolibrary.ask_set_content(1) config.set_setting('show_once', True) logger.info(item.tostring()) try: if not config.get_setting('tmdb_active'): config.set_setting('tmdb_active', True) # If item has no action, stops here if item.action == "": logger.info("Item sin accion") return # Action for main menu in channelselector elif item.action == "getmainlist": import channelselector itemlist = channelselector.getmainlist() platformtools.render_items(itemlist, item) # Action for channel types on channelselector: movies, series, etc. elif item.action == "getchanneltypes": import channelselector itemlist = channelselector.getchanneltypes() platformtools.render_items(itemlist, item) # Action for channel listing on channelselector elif item.action == "filterchannels": import channelselector itemlist = channelselector.filterchannels(item.channel_type) platformtools.render_items(itemlist, item) # Special action for playing a video from the library elif item.action == "play_from_library": play_from_library(item) return elif item.action == "keymap": from platformcode import keymaptools if item.open: return keymaptools.open_shortcut_menu() else: return keymaptools.set_key() elif item.action == "script": from core import tmdb if tmdb.drop_bd(): platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(60011), time=2000, sound=False) # Action in certain channel specified in "action" and "channel" parameters else: # Entry point for a channel is the "mainlist" action, so here we check parental control if item.action == "mainlist": # Parental control # If it is an adult channel, and user has configured pin, asks for it if channeltools.is_adult(item.channel) and config.get_setting("adult_request_password"): tecleado = platformtools.dialog_input("", config.get_localized_string(60334), True) if tecleado is None or tecleado != config.get_setting("adult_password"): return # # Actualiza el canal individual # if (item.action == "mainlist" and item.channel != "channelselector" and # config.get_setting("check_for_channel_updates") == True): # from core import updater # updater.update_channel(item.channel) # Checks if channel exists channel_file = os.path.join(config.get_runtime_path(), 'channels', item.channel + ".py") logger.info("channel_file=%s" % channel_file) channel = None if os.path.exists(channel_file): try: channel = __import__('channels.%s' % item.channel, None, None, ["channels.%s" % item.channel]) except ImportError: exec("import channels." + item.channel + " as channel") logger.info("Running channel %s | %s" % (channel.__name__, channel.__file__)) # Special play action if item.action == "play": #define la info para trakt try: trakt_tools.set_trakt_info(item) except: pass logger.info("item.action=%s" % item.action.upper()) # logger.debug("item_toPlay: " + "\n" + item.tostring('\n')) # First checks if channel has a "play" function if hasattr(channel, 'play'): logger.info("Executing channel 'play' method") itemlist = channel.play(item) b_favourite = item.isFavourite # Play should return a list of playable URLS if len(itemlist) > 0 and isinstance(itemlist[0], Item): item = itemlist[0] if b_favourite: item.isFavourite = True platformtools.play_video(item) # Permitir varias calidades desde play en el canal elif len(itemlist) > 0 and isinstance(itemlist[0], list): item.video_urls = itemlist platformtools.play_video(item) # If not, shows user an error message else: platformtools.dialog_ok(config.get_localized_string(20000), config.get_localized_string(60339)) # If player don't have a "play" function, not uses the standard play from platformtools else: logger.info("Executing core 'play' method") platformtools.play_video(item) # Special action for findvideos, where the plugin looks for known urls elif item.action == "findvideos": # First checks if channel has a "findvideos" function if hasattr(channel, 'findvideos'): itemlist = getattr(channel, item.action)(item) itemlist = servertools.filter_servers(itemlist) # If not, uses the generic findvideos function else: logger.info("No channel 'findvideos' method, " "executing core method") itemlist = servertools.find_video_items(item) if config.get_setting("max_links", "videolibrary") != 0: itemlist = limit_itemlist(itemlist) from platformcode import subtitletools subtitletools.saveSubtitleName(item) platformtools.render_items(itemlist, item) # Special action for adding a movie to the library elif item.action == "add_pelicula_to_library": videolibrarytools.add_movie(item) # Special action for adding a serie to the library elif item.action == "add_serie_to_library": videolibrarytools.add_tvshow(item, channel) # Special action for downloading all episodes from a serie elif item.action == "download_all_episodes": from channels import downloads item.action = item.extra del item.extra downloads.save_download(item) # Special action for searching, first asks for the words then call the "search" function elif item.action == "search": logger.info("item.action=%s" % item.action.upper()) # last_search = "" # last_search_active = config.get_setting("last_search", "search") # if last_search_active: # try: # current_saved_searches_list = list(config.get_setting("saved_searches_list", "search")) # last_search = current_saved_searches_list[0] # except: # pass last_search = channeltools.get_channel_setting('Last_searched', 'search', '') tecleado = platformtools.dialog_input(last_search) if tecleado is not None: channeltools.set_channel_setting('Last_searched', tecleado, 'search') itemlist = channel.search(item, tecleado) else: return platformtools.render_items(itemlist, item) # For all other actions else: logger.info("Executing channel '%s' method" % item.action) itemlist = getattr(channel, item.action)(item) if config.get_setting('trakt_sync'): token_auth = config.get_setting("token_trakt", "trakt") if not token_auth: trakt_tools.auth_trakt() else: import xbmc if not xbmc.getCondVisibility('System.HasAddon(script.trakt)') and config.get_setting( 'install_trakt'): trakt_tools.ask_install_script() itemlist = trakt_tools.trakt_check(itemlist) else: config.set_setting('install_trakt', True) platformtools.render_items(itemlist, item) except urllib2.URLError as e: import traceback logger.error(traceback.format_exc()) # Grab inner and third party errors if hasattr(e, 'reason'): logger.error("Razon del error, codigo: %s | Razon: %s" % (str(e.reason[0]), str(e.reason[1]))) texto = config.get_localized_string(30050) # "No se puede conectar con el sitio web" platformtools.dialog_ok("alfa", texto) # Grab server response errors elif hasattr(e, 'code'): logger.error("Codigo de error HTTP : %d" % e.code) # "El sitio web no funciona correctamente (error http %d)" platformtools.dialog_ok("alfa", config.get_localized_string(30051) % e.code) except WebErrorException as e: import traceback logger.error(traceback.format_exc()) patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + '([^.]+)\.py"' canal = scrapertools.find_single_match(traceback.format_exc(), patron) platformtools.dialog_ok( config.get_localized_string(59985) + canal, config.get_localized_string(60013) %(e)) except: import traceback logger.error(traceback.format_exc()) patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + '([^.]+)\.py"' canal = scrapertools.find_single_match(traceback.format_exc(), patron) try: import xbmc if config.get_platform(True)['num_version'] < 14: log_name = "xbmc.log" else: log_name = "kodi.log" log_message = config.get_localized_string(50004) + xbmc.translatePath("special://logpath") + log_name except: log_message = "" if canal: platformtools.dialog_ok( config.get_localized_string(60087) %canal, config.get_localized_string(60014), log_message) else: platformtools.dialog_ok( config.get_localized_string(60038), config.get_localized_string(60015), log_message)
logger.error(traceback.print_exc()) f.close() if not silent: progreso.close() # platformtools.dialog_ok('Error al descargar' , 'Se ha producido un error' , 'al descargar el archivo') return -2 except: if url.startswith("rtmp"): error = downloadfileRTMP(url, nombrefichero, silent) if error and not silent: from platformcode import platformtools platformtools.dialog_ok("No puedes descargar ese vídeo", "Las descargas en RTMP aún no", "están soportadas") else: import traceback from pprint import pprint exc_type, exc_value, exc_tb = sys.exc_info() lines = traceback.format_exception(exc_type, exc_value, exc_tb) for line in lines: line_splits = line.split("\n") for line_split in line_splits: logger.error(line_split) try: f.close() except: pass
def add_tvshow(item, channel=None): """ Guarda contenido en la libreria de series. Este contenido puede ser uno de estos dos: - La serie con todos los capitulos incluidos en la lista episodelist. - Un solo capitulo descargado previamente en local. Para añadir episodios descargados en local, el item debe tener exclusivamente: - contentSerieName (o show): Titulo de la serie - contentTitle: titulo del episodio para extraer season_and_episode ("1x01 Piloto") - title: titulo a mostrar junto al listado de enlaces -findvideos- ("Reproducir video local") - infoLabels["tmdb_id"] o infoLabels["imdb_id"] - contentType != "movie" - channel = "downloads" - url : ruta local al video @type item: item @param item: item que representa la serie a guardar @type channel: modulo @param channel: canal desde el que se guardara la serie. Por defecto se importara item.from_channel o item.channel """ logger.info("show=#" + item.show + "#") if item.channel == "downloads": itemlist = [item.clone()] else: # Esta marca es porque el item tiene algo más aparte en el atributo "extra" item.action = item.extra if isinstance(item.extra, str) and "###" in item.extra: item.action = item.extra.split("###")[0] item.extra = item.extra.split("###")[1] if item.from_action: item.__dict__["action"] = item.__dict__.pop("from_action") if item.from_channel: item.__dict__["channel"] = item.__dict__.pop("from_channel") if not channel: try: channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel]) except ImportError: exec "import channels." + item.channel + " as channel" #Para desambiguar títulos, se provoca que TMDB pregunte por el título realmente deseado #El usuario puede seleccionar el título entre los ofrecidos en la primera pantalla #o puede cancelar e introducir un nuevo título en la segunda pantalla #Si lo hace en "Introducir otro nombre", TMDB buscará automáticamente el nuevo título #Si lo hace en "Completar Información", cambia parcialmente al nuevo título, pero no busca en TMDB. Hay que hacerlo #Si se cancela la segunda pantalla, la variable "scraper_return" estará en False. El usuario no quiere seguir item = generictools.update_title( item ) #Llamamos al método que actualiza el título con tmdb.find_and_set_infoLabels #if item.tmdb_stat: # del item.tmdb_stat #Limpiamos el status para que no se grabe en la Videoteca # Obtiene el listado de episodios itemlist = getattr(channel, item.action)(item) insertados, sobreescritos, fallidos, path = save_tvshow(item, itemlist) if not insertados and not sobreescritos and not fallidos: platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(60067)) logger.error( "La serie %s no se ha podido añadir a la videoteca. No se ha podido obtener ningun episodio" % item.show) elif fallidos == -1: platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(60068)) logger.error("La serie %s no se ha podido añadir a la videoteca" % item.show) elif fallidos > 0: platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(60069)) logger.error( "No se han podido añadir %s episodios de la serie %s a la videoteca" % (fallidos, item.show)) else: platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(60070)) logger.info( "Se han añadido %s episodios de la serie %s a la videoteca" % (insertados, item.show)) if config.is_xbmc(): if config.get_setting("sync_trakt_new_tvshow", "videolibrary"): import xbmc from platformcode import xbmc_videolibrary if config.get_setting("sync_trakt_new_tvshow_wait", "videolibrary"): # Comprobar que no se esta buscando contenido en la videoteca de Kodi while xbmc.getCondVisibility('Library.IsScanningVideo()'): xbmc.sleep(1000) # Se lanza la sincronizacion para la videoteca de Kodi xbmc_videolibrary.sync_trakt_kodi() # Se lanza la sincronización para la videoteca del addon xbmc_videolibrary.sync_trakt_addon(path)
def download_all_episodes(item, first_episode="", preferred_server="vidspot", filter_language=""): logger.info("show=" + item.show) channel = import_channel(item) show_title = item.show # Obtiene el listado desde el que se llamó action = item.extra # Esta marca es porque el item tiene algo más aparte en el atributo "extra" if "###" in item.extra: action = item.extra.split("###")[0] item.extra = item.extra.split("###")[1] exec "episode_itemlist = channel." + action + "(item)" # Ordena los episodios para que funcione el filtro de first_episode episode_itemlist = sorted(episode_itemlist, key=lambda Item: Item.title) from core import downloadtools from core import scrapertools best_server = preferred_server worst_server = "moevideos" # Para cada episodio if first_episode == "": empezar = True else: empezar = False for episode_item in episode_itemlist: try: logger.info("episode=" + episode_item.title) episode_title = scrapertools.get_match(episode_item.title, "(\d+x\d+)") logger.info("episode=" + episode_title) except: import traceback logger.error(traceback.format_exc()) continue if first_episode != "" and episode_title == first_episode: empezar = True if episodio_ya_descargado(show_title, episode_title): continue if not empezar: continue # Extrae los mirrors try: mirrors_itemlist = channel.findvideos(episode_item) except: mirrors_itemlist = servertools.find_video_items(episode_item) print mirrors_itemlist descargado = False new_mirror_itemlist_1 = [] new_mirror_itemlist_2 = [] new_mirror_itemlist_3 = [] new_mirror_itemlist_4 = [] new_mirror_itemlist_5 = [] new_mirror_itemlist_6 = [] for mirror_item in mirrors_itemlist: # Si está en español va al principio, si no va al final if "(Español)" in mirror_item.title: if best_server in mirror_item.title.lower(): new_mirror_itemlist_1.append(mirror_item) else: new_mirror_itemlist_2.append(mirror_item) elif "(Latino)" in mirror_item.title: if best_server in mirror_item.title.lower(): new_mirror_itemlist_3.append(mirror_item) else: new_mirror_itemlist_4.append(mirror_item) elif "(VOS)" in mirror_item.title: if best_server in mirror_item.title.lower(): new_mirror_itemlist_3.append(mirror_item) else: new_mirror_itemlist_4.append(mirror_item) else: if best_server in mirror_item.title.lower(): new_mirror_itemlist_5.append(mirror_item) else: new_mirror_itemlist_6.append(mirror_item) mirrors_itemlist = new_mirror_itemlist_1 + new_mirror_itemlist_2 + new_mirror_itemlist_3 + new_mirror_itemlist_4 + new_mirror_itemlist_5 + new_mirror_itemlist_6 for mirror_item in mirrors_itemlist: logger.info("mirror=" + mirror_item.title) if "(Español)" in mirror_item.title: idioma = "(Español)" codigo_idioma = "es" elif "(Latino)" in mirror_item.title: idioma = "(Latino)" codigo_idioma = "lat" elif "(VOS)" in mirror_item.title: idioma = "(VOS)" codigo_idioma = "vos" elif "(VO)" in mirror_item.title: idioma = "(VO)" codigo_idioma = "vo" else: idioma = "(Desconocido)" codigo_idioma = "desconocido" logger.info("filter_language=#" + filter_language + "#, codigo_idioma=#" + codigo_idioma + "#") if filter_language == "" or (filter_language != "" and filter_language == codigo_idioma): logger.info("downloading mirror") else: logger.info("language " + codigo_idioma + " filtered, skipping") continue if hasattr(channel, 'play'): video_items = channel.play(mirror_item) else: video_items = [mirror_item] if len(video_items) > 0: video_item = video_items[0] # Comprueba que esté disponible video_urls, puedes, motivo = servertools.resolve_video_urls_for_playing( video_item.server, video_item.url, video_password="", muestra_dialogo=False) # Lo añade a la lista de descargas if puedes: logger.info("downloading mirror started...") # El vídeo de más calidad es el último mediaurl = video_urls[len(video_urls) - 1][1] devuelve = downloadtools.downloadbest( video_urls, show_title + " " + episode_title + " " + idioma + " [" + video_item.server + "]", continuar=False) if devuelve == 0: logger.info("download ok") descargado = True break elif devuelve == -1: try: platformtools.dialog_ok("plugin", "Descarga abortada") except: pass return else: logger.info("download error, try another mirror") continue else: logger.info( "downloading mirror not available... trying next") if not descargado: logger.info("EPISODIO NO DESCARGADO " + episode_title)
def compartir_lista(item): logger.info() fullfilename = os.path.join(config.get_data_path(), item.lista) if not os.path.exists(fullfilename): platformtools.dialog_ok('Alfa', 'Error, no se encuentra la lista!', fullfilename) return False try: progreso = platformtools.dialog_progress_bg( 'Compartir lista', 'Conectando con tinyupload ...') # Acceso a la página principal de tinyupload para obtener datos necesarios from core import httptools, scrapertools data = httptools.downloadpage( 'http://s000.tinyupload.com/index.php').data upload_url = scrapertools.find_single_match(data, 'form action="([^"]+)') sessionid = scrapertools.find_single_match(upload_url, 'sid=(.+)') progreso.update( 10, 'Subiendo fichero', 'Espera unos segundos a que acabe de subirse tu fichero de lista a tinyupload' ) # Envío del fichero a tinyupload mediante multipart/form-data from lib import MultipartPostHandler import urllib2 opener = urllib2.build_opener( MultipartPostHandler.MultipartPostHandler) params = { 'MAX_FILE_SIZE': '52428800', 'file_description': '', 'sessionid': sessionid, 'uploaded_file': open(fullfilename, 'rb') } handle = opener.open(upload_url, params) data = handle.read() progreso.close() if not 'File was uploaded successfuly' in data: logger.debug(data) platformtools.dialog_ok( 'Alfa', 'Error, no se ha podido subir el fichero a tinyupload.com!') return False codigo = scrapertools.find_single_match( data, 'href="index\.php\?file_id=([^"]+)') except: platformtools.dialog_ok( 'Alfa', 'Error, al intentar subir el fichero a tinyupload.com!', item.lista) return False # Apuntar código en fichero de log y dentro de la lista save_log_lista_shared( 'Subido fichero %s a tinyupload.com. El código para descargarlo es: %s' % (item.lista, codigo)) alfav = AlfavoritesData(item.lista) alfav.info_lista['tinyupload_date'] = fechahora_actual() alfav.info_lista['tinyupload_code'] = codigo alfav.save() platformtools.dialog_ok( 'Alfa', 'Subida lista a tinyupload. Si quieres compartirla con alguien, pásale este código:', codigo) return True
def run(item=None): logger.info() if not item: # Extract item from sys.argv if sys.argv[2]: item = Item().fromurl(sys.argv[2]) # If no item, this is mainlist else: if config.get_setting("start_page"): if not config.get_setting("custom_start"): dictCategory = { config.get_localized_string(70137): 'peliculas', config.get_localized_string(30123): 'series', config.get_localized_string(30124): 'anime', config.get_localized_string(70018): 'infantiles', config.get_localized_string(60513): 'documentales', config.get_localized_string(70013): 'terror', config.get_localized_string(70014): 'castellano', config.get_localized_string(59976): 'latino', config.get_localized_string(70171): 'torrent', } if not config.get_setting( "category") in dictCategory.keys(): config.set_setting('category', config.get_localized_string(70137)) category = dictCategory[config.get_setting("category")] item = Item(channel="news", action="novedades", extra=category, mode='silent') else: from specials import side_menu item = Item() item = side_menu.check_user_home(item) item.start = True else: item = Item(channel="channelselector", action="getmainlist", viewmode="movie") if not config.get_setting('show_once'): if not config.dev_mode(): from platformcode import updater updater.calcCurrHash() from platformcode import xbmc_videolibrary xbmc_videolibrary.ask_set_content( 1, config.get_setting('videolibrary_kodi_force')) config.set_setting('show_once', True) logger.info(item.tostring()) try: # If item has no action, stops here if item.action == "": logger.info("Item sin accion") return # Action for main menu in channelselector elif item.action == "getmainlist": import channelselector itemlist = channelselector.getmainlist() platformtools.render_items(itemlist, item) # Action for channel types on channelselector: movies, series, etc. elif item.action == "getchanneltypes": import channelselector itemlist = channelselector.getchanneltypes() platformtools.render_items(itemlist, item) # Action for channel listing on channelselector elif item.action == "filterchannels": import channelselector itemlist = channelselector.filterchannels(item.channel_type) platformtools.render_items(itemlist, item) # Special action for playing a video from the library elif item.action == "play_from_library": play_from_library(item) return elif item.action == "keymap": from platformcode import keymaptools if item.open: return keymaptools.open_shortcut_menu() else: return keymaptools.set_key() elif item.action == "delete_key": from platformcode import keymaptools return keymaptools.delete_key() elif item.action == "script": from core import tmdb if tmdb.drop_bd(): platformtools.dialog_notification( config.get_localized_string(20000), config.get_localized_string(60011), time=2000, sound=False) elif item.action == "itemInfo": import base64 platformtools.dialog_textviewer('Item info', item.parent) # Action in certain channel specified in "action" and "channel" parameters else: # Entry point for a channel is the "mainlist" action, so here we check parental control if item.action == "mainlist": #updater.checkforupdates() beta version checking for update, still disabled # Parental control # If it is an adult channel, and user has configured pin, asks for it if channeltools.is_adult(item.channel) and config.get_setting( "adult_request_password"): tecleado = platformtools.dialog_input( "", config.get_localized_string(60334), True) if tecleado is None or tecleado != config.get_setting( "adult_password"): return # # Actualiza el canal individual # if (item.action == "mainlist" and item.channel != "channelselector" and # config.get_setting("check_for_channel_updates") == True): # from core import updater # updater.update_channel(item.channel) # Checks if channel exists if os.path.isfile( os.path.join(config.get_runtime_path(), 'channels', item.channel + ".py")): CHANNELS = 'channels' elif os.path.isfile( os.path.join(config.get_runtime_path(), 'channels', 'p**n', item.channel + ".py")): CHANNELS = 'channels.p**n' else: CHANNELS = 'specials' if CHANNELS != 'channels.p**n': channel_file = os.path.join(config.get_runtime_path(), CHANNELS, item.channel + ".py") else: channel_file = os.path.join(config.get_runtime_path(), 'channels', 'p**n', item.channel + ".py") logger.info("channel_file= " + channel_file + ' - ' + CHANNELS + ' - ' + item.channel) channel = None if os.path.exists(channel_file): try: channel = __import__(CHANNELS + item.channel, None, None, [CHANNELS + item.channel]) except ImportError: importer = "import " + CHANNELS + "." + item.channel + " as channel " exec(importer) logger.info("Running channel %s | %s" % (channel.__name__, channel.__file__)) # Special play action if item.action == "play": #define la info para trakt try: trakt_tools.set_trakt_info(item) except: pass logger.info("item.action=%s" % item.action.upper()) # logger.debug("item_toPlay: " + "\n" + item.tostring('\n')) # First checks if channel has a "play" function if hasattr(channel, 'play'): logger.info("Executing channel 'play' method") itemlist = channel.play(item) b_favourite = item.isFavourite # Play should return a list of playable URLS if len(itemlist) > 0 and isinstance(itemlist[0], Item): item = itemlist[0] if b_favourite: item.isFavourite = True platformtools.play_video(item) # Permitir varias calidades desde play en el canal elif len(itemlist) > 0 and isinstance(itemlist[0], list): item.video_urls = itemlist platformtools.play_video(item) # If not, shows user an error message else: platformtools.dialog_ok( config.get_localized_string(20000), config.get_localized_string(60339)) # If player don't have a "play" function, not uses the standard play from platformtools else: logger.info("Executing core 'play' method") platformtools.play_video(item) # Special action for findvideos, where the plugin looks for known urls elif item.action == "findvideos": # First checks if channel has a "findvideos" function if hasattr(channel, 'findvideos'): itemlist = getattr(channel, item.action)(item) itemlist = servertools.filter_servers(itemlist) # If not, uses the generic findvideos function else: logger.info("No channel 'findvideos' method, " "executing core method") itemlist = servertools.find_video_items(item) if config.get_setting("max_links", "videolibrary") != 0: itemlist = limit_itemlist(itemlist) from platformcode import subtitletools subtitletools.saveSubtitleName(item) platformtools.render_items(itemlist, item) # Special action for adding a movie to the library elif item.action == "add_pelicula_to_library": videolibrarytools.add_movie(item) # Special action for adding a serie to the library elif item.action == "add_serie_to_library": videolibrarytools.add_tvshow(item, channel) # Special action for downloading all episodes from a serie elif item.action == "download_all_episodes": from specials import downloads item.action = item.extra del item.extra downloads.save_download(item) # Special action for searching, first asks for the words then call the "search" function elif item.action == "search": logger.info("item.action=%s" % item.action.upper()) last_search = "" last_search_active = config.get_setting( "last_search", "search") if last_search_active: try: current_saved_searches_list = list( config.get_setting("saved_searches_list", "search")) last_search = current_saved_searches_list[0] except: pass tecleado = platformtools.dialog_input(last_search) if tecleado is not None: if last_search_active and not tecleado.startswith("http"): from specials import search search.save_search(tecleado) if 'search' in dir(channel): itemlist = channel.search(item, tecleado) else: from core import support itemlist = support.search(channel, item, tecleado) else: return platformtools.render_items(itemlist, item) # For all other actions else: # import web_pdb; web_pdb.set_trace() logger.info("Executing channel '%s' method" % item.action) itemlist = getattr(channel, item.action)(item) if config.get_setting('trakt_sync'): token_auth = config.get_setting("token_trakt", "trakt") if not token_auth: trakt_tools.auth_trakt() else: import xbmc if not xbmc.getCondVisibility( 'System.HasAddon(script.trakt)' ) and config.get_setting('install_trakt'): trakt_tools.ask_install_script() itemlist = trakt_tools.trakt_check(itemlist) else: config.set_setting('install_trakt', True) platformtools.render_items(itemlist, item) except urllib2.URLError, e: import traceback logger.error(traceback.format_exc()) # Grab inner and third party errors if hasattr(e, 'reason'): logger.error("Razon del error, codigo: %s | Razon: %s" % (str(e.reason[0]), str(e.reason[1]))) texto = config.get_localized_string( 30050) # "No se puede conectar con el sitio web" platformtools.dialog_ok(config.get_localized_string(20000), texto) # Grab server response errors elif hasattr(e, 'code'): logger.error("Codigo de error HTTP : %d" % e.code) # "El sitio web no funciona correctamente (error http %d)" platformtools.dialog_ok( config.get_localized_string(20000), config.get_localized_string(30051) % e.code)
def downloadfile(url, nombrefichero, headers=None, silent=False, continuar=False, resumir=True): logger.info("url=" + url) logger.info("filename=" + nombrefichero) if headers is None: headers = [] progreso = None if config.is_xbmc() and nombrefichero.startswith("special://"): import xbmc nombrefichero = xbmc.translatePath(nombrefichero) try: # Si no es XBMC, siempre a "Silent" from platformcode import platformtools # antes # f=open(nombrefichero,"wb") try: import xbmc nombrefichero = xbmc.makeLegalFilename(nombrefichero) except: pass logger.info("filename=" + nombrefichero) # El fichero existe y se quiere continuar if filetools.exists(nombrefichero) and continuar: f = filetools.file_open(nombrefichero, 'r+b', vfs=VFS) if resumir: exist_size = filetools.getsize(nombrefichero) logger.info("the file exists, size=%d" % exist_size) grabado = exist_size f.seek(exist_size) else: exist_size = 0 grabado = 0 # el fichero ya existe y no se quiere continuar, se aborta elif filetools.exists(nombrefichero) and not continuar: logger.info("the file exists, it does not download again") return -3 # el fichero no existe else: exist_size = 0 logger.info("the file does not exist") f = filetools.file_open(nombrefichero, 'wb', vfs=VFS) grabado = 0 # Crea el diálogo de progreso if not silent: progreso = platformtools.dialog_progress("plugin", "Downloading...", url, nombrefichero) # Si la plataforma no devuelve un cuadro de diálogo válido, asume modo silencio if progreso is None: silent = True if "|" in url: additional_headers = url.split("|")[1] if "&" in additional_headers: additional_headers = additional_headers.split("&") else: additional_headers = [additional_headers] for additional_header in additional_headers: logger.info("additional_header: " + additional_header) name = re.findall("(.*?)=.*?", additional_header)[0] value = urllib.parse.unquote_plus( re.findall(".*?=(.*?)$", additional_header)[0]) headers.append([name, value]) url = url.split("|")[0] logger.info("url=" + url) # Timeout del socket a 60 segundos socket.setdefaulttimeout(60) h = urllib.request.HTTPHandler(debuglevel=0) request = urllib.request.Request(url) for header in headers: logger.info("Header=" + header[0] + ": " + header[1]) request.add_header(header[0], header[1]) if exist_size > 0: request.add_header('Range', 'bytes=%d-' % (exist_size, )) opener = urllib.request.build_opener(h) urllib.request.install_opener(opener) try: connexion = opener.open(request) except urllib.error.HTTPError as e: logger.error("error %d (%s) al abrir la url %s" % (e.code, e.msg, url)) f.close() if not silent: progreso.close() # El error 416 es que el rango pedido es mayor que el fichero => es que ya está completo if e.code == 416: return 0 else: return -2 try: totalfichero = int(connexion.headers["Content-Length"]) except ValueError: totalfichero = 1 if exist_size > 0: totalfichero = totalfichero + exist_size logger.info("Content-Length=%s" % totalfichero) blocksize = 100 * 1024 bloqueleido = connexion.read(blocksize) logger.info("Starting downloading the file, blocked=%s" % len(bloqueleido)) maxreintentos = 10 while len(bloqueleido) > 0: try: # Escribe el bloque leido f.write(bloqueleido) grabado += len(bloqueleido) percent = int(float(grabado) * 100 / float(totalfichero)) totalmb = float(float(totalfichero) / (1024 * 1024)) descargadosmb = float(float(grabado) / (1024 * 1024)) # Lee el siguiente bloque, reintentando para no parar todo al primer timeout reintentos = 0 while reintentos <= maxreintentos: try: before = time.time() bloqueleido = connexion.read(blocksize) after = time.time() if (after - before) > 0: velocidad = old_div(len(bloqueleido), (after - before)) falta = totalfichero - grabado if velocidad > 0: tiempofalta = old_div(falta, velocidad) else: tiempofalta = 0 # logger.info(sec_to_hms(tiempofalta)) if not silent: progreso.update( percent, "%.2fMB/%.2fMB (%d%%) %.2f Kb/s %s falta " % (descargadosmb, totalmb, percent, old_div(velocidad, 1024), sec_to_hms(tiempofalta))) break except: reintentos += 1 logger.info("ERROR in block download, retry %d" % reintentos) import traceback logger.error(traceback.print_exc()) # El usuario cancelo la descarga try: if progreso.iscanceled(): logger.info("Download of file canceled") f.close() progreso.close() return -1 except: pass # Ha habido un error en la descarga if reintentos > maxreintentos: logger.info("ERROR in the file download") f.close() if not silent: progreso.close() return -2 except: import traceback logger.error(traceback.print_exc()) f.close() if not silent: progreso.close() # platformtools.dialog_ok('Error al descargar' , 'Se ha producido un error' , 'al descargar el archivo') return -2 except: if url.startswith("rtmp"): error = downloadfileRTMP(url, nombrefichero, silent) if error and not silent: from platformcode import platformtools platformtools.dialog_ok("No puedes descargar ese vídeo", "Las descargas en RTMP aún no", "están soportadas") else: import traceback from pprint import pprint exc_type, exc_value, exc_tb = sys.exc_info() lines = traceback.format_exception(exc_type, exc_value, exc_tb) for line in lines: line_splits = line.split("\n") for line_split in line_splits: logger.error(line_split) try: f.close() except: pass if not silent: try: progreso.close() except: pass logger.info("End of file download")
def clear_saved_searches(item): config.set_setting("saved_searches_list", list(), "buscador") platformtools.dialog_ok("Ricerca", "Ricerche cancellate correttamente")
def play(item): from time import time from base64 import b64encode from hashlib import md5 data = support.httptools.downloadpage(item.url + item.episodeid, headers=headers).data.replace( '"', '"').replace('\\', '') scws_id = support.match(data, patron=r'scws_id"\s*:\s*(\d+)').match # support.dbg() if not scws_id: if '<strong>Prossimamente' in data: platformtools.dialog_ok( 'StreamingCommunity', 'Il sito notifica che il contenuto sarà disponibile prossimamente' ) platformtools.play_canceled = True return [] # Calculate Token client_ip = httptools.downloadpage('https://api.ipify.org/').data expires = int(time() + 172800) token = b64encode( md5('{}{} Yc8U6r8KjAKAepEA'.format( expires, client_ip).encode('utf-8')).digest()).decode('utf-8').replace( '=', '').replace('+', '-').replace('/', '_') url = 'https://scws.xyz/master/{}?token={}&expires={}&n=1'.format( scws_id, token, expires) subs = [] urls = [] info = support.match( url, patron= r'LANGUAGE="([^"]+)",\s*URI="([^"]+)|RESOLUTION=\d+x(\d+).*?(http[^"\s]+)' ).matches if info: for lang, sub, res, url in info: if sub and not logger.testMode: # ai test non piace questa parte if lang == 'auto': lang = 'ita-forced' s = config.get_temp_file(lang + '.srt') subs.append(s) filetools.write( s, support.vttToSrt( httptools.downloadpage( support.match( sub, patron=r'(http[^\s\n]+)').match).data)) elif url: urls.append(['hls [{}]'.format(res), url]) return [ item.clone(title=channeltools.get_channel_parameters( item.channel)['title'], server='directo', video_urls=urls, subtitle=subs, manifest='hls') ] else: return [ item.clone(title=channeltools.get_channel_parameters( item.channel)['title'], server='directo', url=url, manifest='hls') ]
elif itemlist == True: logger.info('El canal ha ejecutado correctamente una acción que no devuelve ningún listado.') elif itemlist == False: logger.info('El canal ha ejecutado una acción que no devuelve ningún listado.') except urllib2.URLError, e: import traceback logger.error(traceback.format_exc()) # Grab inner and third party errors if hasattr(e, 'reason'): logger.error("Razon del error, codigo: %s | Razon: %s" % (str(e.reason[0]), str(e.reason[1]))) texto = "No se puede conectar con el servidor" # "No se puede conectar con el sitio web" platformtools.dialog_ok(config.__addon_name, texto) # Grab server response errors elif hasattr(e, 'code'): logger.error("Codigo de error HTTP : %d" % e.code) platformtools.dialog_ok(config.__addon_name, "El sitio web no funciona correctamente (error http %d)" % e.code) except WebErrorException, e: import traceback logger.error(traceback.format_exc()) # Ofrecer buscar en otros canales o en el mismo canal, si está activado en la configuración if item.contentType in ['movie', 'tvshow', 'season', 'episode'] and config.get_setting('tracking_weberror_dialog', default=True): if item.action == 'findvideos': platformtools.play_fake() item_search = platformtools.dialogo_busquedas_por_fallo_web(item)
def open_settings(): Opciones = [] 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")))])) from platformcode import platformtools global adult_setting adult_password = get_setting('adult_password') if not adult_password: adult_password = set_setting('adult_password', '0000') adult_mode = get_setting('adult_mode') adult_request_password = get_setting('adult_request_password') platformtools.open_settings(Opciones) # Hemos accedido a la seccion de Canales para adultos if get_setting('adult_aux_intro_password'): # La contraseña de acceso es correcta if get_setting('adult_aux_intro_password') == adult_password: # Cambio de contraseña if get_setting('adult_aux_new_password1'): if get_setting('adult_aux_new_password1') == get_setting( 'adult_aux_new_password2'): 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 = {} else: platformtools.dialog_ok( "Canales para adultos", "La contraseña no es correcta.", "Los cambios realizados en esta sección no se guardaran.") # Deshacer cambios set_setting("adult_mode", adult_mode) set_setting("adult_request_password", adult_request_password) # Borramos settings auxiliares set_setting('adult_aux_intro_password', '') set_setting('adult_aux_new_password1', '') set_setting('adult_aux_new_password2', '')
def novedades(item): logger.debug() global list_newest threads = [] list_newest = [] start_time = time.time() mode = item.mode if mode == '': mode = 'normal' if mode == 'get_cached': if os.path.exists(menu_cache_path): return get_from_cache(item) multithread = config.get_setting("multithread", "news") logger.debug("multithread= " + str(multithread)) if not multithread: if platformtools.dialog_yesno( config.get_localized_string(60515), config.get_localized_string(60516) + '\n' + config.get_localized_string(60517) + '\n' + config.get_localized_string(60518)): if config.set_setting("multithread", True, "news"): multithread = True if mode == 'normal': progreso = platformtools.dialog_progress( item.category, config.get_localized_string(60519)) list_canales, any_active = get_channels_list() # if config.is_xbmc(): # from platformcode import side_menu # if mode=='silent' and any_active and len(list_canales[item.extra]) > 0: # side_menu.set_menu_settings(item) # aux_list=[] # for canal in list_canales[item.extra]: # if len(aux_list)<2: # aux_list.append(canal) # list_canales[item.extra]=aux_list if mode == 'set_cache': list_canales[item.extra] = list_canales[item.extra][2:] if any_active and len(list_canales[item.extra]) > 0: import math # fix float because division is done poorly in python 2.x number_of_channels = float(100) / len(list_canales[item.extra]) for index, channel in enumerate(list_canales[item.extra]): channel_id, channel_title = channel percentage = int(math.ceil((index + 1) * number_of_channels)) # if progreso.iscanceled(): # progreso.close() # logger.debug("Búsqueda cancelada") # return itemlist # Modo Multi Thread if multithread: t = Thread(target=get_newest, args=[channel_id, item.extra], name=channel_title) t.start() threads.append(t) if mode == 'normal': progreso.update( percentage, config.get_localized_string(60520) % channel_title) # Modo single Thread else: if mode == 'normal': logger.debug("Obteniendo novedades de channel_id=" + channel_id) progreso.update( percentage, "", config.get_localized_string(60520) % channel_title) get_newest(channel_id, item.extra) # Multi Thread mode: wait for all threads to finish if multithread: pendent = [a for a in threads if a.is_alive()] t = float(100) / len(pendent) while pendent: index = (len(threads) - len(pendent)) + 1 percentage = int(math.ceil(index * t)) list_pendent_names = [a.getName() for a in pendent] if mode == 'normal': mensaje = config.get_localized_string(30994) % ( ", ".join(list_pendent_names)) progreso.update( percentage, config.get_localized_string(60521) % (len(threads) - len(pendent), len(threads)) + '\n' + mensaje) logger.debug(mensaje) if progreso.iscanceled(): logger.debug("Busqueda de novedades cancelada") break time.sleep(0.5) pendent = [a for a in threads if a.is_alive()] if mode == 'normal': mensaje = config.get_localized_string(60522) % ( len(list_newest), time.time() - start_time) progreso.update(100, mensaje) logger.debug(mensaje) start_time = time.time() # logger.debug(start_time) result_mode = config.get_setting("result_mode", "news") if mode != 'normal': result_mode = 0 if result_mode == 0: # Grouped by content ret = group_by_content(list_newest) elif result_mode == 1: # Grouped by channels ret = group_by_channel(list_newest) else: # Ungrouped ret = no_group(list_newest) while time.time() - start_time < 2: # show progress chart with time spent for at least 2 seconds time.sleep(0.5) if mode == 'normal': progreso.close() if mode == 'silent': set_cache(item) item.mode = 'set_cache' ret = add_menu_items(item, ret) if mode != 'set_cache': return ret else: if mode != 'set_cache': no_channels = platformtools.dialog_ok( config.get_localized_string(30130) + ' - ' + item.extra + '\n' + config.get_localized_string(70661) + '\n' + config.get_localized_string(70662)) return
def get_video_url(page_url, premium=False, user="", password="", video_password=""): def int_bckup_method(): global data, headers page_url = scrapertools.find_single_match( data, r"""<center><a href='(https?:\/\/wstream[^']+)'\s*title='bkg'""") if not page_url: page_url = scrapertools.find_single_match( data, r"""<form action=['"]([^'"]+)['"]""") if page_url.startswith('/'): page_url = 'http://wstream.video' + page_url if page_url: data = httptools.downloadpage(page_url, follow_redirects=True, post={ 'g-recaptcha-response': captcha }, verify=False).data def getSources(data): possibileSources = scrapertools.find_multiple_matches( data, r'sources:\s*(\[[^\]]+\])') for data in possibileSources: try: data = re.sub('([A-z]+):(?!/)', '"\\1":', data) keys = json.loads(data) for key in keys: if 'label' in key: if not 'type' in key: key['type'] = 'mp4' if not 'src' in key and 'file' in key: key['src'] = key['file'] if '?' in key['src']: key['src'] = key['src'].split('?')[0] video_urls.append([ '%s [%s]' % (key['type'].replace('video/', ''), key['label']), key['src'].replace('https', 'http') + '|' + _headers ]) elif type(key) != dict: filetype = key.split('.')[-1] if '?' in filetype: filetype = filetype.split('?')[0] video_urls.append([ filetype, key.replace('https', 'http') + '|' + _headers ]) else: if not 'src' in key and 'file' in key: key['src'] = key['file'] if '?' in key['src']: key['src'] = key['src'].split('?')[0] if key['src'].split('.')[-1] == 'mpd': pass video_urls.append([ key['src'].split('.')[-1], key['src'].replace('https', 'http') + '|' + _headers ]) except: pass logger.debug("[Wstream] url=" + page_url) video_urls = [] global data, real_url, headers sitekey = scrapertools.find_multiple_matches( data, """data-sitekey=['"] *([^"']+)""") if sitekey: sitekey = sitekey[-1] captcha = platformtools.show_recaptcha(sitekey, page_url) if sitekey else '' possibleParam = scrapertools.find_multiple_matches( data, r"""<input.*?(?:name=["']([^'"]+).*?value=["']([^'"]*)['"]>|>)""") if possibleParam and possibleParam[0][0]: post = {param[0]: param[1] for param in possibleParam if param[0]} if captcha: post['g-recaptcha-response'] = captcha if post: data = httptools.downloadpage(real_url, post=post, follow_redirects=True, verify=False).data elif captcha: int_bckup_method() elif captcha or not sitekey: int_bckup_method() else: platformtools.dialog_ok(config.get_localized_string(20000), config.get_localized_string(707434)) return [] headers = [['Referer', real_url]] _headers = urllib.urlencode(dict(headers)) post_data = scrapertools.find_single_match( data, r"<script type='text/javascript'>(eval.function.p,a,c,k,e,.*?)\s*</script>" ) if post_data != "": from lib import jsunpack data = jsunpack.unpack(post_data) getSources(data) else: getSources(data) if not video_urls: media_urls = scrapertools.find_multiple_matches( data, r'(http[^\s]*?\.(?:mp4|m3u8))') for media_url in media_urls: video_urls.append([ media_url.split('.')[-1] + " [Wstream] ", media_url + '|' + _headers ]) video_urls.sort(key=lambda x: x[0]) return video_urls
def run(): logger.info() # Extract item from sys.argv if sys.argv[2]: item = Item().fromurl(sys.argv[2]) # If no item, this is mainlist else: item = Item(channel="channelselector", action="getmainlist", viewmode="movie") logger.info(item.tostring()) try: # If item has no action, stops here if item.action == "": logger.info("Item sin accion") return # Action for main menu in channelselector if item.action == "getmainlist": import channelselector # Check for updates only on first screen if config.get_setting("check_for_plugin_updates") == "true": logger.info("Check for plugin updates enabled") from core import updater try: config.set_setting("plugin_updates_available","0") version = updater.checkforupdates() itemlist = channelselector.getmainlist() if version: config.set_setting("plugin_updates_available","1") platformtools.dialog_ok("Versión "+version+" disponible", "Ya puedes descargar la nueva versión del plugin\n" "desde el listado principal") itemlist = channelselector.getmainlist() itemlist.insert(0, Item(title="Descargar version "+version, version=version, channel="updater", action="update", thumbnail=channelselector.get_thumb("squares","thumb_actualizar.png"))) except: import traceback logger.info(traceback.format_exc()) platformtools.dialog_ok("No se puede conectar", "No ha sido posible comprobar", "si hay actualizaciones") logger.info("Fallo al verificar la actualización") config.set_setting("plugin_updates_available","0") itemlist = channelselector.getmainlist() else: logger.info("Check for plugin updates disabled") config.set_setting("plugin_updates_available","0") itemlist = channelselector.getmainlist() platformtools.render_items(itemlist, item) # Action for updating plugin elif item.action == "update": from core import updater updater.update(item) config.set_setting("plugin_updates_available","0") if config.get_system_platform() != "xbox": import xbmc xbmc.executebuiltin("Container.Refresh") # Action for channel types on channelselector: movies, series, etc. elif item.action == "getchanneltypes": import channelselector itemlist = channelselector.getchanneltypes() platformtools.render_items(itemlist, item) # Action for channel listing on channelselector elif item.action == "filterchannels": import channelselector itemlist = channelselector.filterchannels(item.channel_type) platformtools.render_items(itemlist, item) # Special action for playing a video from the library elif item.action == "play_from_library": play_from_library(item) return # Action in certain channel specified in "action" and "channel" parameters else: # Entry point for a channel is the "mainlist" action, so here we check parental control if item.action == "mainlist": # Parental control can_open_channel = False # If it is an adult channel, and user has configured pin, asks for it if channeltools.is_adult(item.channel) and config.get_setting("adult_pin") != "": tecleado = platformtools.dialog_input("", "PIN para canales de adultos", True) if tecleado is not None: if tecleado == config.get_setting("adult_pin"): can_open_channel = True # All the other cases can open the channel else: can_open_channel = True if not can_open_channel: return # Actualiza el canal individual if (item.action == "mainlist" and item.channel != "channelselector" and config.get_setting("check_for_channel_updates") == "true"): from core import updater updater.update_channel(item.channel) # Checks if channel exists channel_file = os.path.join(config.get_runtime_path(), 'channels', item.channel + ".py") logger.info("channel_file=%s" % channel_file) channel = None if item.channel in ["personal", "personal2", "personal3", "personal4", "personal5"]: import channels.personal as channel elif os.path.exists(channel_file): try: channel = __import__('channels.%s' % item.channel, None, None, ["channels.%s" % item.channel]) except ImportError: exec "import channels." + item.channel + " as channel" logger.info("Running channel %s | %s" % (channel.__name__, channel.__file__)) # Special play action if item.action == "play": logger.info("item.action=%s" % item.action.upper()) # logger.debug("item_toPlay: " + "\n" + item.tostring('\n')) # First checks if channel has a "play" function if hasattr(channel, 'play'): logger.info("Executing channel 'play' method") itemlist = channel.play(item) b_favourite = item.isFavourite # Play should return a list of playable URLS if len(itemlist) > 0 and isinstance(itemlist[0], Item): item = itemlist[0] if b_favourite: item.isFavourite = True platformtools.play_video(item) # Permitir varias calidades desde play en el canal elif len(itemlist) > 0 and isinstance(itemlist[0], list): item.video_urls = itemlist platformtools.play_video(item) # If not, shows user an error message else: platformtools.dialog_ok("pelisalacarta", "No hay nada para reproducir") # If player don't have a "play" function, not uses the standard play from platformtools else: logger.info("Executing core 'play' method") platformtools.play_video(item) # Special action for findvideos, where the plugin looks for known urls elif item.action == "findvideos": # First checks if channel has a "findvideos" function if hasattr(channel, 'findvideos'): itemlist = getattr(channel, item.action)(item) # If not, uses the generic findvideos function else: logger.info("No channel 'findvideos' method, " "executing core method") from core import servertools itemlist = servertools.find_video_items(item) if config.get_setting('filter_servers') == 'true': itemlist = filtered_servers(itemlist) if config.get_setting("max_links", "biblioteca") != 0: itemlist = limit_itemlist(itemlist) from platformcode import subtitletools subtitletools.saveSubtitleName(item) platformtools.render_items(itemlist, item) # Special action for adding a movie to the library elif item.action == "add_pelicula_to_library": library.add_pelicula_to_library(item) # Special action for adding a serie to the library elif item.action == "add_serie_to_library": library.add_serie_to_library(item, channel) # Special action for downloading all episodes from a serie elif item.action == "download_all_episodes": from channels import descargas item.action = item.extra del item.extra descargas.save_download(item) # Special action for searching, first asks for the words then call the "search" function elif item.action == "search": logger.info("item.action=%s" % item.action.upper()) last_search = "" last_search_active = config.get_setting("last_search", "buscador") if last_search_active: try: current_saved_searches_list = list(config.get_setting("saved_searches_list", "buscador")) last_search = current_saved_searches_list[0] except: pass tecleado = platformtools.dialog_input(last_search) if tecleado is not None: if last_search_active: from channels import buscador buscador.save_search(tecleado) # TODO revisar 'personal.py' porque no tiene función search y daría problemas itemlist = channel.search(item, tecleado) else: itemlist = [] platformtools.render_items(itemlist, item) # For all other actions else: logger.info("Executing channel '%s' method" % item.action) itemlist = getattr(channel, item.action)(item) platformtools.render_items(itemlist, item) except urllib2.URLError, e: import traceback logger.error(traceback.format_exc()) # Grab inner and third party errors if hasattr(e, 'reason'): logger.info("Razon del error, codigo: %s | Razon: %s" % (str(e.reason[0]), str(e.reason[1]))) texto = config.get_localized_string(30050) # "No se puede conectar con el sitio web" platformtools.dialog_ok("pelisalacarta", texto) # Grab server response errors elif hasattr(e, 'code'): logger.info("Codigo de error HTTP : %d" % e.code) # "El sitio web no funciona correctamente (error http %d)" platformtools.dialog_ok("pelisalacarta", config.get_localized_string(30051) % e.code)
try: import xbmc if config.get_platform(True)['num_version'] < 14: log_name = "xbmc.log" else: log_name = "kodi.log" log_message = "Route: " + xbmc.translatePath( "special://logpath") + log_name except: log_message = "" if canal: platformtools.dialog_ok( "Unexpected error on the channel " + canal, "It may be due to a connection failure, the channel's website " "has changed its structure, or an internal error of dss.", "To know more details, consult the log.", log_message) else: platformtools.dialog_ok( "There was an error in dss", "Check the log to see more details of the error.", log_message) def reorder_itemlist(itemlist): logger.info() # logger.debug("Inlet itemlist size: %i" % len(itemlist)) new_list = [] mod_list = [] not_mod_list = []
logger.error("Codigo de error HTTP : %d" % e.code) # "El sitio web no funciona correctamente (error http %d)" platformtools.dialog_ok( config.get_localized_string(20000), config.get_localized_string(30051) % e.code) except WebErrorException, e: import traceback logger.error(traceback.format_exc()) patron = 'File "' + os.path.join(config.get_runtime_path(), CHANNELS, "").replace("\\", "\\\\") + '([^.]+)\.py"' canal = scrapertools.find_single_match(traceback.format_exc(), patron) platformtools.dialog_ok( config.get_localized_string(59985) + canal, config.get_localized_string(60013) % (e)) except: import traceback logger.error(traceback.format_exc()) patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + '([^.]+)\.py"' canal = scrapertools.find_single_match(traceback.format_exc(), patron) try: import xbmc if config.get_platform(True)['num_version'] < 14: log_name = "xbmc.log" else:
def run(item=None): logger.debug() if not item: # Extract item from sys.argv if sys.argv[2]: sp = sys.argv[2].split('&') url = sp[0] item = Item().fromurl(url) if len(sp) > 1: for e in sp[1:]: key, val = e.split('=') item.__setattr__(key, val) # If no item, this is mainlist else: if config.get_setting("start_page"): if not config.get_setting("custom_start"): dictCategory = { config.get_localized_string(70137): 'peliculas', config.get_localized_string(30123): 'series', config.get_localized_string(30124): 'anime', config.get_localized_string(60513): 'documentales', config.get_localized_string(70171): 'torrent', } if not config.get_setting( "category") in dictCategory.keys(): config.set_setting('category', config.get_localized_string(70137)) category = dictCategory[config.get_setting("category")] item = Item(channel="news", action="novedades", extra=category, mode='silent') else: from platformcode import side_menu item = Item() item = side_menu.check_user_home(item) item.start = True else: item = Item(channel="channelselector", action="getmainlist", viewmode="movie") if not config.get_setting('show_once'): if not config.get_all_settings_addon(): logger.error('corrupted settings.xml!!') settings_xml = os.path.join(config.get_data_path(), "settings.xml") settings_bak = os.path.join(config.get_data_path(), "settings.bak") if filetools.exists(settings_bak): filetools.copy(settings_bak, settings_xml, True) logger.info('restored settings.xml from backup') else: filetools.write(settings_xml, '<settings version="2">\n</settings>' ) # resetted settings else: from platformcode import xbmc_videolibrary xbmc_videolibrary.ask_set_content(silent=False) config.set_setting('show_once', True) logger.info(item.tostring()) try: if not config.get_setting('tmdb_active'): config.set_setting('tmdb_active', True) # If item has no action, stops here if item.action == "": logger.debug("Item without action") return # Action for main menu in channelselector elif item.action == "getmainlist": import channelselector itemlist = channelselector.getmainlist() platformtools.render_items(itemlist, item) # Action for channel types on channelselector: movies, series, etc. elif item.action == "getchanneltypes": import channelselector itemlist = channelselector.getchanneltypes() platformtools.render_items(itemlist, item) # Action for channel listing on channelselector elif item.action == "filterchannels": import channelselector itemlist = channelselector.filterchannels(item.channel_type) platformtools.render_items(itemlist, item) # Special action for playing a video from the library elif item.action == "play_from_library": play_from_library(item) return elif item.action == "keymap": from platformcode import keymaptools if item.open: return keymaptools.open_shortcut_menu() else: return keymaptools.set_key() elif item.channel == "infoplus": from platformcode import infoplus return infoplus.Main(item) elif config.get_setting( 'new_search' ) and item.channel == "search" and item.action == 'new_search': from platformcode.globalsearch import Search item.contextual = True Search(item) return elif item.channel == "backup": from platformcode import backup return getattr(backup, item.action)(item) elif item.channel == "elementum_download": from platformcode import elementum_download return getattr(elementum_download, item.action)(item) elif item.channel == "shortcuts": from platformcode import shortcuts return getattr(shortcuts, item.action)(item) elif item.channel == "autorenumber": from platformcode import autorenumber return getattr(autorenumber, item.action)(item) elif item.action == "delete_key": from platformcode import keymaptools return keymaptools.delete_key() elif item.action == "script": from core import tmdb if tmdb.drop_bd(): platformtools.dialog_notification( config.get_localized_string(20000), config.get_localized_string(60011), time=2000, sound=False) elif item.action == "itemInfo": platformtools.dialog_textviewer('Item info', item.parent) elif item.action == "open_browser": import webbrowser if not webbrowser.open(item.url): import xbmc if xbmc.getCondVisibility( 'system.platform.linux') and xbmc.getCondVisibility( 'system.platform.android'): # android xbmc.executebuiltin( 'StartAndroidActivity("", "android.intent.action.VIEW", "", "%s")' % (item.url)) else: try: import urllib.request as urllib except ImportError: import urllib short = urllib.urlopen( 'https://u.nu/api.php?action=shorturl&format=simple&url=' + item.url).read().decode('utf-8') platformtools.dialog_ok( config.get_localized_string(20000), config.get_localized_string(70740) % short) # Action in certain channel specified in "action" and "channel" parameters elif item.action == "check_channels": from platformcode import checkhost checkhost.check_channels() else: # Checks if channel exists if os.path.isfile( os.path.join(config.get_runtime_path(), 'channels', item.channel + ".py")): CHANNELS = 'channels' else: CHANNELS = 'specials' channel_file = os.path.join(config.get_runtime_path(), CHANNELS, item.channel + ".py") logger.debug("channel_file= " + channel_file + ' - ' + CHANNELS + ' - ' + item.channel) channel = None if os.path.exists(channel_file): try: channel = __import__('%s.%s' % (CHANNELS, item.channel), None, None, ['%s.%s' % (CHANNELS, item.channel)]) except ImportError: exec("import " + CHANNELS + "." + item.channel + " as channel") logger.info("Running channel %s | %s" % (channel.__name__, channel.__file__)) # Special play action if item.action == "play": # define la info para trakt try: from core import trakt_tools trakt_tools.set_trakt_info(item) except: pass logger.debug("item.action=%s" % item.action.upper()) # logger.debug("item_toPlay: " + "\n" + item.tostring('\n')) # First checks if channel has a "play" function if hasattr(channel, 'play'): logger.debug("Executing channel 'play' method") itemlist = channel.play(item) b_favourite = item.isFavourite # Play should return a list of playable URLS if len(itemlist) > 0 and isinstance(itemlist[0], Item): item = itemlist[0] if b_favourite: item.isFavourite = True platformtools.play_video(item) # Permitir varias calidades desde play en el Channel elif len(itemlist) > 0 and isinstance(itemlist[0], list): item.video_urls = itemlist platformtools.play_video(item) # If not, shows user an error message else: platformtools.dialog_ok( config.get_localized_string(20000), config.get_localized_string(60339)) # If player don't have a "play" function, not uses the standard play from platformtools else: logger.debug("Executing core 'play' method") platformtools.play_video(item) # Special action for findvideos, where the plugin looks for known urls elif item.action == "findvideos": from core import servertools # First checks if channel has a "findvideos" function if hasattr(channel, 'findvideos'): itemlist = getattr(channel, item.action)(item) # If not, uses the generic findvideos function else: logger.debug("No channel 'findvideos' method, " "executing core method") itemlist = servertools.find_video_items(item) if config.get_setting("max_links", "videolibrary") != 0: itemlist = limit_itemlist(itemlist) from platformcode import subtitletools subtitletools.saveSubtitleName(item) platformtools.render_items(itemlist, item) # Special action for adding a movie to the library elif item.action == "add_pelicula_to_library": from core import videolibrarytools videolibrarytools.add_movie(item) # Special action for adding a serie to the library elif item.action == "add_serie_to_library": from core import videolibrarytools videolibrarytools.add_tvshow(item, channel) # Special action for downloading all episodes from a serie elif item.action == "download_all_episodes": from specials import downloads item.action = item.extra del item.extra downloads.save_download(item) # Special action for searching, first asks for the words then call the "search" function elif item.action == "search": # from core.support import dbg;dbg() if filetools.isfile(temp_search_file) and config.get_setting( 'videolibrary_kodi'): itemlist = [] f = filetools.read(temp_search_file) strList = f.split(',') if strList[0] == '[V]' and strList[1] == item.channel: for it in strList: if it and it not in ['[V]', item.channel]: itemlist.append(Item().fromurl(it)) filetools.write(temp_search_file, f[4:]) return platformtools.render_items(itemlist, item) else: filetools.remove(temp_search_file) logger.debug("item.action=%s" % item.action.upper()) from core import channeltools if config.get_setting('last_search'): last_search = channeltools.get_channel_setting( 'Last_searched', 'search', '') else: last_search = '' search_text = platformtools.dialog_input(last_search) if search_text is not None: channeltools.set_channel_setting('Last_searched', search_text, 'search') itemlist = new_search(item.clone(text=search_text), channel) else: return platformtools.render_items(itemlist, item) # For all other actions else: # import web_pdb; web_pdb.set_trace() logger.debug("Executing channel '%s' method" % item.action) itemlist = getattr(channel, item.action)(item) if config.get_setting('trakt_sync'): from core import trakt_tools token_auth = config.get_setting("token_trakt", "trakt") if not token_auth: trakt_tools.auth_trakt() else: import xbmc if not xbmc.getCondVisibility( 'System.HasAddon(script.trakt)' ) and config.get_setting('install_trakt'): trakt_tools.ask_install_script() itemlist = trakt_tools.trakt_check(itemlist) else: config.set_setting('install_trakt', True) platformtools.render_items(itemlist, item) except WebErrorException as e: import traceback from core import scrapertools logger.error(traceback.format_exc()) platformtools.dialog_ok( config.get_localized_string(59985) % e.channel, config.get_localized_string(60013) % e.url) except Exception as e: import traceback from core import scrapertools logger.error(traceback.format_exc()) patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + r'([^.]+)\.py"' Channel = scrapertools.find_single_match(traceback.format_exc(), patron) if Channel or e.__class__ == logger.ChannelScraperException: if item.url: if platformtools.dialog_yesno( config.get_localized_string(60087) % Channel, config.get_localized_string(60014), nolabel='ok', yeslabel=config.get_localized_string(70739)): run(Item(action="open_browser", url=item.url)) else: platformtools.dialog_ok( config.get_localized_string(60087) % Channel, config.get_localized_string(60014)) else: if platformtools.dialog_yesno(config.get_localized_string(60038), config.get_localized_string(60015)): run(Item(channel="setting", action="report_menu"))
def get_all_versions(item): logger.info() itemlist = [] # Lee la versión local from core import updater from core import versiontools # Descarga la lista de versiones from core import api api_response = api.plugins_get_all_packages() if api_response["error"]: platformtools.dialog_ok( "Error", "Se ha producido un error al descargar la lista de versiones") return for entry in api_response["body"]: if entry["package"] == "plugin": title = "pelisalacarta " + entry["tag"] + " (Publicada " + entry[ "date"] + ")" local_version_number = versiontools.get_current_plugin_version() elif entry["package"] == "channels": title = "Canales (Publicada " + entry["date"] + ")" local_version_number = versiontools.get_current_channels_version() elif entry["package"] == "servers": title = "Servidores (Publicada " + entry["date"] + ")" local_version_number = versiontools.get_current_servers_version() else: title = entry["package"] + " (Publicada " + entry["date"] + ")" local_version_number = None title_color = "" if local_version_number is None: title = title elif entry["version"] == local_version_number: title = title + " ACTUAL" elif entry["version"] > local_version_number: title_color = "yellow" else: title_color = "0xFF666666" itemlist.append( Item(channel=CHANNELNAME, title=title, url=entry["url"], filename=entry["filename"], package=entry["package"], version=str(entry["version"]), text_color=title_color, action="download_and_install_package", folder=False)) return itemlist
def registerOrLogin(page_url): if config.get_setting('username', server='hdmario') and config.get_setting( 'password', server='hdmario'): if login(): return True if platformtools.dialog_yesno( 'HDmario', 'Questo server necessita di un account, ne hai già uno oppure vuoi tentare una registrazione automatica?', yeslabel='Accedi', nolabel='Tenta registrazione'): from specials import setting from core.item import Item user_pre = config.get_setting('username', server='hdmario') password_pre = config.get_setting('password', server='hdmario') setting.server_config(Item(config='hdmario')) user_post = config.get_setting('username', server='hdmario') password_post = config.get_setting('password', server='hdmario') if user_pre != user_post or password_pre != password_post: return registerOrLogin(page_url) else: return [] else: import random import string logger.debug('Registrazione automatica in corso') mailbox = Gmailnator() randPsw = ''.join( random.choice(string.ascii_letters + string.digits) for i in range(10)) captcha = httptools.downloadpage(baseUrl + '/captchaInfo').json logger.debug('email: ' + mailbox.address) logger.debug('pass: '******'/register/', email=True, password=True, email_default=mailbox.address, password_default=randPsw, captcha_img=captcha['captchaUrl']) if not reg: return False regPost = httptools.downloadpage(baseUrl + '/register/', post={ 'email': reg['email'], 'email_confirmation': reg['email'], 'password': reg['password'], 'password_confirmation': reg['password'], 'captchaUuid': captcha['captchaUuid'], 'captcha': reg['captcha'] }) if '/register' in regPost.url: error = scrapertools.htmlclean( scrapertools.find_single_match( regPost.data, 'Impossibile proseguire.*?</div>')) error = scrapertools.unescape( scrapertools.re.sub('\n\s+', ' ', error)) platformtools.dialog_ok('HDmario', error) return False if reg['email'] == mailbox.address: if "L'indirizzo email è già stato utilizzato" in regPost.data: # httptools.downloadpage(baseUrl + '/forgotPassword', post={'email': reg['email']}) platformtools.dialog_ok('HDmario', 'Indirizzo mail già utilizzato') return False mail = mailbox.waitForMail() if mail: checkUrl = scrapertools.find_single_match( mail.body, 'href="([^"]+)">Premi qui').replace(r'\/', '/') logger.debug('CheckURL: ' + checkUrl) httptools.downloadpage(checkUrl) config.set_setting('username', mailbox.address, server='hdmario') config.set_setting('password', randPsw, server='hdmario') platformtools.dialog_ok( 'HDmario', 'Registrato automaticamente con queste credenziali:\nemail:' + mailbox.address + '\npass: '******'HDmario', 'Impossibile registrarsi automaticamente') return False else: platformtools.dialog_ok( 'HDmario', 'Hai modificato la mail quindi KoD non sarà in grado di effettuare la verifica in autonomia, apri la casella ' + reg['email'] + ' e clicca sul link. Premi ok quando fatto') logger.debug('Registrazione completata') return True
try: import xbmc xbmc_version = int(xbmc.getInfoLabel("System.BuildVersion").split(".", 1)[0]) if xbmc_version > 13: log_name = "kodi.log" else: log_name = "xbmc.log" log_message = "Ruta: "+xbmc.translatePath("special://logpath")+log_name except: log_message = "" if canal: platformtools.dialog_ok( "Error inesperado en el canal " + canal, "Puede deberse a un fallo de conexión, la web del canal " "ha cambiado su estructura, o un error interno de pelisalacarta.", "Para saber más detalles, consulta el log.", log_message) else: platformtools.dialog_ok( "Se ha producido un error en pelisalacarta", "Comprueba el log para ver mas detalles del error.", log_message) def set_server_list(): logger.info() server_white_list = [] server_black_list = []