# -*- coding: utf-8 -*- # -------------------------------------------------------------------------------- # Search trailers from youtube, filmaffinity, abandomoviez, vimeo, etc... # -------------------------------------------------------------------------------- from __future__ import division #from builtins import str import sys import xbmcaddon PY3 = False if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int from past.utils import old_div if PY3: #from future import standard_library #standard_library.install_aliases() import urllib.parse as urllib # Es muy lento en PY2. En PY3 es nativo import urllib.parse as urlparse else: import urllib # Usamos el nativo de PY2 que es más rápido import urlparse import re from core import httptools from core import jsontools from core import scrapertools from core import servertools from core.item import Item from platformcode import config, logger from platformcode import platformtools info_language = ["it", "en", "es", "fr", "de", "pt"] # from videolibrary.json def_lang = info_language[config.get_setting("info_language", "videolibrary")] result = None window_select = [] # Para habilitar o no la opción de búsqueda manual if config.get_platform() != "plex": keyboard = True else: keyboard = False def buscartrailer(item, trailers=[]): logger.info() # Lista de acciones si se ejecuta desde el menú contextual if item.action == "manual_search" and item.contextual: itemlist = manual_search(item) item.contentTitle = itemlist[0].contentTitle elif 'search' in item.action and item.contextual: itemlist = globals()[item.action](item) else: # Se elimina la opción de Buscar Trailer del menú contextual para evitar redundancias if isinstance(item.context, str) and "buscar_trailer" in item.context: item.context = item.context.replace("buscar_trailer", "") elif isinstance(item.context, list) and "buscar_trailer" in item.context: item.context.remove("buscar_trailer") item.text_color = "" itemlist = [] if item.search_title: item.contentTitle = item.search_title elif item.contentTitle != "": item.contentTitle = item.contentTitle.strip() elif keyboard: contentTitle = re.sub('\[\/*(B|I|COLOR)\s*[^\]]*\]', '', item.contentTitle.strip()) item.contentTitle = platformtools.dialog_input(default=contentTitle, heading=config.get_localized_string(70505)) if item.contentTitle is None: item.contentTitle = contentTitle else: item.contentTitle = item.contentTitle.strip() else: contentTitle = re.sub('\[\/*(B|I|COLOR)\s*[^\]]*\]', '', item.contentTitle.strip()) item.contentTitle = contentTitle item.year = item.infoLabels['year'] logger.info("Búsqueda: %s" % item.contentTitle) logger.info("Año: %s" % item.year) if item.infoLabels['trailer'] and not trailers: url = item.infoLabels['trailer'] if "youtube" in url: url = url.replace("embed/", "watch?v=") titulo, url, server = servertools.findvideos(url)[0] title = "Trailer [" + server + "]" itemlist.append(item.clone(title=title, url=url, server=server, action="play")) if item.show or item.infoLabels['tvshowtitle'] or item.contentType != "movie": tipo = "tv" else: tipo = "movie" try: if not trailers: itemlist.extend(tmdb_trailers(item, tipo)) else: for trailer in trailers: title = trailer['name'] + " [" + trailer['size'] + "p] (" + trailer['language'].replace("en", "ING") \ .replace("it", "ITA") + ") [tmdb/youtube]" itemlist.append(item.clone(action="play", title=title, url=trailer['url'], server="youtube")) except: import traceback logger.error(traceback.format_exc()) if item.contextual: title = "%s" else: title = "%s" itemlist.append(item.clone(title=title % config.get_localized_string(70507), action="youtube_search")) itemlist.append(item.clone(title=title % config.get_localized_string(70024), action="filmaffinity_search")) # Si se trata de una serie, no se incluye la opción de buscar en Abandomoviez if not item.show and not item.infoLabels['tvshowtitle']: itemlist.append(item.clone(title=title % config.get_localized_string(70508), action="abandomoviez_search")) if item.contextual: global window_select, result select = Select("DialogSelect.xml", config.get_runtime_path(), item=item, itemlist=itemlist, caption=config.get_localized_string(70506) + item.contentTitle) window_select.append(select) select.doModal() if item.windowed: return result, window_select else: return itemlist def manual_search(item): logger.info() texto = platformtools.dialog_input(default=item.contentTitle, heading=config.get_localized_string(30112)) if texto is not None: if item.extra == "abandomoviez": return abandomoviez_search(item.clone(contentTitle=texto, page="", year="")) elif item.extra == "youtube": return youtube_search(item.clone(contentTitle=texto, page="")) elif item.extra == "filmaffinity": return filmaffinity_search(item.clone(contentTitle=texto, page="", year="")) def tmdb_trailers(item, tipo="movie"): logger.info() from core.tmdb import Tmdb itemlist = [] tmdb_search = None if item.infoLabels['tmdb_id']: tmdb_search = Tmdb(id_Tmdb=item.infoLabels['tmdb_id'], tipo=tipo, idioma_busqueda=def_lang) elif item.infoLabels['year']: tmdb_search = Tmdb(texto_buscado=item.contentTitle, tipo=tipo, year=item.infoLabels['year']) if tmdb_search: for result in tmdb_search.get_videos(): title = result['name'] + " [" + result['size'] + "p] (" + result['language'].replace("en", "ING") \ .replace("it", "ITA") + ") [tmdb/youtube]" itemlist.append(item.clone(action="play", title=title, url=result['url'], server="youtube")) return itemlist def youtube_search(item): logger.info() itemlist = [] titulo = item.contentTitle if item.extra != "youtube": titulo += " trailer" # Comprueba si es una búsqueda de cero o viene de la opción Siguiente if item.page != "": data = httptools.downloadpage(item.page).data else: titulo = urllib.quote(titulo) titulo = titulo.replace("%20", "+") data = httptools.downloadpage("https://www.youtube.com/results?sp=EgIQAQ%253D%253D&q=" + titulo).data patron = 'thumbnails":\[\{"url":"(https://i.ytimg.com/vi[^"]+).*?' patron += 'text":"([^"]+).*?' patron += 'simpleText":"[^"]+.*?simpleText":"([^"]+).*?' patron += 'url":"([^"]+)' matches = scrapertools.find_multiple_matches(data, patron) for scrapedthumbnail, scrapedtitle, scrapedduration, scrapedurl in matches: scrapedtitle = scrapedtitle.decode('utf8').encode('utf8') scrapedtitle = scrapedtitle + " (" + scrapedduration + ")" if item.contextual: scrapedtitle = "%s" % scrapedtitle url = urlparse.urljoin('https://www.youtube.com/', scrapedurl) itemlist.append(item.clone(title=scrapedtitle, action="play", server="youtube", url=url, thumbnail=scrapedthumbnail)) next_page = scrapertools.find_single_match(data, ']+>' 'Siguiente') if next_page != "": next_page = urlparse.urljoin("https://www.youtube.com", next_page) itemlist.append(item.clone(title=config.get_localized_string(70502), action="youtube_search", extra="youtube", page=next_page, thumbnail="", text_color="")) if not itemlist: itemlist.append(item.clone(title=config.get_localized_string(70501) % titulo, action="", thumbnail="", text_color="")) if keyboard: if item.contextual: title = "%s" else: title = "%s" itemlist.append(item.clone(title=title % config.get_localized_string(70510), action="manual_search", thumbnail="", extra="youtube")) return itemlist def abandomoviez_search(item): logger.info() # Comprueba si es una búsqueda de cero o viene de la opción Siguiente if item.page != "": data = httptools.downloadpage(item.page).data else: titulo = item.contentTitle.decode('utf-8').encode('iso-8859-1') post = urllib.urlencode({'query': titulo, 'searchby': '1', 'posicion': '1', 'orden': '1', 'anioin': item.year, 'anioout': item.year, 'orderby': '1'}) url = "http://www.abandomoviez.net/db/busca_titulo.php?busco2=%s" %item.contentTitle item.prefix = "db/" data = httptools.downloadpage(url, post=post).data if "No hemos encontrado ninguna" in data: url = "http://www.abandomoviez.net/indie/busca_titulo.php?busco2=%s" %item.contentTitle item.prefix = "indie/" data = httptools.downloadpage(url, post=post).data.decode("iso-8859-1").encode('utf-8') itemlist = [] patron = '(?:).*?(.*?)(?:<\/td>|<\/small>)' matches = scrapertools.find_multiple_matches(data, patron) # Si solo hay un resultado busca directamente los trailers, sino lista todos los resultados if len(matches) == 1: item.url = urlparse.urljoin("http://www.abandomoviez.net/%s" % item.prefix, matches[0][1]) item.thumbnail = matches[0][0] itemlist = search_links_abando(item) elif len(matches) > 1: for scrapedthumbnail, scrapedurl, scrapedtitle in matches: scrapedurl = urlparse.urljoin("http://www.abandomoviez.net/%s" % item.prefix, scrapedurl) scrapedtitle = scrapertools.htmlclean(scrapedtitle) itemlist.append(item.clone(title=scrapedtitle, action="search_links_abando", url=scrapedurl, thumbnail=scrapedthumbnail)) next_page = scrapertools.find_single_match(data, 'Siguiente') if next_page != "": next_page = urlparse.urljoin("http://www.abandomoviez.net/%s" % item.prefix, next_page) itemlist.append(item.clone(title=config.get_localized_string(70502), action="abandomoviez_search", page=next_page, thumbnail="", text_color="")) if not itemlist: itemlist.append(item.clone(title=config.get_localized_string(70501), action="", thumbnail="", text_color="")) if keyboard: if item.contextual: title = "%s" else: title = "%s" itemlist.append(item.clone(title=title % config.get_localized_string(70511), action="manual_search", thumbnail="", extra="abandomoviez")) return itemlist def search_links_abando(item): logger.info() data = httptools.downloadpage(item.url).data itemlist = [] if "Lo sentimos, no tenemos trailer" in data: itemlist.append(item.clone(title=config.get_localized_string(70503), action="", text_color="")) else: if item.contextual: progreso = platformtools.dialog_progress(config.get_localized_string(70512), config.get_localized_string(70504)) progreso.update(10) i = 0 message = config.get_localized_string(70504) patron = '
(.*?)' matches = scrapertools.find_multiple_matches(data, patron) if len(matches) == 0: trailer_url = scrapertools.find_single_match(data, ']+>(.*?) 1: for scrapedthumbnail, id, scrapedtitle in matches: if not scrapedthumbnail.startswith("http"): scrapedthumbnail = "http://www.filmaffinity.com" + scrapedthumbnail scrapedurl = "http://www.filmaffinity.com/es/evideos.php?movie_id=%s" % id if PY3: scrapedtitle = unicode(scrapedtitle, encoding="utf-8", errors="ignore") scrapedtitle = scrapertools.htmlclean(scrapedtitle) itemlist.append(item.clone(title=scrapedtitle, url=scrapedurl, action="search_links_filmaff", thumbnail=scrapedthumbnail)) next_page = scrapertools.find_single_match(data, '>>') if next_page != "": next_page = urlparse.urljoin("http://www.filmaffinity.com/es/", next_page) itemlist.append(item.clone(title=config.get_localized_string(70502), page=next_page, action="filmaffinity_search", thumbnail="", text_color="")) if not itemlist: itemlist.append(item.clone(title=config.get_localized_string(70501) % item.contentTitle, action="", thumbnail="", text_color="")) if keyboard: if item.contextual: title = "%s" else: title = "%s" itemlist.append(item.clone(title=title % config.get_localized_string(70513), action="manual_search", thumbnail="", extra="filmaffinity")) return itemlist def search_links_filmaff(item): logger.info() itemlist = [] data = httptools.downloadpage(item.url).data if not '