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 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_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("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 get_episodes(item): logger.info("pelisalacarta.channels.descargas get_episodes") #El item YA es un episodio, no cal buscar if item.contentType == "episode": episodes = [item.clone()] #El item es uma serie o temporada elif item.contentType in ["tvshow", "season"]: # importamos el canal channel = __import__('channels.%s' % item.contentChannel, None, None, ["channels.%s" % item.contentChannel]) # Obtenemos el listado de episodios episodes = getattr(channel, item.contentAction)(item) itemlist = [] #Tenemos las lista, ahora vamos a comprobar for episode in episodes: #Si partiamos de un item que ya era episodio estos datos ya están bien, no hay que modificarlos if item.contentType != "episode": episode.contentAction = episode.action episode.contentChannel = episode.channel #Si el resultado es una temporada, no nos vale, tenemos que descargar los episodios de cada temporada if episode.contentType == "season": itemlist.extend(get_episodes(episode)) #Si el resultado es un episodio ya es lo que necesitamos, lo preparamos para añadirlo a la descarga if episode.contentType == "episode": episode.infoLabels = item.infoLabels tmdb.find_and_set_infoLabels_tmdb(episode) episode.action = "menu" episode.channel = "descargas" episode.downloadStatus = 0 episode.downloadProgress = 0 episode.downloadSize = 0 episode.downloadCompleted = 0 if episode.text_color: del episode.text_color if episode.text_bold: del episode.text_bold if episode.text_italic: del episode.text_italic season_and_episode = scrapertools.get_season_and_episode(episode.title) if season_and_episode and episode.contentTitle: episode.contentSeason, episode.contentEpisodeNumber = season_and_episode.split("x") episode.downloadFilename = os.path.join(item.downloadFilename,"%s - %s" % (season_and_episode, episode.contentTitle.strip())) else: episode.contentTitle = re.sub("\[[^\]]+\]|\([^\)]+\)","",episode.title).strip() episode.downloadFilename = os.path.join(item.downloadFilename, episode.contentTitle) itemlist.append(episode) #Cualquier otro resultado no nos vale, lo ignoramos else: logger.info("Omitiendo item no válido: %s" % episode.tostring()) return itemlist
def get_episodes(item): logger.info("contentAction: %s | contentChannel: %s | contentType: %s" % (item.contentAction, item.contentChannel, item.contentType)) #El item que pretendemos descargar YA es un episodio if item.contentType == "episode": episodes = [item.clone()] #El item es uma serie o temporada elif item.contentType in ["tvshow", "season"]: # importamos el canal channel = __import__('channels.%s' % item.contentChannel, None, None, ["channels.%s" % item.contentChannel]) # Obtenemos el listado de episodios episodes = getattr(channel, item.contentAction)(item) itemlist = [] #Tenemos las lista, ahora vamos a comprobar for episode in episodes: #Si partiamos de un item que ya era episodio estos datos ya están bien, no hay que modificarlos if item.contentType != "episode": episode.contentAction = episode.action episode.contentChannel = episode.channel #Si el resultado es una temporada, no nos vale, tenemos que descargar los episodios de cada temporada if episode.contentType == "season": itemlist.extend(get_episodes(episode)) #Si el resultado es un episodio ya es lo que necesitamos, lo preparamos para añadirlo a la descarga if episode.contentType == "episode": #Pasamos el id al episodio if not episode.infoLabels["tmdb_id"]: episode.infoLabels["tmdb_id"] = item.infoLabels["tmdb_id"] #Episodio, Temporada y Titulo if not episode.contentSeason or not episode.contentEpisodeNumber: season_and_episode = scrapertools.get_season_and_episode(episode.title) if season_and_episode: episode.contentSeason = season_and_episode.split("x")[0] episode.contentEpisodeNumber = season_and_episode.split("x")[1] #Buscamos en tmdb if item.infoLabels["tmdb_id"]: tmdb.find_and_set_infoLabels_tmdb(episode) #Episodio, Temporada y Titulo if not episode.contentTitle: episode.contentTitle = re.sub("\[[^\]]+\]|\([^\)]+\)|\d*x\d*\s*-","",episode.title).strip() episode.downloadFilename = os.path.join(item.downloadFilename,"%dx%0.2d - %s" % (episode.contentSeason, episode.contentEpisodeNumber, episode.contentTitle.strip())) itemlist.append(episode) #Cualquier otro resultado no nos vale, lo ignoramos else: logger.info("Omitiendo item no válido: %s" % episode.tostring()) return itemlist
def save_library_tvshow(item, episodelist): """ guarda en la libreria de series la serie con todos los capitulos incluidos en la lista episodelist @type item: item @param item: item que representa la serie a guardar @type episodelist: list @param episodelist: listado de items que representan los episodios que se van a guardar. @rtype insertados: int @return: el número de episodios insertados @rtype sobreescritos: int @return: el número de episodios sobreescritos @rtype fallidos: int @return: el número de episodios fallidos o -1 si ha fallado toda la serie """ logger.info("streamondemand.platformcode.library save_library_tvshow") # Itentamos obtener el titulo correcto: # 1. contentSerieName: Este deveria ser el sitio correcto # 2. show titulo = item.contentSerieName if not titulo: titulo = item.show # Colocamos el titulo en su sitio para que tmdb lo localize item.contentSerieName = titulo # establecemos "active" para que se actualice cuando se llame a library_service item.active = True # Si llegados a este punto no tenemos titulo, salimos if not item.contentSerieName or not item.channel: return 0, 0, -1 # Salimos sin guardar # TODO configurar para segun el scraper se llame a uno u otro tmdb.find_and_set_infoLabels_tmdb( item, config.get_setting("scrap_ask_name") == "true") path = filetools.join( TVSHOWS_PATH, "{0} [{1}]".format(item.contentSerieName.strip().lower(), item.channel).lower()) if not filetools.exists(path): logger.info( "streamondemand.platformcode.library save_library_tvshow Creando directorio serie:" + path) try: filetools.mkdir(path) except OSError, exception: if exception.errno != errno.EEXIST: raise
def save_library_tvshow(item, episodelist): """ guarda en la libreria de series la serie con todos los capitulos incluidos en la lista episodelist @type item: item @param item: item que representa la serie a guardar @type episodelist: list @param episodelist: listado de items que representan los episodios que se van a guardar. @rtype insertados: int @return: el número de episodios insertados @rtype sobreescritos: int @return: el número de episodios sobreescritos @rtype fallidos: int @return: el número de episodios fallidos o -1 si ha fallado toda la serie """ logger.info() # logger.debug(item.tostring('\n')) path = "" # Si llegados a este punto no tenemos titulo o tmdb_id, salimos if not (item.contentSerieName or item.infoLabels['tmdb_id']) or not item.channel: logger.debug("NO ENCONTRADO contentSerieName NI tmdb_id") return 0, 0, -1 # Salimos sin guardar # TODO configurar para segun el scraper se llame a uno u otro tmdb_return = tmdb.find_and_set_infoLabels_tmdb(item) # Llegados a este punto podemos tener: # tmdb_return = True: Un item con infoLabels con la información actualizada de la serie # tmdb_return = False: Un item sin información de la peli (se ha dado a cancelar en la ventana) # item.infoLabels['code'] == "" : No se ha encontrado el identificador de IMDB necesario para continuar, salimos if not tmdb_return or not item.infoLabels['code']: # TODO de momento si no hay resultado no añadimos nada, # aunq podriamos abrir un cuadro para introducir el identificador/nombre a mano logger.debug("NO ENCONTRADO EN TMDB O NO TIENE IMDB_ID") return 0, 0, -1 _id = item.infoLabels['code'] if item.infoLabels['title']: base_name = item.infoLabels['title'] else: base_name = item.contentSerieName base_name = filetools.text2filename(base_name) for raiz, subcarpetas, ficheros in filetools.walk(TVSHOWS_PATH): for c in subcarpetas: if c.endswith("[%s]" % _id): path = filetools.join(raiz, c) break if not path: path = filetools.join(TVSHOWS_PATH, ("%s [%s]" % (base_name, _id)).strip()) logger.info("Creando directorio serie: " + path) try: filetools.mkdir(path) except OSError, exception: if exception.errno != errno.EEXIST: raise
def save_library_tvshow(item, episodelist): """ guarda en la libreria de series la serie con todos los capitulos incluidos en la lista episodelist @type item: item @param item: item que representa la serie a guardar @type episodelist: list @param episodelist: listado de items que representan los episodios que se van a guardar. @rtype insertados: int @return: el número de episodios insertados @rtype sobreescritos: int @return: el número de episodios sobreescritos @rtype fallidos: int @return: el número de episodios fallidos o -1 si ha fallado toda la serie """ logger.info("streamondemand.platformcode.library save_library_tvshow") # Itentamos obtener el titulo correcto: # 1. contentSerieName: Este deveria ser el sitio correcto # 2. show titulo = item.contentSerieName if not titulo: titulo = item.show # Colocamos el titulo en su sitio para que tmdb lo localize item.contentSerieName = titulo # establecemos "active" para que se actualice cuando se llame a library_service item.active = True # Si llegados a este punto no tenemos titulo, salimos if not item.contentSerieName or not item.channel: return 0, 0, -1 # Salimos sin guardar # TODO configurar para segun el scraper se llame a uno u otro tmdb.find_and_set_infoLabels_tmdb(item, config.get_setting("scrap_ask_name") == "true") path = filetools.join(TVSHOWS_PATH, "{0} [{1}]".format(item.contentSerieName.strip().lower(), item.channel).lower()) if not filetools.exists(path): logger.info("streamondemand.platformcode.library save_library_tvshow Creando directorio serie:" + path) try: filetools.mkdir(path) except OSError, exception: if exception.errno != errno.EEXIST: raise
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 save_download_movie(item): logger.info("contentAction: %s | contentChannel: %s | contentTitle: %s" % (item.contentAction, item.contentChannel, item.contentTitle)) progreso = platformtools.dialog_progress("Descargas", "Obteniendo datos de la pelicula") result = tmdb.find_and_set_infoLabels_tmdb(item) if not result: progreso.close() item.contentType = "video" return save_download_video(item) progreso.update(0, "Añadiendo pelicula...") item.downloadFilename = "%s [%s]" % (item.contentTitle.strip(), item.contentChannel) write_json(item) 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 get_episodes(item): logger.info("pelisalacarta.channels.descargas get_episodes") #El item YA es un episodio, no cal buscar if item.contentType == "episode": episodes = [item.clone()] #El item es uma serie o temporada elif item.contentType in ["tvshow", "season"]: # importamos el canal channel = __import__('channels.%s' % item.contentChannel, None, None, ["channels.%s" % item.contentChannel]) # Obtenemos el listado de episodios episodes = getattr(channel, item.contentAction)(item) itemlist = [] #Tenemos las lista, ahora vamos a comprobar for episode in episodes: #Si partiamos de un item que ya era episodio estos datos ya están bien, no hay que modificarlos if item.contentType != "episode": episode.contentAction = episode.action episode.contentChannel = episode.channel #Si el resultado es una temporada, no nos vale, tenemos que descargar los episodios de cada temporada if episode.contentType == "season": itemlist.extend(get_episodes(episode)) #Si el resultado es un episodio ya es lo que necesitamos, lo preparamos para añadirlo a la descarga if episode.contentType == "episode": episode.infoLabels = item.infoLabels tmdb.find_and_set_infoLabels_tmdb(episode) episode.action = "menu" episode.channel = "descargas" episode.downloadStatus = 0 episode.downloadProgress = 0 episode.downloadSize = 0 episode.downloadCompleted = 0 if episode.text_color: del episode.text_color if episode.text_bold: del episode.text_bold if episode.text_italic: del episode.text_italic season_and_episode = scrapertools.get_season_and_episode( episode.title) if season_and_episode and episode.contentTitle: episode.contentSeason, episode.contentEpisodeNumber = season_and_episode.split( "x") episode.downloadFilename = os.path.join( item.downloadFilename, "%s - %s" % (season_and_episode, episode.contentTitle.strip())) else: episode.contentTitle = re.sub("\[[^\]]+\]|\([^\)]+\)", "", episode.title).strip() episode.downloadFilename = os.path.join( item.downloadFilename, episode.contentTitle) itemlist.append(episode) #Cualquier otro resultado no nos vale, lo ignoramos else: logger.info("Omitiendo item no válido: %s" % episode.tostring()) return itemlist
def save_library_movie(item): """ guarda en la libreria de peliculas el elemento item, con los valores que contiene. @type item: item @param item: elemento que se va a guardar. @rtype insertados: int @return: el número de elementos insertados @rtype sobreescritos: int @return: el número de elementos sobreescritos @rtype fallidos: int @return: el número de elementos fallidos o -1 si ha fallado todo """ logger.info("pelisalacarta.platformcode.library save_library_movie") # logger.debug(item.tostring('\n')) insertados = 0 sobreescritos = 0 fallidos = 0 path = "" # Itentamos obtener el titulo correcto: # 1. contentTitle: Este deberia ser el sitio correcto, ya que title suele contener "Añadir a la biblioteca..." # 2. fulltitle # 3. title if not item.contentTitle: # Colocamos el titulo correcto en su sitio para que tmdb lo localize if item.fulltitle: item.contentTitle = item.fulltitle else: item.contentTitle = item.title # Si llegados a este punto no tenemos titulo, salimos if not item.contentTitle or not item.channel: logger.debug("NO ENCONTRADO contentTitle") return 0, 0, -1 # Salimos sin guardar # TODO configurar para segun el scraper se llamara a uno u otro tmdb_return = tmdb.find_and_set_infoLabels_tmdb(item) # Llegados a este punto podemos tener: # tmdb_return = True: Un item con infoLabels con la información actualizada de la peli # tmdb_return = False: Un item sin información de la peli (se ha dado a cancelar en la ventana) # item.infoLabels['imdb_id'] == "" : No se ha encontrado el identificador de IMDB necesario para continuar, salimos if not tmdb_return or not item.infoLabels['imdb_id']: # TODO de momento si no hay resultado no añadimos nada, # aunq podriamos abrir un cuadro para introducir el identificador/nombre a mano logger.debug("NO ENCONTRADO EN TMDB O NO TIENE IMDB_ID") return 0, 0, -1 _id = item.infoLabels['imdb_id'] # progress dialog p_dialog = platformtools.dialog_progress('pelisalacarta', 'Añadiendo película...') base_name = filetools.text2filename(item.contentTitle) for raiz, subcarpetas, ficheros in filetools.walk(MOVIES_PATH): for c in subcarpetas: if c.endswith("[%s]" % _id): path = filetools.join(raiz, c) break if not path: # Crear carpeta path = filetools.join(MOVIES_PATH, ("%s [%s]" % (base_name, _id)).strip()) logger.info("pelisalacarta.platformcode.library save_library_movie Creando directorio pelicula:" + path) try: filetools.mkdir(path) except OSError, exception: if exception.errno != errno.EEXIST: raise
def save_library_episodes(path, episodelist, serie, silent=False, overwrite=True): """ guarda en la ruta indicada todos los capitulos incluidos en la lista episodelist @type path: str @param path: ruta donde guardar los episodios @type episodelist: list @param episodelist: listado de items que representan los episodios que se van a guardar. @type serie: item @param serie: serie de la que se van a guardar los episodios @type silent: bool @param silent: establece si se muestra la notificación @param overwrite: permite sobreescribir los ficheros existentes @type overwrite: bool @rtype insertados: int @return: el número de episodios insertados @rtype sobreescritos: int @return: el número de episodios sobreescritos @rtype fallidos: int @return: el número de episodios fallidos """ logger.info("pelisalacarta.platformcode.library save_library_episodes") # No hay lista de episodios, no hay nada que guardar if not len(episodelist): logger.info("pelisalacarta.platformcode.library save_library_episodes No hay lista de episodios, " "salimos sin crear strm") return 0, 0, 0 insertados = 0 sobreescritos = 0 fallidos = 0 news_in_playcounts = {} # Silent es para no mostrar progreso (para library_service) if not silent: # progress dialog p_dialog = platformtools.dialog_progress('pelisalacarta', 'Añadiendo episodios...') p_dialog.update(0, 'Añadiendo episodio...') # fix float porque la division se hace mal en python 2.x t = float(100) / len(episodelist) for i, e in enumerate(episodelist): if not silent: p_dialog.update(int(math.ceil((i + 1) * t)), 'Añadiendo episodio...', e.title) # Añade todos menos el que dice "Añadir esta serie..." o "Descargar esta serie..." if e.action == "add_serie_to_library" or e.action == "download_all_episodes": continue try: if e.channel == "descargas": season_episode = scrapertools.get_season_and_episode(e.contentTitle.lower()) else: season_episode = scrapertools.get_season_and_episode(e.title.lower()) e.infoLabels = serie.infoLabels e.contentSeason, e.contentEpisodeNumber = season_episode.split("x") season_episode = "%sx%s" % (e.contentSeason, str(e.contentEpisodeNumber).zfill(2)) except: continue strm_path = filetools.join(path, "%s.strm" % season_episode) if not filetools.exists(strm_path): # Si no existe season_episode.strm añadirlo item_strm = e.clone(action='play_from_library', channel='biblioteca', strm_path=strm_path.replace(TVSHOWS_PATH, ""), infoLabels={}) item_strm.contentSeason = e.contentSeason item_strm.contentEpisodeNumber = e.contentEpisodeNumber item_strm.contentType = e.contentType item_strm.contentTitle = season_episode # si el canal tiene filtro se le pasa el nombre que tiene guardado para que filtre correctamente, if item_strm.list_idiomas: # si viene de library_service se obtiene del fichero tvshow.nfo, propiedad "library_filter_show" if "library_filter_show" in serie: item_strm.library_filter_show = serie.library_filter_show.get(serie.channel, "") # si se ha agregado la serie lo obtenemos del titulo. else: item_strm.library_filter_show = serie.title if item_strm.library_filter_show == "": logger.error("Se ha producido un error al obtener el nombre de la serie a filtrar") # logger.debug("item_strm" + item_strm.tostring('\n')) # logger.debug("serie " + serie.tostring('\n')) filetools.write(strm_path, '%s?%s' % (addon_name, item_strm.tourl())) nfo_path = filetools.join(path, "%s.nfo" % season_episode) item_nfo = None if not filetools.exists(nfo_path) and e.infoLabels.get("tmdb_id"): # Si no existe season_episode.nfo añadirlo tmdb.find_and_set_infoLabels_tmdb(e) item_nfo = e.clone(channel="biblioteca", url="", action='findvideos', strm_path=strm_path.replace(TVSHOWS_PATH, "")) url_scraper = "https://www.themoviedb.org/tv/%s/season/%s/episode/%s\n" % (item_nfo.infoLabels['tmdb_id'], item_nfo.contentSeason, item_nfo.contentEpisodeNumber) filetools.write(nfo_path, url_scraper + item_nfo.tojson()) # Solo si existen season_episode.nfo y season_episode.strm continuamos json_path = filetools.join(path, ("%s [%s].json" % (season_episode, e.channel)).lower()) if filetools.exists(nfo_path) and filetools.exists(strm_path): nuevo = not filetools.exists(json_path) if nuevo or overwrite: # Obtenemos infoLabel del episodio if not item_nfo: item_nfo = Item().fromjson(filetools.read(nfo_path, 1)) e.infoLabels = item_nfo.infoLabels if filetools.write(json_path, e.tojson()): if nuevo: logger.info("pelisalacarta.platformcode.library savelibrary Insertado: %s" % json_path) insertados += 1 # Marcamos episodio como no visto news_in_playcounts[season_episode] = 0 # Marcamos la temporada como no vista news_in_playcounts["season %s" % e.contentSeason] = 0 # Marcamos la serie como no vista # logger.debug("serie " + serie.tostring('\n')) news_in_playcounts[serie.contentTitle] = 0 else: logger.info("pelisalacarta.platformcode.library savelibrary Sobreescrito: %s" % json_path) sobreescritos += 1 else: logger.info("pelisalacarta.platformcode.library savelibrary Fallido: %s" % json_path) fallidos += 1 else: logger.info("pelisalacarta.platformcode.library savelibrary Fallido: %s" % json_path) fallidos += 1 if not silent and p_dialog.iscanceled(): break if not silent: p_dialog.close() if news_in_playcounts: # Si hay nuevos episodios los marcamos como no vistos en tvshow.nfo ... tvshow_path = filetools.join(path, "tvshow.nfo") try: url_scraper = filetools.read(tvshow_path, 0, 1) tvshow_item = Item().fromjson(filetools.read(tvshow_path, 1)) tvshow_item.library_playcounts.update(news_in_playcounts) filetools.write(tvshow_path, url_scraper + tvshow_item.tojson()) except: logger.error("Error al actualizar tvshow.nfo") fallidos = -1 # ... y actualizamos la biblioteca de Kodi if config.is_xbmc(): update(FOLDER_TVSHOWS, filetools.basename(path) + "/") if fallidos == len(episodelist): fallidos = -1 logger.debug("%s [%s]: insertados= %s, sobreescritos= %s, fallidos= %s" % (serie.contentSerieName, serie.channel, insertados, sobreescritos, fallidos)) return insertados, sobreescritos, fallidos
def save_library_movie(item): """ guarda en la libreria de peliculas el elemento item, con los valores que contiene. @type item: item @param item: elemento que se va a guardar. @rtype insertados: int @return: el número de elementos insertados @rtype sobreescritos: int @return: el número de elementos sobreescritos @rtype fallidos: int @return: el número de elementos fallidos o -1 si ha fallado todo """ logger.info("pelisalacarta.platformcode.library save_library_movie") # logger.debug(item.tostring('\n')) insertados = 0 sobreescritos = 0 fallidos = 0 path = "" # Itentamos obtener el titulo correcto: # 1. contentTitle: Este deberia ser el sitio correcto, ya que title suele contener "Añadir a la biblioteca..." # 2. fulltitle # 3. title if not item.contentTitle: # Colocamos el titulo correcto en su sitio para que tmdb lo localize if item.fulltitle: item.contentTitle = item.fulltitle else: item.contentTitle = item.title # Si llegados a este punto no tenemos titulo, salimos if not item.contentTitle or not item.channel: logger.debug("NO ENCONTRADO contentTitle") return 0, 0, -1 # Salimos sin guardar # TODO configurar para segun el scraper se llamara a uno u otro tmdb_return = tmdb.find_and_set_infoLabels_tmdb(item) # Llegados a este punto podemos tener: # tmdb_return = True: Un item con infoLabels con la información actualizada de la peli # tmdb_return = False: Un item sin información de la peli (se ha dado a cancelar en la ventana) # item.infoLabels['imdb_id'] == "" : No se ha encontrado el identificador de IMDB necesario para continuar, salimos if not tmdb_return or not item.infoLabels['imdb_id']: # TODO de momento si no hay resultado no añadimos nada, # aunq podriamos abrir un cuadro para introducir el identificador/nombre a mano logger.debug("NO ENCONTRADO EN TMDB O NO TIENE IMDB_ID") return 0, 0, -1 _id = item.infoLabels['imdb_id'] # progress dialog p_dialog = platformtools.dialog_progress('pelisalacarta', 'Añadiendo película...') base_name = filetools.text2filename(item.contentTitle) for raiz, subcarpetas, ficheros in filetools.walk(MOVIES_PATH): for c in subcarpetas: if c.endswith("[%s]" % _id): path = filetools.join(raiz, c) break if not path: # Crear carpeta path = filetools.join(MOVIES_PATH, ("%s [%s]" % (base_name, _id)).strip()) logger.info( "pelisalacarta.platformcode.library save_library_movie Creando directorio pelicula:" + path) try: filetools.mkdir(path) except OSError, exception: if exception.errno != errno.EEXIST: raise
def save_library_episodes(path, episodelist, serie, silent=False, overwrite=True): """ guarda en la ruta indicada todos los capitulos incluidos en la lista episodelist @type path: str @param path: ruta donde guardar los episodios @type episodelist: list @param episodelist: listado de items que representan los episodios que se van a guardar. @type serie: item @param serie: serie de la que se van a guardar los episodios @type silent: bool @param silent: establece si se muestra la notificación @param overwrite: permite sobreescribir los ficheros existentes @type overwrite: bool @rtype insertados: int @return: el número de episodios insertados @rtype sobreescritos: int @return: el número de episodios sobreescritos @rtype fallidos: int @return: el número de episodios fallidos """ logger.info("pelisalacarta.platformcode.library save_library_episodes") # No hay lista de episodios, no hay nada que guardar if not len(episodelist): logger.info( "pelisalacarta.platformcode.library save_library_episodes No hay lista de episodios, " "salimos sin crear strm") return 0, 0, 0 insertados = 0 sobreescritos = 0 fallidos = 0 news_in_playcounts = {} # Silent es para no mostrar progreso (para library_service) if not silent: # progress dialog p_dialog = platformtools.dialog_progress('pelisalacarta', 'Añadiendo episodios...') p_dialog.update(0, 'Añadiendo episodio...') # fix float porque la division se hace mal en python 2.x t = float(100) / len(episodelist) for i, e in enumerate(episodelist): if not silent: p_dialog.update(int(math.ceil((i + 1) * t)), 'Añadiendo episodio...', e.title) # Añade todos menos el que dice "Añadir esta serie..." o "Descargar esta serie..." if e.action == "add_serie_to_library" or e.action == "download_all_episodes": continue try: if e.channel == "descargas": season_episode = scrapertools.get_season_and_episode( e.contentTitle.lower()) else: season_episode = scrapertools.get_season_and_episode( e.title.lower()) e.infoLabels = serie.infoLabels e.contentSeason, e.contentEpisodeNumber = season_episode.split("x") season_episode = "%sx%s" % (e.contentSeason, str(e.contentEpisodeNumber).zfill(2)) except: continue strm_path = filetools.join(path, "%s.strm" % season_episode) if not filetools.exists(strm_path): # Si no existe season_episode.strm añadirlo item_strm = e.clone(action='play_from_library', channel='biblioteca', strm_path=strm_path.replace(TVSHOWS_PATH, ""), infoLabels={}) item_strm.contentSeason = e.contentSeason item_strm.contentEpisodeNumber = e.contentEpisodeNumber item_strm.contentType = e.contentType item_strm.contentTitle = season_episode # si el canal tiene filtro se le pasa el nombre que tiene guardado para que filtre correctamente, if item_strm.list_idiomas: # si viene de library_service se obtiene del fichero tvshow.nfo, propiedad "library_filter_show" if "library_filter_show" in serie: item_strm.library_filter_show = serie.library_filter_show.get( serie.channel, "") # si se ha agregado la serie lo obtenemos del titulo. else: item_strm.library_filter_show = serie.title if item_strm.library_filter_show == "": logger.error( "Se ha producido un error al obtener el nombre de la serie a filtrar" ) # logger.debug("item_strm" + item_strm.tostring('\n')) # logger.debug("serie " + serie.tostring('\n')) filetools.write(strm_path, '%s?%s' % (addon_name, item_strm.tourl())) nfo_path = filetools.join(path, "%s.nfo" % season_episode) item_nfo = None if not filetools.exists(nfo_path) and e.infoLabels.get("tmdb_id"): # Si no existe season_episode.nfo añadirlo tmdb.find_and_set_infoLabels_tmdb(e) item_nfo = e.clone(channel="biblioteca", url="", action='findvideos', strm_path=strm_path.replace(TVSHOWS_PATH, "")) url_scraper = "https://www.themoviedb.org/tv/%s/season/%s/episode/%s\n" % ( item_nfo.infoLabels['tmdb_id'], item_nfo.contentSeason, item_nfo.contentEpisodeNumber) filetools.write(nfo_path, url_scraper + item_nfo.tojson()) # Solo si existen season_episode.nfo y season_episode.strm continuamos json_path = filetools.join(path, ("%s [%s].json" % (season_episode, e.channel)).lower()) if filetools.exists(nfo_path) and filetools.exists(strm_path): nuevo = not filetools.exists(json_path) if nuevo or overwrite: # Obtenemos infoLabel del episodio if not item_nfo: item_nfo = Item().fromjson(filetools.read(nfo_path, 1)) e.infoLabels = item_nfo.infoLabels if filetools.write(json_path, e.tojson()): if nuevo: logger.info( "pelisalacarta.platformcode.library savelibrary Insertado: %s" % json_path) insertados += 1 # Marcamos episodio como no visto news_in_playcounts[season_episode] = 0 # Marcamos la temporada como no vista news_in_playcounts["season %s" % e.contentSeason] = 0 # Marcamos la serie como no vista # logger.debug("serie " + serie.tostring('\n')) news_in_playcounts[serie.contentTitle] = 0 else: logger.info( "pelisalacarta.platformcode.library savelibrary Sobreescrito: %s" % json_path) sobreescritos += 1 else: logger.info( "pelisalacarta.platformcode.library savelibrary Fallido: %s" % json_path) fallidos += 1 else: logger.info( "pelisalacarta.platformcode.library savelibrary Fallido: %s" % json_path) fallidos += 1 if not silent and p_dialog.iscanceled(): break if not silent: p_dialog.close() if news_in_playcounts: # Si hay nuevos episodios los marcamos como no vistos en tvshow.nfo ... tvshow_path = filetools.join(path, "tvshow.nfo") try: url_scraper = filetools.read(tvshow_path, 0, 1) tvshow_item = Item().fromjson(filetools.read(tvshow_path, 1)) tvshow_item.library_playcounts.update(news_in_playcounts) filetools.write(tvshow_path, url_scraper + tvshow_item.tojson()) except: logger.error("Error al actualizar tvshow.nfo") fallidos = -1 # ... y actualizamos la biblioteca de Kodi if config.is_xbmc(): update(FOLDER_TVSHOWS, filetools.basename(path) + "/") if fallidos == len(episodelist): fallidos = -1 logger.debug("%s [%s]: insertados= %s, sobreescritos= %s, fallidos= %s" % (serie.contentSerieName, serie.channel, insertados, sobreescritos, fallidos)) return insertados, sobreescritos, fallidos
def save_library_tvshow(item, episodelist): """ guarda en la libreria de series la serie con todos los capitulos incluidos en la lista episodelist @type item: item @param item: item que representa la serie a guardar @type episodelist: list @param episodelist: listado de items que representan los episodios que se van a guardar. @rtype insertados: int @return: el número de episodios insertados @rtype sobreescritos: int @return: el número de episodios sobreescritos @rtype fallidos: int @return: el número de episodios fallidos o -1 si ha fallado toda la serie """ logger.info("pelisalacarta.platformcode.library save_library_tvshow") # logger.debug(item.tostring('\n')) path = "" ''''# Itentamos obtener el titulo correcto: # 1. contentSerieName: Este deberia ser el sitio correcto # 2. show if not item.contentSerieName: # Colocamos el titulo en su sitio para que tmdb lo localize item.contentSerieName = item.show''' # Si llegados a este punto no tenemos titulo o tmdb_id, salimos if not (item.contentSerieName or item.infoLabels['tmdb_id']) or not item.channel: logger.debug("NO ENCONTRADO contentSerieName NI tmdb_id") return 0, 0, -1 # Salimos sin guardar # TODO configurar para segun el scraper se llame a uno u otro tmdb_return = tmdb.find_and_set_infoLabels_tmdb(item) # Llegados a este punto podemos tener: # tmdb_return = True: Un item con infoLabels con la información actualizada de la serie # tmdb_return = False: Un item sin información de la peli (se ha dado a cancelar en la ventana) # item.infoLabels['imdb_id'] == "" : No se ha encontrado el identificador de IMDB necesario para continuar, salimos if not tmdb_return or not item.infoLabels['imdb_id']: # TODO de momento si no hay resultado no añadimos nada, # aunq podriamos abrir un cuadro para introducir el identificador/nombre a mano logger.debug("NO ENCONTRADO EN TMDB O NO TIENE IMDB_ID") return 0, 0, -1 _id = item.infoLabels['imdb_id'] if item.infoLabels['title']: base_name = item.infoLabels['title'] else: base_name = item.contentSerieName base_name = filetools.text2filename(base_name) for raiz, subcarpetas, ficheros in filetools.walk(TVSHOWS_PATH): for c in subcarpetas: if c.endswith("[%s]" % _id): path = filetools.join(raiz, c) break if not path: path = filetools.join(TVSHOWS_PATH, ("%s [%s]" % (base_name, _id)).strip()) logger.info("Creando directorio serie: " + path) try: filetools.mkdir(path) except OSError, exception: if exception.errno != errno.EEXIST: raise
def save_library_episodes(path, episodelist, serie, silent=False): """ guarda en la ruta indicada todos los capitulos incluidos en la lista episodelist @type path: str @param path: ruta donde guardar los episodios @type episodelist: list @param episodelist: listado de items que representan los episodios que se van a guardar. @type serie: item @param serie: serie de la que se van a guardar los episodios @type silent: bool @param silent: establece si se muestra la notificación @rtype insertados: int @return: el número de episodios insertados @rtype sobreescritos: int @return: el número de episodios sobreescritos @rtype fallidos: int @return: el número de episodios fallidos """ logger.info("streamondemand.platformcode.library save_library_episodes") # No hay lista de episodios, no hay nada que guardar if not len(episodelist): logger.info("streamondemand.platformcode.library save_library_episodes No hay lista de episodios, " "salimos sin crear strm") return 0, 0, 0 insertados = 0 sobreescritos = 0 fallidos = 0 # Silent es para no mostrar progreso (para library_service) if not silent: # progress dialog p_dialog = platformtools.dialog_progress('streamondemand', 'Aggiunta episodi...') p_dialog.update(0, 'Aggiunta episodio...') # fix float porque la division se hace mal en python 2.x t = float(100) / len(episodelist) addon_name = sys.argv[0].strip() if not addon_name or addon_name.startswith("default.py"): addon_name = "plugin://plugin.video.streamondemand/" for i, e in enumerate(episodelist): if not silent: p_dialog.update(int(math.ceil((i + 1) * t)), 'Aggiunta episodio...', e.title) # Añade todos menos el que dice "Añadir esta serie..." o "Descargar esta serie..." if e.action == "add_serie_to_library" or e.action == "download_all_episodes": continue season_episode = scrapertools.get_season_and_episode(e.title.lower()) e.infoLabels = serie.infoLabels e.contentSeason, e.contentEpisodeNumber = season_episode.split("x") filename = "{0}.strm".format(season_episode) fullfilename = filetools.join(path, filename) nuevo = not filetools.exists(fullfilename) if e.infoLabels.get("tmdb_id"): tmdb.find_and_set_infoLabels_tmdb(e, config.get_setting("scrap_ask_name") == "true") e.strm = True # Para depuración creamos un .json al lado del .strm, para poder visualizar que parametros se estan guardando filetools.write(fullfilename + ".json", e.tojson()) # TODO fix temporal, en algunas ocasiones no se reproduce desde la biblioteca de kodi si tiene valor # por ejemplo serie doctor who, en seriesblanco e.infoLabels['tmdb_id'] = "" if filetools.write(fullfilename, '{addon}?{url}'.format(addon=addon_name, url=e.tourl())): if nuevo: insertados += 1 else: sobreescritos += 1 else: fallidos += 1 if not silent and p_dialog.iscanceled(): break if not silent: p_dialog.close() # si se han añadido episodios los actualizamos en la biblioteca de Kodi con la serie if fallidos >= 0: # TODO arreglar el porque hay que poner la ruta special ruta = "special://home/userdata/addon_data/plugin.video.streamondemand/library/SERIES/" + \ "{0} [{1}]".format(serie.contentSerieName.strip().lower(), serie.channel).lower() + "/" update(ruta) logger.debug("insertados= {0}, sobreescritos={1}, fallidos={2}".format(insertados, sobreescritos, fallidos)) return insertados, sobreescritos, fallidos
def save_library_movie(item): """ guarda en la libreria de peliculas el elemento item, con los valores que contiene. @type item: item @param item: elemento que se va a guardar. @rtype insertados: int @return: el número de elementos insertados @rtype sobreescritos: int @return: el número de elementos sobreescritos @rtype fallidos: int @return: el número de elementos fallidos o -1 si ha fallado todo """ logger.info("streamondemand.platformcode.library savelibrary_movie") insertados = 0 sobreescritos = 0 fallidos = 0 logger.debug(item.tostring('\n')) # Itentamos obtener el titulo correcto: # 1. contentTitle: Este deveria ser el sitio correcto # 2. fulltitle # 3. title titulo = item.contentTitle if not titulo: titulo = item.fulltitle if not titulo: titulo = item.title # Colocamos el titulo en su sitio para que tmdb lo localize item.contentTitle = titulo # Si llegados a este punto no tenemos titulo, salimos if not item.contentTitle or not item.channel: return 0, 0, -1 # Salimos sin guardar # TODO configurar para segun el scraper se llamara a uno u otro tmdb.find_and_set_infoLabels_tmdb(item, config.get_setting("scrap_ask_name") == "true") # Llegados a este punto podemos tener: # Un item con infoLabels con la información actualizada de la peli # Un item sin información de la peli (se ha dado a cancelar en la ventana) # progress dialog p_dialog = platformtools.dialog_progress('streamondemand', 'Aggiunta film...') filename = "{0} [{1}].strm".format(item.fulltitle.strip().lower(), item.channel) logger.debug(filename) fullfilename = filetools.join(MOVIES_PATH, filename) addon_name = sys.argv[0].strip() if not addon_name or addon_name.startswith("default.py"): addon_name = "plugin://plugin.video.streamondemand/" if filetools.exists(fullfilename): logger.info("streamondemand.platformcode.library savelibrary el fichero existe. Se sobreescribe") sobreescritos += 1 else: insertados += 1 p_dialog.update(100, 'Añadiendo película...', item.contentTitle) p_dialog.close() item.strm = True # Para depuración creamos un .json al lado del .strm, para poder visualizar que parametros se estan guardando filetools.write(fullfilename + ".json", item.tojson()) if filetools.write(fullfilename, '{addon}?{url}'.format(addon=addon_name, url=item.tourl())): if 'tmdb_id' in item.infoLabels: create_nfo_file(item.infoLabels['tmdb_id'], fullfilename[:-5], "cine") else: if filetools.exists(fullfilename[:-5] + ".nfo"): filetools.remove(fullfilename[:-5] + ".nfo") # actualizamos la biblioteca de Kodi con la pelicula # TODO arreglar el porque hay que poner la ruta special ruta = "special://home/userdata/addon_data/plugin.video.streamondemand/library/CINE/" update(ruta) return insertados, sobreescritos, fallidos else: return 0, 0, 1