# -*- coding: utf-8 -*- # -------------------------------------------------------------------------------- # Search trailers from youtube, filmaffinity, mymovies, 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 # It is very slow in PY2. In PY3 it is native import urllib.parse as urlparse else: import urllib # We use the native of PY2 which is faster import urlparse import re from core import httptools, jsontools, scrapertools, servertools from core.support import match, thumb 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 = [] # To enable or disable the manual search option if config.get_platform() != "plex": keyboard = True else: keyboard = False def buscartrailer(item, trailers=[]): logger.debug() # List of actions if run from context menu 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: # Remove Trailer Search option from context menu to avoid redundancies 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 = urllib.unquote_plus(item.search_title) elif item.contentTitle != "": item.contentTitle = item.contentTitle.strip() elif keyboard: contentTitle = re.sub(r'\[\/*(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(r'\[\/*(B|I|COLOR)\s*[^\]]*\]', '', item.contentTitle.strip()) item.contentTitle = contentTitle item.year = item.infoLabels['year'] logger.debug("Search: %s" % item.contentTitle) logger.debug("Year: %s" % item.year) if item.infoLabels['trailer'] and not trailers: url = item.infoLabels['trailer'] if "youtube" in url: url = url.replace("embed/", "watch?v=") title, 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", thumbnail=thumb('search'))) itemlist.append(item.clone(title=title % config.get_localized_string(70508), action="mymovies_search", thumbnail=thumb('search'))) itemlist.append(item.clone(title=title % config.get_localized_string(70024), action="filmaffinity_search", thumbnail=thumb('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.debug() texto = platformtools.dialog_input(default=item.contentTitle, heading=config.get_localized_string(30112)) if texto is not None: if item.extra == "mymovies": return mymovies_search(item.clone(contentTitle=texto)) 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.debug() 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.debug() itemlist = [] title = item.contentTitle if item.extra != "youtube": title += " trailer" # Check if it is a zero search or comes from the Next option if item.page != "": data = httptools.downloadpage(item.page).data else: title = urllib.quote(title) title = title.replace("%20", "+") data = httptools.downloadpage("https://www.youtube.com/results?sp=EgIQAQ%253D%253D&q=" + title).data patron = r'thumbnails":\[\{"url":"(https://i.ytimg.com/vi[^"]+).*?' patron += r'text":"([^"]+).*?' patron += r'simpleText":"[^"]+.*?simpleText":"([^"]+).*?' patron += r'url":"([^"]+)' matches = scrapertools.find_multiple_matches(data, patron) for scrapedthumbnail, scrapedtitle, scrapedduration, scrapedurl in matches: scrapedtitle = scrapedtitle if PY3 else scrapedtitle.decode('utf8').encode('utf8') + " (" + 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, ']+>') if next_page != "": next_page = urlparse.urljoin("https://www.youtube.com", next_page) itemlist.append(item.clone(title=config.get_localized_string(30992), action="youtube_search", extra="youtube", page=next_page, thumbnail=thumb('search'), text_color="")) if not itemlist: itemlist.append(item.clone(title=config.get_localized_string(70501) % title, 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=thumb('search'), extra="youtube")) return itemlist def mymovies_search(item): logger.debug() import json title = item.contentTitle url = 'https://www.mymovies.it/ricerca/ricerca.php?limit=true&q=' + title js = json.loads(httptools.downloadpage(url).data)['risultati']['film']['elenco'] itemlist = [] for it in js: itemlist.append(item.clone(title=it['titolo'], thumbnail=it['immagine'].replace('\\',''), url=it['url'].replace('\\',''), action ='search_links_mymovies')) 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=thumb('search'), extra="mymovies")) return itemlist def search_links_mymovies(item): logger.debug() trailer_url = match(item, patron=r'
  • ]+>]+>(.*?) 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(30992), page=next_page, action="filmaffinity_search", thumbnail=thumb('search'), 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=thumb('search'), extra="filmaffinity")) return itemlist def search_links_filmaff(item): logger.debug() itemlist = [] data = httptools.downloadpage(item.url).data if not '