# -*- coding: utf-8 -*- import base64 import re import urllib import urlparse 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 from channelselector import get_thumb host = "https://hdfull.me" if config.get_setting('hdfulluser', 'hdfull'): account = True else: account = False def settingCanal(item): return platformtools.show_channel_settings() def login(): logger.info() data = agrupa_datos(httptools.downloadpage(host).data) patron = "" sid = scrapertools.find_single_match(data, patron) post = urllib.urlencode({'__csrf_magic': sid}) + "&username=" + config.get_setting('hdfulluser', 'hdfull') + "&password=" + config.get_setting( 'hdfullpassword', 'hdfull') + "&action=login" httptools.downloadpage(host, post=post) def mainlist(item): logger.info() itemlist = [] itemlist.append(Item(channel=item.channel, action="menupeliculas", title="Películas", url=host, folder=True, thumbnail=get_thumb('movies', auto=True),)) itemlist.append(Item(channel=item.channel, action="menuseries", title="Series", url=host, folder=True, thumbnail=get_thumb('tvshows', auto=True),)) itemlist.append(Item(channel=item.channel, action="search", title="Buscar...", thumbnail=get_thumb('search', auto=True),)) if not account: itemlist.append(Item(channel=item.channel, title="[COLOR orange][B]Habilita tu cuenta para activar los items de usuario...[/B][/COLOR]", action="settingCanal", url="")) else: login() itemlist.append(Item(channel=item.channel, action="settingCanal", title="Configuración...", url="")) return itemlist def menupeliculas(item): logger.info() itemlist = [] if account: itemlist.append(Item(channel=item.channel, action="items_usuario", title="[COLOR orange][B]Favoritos[/B][/COLOR]", url=host + "/a/my?target=movies&action=favorite&start=-28&limit=28", folder=True)) itemlist.append(Item(channel=item.channel, action="items_usuario", title="[COLOR orange][B]Pendientes[/B][/COLOR]", url=host + "/a/my?target=movies&action=pending&start=-28&limit=28", folder=True)) itemlist.append(Item(channel=item.channel, action="fichas", title="ABC", url=host + "/peliculas/abc", folder=True)) itemlist.append( Item(channel=item.channel, action="fichas", title="Últimas películas", url=host + "/peliculas", folder=True)) itemlist.append( Item(channel=item.channel, action="fichas", title="Películas Estreno", url=host + "/peliculas-estreno", folder=True)) itemlist.append(Item(channel=item.channel, action="fichas", title="Películas Actualizadas", url=host + "/peliculas-actualizadas", folder=True)) itemlist.append( Item(channel=item.channel, action="fichas", title="Rating IMDB", url=host + "/peliculas/imdb_rating", folder=True)) itemlist.append(Item(channel=item.channel, action="generos", title="Películas por Género", url=host, folder=True)) if account: itemlist.append(Item(channel=item.channel, action="items_usuario", title="[COLOR orange][B]Vistas[/B][/COLOR]", url=host + "/a/my?target=movies&action=seen&start=-28&limit=28", folder=True)) return itemlist def menuseries(item): logger.info() itemlist = [] if account: itemlist.append(Item(channel=item.channel, action="items_usuario", title="[COLOR orange][B]Siguiendo[/B][/COLOR]", url=host + "/a/my?target=shows&action=following&start=-28&limit=28", folder=True)) itemlist.append(Item(channel=item.channel, action="items_usuario", title="[COLOR orange][B]Para Ver[/B][/COLOR]", url=host + "/a/my?target=shows&action=watch&start=-28&limit=28", folder=True)) itemlist.append(Item(channel=item.channel, action="series_abc", title="A-Z", folder=True)) itemlist.append(Item(channel=item.channel, action="novedades_episodios", title="Últimos Emitidos", url=host + "/a/episodes?action=latest&start=-24&limit=24&elang=ALL", folder=True)) itemlist.append(Item(channel=item.channel, action="novedades_episodios", title="Episodios Estreno", url=host + "/a/episodes?action=premiere&start=-24&limit=24&elang=ALL", folder=True)) itemlist.append(Item(channel=item.channel, action="novedades_episodios", title="Episodios Actualizados", url=host + "/a/episodes?action=updated&start=-24&limit=24&elang=ALL", folder=True)) itemlist.append( Item(channel=item.channel, action="fichas", title="Últimas series", url=host + "/series", folder=True)) itemlist.append( Item(channel=item.channel, action="fichas", title="Rating IMDB", url=host + "/series/imdb_rating", folder=True)) itemlist.append( Item(channel=item.channel, action="generos_series", title="Series por Género", url=host, folder=True)) itemlist.append(Item(channel=item.channel, action="listado_series", title="Listado de todas las series", url=host + "/series/list", folder=True)) if account: itemlist.append(Item(channel=item.channel, action="items_usuario", title="[COLOR orange][B]Favoritas[/B][/COLOR]", url=host + "/a/my?target=shows&action=favorite&start=-28&limit=28", folder=True)) itemlist.append(Item(channel=item.channel, action="items_usuario", title="[COLOR orange][B]Pendientes[/B][/COLOR]", url=host + "/a/my?target=shows&action=pending&start=-28&limit=28", folder=True)) itemlist.append(Item(channel=item.channel, action="items_usuario", title="[COLOR orange][B]Vistas[/B][/COLOR]", url=host + "/a/my?target=shows&action=seen&start=-28&limit=28", folder=True)) return itemlist def search(item, texto): logger.info() data = agrupa_datos(httptools.downloadpage(host).data) sid = scrapertools.get_match(data, '.__csrf_magic. value="(sid:[^"]+)"') item.extra = urllib.urlencode({'__csrf_magic': sid}) + '&menu=search&query=' + texto item.title = "Buscar..." item.url = host + "/buscar" try: return fichas(item) # Se captura la excepción, para no interrumpir al buscador global si un canal falla except: import sys for line in sys.exc_info(): logger.error("%s" % line) return [] def series_abc(item): logger.info() itemlist = [] az = "ABCDEFGHIJKLMNOPQRSTUVWXYZ#" for l in az: itemlist.append( Item(channel=item.channel, action='fichas', title=l, url=host + "/series/abc/" + l.replace('#', '9'))) return itemlist def items_usuario(item): logger.info() itemlist = [] ## Carga estados status = jsontools.load(httptools.downloadpage(host + '/a/status/all').data) ## Fichas usuario url = item.url.split("?")[0] post = item.url.split("?")[1] old_start = scrapertools.get_match(post, 'start=([^&]+)&') limit = scrapertools.get_match(post, 'limit=(\d+)') start = "%s" % (int(old_start) + int(limit)) post = post.replace("start=" + old_start, "start=" + start) next_page = url + "?" + post ## Carga las fichas de usuario data = httptools.downloadpage(url, post=post).data fichas_usuario = jsontools.load(data) for ficha in fichas_usuario: try: title = ficha['title']['es'].strip() except: title = ficha['title']['en'].strip() try: title = title.encode('utf-8') except: pass show = title try: thumbnail = host + "/thumbs/" + ficha['thumbnail'] except: thumbnail = host + "/thumbs/" + ficha['thumb'] try: url = urlparse.urljoin(host, '/serie/' + ficha['permalink']) + "###" + ficha['id'] + ";1" action = "episodios" str = get_status(status, 'shows', ficha['id']) if "show_title" in ficha: action = "findvideos" try: serie = ficha['show_title']['es'].strip() except: serie = ficha['show_title']['en'].strip() temporada = ficha['season'] episodio = ficha['episode'] serie = "[COLOR whitesmoke][B]" + serie + "[/B][/COLOR]" if len(episodio) == 1: episodio = '0' + episodio try: title = temporada + "x" + episodio + " - " + serie + ": " + title except: title = temporada + "x" + episodio + " - " + serie.decode('iso-8859-1') + ": " + title.decode( 'iso-8859-1') url = urlparse.urljoin(host, '/serie/' + ficha[ 'permalink'] + '/temporada-' + temporada + '/episodio-' + episodio) + "###" + ficha['id'] + ";3" except: url = urlparse.urljoin(host, '/pelicula/' + ficha['perma']) + "###" + ficha['id'] + ";2" action = "findvideos" str = get_status(status, 'movies', ficha['id']) if str != "": title += str itemlist.append( Item(channel=item.channel, action=action, title=title, fulltitle=title, url=url, thumbnail=thumbnail, show=show, folder=True)) if len(itemlist) == int(limit): itemlist.append( Item(channel=item.channel, action="items_usuario", title=">> Página siguiente", url=next_page, folder=True)) return itemlist def listado_series(item): logger.info() itemlist = [] data = agrupa_datos(httptools.downloadpage(item.url).data) patron = '
' matches = re.compile(patron, re.DOTALL).findall(data) for scrapedurl, scrapedtitle in matches: url = scrapedurl + "###0;1" itemlist.append( Item(channel=item.channel, action="episodios", title=scrapedtitle, fulltitle=scrapedtitle, url=url, show=scrapedtitle, contentType="tvshow")) return itemlist def fichas(item): logger.info() itemlist = [] textoidiomas='' infoLabels=dict() ## Carga estados status = jsontools.load(httptools.downloadpage(host + '/a/status/all').data) if item.title == "Buscar...": data = agrupa_datos(httptools.downloadpage(item.url, post=item.extra).data) s_p = scrapertools.get_match(data, '