»\s?(.*?)\s?«<\/a>' - matches = re.compile(patron, re.DOTALL).findall(data) + 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 = '
»\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 + 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: - 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) + 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 - size = generictools.get_torrent_size(item_local.url) #Buscamos el tamaño en el .torrent - if size: - quality += ' [%s]' % size - 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 + #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 - # Requerido para FilterTools - if config.get_setting('filter_languages', channel) > 0: #Si hay idioma seleccionado, se filtra - 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 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) + #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 + 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 @@ -861,13 +906,22 @@ def findvideos(item): item_local.language = ["%s" % IDIOMAS[scrapedlang]] #Salvamos el idioma, si lo hay #Leemos la página con el enlace al Servidor - try: - data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item_local.url, timeout=timeout).data) - except: - pass - - patron = '
)", "", 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 not item.videolibray_emergency_urls: + item_local = item_local.clone() + + enlace = '' + devuelve = '' + mostrar_server = '' + capitulo = '' + + servidor = scrapedtitle.strip() + servidor = servidor.replace("streamin", "streaminto") + if not servidor or "Capituo" in servidor or "Capitulo" in servidor or scrapertools.find_single_match(servidor, '(\d+[x|X]\d+)'): + capitulo = scrapertools.find_single_match(servidor, '(\d+[x|X]\d+)') + servidor = scrapertools.find_single_match(scrapedenlace, ':\/\/(.*?)\.') + 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) 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 + #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 - 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)) + #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() - #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 #Seridor 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 - 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) + 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) + #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 @@ -997,11 +1058,11 @@ def findvideos(item): #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 + 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 + autoplay.start(itemlist, item) #Lanzamos Autoplay return itemlist diff --git a/plugin.video.alfa/channels/grantorrent.py b/plugin.video.alfa/channels/grantorrent.py index 47e1b781..6214ef38 100644 --- a/plugin.video.alfa/channels/grantorrent.py +++ b/plugin.video.alfa/channels/grantorrent.py @@ -428,15 +428,17 @@ def findvideos(item): #logger.debug(item) timeout_find = timeout + follow_redirects=True if item.videolibray_emergency_urls: #Si se están cacheando enlaces aumentamos el timeout timeout_find = timeout * 2 elif item.emergency_urls: #Si se llama desde la Videoteca con enlaces cacheados... timeout_find = timeout / 2 #reducimos el timeout antes de saltar a los enlaces cacheados + follow_redirects=False #Bajamos los datos de la página data = '' try: - data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, timeout=timeout_find).data) + data = re.sub(r"\n|\r|\t|\s{2,}", "", httptools.downloadpage(item.url, timeout=timeout_find, follow_redirects=follow_redirects).data) except: pass @@ -633,6 +635,8 @@ def episodios(item): temp_next = '' item.extra = "episodios" + #logger.debug(item) + # Obtener la información actualizada de la Serie. TMDB es imprescindible para Videoteca if not item.infoLabels['tmdb_id']: tmdb.set_infoLabels(item, True) @@ -716,6 +720,8 @@ def episodios(item): if item.ow_force == '1': #Si viene formazado la reconstrucción de la serie, lo hacemo item.contentType = "tvshow" + if not modo_ultima_temp: #Si se quiere actualiar toda la serie en vez de la última temporada... + item.contentType = "tvshow" temp_lista = [] temp_bucle = 0 diff --git a/plugin.video.alfa/core/httptools.py b/plugin.video.alfa/core/httptools.py index b097ec6b..fe149f3c 100644 --- a/plugin.video.alfa/core/httptools.py +++ b/plugin.video.alfa/core/httptools.py @@ -267,11 +267,19 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr if response["headers"].get('content-encoding') == 'gzip': logger.info("Descomprimiendo...") + data_alt = response["data"] try: response["data"] = gzip.GzipFile(fileobj=StringIO(response["data"])).read() logger.info("Descomprimido") except: - logger.info("No se ha podido descomprimir") + logger.info("No se ha podido descomprimir con gzip. Intentando con zlib") + response["data"] = data_alt + try: + import zlib + response["data"] = zlib.decompressobj(16 + zlib.MAX_WBITS).decompress(response["data"]) + except: + logger.info("No se ha podido descomprimir con zlib") + response["data"] = data_alt # Anti Cloudflare if bypass_cloudflare and count_retries < 5: diff --git a/plugin.video.alfa/lib/generictools.py b/plugin.video.alfa/lib/generictools.py index 9cca522d..5647fb0d 100644 --- a/plugin.video.alfa/lib/generictools.py +++ b/plugin.video.alfa/lib/generictools.py @@ -14,6 +14,7 @@ import urllib import urlparse import datetime import time +import traceback from channelselector import get_thumb from core import httptools @@ -183,7 +184,7 @@ def update_title(item): rating_new = round(rating_new, 1) item.title = item.title.replace("[" + str(rating_old) + "]", "[" + str(rating_new) + "]") except: - pass + logger.error(traceback.format_exc()) if item.wanted: #Actualizamos Wanted, si existe item.wanted = item.contentTitle if new_item.contentSeason: #Restauramos el núm. de Temporada después de TMDB @@ -236,7 +237,7 @@ def refresh_screen(item): xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, xlistitem) #Preparamos el entorno para evitar error Kod1 18 time.sleep(1) #Dejamos tiempo para que se ejecute except: - pass + logger.error(traceback.format_exc()) platformtools.itemlist_update(item) #refrescamos la pantalla con el nuevo Item @@ -329,7 +330,7 @@ def post_tmdb_listado(item, itemlist): if rating == 0.0: rating = '' except: - pass + logger.error(traceback.format_exc()) __modo_grafico__ = config.get_setting('modo_grafico', item.channel) @@ -346,7 +347,7 @@ def post_tmdb_listado(item, itemlist): try: tmdb.set_infoLabels(item_local, __modo_grafico__) #pasamos otra vez por TMDB except: - pass + logger.error(traceback.format_exc()) logger.error(item_local) # Si TMDB no ha encontrado nada y hemos usado el año de la web, lo intentamos sin año @@ -357,7 +358,7 @@ def post_tmdb_listado(item, itemlist): try: tmdb.set_infoLabels(item_local, __modo_grafico__) #pasamos otra vez por TMDB except: - pass + logger.error(traceback.format_exc()) if not item_local.infoLabels['tmdb_id']: #ha tenido éxito? item_local.infoLabels['year'] = year #no, restauramos el año y lo dejamos ya @@ -539,7 +540,7 @@ def post_tmdb_seasons(item, itemlist): try: tmdb.set_infoLabels(item, True) #TMDB de cada Temp except: - pass + logger.error(traceback.format_exc()) item_season = item.clone() if item_season.season_colapse: #Quitamos el indicador de listado por Temporadas @@ -554,7 +555,7 @@ def post_tmdb_seasons(item, itemlist): rating = float(item_season.infoLabels['rating']) rating = round(rating, 1) except: - pass + logger.error(traceback.format_exc()) if rating and rating == 0.0: rating = '' @@ -586,7 +587,7 @@ def post_tmdb_seasons(item, itemlist): try: tmdb.set_infoLabels(item_local, True) #TMDB de cada Temp except: - pass + logger.error(traceback.format_exc()) if item_local.infoLabels['temporada_air_date']: #Fecha de emisión de la Temp item_local.title += ' [%s]' % str(scrapertools.find_single_match(str(item_local.infoLabels['temporada_air_date']), r'\/(\d{4})')) @@ -597,7 +598,7 @@ def post_tmdb_seasons(item, itemlist): # rating = float(item_local.infoLabels['rating']) # rating = round(rating, 1) # except: - # pass + # logger.error(traceback.format_exc()) #if rating and rating > 0.0: # item_local.title += ' [%s]' % str(rating) @@ -813,6 +814,7 @@ def post_tmdb_episodios(item, itemlist): num_episodios = item_local.infoLabels['temporada_num_episodios'] except: num_episodios = 0 + logger.error(traceback.format_exc()) #Preparamos el Rating del vídeo rating = '' @@ -823,7 +825,7 @@ def post_tmdb_episodios(item, itemlist): if rating == 0.0: rating = '' except: - pass + logger.error(traceback.format_exc()) # Si TMDB no ha encontrado el vídeo limpiamos el año if item_local.infoLabels['year'] == "-": @@ -883,7 +885,7 @@ def post_tmdb_episodios(item, itemlist): try: num_episodios_lista[item_local.contentSeason] = num_episodios except: - pass + logger.error(traceback.format_exc()) #logger.debug("title: " + item_local.title + " / url: " + item_local.url + " / calidad: " + item_local.quality + " / Season: " + str(item_local.contentSeason) + " / EpisodeNumber: " + str(item_local.contentEpisodeNumber) + " / num_episodios_lista: " + str(num_episodios_lista) + str(num_episodios_flag)) #logger.debug(item_local) @@ -900,6 +902,7 @@ def post_tmdb_episodios(item, itemlist): item_local.infoLabels['temporada_num_episodios'] = int(num_episodios_lista[item_local.contentSeason]) except: logger.error("ERROR 07: EPISODIOS: Num de Temporada fuera de rango " + " / TEMPORADA: " + str(item_local.contentSeason) + " / " + str(item_local.contentEpisodeNumber) + " / MAX_TEMPORADAS: " + str(num_temporada_max) + " / LISTA_TEMPORADAS: " + str(num_episodios_lista)) + logger.error(traceback.format_exc()) #Permitimos la actualización de los títulos, bien para uso inmediato, o para añadir a la videoteca itemlist.append(item.clone(title="** [COLOR yelow]Actualizar Títulos - vista previa videoteca[/COLOR] **", action="actualizar_titulos", tmdb_stat=False, from_action=item.action, from_title_tmdb=item.title, from_update=True)) @@ -938,6 +941,7 @@ def post_tmdb_episodios(item, itemlist): videolibrarytools.save_tvshow(item, itemlist_fake) #Se actualiza el .nfo except: logger.error("ERROR 08: EPISODIOS: No se ha podido actualizar la URL a la nueva Temporada") + logger.error(traceback.format_exc()) itemlist.append(item.clone(title="[COLOR yellow]Añadir esta Serie a Videoteca-[/COLOR]" + title, action="add_serie_to_library")) elif modo_serie_temp == 1: #si es Serie damos la opción de guardar la última temporada o la serie completa @@ -1006,6 +1010,7 @@ def post_tmdb_findvideos(item, itemlist): item.unify = config.get_setting("unify") except: item.unify = config.get_setting("unify") + logger.error(traceback.format_exc()) if item.contentSeason_save: #Restauramos el num. de Temporada item.contentSeason = item.contentSeason_save @@ -1027,7 +1032,7 @@ def post_tmdb_findvideos(item, itemlist): try: tmdb.set_infoLabels(item, True) #TMDB de cada Temp except: - pass + logger.error(traceback.format_exc()) #Restauramos la información de max num. de episodios por temporada despues de TMDB try: if item.infoLabels['temporada_num_episodios']: @@ -1036,7 +1041,7 @@ def post_tmdb_findvideos(item, itemlist): else: item.infoLabels['temporada_num_episodios'] = num_episodios except: - pass + logger.error(traceback.format_exc()) #Ajustamos el nombre de la categoría if item.channel == channel_py: @@ -1068,7 +1073,7 @@ def post_tmdb_findvideos(item, itemlist): if rating == 0.0: rating = '' except: - pass + logger.error(traceback.format_exc()) if item.quality.lower() in ['gb', 'mb']: item.quality = item.quality.replace('GB', 'G B').replace('Gb', 'G b').replace('MB', 'M B').replace('Mb', 'M b') @@ -1085,6 +1090,7 @@ def post_tmdb_findvideos(item, itemlist): tiempo = item.infoLabels['duration'] except: tiempo = item.infoLabels['duration'] + logger.error(traceback.format_exc()) elif item.contentChannel == 'videolibrary': #No hay, viene de la Videoteca? buscamos en la DB #Leo de la BD de Kodi la duración de la película o episodio. En "from_fields" se pueden poner las columnas que se quiera @@ -1095,7 +1101,7 @@ def post_tmdb_findvideos(item, itemlist): else: nun_records, records = get_field_from_kodi_DB(item, from_fields='c09') #Leo de la BD de Kodi la duración del episodio except: - pass + logger.error(traceback.format_exc()) if nun_records > 0: #Hay registros? #Es un array, busco el campo del registro: añadir en el FOR un fieldX por nueva columna for strFileName, field1 in records: @@ -1111,7 +1117,7 @@ def post_tmdb_findvideos(item, itemlist): if not scrapertools.find_single_match(item.quality, '(\[\d+:\d+)'): #si ya tiene la duración, pasamos item.quality += ' [/COLOR][COLOR white][%s:%s h]' % (str(horas).zfill(2), str(resto).zfill(2)) #Lo agrego a Calidad del Servidor except: - pass + logger.error(traceback.format_exc()) #Ajustamos el nombre de la categoría if item.channel != channel_py: @@ -1193,8 +1199,9 @@ def post_tmdb_findvideos(item, itemlist): return (item, itemlist) -def get_torrent_size(url): +def get_torrent_size(url, data_torrent=False): logger.info() + from core import videolibrarytools """ @@ -1203,9 +1210,11 @@ def get_torrent_size(url): Calcula el tamaño de los archivos que contienen un .torrent. Descarga el archivo .torrent en una carpeta, lo lee y descodifica. Si contiene múltiples archivos, suma el tamaño de todos ellos - Llamada: generictools.get_torrent_size(url) + Llamada: generictools.get_torrent_size(url, data_torrent=False) Entrada: url: url del archivo .torrent + Entrada: data_torrent: Flag por si se quiere el contenido del .torretn de vuelta Salida: size: str con el tamaño y tipo de medida ( MB, GB, etc) + Salida: torrent: dict() con el contenido del .torrent (opcional) """ @@ -1271,6 +1280,7 @@ def get_torrent_size(url): #Móludo principal size = "" + torrent = '' try: #torrents_path = config.get_videolibrary_path() + '/torrents' #path para dejar el .torrent @@ -1281,25 +1291,12 @@ def get_torrent_size(url): #urllib.urlretrieve(url, torrents_path + "/generictools.torrent") #desacargamos el .torrent a la carpeta #torrent_file = open(torrents_path + "/generictools.torrent", "rb").read() #leemos el .torrent - response = httptools.downloadpage(url, timeout=2) #Descargamos el .torrent - if not response.sucess: - size = '' - return size #Si hay un error, devolvemos el "size" vacío - torrent_file = response.data + torrents_path, torrent_file = videolibrarytools.caching_torrents(url, timeout=2, lookup=True, data_torrent=True) + if not torrent_file: + if data_torrent: + return (size, torrent) + return size #Si hay un error, devolvemos el "size" y "torrent" vacíos - if "used CloudFlare" in torrent_file: #Si tiene CloudFlare, usamos este proceso - #try: - # urllib.urlretrieve("http://anonymouse.org/cgi-bin/anon-www.cgi/" + url.strip(), - # torrents_path + "/generictools.torrent") - # torrent_file = open(torrents_path + "/generictools.torrent", "rb").read() - #except: - # torrent_file = "" - response = httptools.downloadpage("http://anonymouse.org/cgi-bin/anon-www.cgi/" + url.strip()) - if not response.sucess: - size = '' - return size #Si hay un error, devolvemos el "size" vacío - torrent_file = response.data - torrent = decode(torrent_file) #decodificamos el .torrent #si sólo tiene un archivo, tomamos la longitud y la convertimos a una unidad legible, si no dará error @@ -1311,20 +1308,27 @@ def get_torrent_size(url): #si tiene múltiples archivos sumamos la longitud de todos if not size: - check_video = scrapertools.find_multiple_matches(str(torrent["info"]["files"]), "'length': (\d+).*?}") - sizet = sum([int(i) for i in check_video]) - size = convert_size(sizet) + try: + check_video = scrapertools.find_multiple_matches(str(torrent["info"]["files"]), "'length': (\d+).*?}") + sizet = sum([int(i) for i in check_video]) + size = convert_size(sizet) + except: + pass except: logger.error('ERROR al buscar el tamaño de un .Torrent: ' + str(url)) + logger.error(traceback.format_exc()) #try: # os.remove(torrents_path + "/generictools.torrent") #borramos el .torrent #except: # pass - #logger.debug(str(url) + ' / ' + str(size)) + #logger.debug(str(url)) + logger.info(str(size)) + if data_torrent: + return (size, torrent) return size @@ -1401,7 +1405,7 @@ def get_field_from_kodi_DB(item, from_fields='*', files='file'): if nun_records == 0: #hay error? logger.error("Error en la SQL: " + sql + ": 0 registros") #No estará catalogada o hay un error en el SQL except: - pass + logger.error(traceback.format_exc()) return (nun_records, records) @@ -1455,7 +1459,7 @@ def fail_over_newpct1(item, patron, patron2=None, timeout=None): verify_torrent, patron1, patron_alt = patron.split('|') #Si es así, los separamos y los tratamos patron = patron1 except: - pass + logger.error(traceback.format_exc()) #Array con los datos de los canales alternativos #Cargamos en .json del canal para ver las listas de valores en settings @@ -1530,6 +1534,7 @@ def fail_over_newpct1(item, patron, patron2=None, timeout=None): url_alt += [scrapertools.find_single_match(item.url, 'http.*?\/temporada-\d+.*?\/capitulo.?-\d+.*?\/')] except: logger.error("ERROR 88: " + item.action + ": Error al convertir la url: " + item.url) + logger.error(traceback.format_exc()) logger.debug('URLs convertidas: ' + str(url_alt)) if patron == True: #solo nos han pedido verificar el clone @@ -1545,6 +1550,7 @@ def fail_over_newpct1(item, patron, patron2=None, timeout=None): data_comillas = data.replace("'", "\"") except: data = '' + logger.error(traceback.format_exc()) if not data: #no ha habido suerte, probamos con la siguiente url logger.error("ERROR 01: " + item.action + ": La Web no responde o la URL es erronea: " + url) continue @@ -1700,6 +1706,7 @@ def web_intervenida(item, data, desactivar=True): json.dump(json_data, outfile, sort_keys = True, indent = 2, ensure_ascii = False) except: logger.error("ERROR 98 al salvar el archivo: %s" % channel_path) + logger.error(traceback.format_exc()) #logger.debug(item) @@ -1764,10 +1771,11 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F delete_stat = 0 canal_org_des_list = [] json_path_list = [] + emergency_urls_force = False - if item.ow_force == '1': #Ha podido qudar activado de una pasada anteriores - del item.ow_force - logger.error('** item.ow_force: ' + item.path) #aviso que ha habido una incidencia + #if item.ow_force == '1': #Ha podido qudar activado de una pasada anteriores + # del item.ow_force + # logger.error('** item.ow_force: ' + item.path) #aviso que ha habido una incidencia if it.ow_force == '1': #Ha podido qudar activado de una pasada anteriores del it.ow_force if path and it.contentType != 'movies': @@ -1777,6 +1785,7 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F logger.error('** .nfo ACTUALIZADO: it.ow_force: ' + nfo) #aviso que ha habido una incidencia except: logger.error('** .nfo ERROR actualizar: it.ow_force: ' + nfo) #aviso que ha habido una incidencia + logger.error(traceback.format_exc()) #Array con los datos de los canales alternativos #Cargamos en .json de Newpct1 para ver las listas de valores en settings @@ -1819,46 +1828,72 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F if it.emergency_urls: item.emergency_urls = it.emergency_urls #Refrescar desde el .nfo + verify_cached_torrents() #TEMPORAL: verificamos si los .torrents son correctos + try: #Si ha habido errores, vemos la lista y los reparamos + json_error_path = filetools.join(config.get_runtime_path(), 'error_cached_torrents.json') + if filetools.exists(json_error_path): #hay erroer que hay que reparar? + from core import jsontools + json_error_file = jsontools.load(filetools.read(json_error_path)) #Leemos la lista de errores + if not json_error_file: + filetools.remove(json_error_path) #si ya no quedan errores, borramos el .json + elif path in json_error_file: #está este títu,o en la lista de errores? + json_error_file.pop(path) #sí. Lo quitamos + if not json_error_file: + filetools.remove(json_error_path) #si ya no quedan errores, borramos el .json + else: + filetools.write(json_error_path, jsontools.dump(json_error_file)) #si quedan, actualizamos el .json + if item.contentType == 'movie': #si es una pelicula, forzamos su actualización + emergency_urls_force = True + else: #si es una serie, que regenere los episodios que faltan (en error) + item.ow_force = '1' #... de todas las temporadas + except: + logger.error('Error en el proceso de REPARACION de vídeos con .torrents dañados') + logger.error(traceback.format_exc()) + #Arreglo temporal para Newpct1 - if channel in fail_over_list or channel_alt == 'videolibrary': - channel_bis = channel_py - if not item.url and it.library_urls and channel_alt == 'videolibrary': - for canal_vid, url_vid in it.library_urls.items(): #Se recorre "item.library_urls" para buscar canales candidatos + try: + if channel in fail_over_list or channel_alt == 'videolibrary': + channel_bis = channel_py + if not item.url and it.library_urls and channel_alt == 'videolibrary': + for canal_vid, url_vid in it.library_urls.items(): #Se recorre "item.library_urls" para buscar canales candidatos + canal_vid_alt = "'%s'" % canal_vid + if canal_vid_alt in fail_over_list: #Se busca si es un clone de newpct1 + channel_bis = channel_py + channel_alt = canal_vid + channel = "'%s'" % channel_alt + break + else: + channel_bis = canal_vid + if channel_bis == channel_py and config.get_setting("emergency_urls", channel_bis) == 1 and config.get_setting("emergency_urls_torrents", channel_bis) and item.emergency_urls and item.emergency_urls.get(channel_alt, False): + raiz, carpetas_series, ficheros = filetools.walk(path).next() + objetivo = '[%s]_01.torrent' % channel_alt + encontrado = False + for fichero in ficheros: + if objetivo in fichero: + encontrado = True + break + if not encontrado: + logger.error('REGENERANDO: ' + str(item.emergency_urls)) + item.emergency_urls.pop(channel_alt, None) + + if item.url: #Viene de actualización de videoteca de series + #Analizamos si el canal ya tiene las urls de emergencia: guardar o borrar + if (config.get_setting("emergency_urls", item.channel) == 1 and (not item.emergency_urls or (item.emergency_urls and not item.emergency_urls.get(channel_alt, False)))) or (config.get_setting("emergency_urls", item.channel) == 2 and item.emergency_urls.get(channel_alt, False)) or config.get_setting("emergency_urls", item.channel) == 3 or emergency_urls_force: + intervencion += ", ('1', '%s', '%s', '', '', '', '', '', '', '', '*', '%s', 'emerg')" % (channel_alt, channel_alt, config.get_setting("emergency_urls", item.channel)) + + elif it.library_urls: #Viene de "listar peliculas´" + for canal_vid, url_vid in it.library_urls.items(): #Se recorre "item.library_urls" para buscar canales candidatos canal_vid_alt = "'%s'" % canal_vid - if canal_vid_alt in fail_over_list: #Se busca si es un clone de newpct1 + if canal_vid_alt in fail_over_list: #Se busca si es un clone de newpct1 channel_bis = channel_py - channel_alt = canal_vid - channel = "'%s'" % channel_alt - break else: channel_bis = canal_vid - if channel_bis == channel_py and config.get_setting("emergency_urls", channel_bis) == 1 and config.get_setting("emergency_urls_torrents", channel_bis) and item.emergency_urls and item.emergency_urls.get(channel_alt, False): - raiz, carpetas_series, ficheros = filetools.walk(path).next() - objetivo = '[%s]_01.torrent' % channel_alt - encontrado = False - for fichero in ficheros: - if objetivo in fichero: - encontrado = True - break - if not encontrado: - logger.error('REGENERANDO: ' + str(item.emergency_urls)) - item.emergency_urls.pop(channel_alt, None) - - if item.url: #Viene de actualización de videoteca de series - #Analizamos si el canal ya tiene las urls de emergencia: guardar o borrar - if (config.get_setting("emergency_urls", item.channel) == 1 and (not item.emergency_urls or (item.emergency_urls and not item.emergency_urls.get(channel_alt, False)))) or (config.get_setting("emergency_urls", item.channel) == 2 and item.emergency_urls.get(channel_alt, False)) or config.get_setting("emergency_urls", item.channel) == 3: - intervencion += ", ('1', '%s', '%s', '', '', '', '', '', '', '', '*', '%s', 'emerg')" % (channel_alt, channel_alt, config.get_setting("emergency_urls", item.channel)) - - elif it.library_urls: #Viene de "listar peliculas´" - for canal_vid, url_vid in it.library_urls.items(): #Se recorre "item.library_urls" para buscar canales candidatos - canal_vid_alt = "'%s'" % canal_vid - if canal_vid_alt in fail_over_list: #Se busca si es un clone de newpct1 - channel_bis = channel_py - else: - channel_bis = canal_vid - #Analizamos si el canal ya tiene las urls de emergencia: guardar o borrar - if (config.get_setting("emergency_urls", channel_bis) == 1 and (not it.emergency_urls or (it.emergency_urls and not it.emergency_urls.get(canal_vid, False)))) or (config.get_setting("emergency_urls", channel_bis) == 2 and it.emergency_urls.get(canal_vid, False)) or config.get_setting("emergency_urls", channel_bis) == 3: - intervencion += ", ('1', '%s', '%s', '', '', '', '', '', '', '', '*', '%s', 'emerg')" % (canal_vid, canal_vid, config.get_setting("emergency_urls", channel_bis)) + #Analizamos si el canal ya tiene las urls de emergencia: guardar o borrar + if (config.get_setting("emergency_urls", channel_bis) == 1 and (not it.emergency_urls or (it.emergency_urls and not it.emergency_urls.get(canal_vid, False)))) or (config.get_setting("emergency_urls", channel_bis) == 2 and it.emergency_urls.get(canal_vid, False)) or config.get_setting("emergency_urls", channel_bis) == 3 or emergency_urls_force: + intervencion += ", ('1', '%s', '%s', '', '', '', '', '', '', '', '*', '%s', 'emerg')" % (canal_vid, canal_vid, config.get_setting("emergency_urls", channel_bis)) + except: + logger.error('Error en el proceso de ALMACENAMIENTO de URLs de Emergencia') + logger.error(traceback.format_exc()) #Ahora tratamos las webs intervenidas, tranformamos la url, el nfo y borramos los archivos obsoletos de la serie if channel not in intervencion and channel_py_alt not in intervencion and category not in intervencion and channel_alt != 'videolibrary': #lookup @@ -2009,7 +2044,7 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F try: response = httptools.downloadpage(url_total, only_headers=True) except: - pass + logger.error(traceback.format_exc()) if not response.sucess: logger.error('Web ' + canal_des_def.upper() + ' INACTIVA. Regla no procesada: ' + str(canal_org_des_list[i])) item = item_back.clone() #Restauro las imágenes inciales @@ -2122,6 +2157,101 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F return (item, it, overwrite) +def verify_cached_torrents(): + logger.info() + import json + + """ + Verifica que todos los archivos .torrent estén descomprimidos. Si no lo están, los descomprime y regraba + + Método para uso temporal y controlado + + Deja el archivo verify_cached_torrents.json como marca de que se ha ejecutado para esa versión de Alfa + """ + + try: + #Localiza los paths donde dejar el archivo .json de control, y de la Videoteca + json_path = filetools.exists(filetools.join(config.get_runtime_path(), 'verify_cached_torrents.json')) + if json_path: + logger.info('Torrents verificados anteriormente: NOS VAMOS') + return + json_path = filetools.join(config.get_runtime_path(), 'verify_cached_torrents.json') + json_error_path = filetools.join(config.get_runtime_path(), 'error_cached_torrents.json') + json_error_path_BK = filetools.join(config.get_runtime_path(), 'error_cached_torrents_BK.json') + + videolibrary_path = config.get_videolibrary_path() #Calculamos el path absoluto a partir de la Videoteca + movies = config.get_setting("folder_movies") + series = config.get_setting("folder_tvshows") + torrents_movies = filetools.join(videolibrary_path, config.get_setting("folder_movies")) #path de CINE + torrents_series = filetools.join(videolibrary_path, config.get_setting("folder_tvshows")) #path de SERIES + + #Inicializa variables + torren_list = [] + torren_list.append(torrents_movies) + torren_list.append(torrents_series) + i = 0 + j = 0 + k = 0 + descomprimidos = [] + errores = [] + json_data = dict() + + #Recorre las carpetas de CINE y SERIES de la Videoteca, leyendo, descomprimiendo y regrabando los archivos .torrent + for contentType in torren_list: + for root, folders, files in filetools.walk(contentType): + for file in files: + if not '.torrent' in file: + continue + i += 1 + torrent_file = '' + torrent_path = filetools.join(root, file) + torrent_file = filetools.read(torrent_path) + if not scrapertools.find_single_match(torrent_file, '^d\d+:\w+\d+:'): + logger.debug('Torrent comprimido: DESCOMPRIMIENDO: ' + str(torrent_path)) + try: + torrent_file_deco = '' + import zlib + torrent_file_deco = zlib.decompressobj(16 + zlib.MAX_WBITS).decompress(torrent_file) + except: + k += 1 + errores += [torrent_path] + logger.error(traceback.format_exc()) + logger.error('No es un archivo TORRENT. Archivo borrado: ' + str(torrent_path)) + if not json_data.get(root, False): + json_data[root] = 'ERROR' + if scrapertools.find_single_match(file, '^\d+x\d+'): + torrent_json = re.sub(r'\]_\d+.torrent$', '].json', torrent_path) + filetools.remove(torrent_json) + filetools.remove(torrent_path) + continue + + if not scrapertools.find_single_match(torrent_file_deco, '^d\d+:\w+\d+:'): + logger.error('Error de DESCOMPRESIÓN: ' + str(torrent_path)) + k += 1 + errores += [torrent_path] + else: + filetools.write(torrent_path, torrent_file_deco) + j += 1 + descomprimidos += [torrent_path] + else: + #logger.info('Torrent OK. No hace falta descompresión: ' + str(torrent_path)) + h = 0 + + if json_data: + filetools.write(json_error_path, json.dumps(json_data)) + filetools.write(json_error_path_BK, json.dumps(json_data)) + filetools.write(json_path, json.dumps({"torrent_verify": True})) + except: + logger.error('Error en el proceso de VERIFICACIÓN de los .torrents') + logger.error(traceback.format_exc()) + + logger.error(str(i) + ' archivos .torrent revisados. / ' + str(j) + ' descomporimidos / ' + str(k) + ' errores') + if descomprimidos: + logger.error('Lista de .torrents DESCOMPRIMIDOS: ' + str(descomprimidos)) + if errores: + logger.error('Lista de .torrents en ERROR: ' + str(errores)) + + def dejuice(data): logger.info() # Metodo para desobfuscar datos de JuicyCodes diff --git a/plugin.video.alfa/platformcode/platformtools.py b/plugin.video.alfa/platformcode/platformtools.py index d0781ef7..da05c1cc 100644 --- a/plugin.video.alfa/platformcode/platformtools.py +++ b/plugin.video.alfa/platformcode/platformtools.py @@ -1094,27 +1094,37 @@ def play_torrent(item, xlistitem, mediaurl): time.sleep(0.5) #Dejamos tiempo para que se ejecute #Nuevo método de descarga previa del .torrent. Si da error, miramos si hay alternatica local. Si ya es local, lo usamos + url = '' url_stat = False + torrents_path = '' videolibrary_path = config.get_videolibrary_path() #Calculamos el path absoluto a partir de la Videoteca if not filetools.exists(videolibrary_path): #Si no existe el path, pasamos al modo clásico - url_stat = True - elif not filetools.exists(videolibrary_path + 'temp_torrents_Alfa'): #Si no existe la carpeta temporal para .torrents, la creamos - filetools.mkdir(videolibrary_path + 'temp_torrents_Alfa') - torrents_path = filetools.join(videolibrary_path, 'temp_torrents_Alfa', 'cliente_torrent_Alfa.torrent') #path de descarga temporal - + videolibrary_path = False + else: + torrents_path = filetools.join(videolibrary_path, 'temp_torrents_Alfa', 'cliente_torrent_Alfa.torrent') #path descarga temporal + if videolibrary_path and not filetools.exists(filetools.join(videolibrary_path, 'temp_torrents_Alfa')): #Si no existe la carpeta temporal, la creamos + filetools.mkdir(filetools.join(videolibrary_path, 'temp_torrents_Alfa')) + #identificamos si es una url o un path de archivo. Los Magnets los tratamos de la forma clásica if not item.url.startswith("\\") and not item.url.startswith("/") and not item.url.startswith("magnet:") and not url_stat: timeout = 10 if item.torrent_alt: timeout = 5 - item.url = videolibrarytools.caching_torrents(item.url, torrents_path=torrents_path, timeout=timeout) #Descargamos el .torrent - if item.url: url_stat = True - - if not item.url and item.torrent_alt: #Si hay error, se busca un .torrent alternativo - item.url = item.torrent_alt #El .torrent alternativo puede estar en una url o en local + url = videolibrarytools.caching_torrents(item.url, torrents_path=torrents_path, timeout=timeout) #Descargamos el .torrent + if url: + url_stat = True + item.url = url + if "torrentin" in torrent_options[seleccion][1]: + item.url = 'file://' + item.url + + if not url and item.torrent_alt: #Si hay error, se busca un .torrent alternativo + if (item.torrent_alt.startswith("\\") or item.torrent_alt.startswith("/")) and videolibrary_path: + item.url = item.torrent_alt #El .torrent alternativo puede estar en una url o en local + elif not item.url.startswith("\\") and not item.url.startswith("/") and not item.url.startswith("magnet:"): + item.url = item.torrent_alt #Si es un archivo .torrent local, actualizamos el path relativo a path absoluto - if item.url.startswith("\\") or item.url.startswith("/") and not url_stat: #.torrent alternativo local + if (item.url.startswith("\\") or item.url.startswith("/")) and not url_stat and videolibrary_path: #.torrent alternativo local movies = config.get_setting("folder_movies") series = config.get_setting("folder_tvshows") if item.contentType == 'movie': @@ -1122,7 +1132,11 @@ def play_torrent(item, xlistitem, mediaurl): else: folder = series #o series item.url = filetools.join(videolibrary_path, folder, item.url) #dirección del .torrent local en la Videoteca - + if filetools.copy(item.url, torrents_path, silent=True): #se copia a la carpeta generíca para evitar problemas de encode + item.url = torrents_path + if "torrentin" in torrent_options[seleccion][1]: #Si es Torrentin, hay que añadir un prefijo + item.url = 'file://' + item.url + mediaurl = urllib.quote_plus(item.url) #Llamada con más parámetros para completar el título if ("quasar" in torrent_options[seleccion][1] or "elementum" in torrent_options[seleccion][1]) and item.infoLabels['tmdb_id']: From 7ead13eaf377e054ace4e74f6e223a7be8cc18d9 Mon Sep 17 00:00:00 2001 From: Kingbox <37674310+lopezvg@users.noreply.github.com> Date: Wed, 14 Nov 2018 11:46:37 +0100 Subject: [PATCH 03/18] Mejoras en la Disponibilidad de los clones MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Selección aleatoria de los mejores clones para redistribuir las cargas --- plugin.video.alfa/channels/newpct1.json | 9 ++- plugin.video.alfa/channels/newpct1.py | 102 +++++++++++++++++------- 2 files changed, 78 insertions(+), 33 deletions(-) diff --git a/plugin.video.alfa/channels/newpct1.json b/plugin.video.alfa/channels/newpct1.json index 5dbb29b9..24a47145 100644 --- a/plugin.video.alfa/channels/newpct1.json +++ b/plugin.video.alfa/channels/newpct1.json @@ -78,12 +78,13 @@ "enabled": true, "visible": true, "lvalues": [ + "Aleatorio", + "Descargas2020", + "Tumejortorrent", + "Torrentrapid", "Torrentlocura", "Tvsinpagar", "Planetatorrent", - "Torrentrapid", - "Tumejortorrent", - "Descargas2020", "Mispelisyseries" ] }, @@ -91,7 +92,7 @@ "id": "clonenewpct1_channels_list", "type": "text", "label": "Lista de clones de NewPct1 y orden de uso", - "default": "('1', 'torrentlocura', 'http://torrentlocura.com/', 'movie, tvshow, season, episode', ''), ('1', 'tvsinpagar', 'http://www.tvsinpagar.com/', 'tvshow, season, episode', ''), ('1', 'planetatorrent', 'http://planetatorrent.com/', 'movie, tvshow, season, episode', ''), ('1', 'torrentrapid', 'http://torrentrapid.com/', 'movie, tvshow, season, episode', 'serie_episodios'), ('1', 'tumejortorrent', 'http://tumejortorrent.com/', 'movie, tvshow, season, episode', ''), ('1', 'descargas2020', 'http://descargas2020.com/', 'movie, tvshow, season, episode', ''), ('1', 'mispelisyseries', 'http://mispelisyseries.com/', 'movie', 'search, listado_busqueda')", + "default": "('1', 'descargas2020', 'http://descargas2020.com/', 'movie, tvshow, season, episode', ''), ('1', 'tumejortorrent', 'http://tumejortorrent.com/', 'movie, tvshow, season, episode', ''), ('1', 'torrentrapid', 'http://torrentrapid.com/', 'movie, tvshow, season, episode', 'serie_episodios'), ('1', 'torrentlocura', 'http://torrentlocura.com/', 'movie, tvshow, season, episode', ''), ('1', 'tvsinpagar', 'http://www.tvsinpagar.com/', 'tvshow, season, episode', ''), ('1', 'planetatorrent', 'http://planetatorrent.com/', 'movie, tvshow, season, episode', ''), ('1', 'mispelisyseries', 'http://mispelisyseries.com/', 'movie', 'search, listado_busqueda')", "enabled": true, "visible": false }, diff --git a/plugin.video.alfa/channels/newpct1.py b/plugin.video.alfa/channels/newpct1.py index 9177fb26..1bdba2d3 100644 --- a/plugin.video.alfa/channels/newpct1.py +++ b/plugin.video.alfa/channels/newpct1.py @@ -6,6 +6,7 @@ import urllib import urlparse import datetime import ast +import random from channelselector import get_thumb from core import httptools @@ -31,27 +32,45 @@ channel_py = 'newpct1' #Código para permitir usar un único canal para todas las webs clones de NewPct1 #Cargamos en .json del canal para ver las listas de valores en settings clone_list = channeltools.get_channel_json(channel_py) -for settings in clone_list['settings']: #Se recorren todos los settings - if settings['id'] == "clonenewpct1_channels_list": #Encontramos en setting - clone_list = settings['default'] #Carga lista de clones +for settings in clone_list['settings']: #Se recorren todos los settings + if settings['id'] == "clonenewpct1_channels_list": #Encontramos en setting + clone_list = settings['default'] #Carga lista de clones break -clone_list = ast.literal_eval(clone_list) #la convierte en array +clone_list = ast.literal_eval(clone_list) #la convierte en array host_index = 0 -host_index = config.get_setting('clonenewpct1_channel_default', channel_py) #Clone por defecto -i = 0 -for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list: - if i == host_index: - channel_clone_name = channel_clone #Nombre del Canal elegido - host = host_clone #URL del Canal elegido - if active_clone == "1": #Comprueba que el clone esté activo +host_index = config.get_setting('clonenewpct1_channel_default', channel_py) #Clone por defecto + +clone_list_random = [] #Iniciamos la lista aleatoria de clones + +if host_index == 0: #Si el clones es "Aleatorio"... + i = 0 + j = 2 #... marcamos el último de los clones "buenos" + for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list: + if i <= j and active_clone == "1": + clone_list_random += [clone_list[i]] #... añadimos el clone activo "bueno" a la lista + else: break - channel_clone_name = "*** DOWN ***" #es un fallo masivo ??? - for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list: - if active_clone == "1": #Comprueba que el clone esté activo - channel_clone_name = channel_clone #Nombre del Canal elegido - host = host_clone #URL del Canal elegido + i += 1 + if clone_list_random: #Si hay clones en la lista aleatoria... + clone_list = [random.choice(clone_list_random)] #Seleccionamos un clone aleatorio + #logger.debug(clone_list) + host_index = 1 #mutamos el num. de clone para que se procese en el siguiente loop + +if host_index > 0 or not clone_list_random: #Si el Clone por defecto no es Aleatorio, o hay ya un aleatorio sleccionado... + i = 1 + for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list: + if i == host_index: + channel_clone_name = channel_clone #Nombre del Canal elegido + host = host_clone #URL del Canal elegido + if active_clone == "1": #Comprueba que el clone esté activo break - i += 1 + channel_clone_name = "*** DOWN ***" #es un fallo masivo ??? + for active_clone, channel_clone, host_clone, contentType_clone, info_clone in clone_list: + if active_clone == "1": #Comprueba que el clone esté activo + channel_clone_name = channel_clone #Nombre del Canal elegido + host = host_clone #URL del Canal elegido + break + i += 1 item = Item() if item.channel != channel_py: @@ -139,6 +158,11 @@ def submenu(item): itemlist = [] item.extra2 = '' + #Renombramos el canal al nombre de clone inicial desde la URL + host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)') + item.channel_host = host + item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + data = '' try: data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item.url, timeout=timeout).data) @@ -218,6 +242,11 @@ def submenu_novedades(item): itemlist_alt = [] item.extra2 = '' + #Renombramos el canal al nombre de clone inicial desde la URL + host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)') + item.channel_host = host + item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + data = '' timeout_search=timeout * 2 #Más tiempo para Novedades, que es una búsqueda thumb_settings = get_thumb("setting_0.png") @@ -315,6 +344,11 @@ def submenu_novedades(item): def alfabeto(item): logger.info() itemlist = [] + + #Renombramos el canal al nombre de clone inicial desde la URL + host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)') + item.channel_host = host + item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() data = '' data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item.url, timeout=timeout).data) @@ -365,6 +399,12 @@ def alfabeto(item): def listado(item): logger.info() itemlist = [] + + #Renombramos el canal al nombre de clone inicial desde la URL + host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)') + item.channel_host = host + item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + clase = "pelilist" # etiqueta para localizar zona de listado de contenidos url_next_page ='' # Control de paginación cnt_tot = 30 # Poner el num. máximo de items por página @@ -1249,7 +1289,7 @@ def findvideos(item): #Renombramos el canal al nombre de clone elegido. Actualizados URL host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)') item.channel_host = host - item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize() + item.category = host.capitalize() verify_fo = True #Verificamos si el clone a usar está activo item, data = generictools.fail_over_newpct1(item, verify_fo) @@ -1374,10 +1414,11 @@ def findvideos(item): pass patron = 'class="btn-torrent">.*?window.location.href = "(.*?)";' #Patron para .torrent - patron_mult = 'torrent:check:status|' + patron - if 'planetatorrent' in item.channel_host: - patron = ' 0: - if item_local.contentSeason > season_display: + if item_local.contentSeason > season_display or (not modo_ultima_temp_alt and item_local.contentSeason != season_display): continue elif item_local.contentSeason < season_display: list_pages = [] #Sale del bucle de leer páginas From f4f983c29ba6ea726181aa5b50ba5ace89f3fde4 Mon Sep 17 00:00:00 2001 From: pipcat
|\s{2,}', "", data) - - enc_data = scrapertools.find_single_match(data, "Core.InitializeStream \('(.*?)'\)") - logger.debug(enc_data) + enc_data = scrapertools.find_single_match(data, 'data-stream="([^"]+)') dec_data = base64.b64decode(enc_data) - - logger.debug(dec_data) - - for url in eval(dec_data): - video_urls.append(['vivo', url]) - + video_urls.append(['vivo', dec_data]) return video_urls From e37fed841e70b4a943b83874b1de9c5532e65f2a Mon Sep 17 00:00:00 2001 From: Intel1
|\s{2,}', "", data) return data @@ -173,7 +175,7 @@ def list_all (item): matches = scrapertools.find_multiple_matches(data, patron) for scrapedurl, scrapedthumbnail, scrapedyear, scrapedtitle in matches: - url = host+scrapedurl+'p001/' + url = host+scrapedurl thumbnail = scrapedthumbnail contentTitle=scrapedtitle title = contentTitle @@ -349,16 +351,15 @@ def season_episodes(item): def get_links_by_language(item, data): logger.info() - video_list = [] - language = scrapertools.find_single_match(data, 'ul id=level\d_(.*?)\s*class=') - patron = 'data-source=(.*?)data.*?srt=(.*?)data-iframe.*?Opci.*?<.*?hidden>[^\(]\((.*?)\)' + language = scrapertools.find_single_match(data, 'ul id="level\d_([^"]+)"\s*class=') + patron = 'data-source="([^"]+)"data-quality="([^"]+)"data-srt="([^"]+)"' matches = re.compile(patron, re.DOTALL).findall(data) if language in IDIOMAS: language = IDIOMAS[language] - for url, sub, quality in matches: + for url, quality, sub in matches: if 'http' not in url: new_url = 'https://onevideo.tv/api/player?key=90503e3de26d45e455b55e9dc54f015b3d1d4150&link' \ @@ -391,15 +392,19 @@ def findvideos(item): logger.info() itemlist = [] video_list = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r'"|\n|\r|\t| |
|\s{2,}', "", data) + if item.contentType == 'movie': + new_url = new_url = item.url.replace('/pelicula/', '/player/%s/' % item.contentType) + else: + base_url = scrapertools.find_single_match(item.url, '(.*?)/temporada') + new_url = base_url.replace('/serie/', '/player/serie/') + new_url += '|%s|%s/' % (item.contentSeason, item.contentEpisodeNumber) + data = get_source(new_url, referer=item.url) - patron_language ='(
- )'
+ patron_language ='(
- )'
matches = re.compile(patron_language, re.DOTALL).findall(data)
for language in matches:
video_list.extend(get_links_by_language(item, language))
-
video_list = servertools.get_servers_itemlist(video_list, lambda i: i.title % (i.server.capitalize(), i.language,
i.quality) )
# Requerido para FilterTools
From fc04c143ecc00953936f6226cbeb8e0c8936a416 Mon Sep 17 00:00:00 2001
From: Kingbox <37674310+lopezvg@users.noreply.github.com>
Date: Wed, 21 Nov 2018 18:48:40 +0100
Subject: [PATCH 14/18] Newpct1: mejora en la disponibilidad
---
plugin.video.alfa/channels/newpct1.py | 18 +++++++++++++----
plugin.video.alfa/channels/videolibrary.py | 3 ---
plugin.video.alfa/lib/generictools.py | 23 ++++++++++++++--------
3 files changed, 29 insertions(+), 15 deletions(-)
diff --git a/plugin.video.alfa/channels/newpct1.py b/plugin.video.alfa/channels/newpct1.py
index 1bdba2d3..e456b356 100644
--- a/plugin.video.alfa/channels/newpct1.py
+++ b/plugin.video.alfa/channels/newpct1.py
@@ -133,8 +133,11 @@ def mainlist(item):
thumbnail=thumb_docus, category=item.category, channel_host=item.channel_host))
itemlist.append(
Item(channel=item.channel, action="search", title="Buscar", url=item.channel_host + "buscar", thumbnail=thumb_buscar, category=item.category, channel_host=item.channel_host))
-
- itemlist.append(Item(channel=item.channel, url=host, title="[COLOR yellow]Configuración:[/COLOR]", folder=False, thumbnail=thumb_separador, category=item.category, channel_host=item.channel_host))
+
+ clone_act = 'Clone: '
+ if config.get_setting('clonenewpct1_channel_default', channel_py) == 0:
+ clone_act = 'Aleatorio: '
+ itemlist.append(Item(channel=item.channel, url=host, title="[COLOR yellow]Configuración:[/COLOR] (" + clone_act + item.category + ")", folder=False, thumbnail=thumb_separador, category=item.category, channel_host=item.channel_host))
itemlist.append(Item(channel=item.channel, action="settingCanal", title="Configurar canal", thumbnail=thumb_settings, category=item.category, channel_host=item.channel_host))
@@ -243,9 +246,8 @@ def submenu_novedades(item):
item.extra2 = ''
#Renombramos el canal al nombre de clone inicial desde la URL
- host = scrapertools.find_single_match(item.url, '(http.?\:\/\/(?:www.)?\w+\.\w+\/)')
item.channel_host = host
- item.category = scrapertools.find_single_match(item.url, 'http.?\:\/\/(?:www.)?(\w+)\.\w+\/').capitalize()
+ item.category = channel_clone_name.capitalize()
data = ''
timeout_search=timeout * 2 #Más tiempo para Novedades, que es una búsqueda
@@ -2051,7 +2053,15 @@ def episodios(item):
if match['episode'] is None: match['episode'] = "0"
try:
match['season'] = int(match['season'])
+ season_alt = match['season']
match['episode'] = int(match['episode'])
+ if match['season'] > max_temp:
+ logger.error("ERROR 07: EPISODIOS: Error en número de Temporada o Episodio: " + " / TEMPORADA/EPISODIO: " + str(match['season']) + " / " + str(match['episode']) + " / NUM_TEMPORADA: " + str(max_temp) + " / " + str(season) + " / MATCHES: " + str(matches))
+ match['season'] = scrapertools.find_single_match(item_local.url, '\/[t|T]emp\w+-*(\d+)\/')
+ if not match['season']:
+ match['season'] = season_alt
+ else:
+ match['season'] = int(match['season'])
except:
logger.error("ERROR 07: EPISODIOS: Error en número de Temporada o Episodio: " + " / TEMPORADA/EPISODIO: " + str(match['season']) + " / " + str(match['episode']) + " / NUM_TEMPORADA: " + str(max_temp) + " / " + str(season) + " / MATCHES: " + str(matches))
diff --git a/plugin.video.alfa/channels/videolibrary.py b/plugin.video.alfa/channels/videolibrary.py
index 1212ec4d..e2edd5c1 100644
--- a/plugin.video.alfa/channels/videolibrary.py
+++ b/plugin.video.alfa/channels/videolibrary.py
@@ -62,7 +62,6 @@ def list_movies(item, silent=False):
for canal_org in new_item.library_urls:
canal = generictools.verify_channel(canal_org)
- logger.error(canal)
try:
channel_verify = __import__('channels.%s' % canal, fromlist=["channels.%s" % canal])
logger.debug('El canal %s parece correcto' % channel_verify)
@@ -286,8 +285,6 @@ def list_tvshows(item):
# logger.debug("item_tvshow:\n" + item_tvshow.tostring('\n'))
## verifica la existencia de los canales ##
-
- logger.debug(item_tvshow)
if len(item_tvshow.library_urls) > 0:
itemlist.append(item_tvshow)
diff --git a/plugin.video.alfa/lib/generictools.py b/plugin.video.alfa/lib/generictools.py
index 5647fb0d..eb549794 100644
--- a/plugin.video.alfa/lib/generictools.py
+++ b/plugin.video.alfa/lib/generictools.py
@@ -863,6 +863,7 @@ def post_tmdb_episodios(item, itemlist):
#Componemos el título final, aunque con Unify usará infoLabels['episodio_titulo']
item_local.infoLabels['title'] = item_local.infoLabels['episodio_titulo']
+ item_local.title = item_local.title.replace("[", "-").replace("]", "-")
item_local.title = '%s [%s] [%s] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.title, item_local.infoLabels['year'], rating, item_local.quality, str(item_local.language))
#Quitamos campos vacíos
@@ -871,7 +872,7 @@ def post_tmdb_episodios(item, itemlist):
item_local.title = item_local.title.replace(" []", "").strip()
item_local.title = re.sub(r'\s?\[COLOR \w+\]\[\[?-?\s?\]?\]\[\/COLOR\]', '', item_local.title).strip()
item_local.title = re.sub(r'\s?\[COLOR \w+\]-?\s?\[\/COLOR\]', '', item_local.title).strip()
- item_local.title = item_local.title.replace("[", "-").replace("]", "-").replace(".", ",").replace("GB", "G B").replace("Gb", "G b").replace("gb", "g b").replace("MB", "M B").replace("Mb", "M b").replace("mb", "m b")
+ item_local.title = item_local.title.replace(".", ",").replace("GB", "G B").replace("Gb", "G b").replace("gb", "g b").replace("MB", "M B").replace("Mb", "M b").replace("mb", "m b")
#Si la información de num. total de episodios de TMDB no es correcta, tratamos de calcularla
if num_episodios < item_local.contentEpisodeNumber:
@@ -1161,7 +1162,8 @@ def post_tmdb_findvideos(item, itemlist):
if item.channel_alt:
title_gen = '[COLOR yellow]%s [/COLOR][ALT]: %s' % (item.category.capitalize(), title_gen)
- elif (config.get_setting("quit_channel_name", "videolibrary") == 1 or item.channel == channel_py) and item.contentChannel == "videolibrary":
+ #elif (config.get_setting("quit_channel_name", "videolibrary") == 1 or item.channel == channel_py) and item.contentChannel == "videolibrary":
+ else:
title_gen = '%s: %s' % (item.category.capitalize(), title_gen)
#Si intervención judicial, alerto!!!
@@ -1814,6 +1816,9 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F
if item.channel_host: #y se borran resto de pasadas anteriores
del item.channel_host
+ if it.emergency_urls:
+ item.emergency_urls = it.emergency_urls #Refrescar desde el .nfo
+
#Analizamos si hay series o películas que migrar, debido a que se ha activado en el .json del canal la opción "guardar"
#"emergency_urls = 1", y hay que calcularla para todos los episodios y película existentes en la Videoteca.
#Si "emergency_urls" está activada para uno o más canales, se verifica en el .nfo del vídeo si ya se ha realizado
@@ -1824,10 +1829,7 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F
#automáticamente. En el caso de peliculas, se general aquí el json actualizado y se marca el .nfo como actualizado.
#Cuando en el .json se activa "Borrar", "emergency_urls = 2", se borran todos los enlaces existentes
#Cuando en el .json se activa "Actualizar", "emergency_urls = 3", se actualizan todos los enlaces existentes
-
- if it.emergency_urls:
- item.emergency_urls = it.emergency_urls #Refrescar desde el .nfo
-
+ """
verify_cached_torrents() #TEMPORAL: verificamos si los .torrents son correctos
try: #Si ha habido errores, vemos la lista y los reparamos
json_error_path = filetools.join(config.get_runtime_path(), 'error_cached_torrents.json')
@@ -1875,7 +1877,12 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F
if not encontrado:
logger.error('REGENERANDO: ' + str(item.emergency_urls))
item.emergency_urls.pop(channel_alt, None)
-
+ except:
+ logger.error('Error en el proceso de RECARGA de URLs de Emergencia')
+ logger.error(traceback.format_exc())
+ """
+
+ try:
if item.url: #Viene de actualización de videoteca de series
#Analizamos si el canal ya tiene las urls de emergencia: guardar o borrar
if (config.get_setting("emergency_urls", item.channel) == 1 and (not item.emergency_urls or (item.emergency_urls and not item.emergency_urls.get(channel_alt, False)))) or (config.get_setting("emergency_urls", item.channel) == 2 and item.emergency_urls.get(channel_alt, False)) or config.get_setting("emergency_urls", item.channel) == 3 or emergency_urls_force:
@@ -1894,7 +1901,7 @@ def redirect_clone_newpct1(item, head_nfo=None, it=None, path=False, overwrite=F
except:
logger.error('Error en el proceso de ALMACENAMIENTO de URLs de Emergencia')
logger.error(traceback.format_exc())
-
+
#Ahora tratamos las webs intervenidas, tranformamos la url, el nfo y borramos los archivos obsoletos de la serie
if channel not in intervencion and channel_py_alt not in intervencion and category not in intervencion and channel_alt != 'videolibrary': #lookup
return (item, it, overwrite) #... el canal/clone está listado
From eaa2339c1600cc78c5377e33f1c6f3612dd64013 Mon Sep 17 00:00:00 2001
From: Kingbox <37674310+lopezvg@users.noreply.github.com>
Date: Wed, 21 Nov 2018 18:49:42 +0100
Subject: [PATCH 15/18] Enlaces de Emergencia
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Adaptación de canales:
- Mejortorrent
- Mejortorrent1
---
plugin.video.alfa/channels/mejortorrent.py | 106 ++++++++++++++----
plugin.video.alfa/channels/mejortorrent1.json | 22 ++++
plugin.video.alfa/channels/mejortorrent1.py | 89 +++++++++++----
plugin.video.alfa/core/videolibrarytools.py | 2 +-
4 files changed, 172 insertions(+), 47 deletions(-)
diff --git a/plugin.video.alfa/channels/mejortorrent.py b/plugin.video.alfa/channels/mejortorrent.py
index 722c559e..63e25330 100755
--- a/plugin.video.alfa/channels/mejortorrent.py
+++ b/plugin.video.alfa/channels/mejortorrent.py
@@ -265,8 +265,8 @@ def listado(item):
del item.next_page
#logger.debug(data)
- logger.debug("PATRON1: " + patron + " / ")
- logger.debug(matches)
+ #logger.debug("PATRON1: " + patron + " / ")
+ #logger.debug(matches)
# Primera pasada
# En la primera pasada se obtiene una información básica del título a partir de la url
@@ -360,8 +360,8 @@ def listado(item):
cnt_pag += cnt_tot
cnt_pag_num += 1
- logger.debug("PATRON2: " + patron_title)
- logger.debug(matches)
+ #logger.debug("PATRON2: " + patron_title)
+ #logger.debug(matches)
cnt = 0
for scrapedtitle, notused, scrapedinfo in matches:
item_local = itemlist[cnt] #Vinculamos item_local con la entrada de la lista itemlist (más fácil de leer)
@@ -763,6 +763,12 @@ def findvideos(item):
itemlist_f = [] #Itemlist de enlaces filtrados
if not item.language:
item.language = ['CAST'] #Castellano por defecto
+ matches = []
+
+ #Si es un lookup para cargar las urls de emergencia en la Videoteca...
+ if item.videolibray_emergency_urls:
+ item.emergency_urls = []
+ item.emergency_urls.append([]) #Reservamos el espacio para los .torrents locales
#Bajamos los datos de la página
data = ''
@@ -775,24 +781,47 @@ def findvideos(item):
data = re.sub(r"\n|\r|\t|\s{2}|()", "", httptools.downloadpage(item.url).data)
patron = ")", "", httptools.downloadpage(url).data)
- except: #error
+ except: #error
+ pass
+
+ if not torrent_data:
logger.error("ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web " + " / URL: " + url + " / DATA: " + data)
itemlist.append(item.clone(action='', title=item.channel.capitalize() + ': ERROR 02: FINDVIDEOS: El archivo Torrent no existe o ha cambiado la estructura de la Web. Verificar en la Web y reportar el error con el log'))
- return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
+ if item.emergency_urls and not item.videolibray_emergency_urls: #Hay urls de emergencia?
+ if len(item.emergency_urls[0]):
+ item_local.url = item.emergency_urls[0][0] #Restauramos la primera url
+ item.armagedon = True #Marcamos la situación como catastrófica
+ else:
+ if item.videolibray_emergency_urls: #Si es llamado desde creación de Videoteca...
+ return item #Devolvemos el Item de la llamada
+ else:
+ return itemlist #si no hay más datos, algo no funciona, pintamos lo que tenemos
+
#logger.debug(torrent_data)
- item_local.url = scrapertools.get_match(torrent_data, ">Pincha.*?Pincha.*? 1:
+ del item.emergency_urls[0][0]
+ if not item.armagedon and item.emergency_urls and not item.videolibray_emergency_urls:
+ if len(item.emergency_urls[0]):
+ item_local.torrent_alt = item.emergency_urls[0][0] #Guardamos la primera url del .Torrent ALTERNATIVA
+
+ if item.videolibray_emergency_urls:
+ item.emergency_urls[0].append(item_local.url) #Salvamnos la url...
# Poner la calidad, si es necesario
if not item_local.quality:
if "hdtv" in item_local.url.lower() or "720p" in item_local.url.lower() or "1080p" in item_local.url.lower() or "4k" in item_local.url.lower():
item_local.quality = scrapertools.find_single_match(item_local.url, '.*?_([H|7|1|4].*?)\.torrent')
item_local.quality = item_local.quality.replace("_", " ")
+ if item.armagedon: #Si es catastrófico, lo marcamos
+ item_local.quality = '[/COLOR][COLOR hotpink][E] [COLOR limegreen]%s' % item_local.quality
# Extrae la dimensión del vídeo
size = scrapertools.find_single_match(item_local.url, '(\d{1,3},\d{1,2}?\w+)\.torrent')
- size = size.upper().replace(".", ",").replace("G", " G ").replace("M", " M ") #sustituimos . por , porque Unify lo borra
- if not size:
+ size = size.upper().replace(".", ",").replace("G", " G ").replace("M", " M ") #sustituimos . por , porque Unify lo borra
+ if not size and not item.armagedon:
size = generictools.get_torrent_size(item_local.url) #Buscamos el tamaño en el .torrent
if size:
item_local.title = re.sub('\s\[\d+,?\d*?\s\w[b|B]\]', '', item_local.title) #Quitamos size de título, si lo traía
item_local.title = '%s [%s]' % (item_local.title, size) #Agregamos size al final del título
item_local.quality = re.sub('\s\[\d+,?\d*?\s\w[b|B]\]', '', item_local.quality) #Quitamos size de calidad, si lo traía
- item_local.quality = '%s [%s]' % (item.quality, size) #Agregamos size al final de calidad
+ item_local.quality = '%s [%s]' % (item.quality, size) #Agregamos size al final de calidad
#Ahora pintamos el link del Torrent, si lo hay
- if item_local.url: # Hay Torrent ?
- item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Torrent
-
+ if item_local.url: # Hay Torrent ?
+ item_local.title = '[COLOR yellow][?][/COLOR] [COLOR yellow][Torrent][/COLOR] [COLOR limegreen][%s][/COLOR] [COLOR red]%s[/COLOR]' % (item_local.quality, str(item_local.language)) #Preparamos título de Torrent
+
#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)
@@ -858,6 +915,9 @@ def findvideos(item):
#logger.debug("title=[" + item.title + "], torrent=[ " + item_local.url + " ], url=[ " + url + " ], post=[" + item.post + "], thumbnail=[ " + item.thumbnail + " ]" + " size: " + size)
+ if item.videolibray_emergency_urls:
+ return item
+
if len(itemlist_f) > 0: #Si hay entradas filtradas...
itemlist.extend(itemlist_f) #Pintamos pantalla filtrada
else:
diff --git a/plugin.video.alfa/channels/mejortorrent1.json b/plugin.video.alfa/channels/mejortorrent1.json
index c17a3407..c5d2aa2f 100644
--- a/plugin.video.alfa/channels/mejortorrent1.json
+++ b/plugin.video.alfa/channels/mejortorrent1.json
@@ -54,6 +54,28 @@
"VOSE"
]
},
+ {
+ "id": "emergency_urls",
+ "type": "list",
+ "label": "Se quieren guardar Enlaces de Emergencia por si se cae la Web?",
+ "default": 1,
+ "enabled": true,
+ "visible": true,
+ "lvalues": [
+ "No",
+ "Guardar",
+ "Borrar",
+ "Actualizar"
+ ]
+ },
+ {
+ "id": "emergency_urls_torrents",
+ "type": "bool",
+ "label": "Se quieren guardar Torrents de Emergencia por si se cae la Web?",
+ "default": true,
+ "enabled": true,
+ "visible": "!eq(-1,'No')"
+ },
{
"id": "seleccionar_ult_temporadda_activa",
"type": "bool",
diff --git a/plugin.video.alfa/channels/mejortorrent1.py b/plugin.video.alfa/channels/mejortorrent1.py
index 6814d79e..23062782 100644
--- a/plugin.video.alfa/channels/mejortorrent1.py
+++ b/plugin.video.alfa/channels/mejortorrent1.py
@@ -165,8 +165,8 @@ def listado(item):
item.contentType = "movie"
pag = False #No hay paginación
elif (item.extra == "peliculas" or item.extra == "varios") and not item.tipo: #Desde Menú principal
- patron = '?