def episodios(item): logger.info() itemlist = [] item.category = categoria #logger.debug(item) if item.from_title: item.title = item.from_title item.extra2 = 'xyz' del item.extra2 #Limpiamos num. Temporada y Episodio que ha podido quedar por Novedades season_display = 0 if item.contentSeason: if item.season_colapse: #Si viene del menú de Temporadas... season_display = item.contentSeason #... salvamos el num de sesión a pintar item.from_num_season_colapse = season_display del item.season_colapse item.contentType = "tvshow" if item.from_title_season_colapse: item.title = item.from_title_season_colapse del item.from_title_season_colapse if item.infoLabels['title']: del item.infoLabels['title'] del item.infoLabels['season'] if item.contentEpisodeNumber: del item.infoLabels['episode'] if season_display == 0 and item.from_num_season_colapse: season_display = item.from_num_season_colapse # Obtener la información actualizada de la Serie. TMDB es imprescindible para Videoteca if not item.infoLabels['tmdb_id']: tmdb.set_infoLabels(item, True) # Descarga la página data = '' #Inserto en num de página en la url try: data = httptools.downloadpage(item.url, timeout=timeout).data data = unicode(data, "utf-8", errors="replace").encode("utf-8") except: #Algún error de proceso, salimos pass if not data: logger.error( "ERROR 01: EPISODIOS: La Web no responde o la URL es erronea" + item.url) itemlist.append( item.clone( action='', title=item.channel.capitalize() + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log' )) return itemlist #Buscamos los episodios matches = jsontools.load(data) if not matches: #error item = generictools.web_intervenida( item, data) #Verificamos que no haya sido clausurada if item.intervencion: #Sí ha sido clausurada judicialmente item, itemlist = generictools.post_tmdb_episodios( item, itemlist) #Llamamos al método para el pintado del error return itemlist #Salimos logger.error( "ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web: " + data) itemlist.append( item.clone( action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log' )) return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos #logger.debug(matches) # Recorremos todos los episodios generando un Item local por cada uno en Itemlist for temporada in matches.get("temporadas", []): if season_display > 0 and temporada.get( "numerotemporada", 0) != season_display: #si no es nuestra temp., pasamos continue #Si hay más de una temporada, solo las enumeramos if len(matches.get("temporadas", [])) > 1 and item.season_colapse: item_local = item.clone() #creo una copia de Item item_local.action = "findvideos" #y lo preparo para la reproducción item_local.contentType = "episode" item_local.extra = "episodios" item_local.contentSeason = temporada.get( "numerotemporada", 1) #Guardo el num. de temporada item_local.contentEpisodeNumber = 1 #relleno el num. de episodio por compatibilidad itemlist.append(item_local.clone()) #lo pinto continue #Paso a la siguiente temporada #Aquí tratamos todos los episodios de una temporada season = temporada.get("numerotemporada", 1) for episodio in temporada.get("capituls", []): item_local = item.clone() #creo una copia de Item item_local.action = "findvideos" #y lo preparo para la reproducción item_local.contentType = "episode" item_local.extra = "episodios" if item_local.library_playcounts: del item_local.library_playcounts if item_local.library_urls: del item_local.library_urls if item_local.path: del item_local.path if item_local.update_last: del item_local.update_last if item_local.update_next: del item_local.update_next if item_local.channel_host: del item_local.channel_host if item_local.active: del item_local.active if item_local.contentTitle: del item_local.infoLabels['title'] if item_local.season_colapse: del item_local.season_colapse if item_local.tmdb_stat: del item_local.tmdb_stat item_local.title = '' item_local.context = "['buscar_trailer']" title = episodio.get("nomcapitul", "") #título del episodio info_epi = episodio.get("infocapitul", "") #información adicional del episodio item_local.language = [] item_local.url = [] if episodio.get("links", {}).get("magnet"): #buscamos los magnets activos url = episodio.get("links", {}).get("magnet") #salvamos el magnet quality = episodio.get("links", {}).get( "calitat", "") #salvamos la calidad del magnet item_local.url += [(url, quality) ] #guardamos todo como url para findvideos item_local.quality = quality.strip( ) #agregamos a la calidad del título if not item_local.language: item_local.language += ['CAST'] #Castellano por defecto #Buscamos la Temporada y el Episodio try: item_local.contentSeason = int( season) #Copiamos el num. de Temporada except: item_local.contentSeason = 1 #Si hay error, lo dejamos en 1 try: item_local.contentEpisodeNumber = int( episodio.get("numerocapitul", 1)) #Copiamos el num. de Episodio except: item_local.contentEpisodeNumber = 1 #Si hay error, lo dejamos en 1 if 'miniserie' in title.lower( ): #Si es una Miniserie, lo ajustamos if not item_local.contentSeason: item_local.contentSeason = 1 title = title.replace('miniserie', '').replace('MiniSerie', '') #Si son episodios múltiples, lo extraemos patron1 = '\d+[x|X]\d{1,2}.?(?:y|Y|al|Al)?.?(?:(?:\d+[x|X])?(\d{1,2}))?' epi_rango = scrapertools.find_single_match(info_epi, patron1) if epi_rango: item_local.infoLabels['episodio_titulo'] = 'al %s ' % epi_rango item_local.title = '%sx%s al %s -' % ( str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2), str(epi_rango).zfill(2)) else: item_local.title = '%sx%s -' % ( str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2)) item.infoLabels['episodio_titulo'] = '%s' % title itemlist.append(item_local.clone()) #logger.debug(item_local) if len(itemlist) > 1: itemlist = sorted(itemlist, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber) )) #clasificamos if item.season_colapse and not item.add_videolibrary: #Si viene de listado, mostramos solo Temporadas item, itemlist = generictools.post_tmdb_seasons(item, itemlist) if not item.season_colapse: #Si no es pantalla de Temporadas, pintamos todo # Pasada por TMDB y clasificación de lista por temporada y episodio tmdb.set_infoLabels(itemlist, True) #Llamamos al método para el maquillaje de los títulos obtenidos desde TMDB item, itemlist = generictools.post_tmdb_episodios(item, itemlist) #logger.debug(item) return itemlist
def episodios(item): logger.info() itemlist = [] item.category = categoria #logger.debug(item) if item.from_title: item.title = item.from_title if item.subtitle: del item.subtitle #Limpiamos num. Temporada y Episodio que ha podido quedar por Novedades season_display = 0 if item.contentSeason: if item.season_colapse: #Si viene del menú de Temporadas... season_display = item.contentSeason #... salvamos el num de sesión a pintar item.from_num_season_colapse = season_display del item.season_colapse item.contentType = "tvshow" if item.from_title_season_colapse: item.title = item.from_title_season_colapse del item.from_title_season_colapse if item.infoLabels['title']: del item.infoLabels['title'] del item.infoLabels['season'] if item.contentEpisodeNumber: del item.infoLabels['episode'] if season_display == 0 and item.from_num_season_colapse: season_display = item.from_num_season_colapse # Obtener la información actualizada de la Serie. TMDB es imprescindible para Videoteca if not item.infoLabels['tmdb_id']: tmdb.set_infoLabels(item, True) modo_ultima_temp_alt = modo_ultima_temp if item.ow_force == "1": #Si hay un traspaso de canal o url, se actualiza todo modo_ultima_temp_alt = False max_temp = 1 if item.infoLabels['number_of_seasons']: max_temp = item.infoLabels['number_of_seasons'] y = [] if modo_ultima_temp_alt and item.library_playcounts: #Averiguar cuantas temporadas hay en Videoteca patron = 'season (\d+)' matches = re.compile(patron, re.DOTALL).findall(str(item.library_playcounts)) for x in matches: y += [int(x)] max_temp = max(y) # Descarga la página data = '' #Inserto en num de página en la url try: data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)| ", "", httptools.downloadpage(item.url, timeout=timeout).data) #data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8") except: #Algún error de proceso, salimos pass if not data: logger.error( "ERROR 01: EPISODIOS: La Web no responde o la URL es erronea" + item.url) itemlist.append( item.clone( action='', title=item.channel.capitalize() + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log' )) return itemlist patron = '<td class="capitulonombre"><img src="([^"]+)[^>]+>(?:<a href="[^>]+>)(.*?)<\/a><\/td><td class="capitulodescarga"><a href="([^"]+)[^>]+>.*?(?:<td class="capitulofecha">.*?(\d{4})?.*?<\/td>)?(?:<td class="capitulosubtitulo"><a href="([^"]+)[^>]+>.*?<\/td>)?<td class="capitulodescarga"><\/tr>' matches = re.compile(patron, re.DOTALL).findall(data) if not matches: #error item = generictools.web_intervenida( item, data) #Verificamos que no haya sido clausurada if item.intervencion: #Sí ha sido clausurada judicialmente item, itemlist = generictools.post_tmdb_episodios( item, itemlist) #Llamamos al método para el pintado del error return itemlist #Salimos logger.error( "ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data) itemlist.append( item.clone( action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log' )) return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos #logger.debug("PATRON: " + patron) #logger.debug(matches) #logger.debug(data) season = max_temp #Comprobamos si realmente sabemos el num. máximo de temporadas if item.library_playcounts or (item.infoLabels['number_of_seasons'] and item.tmdb_stat): num_temporadas_flag = True else: num_temporadas_flag = False # Recorremos todos los episodios generando un Item local por cada uno en Itemlist for scrapedlanguage, scrapedtitle, scrapedurl, year, scrapedsubtitle in matches: item_local = item.clone() item_local.action = "findvideos" item_local.contentType = "episode" item_local.extra = "episodios" if item_local.library_playcounts: del item_local.library_playcounts if item_local.library_urls: del item_local.library_urls if item_local.path: del item_local.path if item_local.update_last: del item_local.update_last if item_local.update_next: del item_local.update_next if item_local.channel_host: del item_local.channel_host if item_local.active: del item_local.active if item_local.contentTitle: del item_local.infoLabels['title'] if item_local.season_colapse: del item_local.season_colapse item_local.title = '' item_local.context = "['buscar_trailer']" item_local.url = scrapedurl.replace('&', '&').replace( '.io/', sufix).replace('.com/', sufix) if scrapedsubtitle: item_local.subtitle = scrapedsubtitle.replace( '&', '&').replace('.io/', sufix).replace('.com/', sufix) title = scrapedtitle item_local.language = [] if "1.png" in scrapedlanguage: item_local.language += ['CAST'] if "512.png" in scrapedlanguage or 'latino' in title.lower(): item_local.language += ['LAT'] if ("1.png" not in scrapedlanguage and "512.png" not in scrapedlanguage ) or "eng" in title.lower() or "sub" in title.lower(): item_local.language += ['VOSE'] try: item_local.contentEpisodeNumber = 0 if 'miniserie' in title.lower(): item_local.contentSeason = 1 title = title.replace('miniserie', '').replace('MiniSerie', '') elif 'completa' in title.lower(): patron = '[t|T].*?(\d+) [c|C]ompleta' if scrapertools.find_single_match(title, patron): item_local.contentSeason = int( scrapertools.find_single_match(title, patron)) if not item_local.contentSeason: #Extraemos los episodios patron = '(\d{1,2})[x|X](\d{1,2})' item_local.contentSeason, item_local.contentEpisodeNumber = scrapertools.find_single_match( title, patron) item_local.contentSeason = int(item_local.contentSeason) item_local.contentEpisodeNumber = int( item_local.contentEpisodeNumber) except: logger.error('ERROR al extraer Temporada/Episodio: ' + title) item_local.contentSeason = 1 item_local.contentEpisodeNumber = 0 #Si son eisodios múltiples, lo extraemos patron1 = '\d+[x|X]\d{1,2}.?(?:y|Y|al|Al)?(?:\d+[x|X]\d{1,2})?.?(?:y|Y|al|Al)?.?\d+[x|X](\d{1,2})' epi_rango = scrapertools.find_single_match(title, patron1) if epi_rango: item_local.infoLabels['episodio_titulo'] = 'al %s' % epi_rango item_local.title = '%sx%s al %s -' % (str( item_local.contentSeason), str( item_local.contentEpisodeNumber).zfill(2), str(epi_rango).zfill(2)) else: item_local.title = '%sx%s -' % (str( item_local.contentSeason), str( item_local.contentEpisodeNumber).zfill(2)) if modo_ultima_temp_alt and item.library_playcounts: #Si solo se actualiza la última temporada de Videoteca if item_local.contentSeason < max_temp: break #Sale del bucle actual del FOR if season_display > 0: if item_local.contentSeason > season_display: continue elif item_local.contentSeason < season_display: break itemlist.append(item_local.clone()) #logger.debug(item_local) if len(itemlist) > 1: itemlist = sorted(itemlist, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber) )) #clasificamos if item.season_colapse and not item.add_videolibrary: #Si viene de listado, mostramos solo Temporadas item, itemlist = generictools.post_tmdb_seasons(item, itemlist) if not item.season_colapse: #Si no es pantalla de Temporadas, pintamos todo # Pasada por TMDB y clasificación de lista por temporada y episodio tmdb.set_infoLabels(itemlist, True) #Llamamos al método para el maquillaje de los títulos obtenidos desde TMDB item, itemlist = generictools.post_tmdb_episodios(item, itemlist) #logger.debug(item) return itemlist
def episodios(item): logger.info() itemlist = [] item.category = categoria #logger.debug(item) if item.from_title: item.title = item.from_title #Limpiamos num. Temporada y Episodio que ha podido quedar por Novedades season_display = 0 if item.contentSeason: if item.season_colapse: #Si viene del menú de Temporadas... season_display = item.contentSeason #... salvamos el num de sesión a pintar item.from_num_season_colapse = season_display del item.season_colapse item.contentType = "tvshow" if item.from_title_season_colapse: item.title = item.from_title_season_colapse del item.from_title_season_colapse if item.infoLabels['title']: del item.infoLabels['title'] del item.infoLabels['season'] if item.contentEpisodeNumber: del item.infoLabels['episode'] if season_display == 0 and item.from_num_season_colapse: season_display = item.from_num_season_colapse # Obtener la información actualizada de la Serie. TMDB es imprescindible para Videoteca try: tmdb.set_infoLabels(item, True, idioma_busqueda='es,en') except: pass modo_ultima_temp_alt = modo_ultima_temp if item.ow_force == "1": #Si hay un traspaso de canal o url, se actualiza todo modo_ultima_temp_alt = False max_temp = 1 if item.infoLabels['number_of_seasons']: max_temp = item.infoLabels['number_of_seasons'] y = [] if modo_ultima_temp_alt and item.library_playcounts: #Averiguar cuantas temporadas hay en Videoteca patron = 'season (\d+)' matches = re.compile(patron, re.DOTALL).findall(str(item.library_playcounts)) for x in matches: y += [int(x)] max_temp = max(y) # Descarga la página data = '' #Inserto en num de página en la url try: data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)| ", "", httptools.downloadpage(item.url, timeout=timeout).data) data = unicode(data, "utf-8", errors="replace").encode("utf-8") except: #Algún error de proceso, salimos pass if not data: logger.error( "ERROR 01: EPISODIOS: La Web no responde o la URL es erronea" + item.url) itemlist.append( item.clone( action='', title=item.channel.capitalize() + ': ERROR 01: EPISODIOS:. La Web no responde o la URL es erronea. Si la Web está activa, reportar el error con el log' )) return itemlist status, itemlist = check_blocked_IP( data, itemlist) #Comprobamos si la IP ha sido bloqueada if status: return itemlist #IP bloqueada #Capturamos las temporadas de episodios dentro de la serie patron_temp = '<h1\s*class="[^"]+">Season\s*(\d+)<\/h1><div class="tvcontent"><div id="[^"]+"><\/div>(.*?<\/div><\/div>)(?:<script>.*?<\/script>)?<\/div>' temp_serie = re.compile(patron_temp, re.DOTALL).findall(data) for season_num, temporada in temp_serie: patron = '<div id="episode_(\d+)"><div class="[^"]+">\s*<a onclick="[^"]+"\s*class="[^"]+"><div class="[^"]+">.*?\s*(\d+)<\/div>\s*(.*?)\s*<' matches = re.compile(patron, re.DOTALL).findall(temporada) if not matches: #error item = generictools.web_intervenida( item, data) #Verificamos que no haya sido clausurada if item.intervencion: #Sí ha sido clausurada judicialmente item, itemlist = generictools.post_tmdb_episodios( item, itemlist) #Llamamos al método para el pintado del error return itemlist #Salimos logger.error( "ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / DATA: " + data) itemlist.append( item.clone( action='', title=item.channel.capitalize() + ': ERROR 02: EPISODIOS: Ha cambiado la estructura de la Web. Reportar el error con el log' )) return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos #logger.debug("PATRON: " + patron) #logger.debug(matches) #logger.debug(data) season = max_temp #Comprobamos si realmente sabemos el num. máximo de temporadas if item.library_playcounts or (item.infoLabels['number_of_seasons'] and item.tmdb_stat): num_temporadas_flag = True else: num_temporadas_flag = False if modo_ultima_temp_alt and item.library_playcounts: #Si solo se actualiza la última temporada de Videoteca if int(season_num) < max_temp: break #Sale del bucle actual del FOR # Recorremos todos los episodios generando un Item local por cada uno en Itemlist for epi_id, episode_num, scrapedtitle in matches: item_local = item.clone() item_local.action = "findvideos" item_local.contentType = "episode" item_local.extra = "episodios" if item_local.library_playcounts: del item_local.library_playcounts if item_local.library_urls: del item_local.library_urls if item_local.path: del item_local.path if item_local.update_last: del item_local.update_last if item_local.update_next: del item_local.update_next if item_local.channel_host: del item_local.channel_host if item_local.active: del item_local.active if item_local.contentTitle: del item_local.infoLabels['title'] if item_local.season_colapse: del item_local.season_colapse item_local.title = '' item_local.context = "['buscar_trailer']" item_local.url = urlparse.urljoin( host, 'tv.php?ajax=1&tvepisode=%s' % epi_id) title = scrapedtitle item_local.language = ['VO'] if not item_local.infoLabels['poster_path']: item_local.thumbnail = item_local.infoLabels['thumbnail'] epi_rango = False try: item_local.contentSeason = int(season_num) if 'season pack' in title.lower(): item_local.contentEpisodeNumber = 1 epi_rango = True else: item_local.contentEpisodeNumber = int(episode_num) except: logger.error('ERROR al extraer Temporada/Episodio: ' + title) item_local.contentSeason = 1 item_local.contentEpisodeNumber = 0 #Si son episodios múltiples, lo extraemos if epi_rango: item_local.infoLabels['episodio_titulo'] = 'al 99' item_local.title = '%sx%s al 99 - Season Pack' % ( str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2)) else: item_local.title = '%sx%s - ' % ( str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2)) if season_display > 0: if item_local.contentSeason > season_display: continue elif item_local.contentSeason < season_display: break itemlist.append(item_local.clone()) #logger.debug(item_local) if len(itemlist) > 1: itemlist = sorted(itemlist, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber) )) #clasificamos if item.season_colapse and not item.add_videolibrary: #Si viene de listado, mostramos solo Temporadas item, itemlist = generictools.post_tmdb_seasons(item, itemlist) if not item.season_colapse: #Si no es pantalla de Temporadas, pintamos todo # Pasada por TMDB y clasificación de lista por temporada y episodio tmdb.set_infoLabels(itemlist, True, idioma_busqueda='es,en') #Llamamos al método para el maquillaje de los títulos obtenidos desde TMDB item, itemlist = generictools.post_tmdb_episodios(item, itemlist) #logger.debug(item) return itemlist
def episodios(item): logger.info() itemlist = [] item.category = categoria #logger.debug(item) if item.from_title: item.title = item.from_title #Limpiamos num. Temporada y Episodio que ha podido quedar por Novedades season_display = 0 if item.contentSeason: if item.season_colapse: #Si viene del menú de Temporadas... season_display = item.contentSeason #... salvamos el num de sesión a pintar item.from_num_season_colapse = season_display del item.season_colapse item.contentType = "tvshow" if item.from_title_season_colapse: item.title = item.from_title_season_colapse del item.from_title_season_colapse if item.infoLabels['title']: del item.infoLabels['title'] del item.infoLabels['season'] if item.contentEpisodeNumber: del item.infoLabels['episode'] if season_display == 0 and item.from_num_season_colapse: season_display = item.from_num_season_colapse # Obtener la información actualizada de la Serie. TMDB es imprescindible para Videoteca try: tmdb.set_infoLabels(item, True, idioma_busqueda='es,en') except: pass modo_ultima_temp_alt = modo_ultima_temp if item.ow_force == "1": #Si hay una migración de canal o url, se actualiza todo modo_ultima_temp_alt = False # Vemos la última temporada de TMDB y del .nfo max_temp = 1 if item.infoLabels['number_of_seasons']: max_temp = item.infoLabels['number_of_seasons'] y = [] if modo_ultima_temp_alt and item.library_playcounts: #Averiguar cuantas temporadas hay en Videoteca patron = 'season (\d+)' matches = re.compile(patron, re.DOTALL).findall(str(item.library_playcounts)) for x in matches: y += [int(x)] max_temp = max(y) # Si la series tiene solo una temporada, o se lista solo una temporada, guardamos la url y seguimos normalmente list_temp = [] list_temp.append(item.url) # Descarga las páginas for url in list_temp: # Recorre todas las temporadas encontradas data, success, code, item, itemlist = generictools.downloadpage(url, timeout=timeout, s2=False, item=item, itemlist=itemlist) # Descargamos la página #Verificamos si se ha cargado una página, y si además tiene la estructura correcta if not success: # Si ERROR o lista de errores ... return itemlist # ... Salimos patron = '<tr>(?:\s*<td>[^<]+<\/td>)?\s*<td>([^<]+)<\/td>\s*<td>([^<]+)<\/td>\s*' patron += '<td\s*class=[^<]+<\/td>(?:<td>([^<]+)<\/td>)?\s*<td\s*class=[^<]+<\/td>\s*' patron += '<td>\s*<a\s*class="[^"]+"\s*(?:data-row="[^"]+"\s*data-post="[^"]+"\s*)?' patron += 'href="([^"]+)"\s*(?:data-season="([^"]+)"\s*data-serie="([^"]+)")?' matches = re.compile(patron, re.DOTALL).findall(data) #logger.debug("PATRON: " + patron) #logger.debug(matches) #logger.debug(data) # Recorremos todos los episodios generando un Item local por cada uno en Itemlist x = 0 for scrapedquality, scrapedlanguage, scrapedsize, scrapedurl, season_num, episode_num in matches: item_local = item.clone() item_local.action = "findvideos" item_local.contentType = "episode" if item_local.library_playcounts: del item_local.library_playcounts if item_local.library_urls: del item_local.library_urls if item_local.path: del item_local.path if item_local.update_last: del item_local.update_last if item_local.update_next: del item_local.update_next if item_local.channel_host: del item_local.channel_host if item_local.active: del item_local.active if item_local.contentTitle: del item_local.infoLabels['title'] if item_local.season_colapse: del item_local.season_colapse item_local.url = url # Usamos las url de la temporada, no hay de episodio item_local.matches = [] item_local.matches.append(matches[x]) # Salvado Matches de cada episodio x += 1 item_local.context = "['buscar_trailer']" if not item_local.infoLabels['poster_path']: item_local.thumbnail = item_local.infoLabels['thumbnail'] # Extraemos números de temporada y episodio try: item_local.contentSeason = int(season_num) except: item_local.contentSeason = 1 try: item_local.contentEpisodeNumber = int(episode_num) except: item_local.contentEpisodeNumber = 0 item_local.title = '%sx%s - ' % (str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2)) # Procesamos Calidad if scrapedquality: item_local.quality = scrapertools.remove_htmltags(scrapedquality) # iniciamos calidad if '[720p]' in scrapedquality.lower() or '720p' in scrapedquality.lower(): item_local.quality = '720p' if '[1080p]' in scrapedquality.lower() or '1080p' in scrapedquality.lower(): item_local.quality = '1080p' if '4k' in scrapedquality.lower(): item_local.quality = '4K' if '3d' in scrapedquality.lower() and not '3d' in item_local.quality.lower(): item_local.quality += ', 3D' if not item_local.quality: item_local.quality = '720p' # Comprobamos si hay más de un enlace por episodio, entonces los agrupamos if len(itemlist) > 0 and item_local.contentSeason == itemlist[-1].contentSeason \ and item_local.contentEpisodeNumber == itemlist[-1].contentEpisodeNumber \ and itemlist[-1].contentEpisodeNumber != 0: # solo guardamos un episodio ... if itemlist[-1].quality: if item_local.quality not in itemlist[-1].quality: itemlist[-1].quality += ", " + item_local.quality # ... pero acumulamos las calidades else: itemlist[-1].quality = item_local.quality itemlist[-1].matches.append(item_local.matches[0]) # Salvado Matches en el episodio anterior continue # ignoramos el episodio duplicado if season_display > 0: # Son de la temporada estos episodios? if item_local.contentSeason > season_display: break elif item_local.contentSeason < season_display: continue if modo_ultima_temp_alt and item.library_playcounts: # Si solo se actualiza la última temporada de Videoteca if item_local.contentSeason < max_temp: continue # Sale del bucle actual del FOR itemlist.append(item_local.clone()) #logger.debug(item_local) if len(itemlist) > 1: itemlist = sorted(itemlist, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber))) #clasificamos if item.season_colapse and not item.add_videolibrary: #Si viene de listado, mostramos solo Temporadas item, itemlist = generictools.post_tmdb_seasons(item, itemlist) if not item.season_colapse: #Si no es pantalla de Temporadas, pintamos todo # Pasada por TMDB y clasificación de lista por temporada y episodio tmdb.set_infoLabels(itemlist, True, idioma_busqueda='es,en') #Llamamos al método para el maquillaje de los títulos obtenidos desde TMDB item, itemlist = generictools.post_tmdb_episodios(item, itemlist) #logger.debug(item) return itemlist