»\s?(.*?)\s?«<\/a>' matches = re.compile(patron, re.DOTALL).findall(data) else: matches = item.emergency_urls[2][0] #Guardamos los matches de Directos, si los hay del item.emergency_urls[2][0] #Una vez tratado lo limpiamos data = 'xyz123' #iniciamos data para que no dé problemas if item.videolibray_emergency_urls: #Si esyamos añadiendo a Videoteca... item.emergency_urls[2].append(matches) #Salvamos este matches if not data or not matches: logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / PATRON: " + patron + " / URL: " + item_local.url + " / DATA: " + data) continue #si no hay más datos, algo no funciona, pasamos a Ver Online #logger.debug(patron) #logger.debug(matches) #logger.debug(data) for scrapedtorrent, scrapedtitle in matches: if item.videolibray_emergency_urls: item.emergency_urls[0].append(host + scrapedtorrent) else: item_local = item_local.clone() quality = item_local.quality qualityscraped = '' if not item_local.contentEpisodeNumber and item_local.contentType == 'episode': item_local.contentEpisodeNumber = 0 #Si son episodios múltiples, los listamos con sus títulos if len(matches) > 1 or len(itemlist_alt) > 1: if item_local.contentType == 'episode' or item_local.contentType == 'season': if scrapertools.find_single_match(scrapedtitle, '(\d+[x|X]\d+(?:-\d{1,2})?)'): qualityscraped = '%s' % scrapertools.find_single_match(scrapedtitle, '(\d+[x|X]\d+(?:-\d{1,2})?)') if scrapertools.find_single_match(scrapedtitle, '\d+[x|X](\d+)'): item_local.contentEpisodeNumber = int(scrapertools.find_single_match(scrapedtitle, '\d+[x|X](\d+)')) elif scrapertools.find_single_match(scrapedtitle, '[c|C]ap.*?(\d+)'): item_local.contentEpisodeNumber = int(scrapertools.find_single_match(scrapedtitle, '[c|C]ap.*?(\d+)')) elif scrapertools.find_single_match(scrapedtorrent, '[s|S]\d{1,2}[e|E](\d{1,2})'): item_local.contentEpisodeNumber = int(scrapertools.find_single_match(scrapedtorrent, '[s|S]\d{1,2}[e|E](\d{1,2})')) if not qualityscraped: qualityscraped = '%sx%s' % (str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2)) else: qualityscraped = '%s' % scrapedtitle #Si todavía no sabemos el num de Episodio, lo buscamos if not item_local.contentEpisodeNumber and item_local.contentType == 'episode': try: if scrapertools.find_single_match(scrapedtitle, '(\d+)[x|X](\d+)'): item_local.contentSeason, item_local.contentEpisodeNumber = scrapertools.find_single_match(scrapedtitle, '(\d+)[x|X](\d+)') qualityscraped = '%sx%s' % (str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2)) except: pass #Buscamos calidades if scrapertools.find_single_match(scrapedtitle, '(\d+p)'): qualityscraped += ' ' + scrapertools.find_single_match(scrapedtitle, '(\d+p)') if qualityscraped: quality = '[%s] %s' % (qualityscraped, item_local.quality) #Ahora pintamos el link del Torrent item_local.url = host + scrapedtorrent if item.emergency_urls and not item.videolibray_emergency_urls: item_local.torrent_alt = item.emergency_urls[0][0] #Guardamos la url del .Torrent ALTERNATIVA if item.armagedon: item_local.url = item.emergency_urls[0][0] #... ponemos la emergencia como primaria del item.emergency_urls[0][0] #Una vez tratado lo limpiamos size = '' if not item.armagedon: size = generictools.get_torrent_size(item_local.url) #Buscamos el tamaño en el .torrent if size: quality += ' [%s]' % size if item.armagedon: #Si es catastrófico, lo marcamos quality = '[/COLOR][COLOR hotpink][E] [COLOR limegreen]%s' % quality item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (quality, str(item_local.language)) #Preparamos título y calidad, quitamos etiquetas vacías item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title) item_local.title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.title) item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip() quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', quality) quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', quality) quality = quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip() item_local.alive = "??" #Calidad del link sin verificar item_local.action = "play" #Visualizar vídeo item_local.server = "torrent" #Seridor Torrent itemlist_t.append(item_local.clone(quality=quality)) #Pintar pantalla, si no se filtran idiomas # Requerido para FilterTools if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra item_local.quality = quality #Calidad itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío #logger.debug("TORRENT: " + scrapedtorrent + " / title gen/torr: " + item.title + " / " + item_local.title + " / calidad: " + item_local.quality + " / tamaño: " + scrapedsize + " / content: " + item_local.contentTitle + " / " + item_local.contentSerieName) #logger.debug(item_local) if not item.videolibray_emergency_urls: if len(itemlist_f) > 0: #Si hay entradas filtradas... itemlist_alt.extend(itemlist_f) #Pintamos pantalla filtrada else: if config.get_setting('filter_languages', channel) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... thumb_separador = get_thumb("next.png") #... pintamos todo con aviso itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) itemlist_alt.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado #Si son múltiples episodios, ordenamos if len(itemlist_alt) > 1 and (item.contentType == 'episode' or item.contentType == 'season'): itemlist_alt = sorted(itemlist_alt, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber))) #clasificamos tmdb.set_infoLabels(itemlist_alt, True) #TMDB de la lista de episodios itemlist.extend(itemlist_alt) #Ahora tratamos los servidores directo itemlist_alt = [] itemlist_t = [] #Itemlist total de enlaces itemlist_f = [] #Itemlist de enlaces filtrados if matches_directo: for scrapedurl, scrapedquality, scrapedlang in matches_directo: #leemos los torrents con la diferentes calidades #Generamos una copia de Item para trabajar sobre ella item_local = item.clone() item_local.url = scrapedurl #Guardamos la url intermedia item_local.quality = '' if scrapedquality: item_local.quality = scrapedquality if not item_local.quality: item_local.quality = item.quality elif scrapertools.find_single_match(item.quality, '(\[\d+:\d+ h\])'): #Salvamos la duración item_local.quality += ' [/COLOR][COLOR white]%s' % scrapertools.find_single_match(item.quality, '(\[\d+:\d+ h\])') #Copiamos duración if scrapedlang in IDIOMAS: item_local.language = ["%s" % IDIOMAS[scrapedlang]] #Salvamos el idioma, si lo hay #Leemos la página con el enlace al Servidor data = '' if not item.armagedon: try: data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item_local.url, timeout=timeout).data) except: pass patron = '
1 or len(itemlist_alt) > 1) and not servidor in scrapedtitle: if not capitulo and (item_local.contentType == 'episode' or item_local.contentType == 'season'): if scrapertools.find_single_match(scrapedtitle, '(\d+[x|X]\d+(?:-\d{1,2})?)'): qualityscraped = '%s' % scrapertools.find_single_match(scrapedtitle, '(\d+[x|X]\d+(?:-\d{1,2})?)') if scrapertools.find_single_match(scrapedtitle, '\d+[x|X](\d+)'): item_local.contentEpisodeNumber = int(scrapertools.find_single_match(scrapedtitle, '\d+[x|X](\d+)')) elif scrapertools.find_single_match(scrapedtitle, '[c|C]ap.*?(\d+)'): item_local.contentEpisodeNumber = int(scrapertools.find_single_match(scrapedtitle, '[c|C]ap.*?(\d+)')) elif scrapertools.find_single_match(scrapedtorrent, '[s|S]\d{1,2}[e|E](\d{1,2})'): item_local.contentEpisodeNumber = int(scrapertools.find_single_match(scrapedtorrent, '[s|S]\d{1,2}[e|E](\d{1,2})')) if not qualityscraped: qualityscraped = '%sx%s' % (str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2)) elif capitulo: if scrapertools.find_single_match(capitulo, '\d+[x|X](\d+)'): item_local.contentEpisodeNumber = int(scrapertools.find_single_match(scrapedtitle, '\d+[x|X](\d+)')) qualityscraped = '%s' % capitulo else: qualityscraped = '%s' % scrapedtitle #Si todavía no sabemos el num de Episodio, lo buscamos if not item_local.contentEpisodeNumber and item_local.contentType == 'episode': try: if scrapertools.find_single_match(scrapedtitle, '(\d+)[x|X](\d+)'): item_local.contentSeason, item_local.contentEpisodeNumber = scrapertools.find_single_match(scrapedtitle, '(\d+)[x|X](\d+)') qualityscraped = '%sx%s' % (str(item_local.contentSeason), str(item_local.contentEpisodeNumber).zfill(2)) except: pass #Buscamos calidades if scrapertools.find_single_match(scrapedenlace, '(\d+p)'): qualityscraped += ' ' + scrapertools.find_single_match(scrapedenlace, '(\d+p)') if qualityscraped: quality = '[%s] %s' % (qualityscraped, item_local.quality) if scrapertools.find_single_match(item.url, '(\d+x\d+.*?\d+x\d+)') and not capitulo and not qualityscraped: quality = '[%s] %s' % (scrapertools.find_single_match(scrapedenlace, '(\d+x\d+)'), quality) elif capitulo and not qualityscraped: quality = '[%s] %s' % (capitulo, quality) if item.armagedon: #Si es catastrófico, lo marcamos quality = '[/COLOR][COLOR hotpink][E] [COLOR limegreen]%s' % quality #Verificamos el si el enlace del servidor está activo mostrar_server = True if config.get_setting("hidepremium"): #Si no se aceptan servidore premium, se ignoran mostrar_server = servertools.is_server_enabled(servidor) try: #Obtenemos el enlace if mostrar_server: devuelve = servertools.findvideosbyserver(scrapedenlace, servidor) #existe el link ? if devuelve: enlace = devuelve[0][1] #Se guarda el link if not enlace: continue item_local.alive = servertools.check_video_link(enlace, servidor, timeout=timeout) #activo el link ? #Si el link no está activo se ignora if "??" in item_local.alive: #dudoso item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][%s][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (servidor.capitalize(), quality, str(item_local.language)) elif "no" in item_local.alive.lower(): #No está activo. Lo preparo, pero no lo pinto item_local.title = '[COLOR red][%s][/COLOR] [COLOR yellow][%s][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.alive, servidor.capitalize(), quality, str(item_local.language)) logger.debug(item_local.alive + ": ALIVE / " + servidor + " / " + enlace) raise else: #Sí está activo item_local.title = '[COLOR yellow][%s][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (servidor.capitalize(), quality, str(item_local.language)) #Ahora pintamos el link Directo item_local.url = enlace #Preparamos título y calidad, quitamos etiquetas vacías item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', item_local.title) item_local.title = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', item_local.title) item_local.title = item_local.title.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip() quality = re.sub(r'\s?\[COLOR \w+\]\[\[?\s?\]?\]\[\/COLOR\]', '', quality) quality = re.sub(r'\s?\[COLOR \w+\]\s?\[\/COLOR\]', '', quality) quality = quality.replace("--", "").replace("[]", "").replace("()", "").replace("(/)", "").replace("[/]", "").strip() item_local.action = "play" #Visualizar vídeo item_local.server = servidor #Servidor Directo itemlist_t.append(item_local.clone(quality=quality)) #Pintar pantalla, si no se filtran idiomas # Requerido para FilterTools if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra item_local.quality = quality #Calidad itemlist_f = filtertools.get_link(itemlist_f, item_local, list_language) #Pintar pantalla, si no está vacío except: logger.error('ERROR al procesar enlaces DIRECTOS: ' + servidor + ' / ' + scrapedenlace) #logger.debug("DIRECTO: " + scrapedenlace + " / title gen/torr: " + item.title + " / " + item_local.title + " / calidad: " + item_local.quality + " / tamaño: " + scrapedsize + " / content: " + item_local.contentTitle + " / " + item_local.contentSerieName) #logger.debug(item_local) if item.videolibray_emergency_urls: #Si estamos cargados emergency_urls, no vamos return item if len(itemlist_f) > 0: #Si hay entradas filtradas... itemlist_alt.extend(itemlist_f) #Pintamos pantalla filtrada else: if config.get_setting('filter_languages', channel) > 0 and len(itemlist_t) > 0: #Si no hay entradas filtradas ... thumb_separador = get_thumb("next.png") #... pintamos todo con aviso itemlist.append(Item(channel=item.channel, url=host, title="[COLOR red][B]NO hay elementos con el idioma seleccionado[/B][/COLOR]", thumbnail=thumb_separador)) itemlist_alt.extend(itemlist_t) #Pintar pantalla con todo si no hay filtrado #Si son múltiples episodios, ordenamos if len(itemlist_alt) > 1 and (item.contentType == 'episode' or item.contentType == 'season'): itemlist_alt = sorted(itemlist_alt, key=lambda it: (int(it.contentSeason), int(it.contentEpisodeNumber))) #clasificamos tmdb.set_infoLabels(itemlist_alt, True) #TMDB de la lista de episodios itemlist.extend(itemlist_alt) # Requerido para AutoPlay autoplay.start(itemlist, item) #Lanzamos Autoplay return itemlist def episodios(item): logger.info() itemlist = [] #logger.debug(item) curr_page = 1 # Página inicial last_page = 99999 # Última página inicial if item.curr_page: curr_page = int(item.curr_page) # Si viene de una pasada anterior, lo usamos del item.curr_page # ... y lo borramos if item.last_page: last_page = int(item.last_page) # Si viene de una pasada anterior, lo usamos del item.last_page # ... y lo borramos url_item = item.url.replace('1-.fx', '%s-.fx').replace('-1.fx', '-%s.fx') 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 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) while curr_page <= last_page: # Descarga la página data = '' url = url_item % curr_page #Inserto en num de página en la url try: data = re.sub(r"\n|\r|\t|\s{2}|()| ", "", httptools.downloadpage(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')) break #Pintamos lo que tenemos curr_page += 1 #Apunto ya a la página siguiente #Usamos el mismo patrón que en listado patron = '