# -*- coding: utf-8 -*- # -------------------------------------------------------------------------------- # Search trailers from youtube, filmaffinity, abandomoviez, vimeo, etc... # -------------------------------------------------------------------------------- import re import urllib import urlparse import xbmcaddon from core import httptools from core import scrapertools from core import servertools from core.item import Item from platformcode import config, logger from platformcode import platformtools addon = xbmcaddon.Addon('metadata.themoviedb.org') def_lang = addon.getSetting('language') 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 type(item.context) is str and "buscar_trailer" in item.context: item.context = item.context.replace("buscar_trailer", "") elif type(item.context) is list and "buscar_trailer" in item.context: item.context.remove("buscar_trailer") item.text_color = "" itemlist = [] if item.contentTitle != "": item.contentTitle = item.contentTitle.strip() elif keyboard: fulltitle = re.sub('\[\/*(B|I|COLOR)\s*[^\]]*\]', '', item.fulltitle.strip()) item.contentTitle = platformtools.dialog_input(default=fulltitle, heading=config.get_localized_string(70505)) if item.contentTitle is None: item.contentTitle = fulltitle else: item.contentTitle = item.contentTitle.strip() else: fulltitle = re.sub('\[\/*(B|I|COLOR)\s*[^\]]*\]', '', item.fulltitle.strip()) item.contentTitle = fulltitle 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 = "[COLOR green]%s[/COLOR]" else: title = "%s" itemlist.append(item.clone(title=title % config.get_localized_string(70507), action="youtube_search", text_color="green")) itemlist.append(item.clone(title=title % config.get_localized_string(70024), action="filmaffinity_search", text_color="green")) # 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", text_color="green")) 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("es", "ESP") + ") [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 data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) patron = """"thumbnails":\[\{"url":"(https://i.ytimg.com/vi[^"]+).*?""" patron += """simpleText":"([^"]+).*?""" 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 = "[COLOR white]%s[/COLOR]" % scrapedtitle url = urlparse.urljoin('https://www.youtube.com/', scrapedurl) itemlist.append(item.clone(title=scrapedtitle, action="play", server="youtube", url=url, thumbnail=scrapedthumbnail, text_color="white")) next_page = scrapertools.find_single_match(data, ']+>