525 lines
20 KiB
Python
525 lines
20 KiB
Python
# -*- coding: utf-8 -*-
|
|
# ------------------------------------------------------------
|
|
# Mediaserver Launcher
|
|
# ------------------------------------------------------------
|
|
|
|
import os
|
|
import sys
|
|
|
|
from core import channeltools
|
|
from core import servertools
|
|
from core import videolibrarytools
|
|
from core.item import Item
|
|
from platformcode import config, platformtools, logger
|
|
|
|
|
|
def start():
|
|
""" Primera funcion que se ejecuta al entrar en el plugin.
|
|
Dentro de esta funcion deberian ir todas las llamadas a las
|
|
funciones que deseamos que se ejecuten nada mas abrir el plugin.
|
|
"""
|
|
logger.info()
|
|
|
|
# Test if all the required directories are created
|
|
config.verify_directories_created()
|
|
import videolibrary_service
|
|
videolibrary_service.start()
|
|
|
|
|
|
def run(item):
|
|
itemlist = []
|
|
# Muestra el item en el log:
|
|
print_items(item)
|
|
|
|
# Control Parental, comprueba si es adulto o no
|
|
if item.action == "mainlist":
|
|
# Parental control
|
|
if channeltools.is_adult(item.channel) and config.get_setting("adult_request_password"):
|
|
tecleado = platformtools.dialog_input("", "Contraseña para canales de adultos", True)
|
|
if tecleado is None or tecleado != config.get_setting("adult_password"):
|
|
platformtools.render_items(None, item)
|
|
return
|
|
|
|
# Importa el canal para el item, todo item debe tener un canal, sino sale de la función
|
|
if item.channel:
|
|
channelmodule = import_channel(item)
|
|
|
|
# If item has no action, stops here
|
|
if item.action == "":
|
|
logger.info("Item sin accion")
|
|
itemlist = None
|
|
|
|
# Action Play, para mostrar el menú con las opciones de reproduccion.
|
|
elif item.action == "play":
|
|
logger.info("play")
|
|
# Si el canal tiene una acción "play" tiene prioridad
|
|
if hasattr(channelmodule, 'play'):
|
|
logger.info("executing channel 'play' method")
|
|
itemlist = channelmodule.play(item)
|
|
b_favourite = item.isFavourite
|
|
if len(itemlist) > 0 and isinstance(itemlist[0], Item):
|
|
item = itemlist[0]
|
|
if b_favourite:
|
|
item.isFavourite = True
|
|
play_menu(item)
|
|
elif len(itemlist) > 0 and isinstance(itemlist[0], list):
|
|
item.video_urls = itemlist
|
|
play_menu(item)
|
|
else:
|
|
platformtools.dialog_ok("plugin", "No hay nada para reproducir")
|
|
else:
|
|
logger.info("no channel 'play' method, executing core method")
|
|
play_menu(item)
|
|
|
|
itemlist = None
|
|
|
|
# Action Search, para mostrar el teclado y lanzar la busqueda con el texto indicado.
|
|
elif item.action == "search":
|
|
logger.info("search")
|
|
tecleado = platformtools.dialog_input()
|
|
if tecleado:
|
|
itemlist = channelmodule.search(item, tecleado)
|
|
else:
|
|
itemlist = []
|
|
|
|
elif item.channel == "channelselector":
|
|
import channelselector
|
|
if item.action == "mainlist":
|
|
itemlist = channelselector.getmainlist("banner_")
|
|
|
|
# if config.get_setting("check_for_plugin_updates"):
|
|
# logger.info("channelselector.mainlist Verificar actualizaciones activado")
|
|
#
|
|
# from core import updater
|
|
# try:
|
|
# version = updater.checkforupdates()
|
|
#
|
|
# if version:
|
|
# platformtools.dialog_ok("Versión " + version + " disponible",
|
|
# "Ya puedes descargar la nueva versión del plugin\ndesde el listado principal")
|
|
# itemlist.insert(0, Item(title="Actualizar Alfa a la versión " + version, version=version,
|
|
# channel="updater", action="update",
|
|
# thumbnail=os.path.join(config.get_runtime_path(), "resources", "images",
|
|
# "banner", "thumb_update.png")))
|
|
# except:
|
|
# platformtools.dialog_ok("No se puede conectar", "No ha sido posible comprobar",
|
|
# "si hay actualizaciones")
|
|
# logger.info("Fallo al verificar la actualización")
|
|
#
|
|
# else:
|
|
# logger.info("Verificar actualizaciones desactivado")
|
|
|
|
if item.action == "getchanneltypes":
|
|
itemlist = channelselector.getchanneltypes("banner_")
|
|
if item.action == "filterchannels":
|
|
itemlist = channelselector.filterchannels(item.channel_type, "banner_")
|
|
|
|
# Todas las demas las intenta ejecturaren el siguiente orden:
|
|
# 1. En el canal
|
|
# 2. En el launcher
|
|
# 3. Si no existe en el canal ni en el launcher guarda un error en el log
|
|
else:
|
|
# Si existe la funcion en el canal la ejecuta
|
|
if hasattr(channelmodule, item.action):
|
|
logger.info("Ejectuando accion: " + item.channel + "." + item.action + "(item)")
|
|
exec "itemlist = channelmodule." + item.action + "(item)"
|
|
|
|
# Si existe la funcion en el launcher la ejecuta
|
|
elif hasattr(sys.modules[__name__], item.action):
|
|
logger.info("Ejectuando accion: " + item.action + "(item)")
|
|
exec "itemlist =" + item.action + "(item)"
|
|
|
|
# Si no existe devuelve un error
|
|
else:
|
|
logger.info(
|
|
"No se ha encontrado la accion [" + item.action + "] en el canal [" + item.channel + "] ni en el launcher")
|
|
|
|
# Llegados a este punto ya tenemos que tener el itemlist con los resultados correspondientes
|
|
# Pueden darse 3 escenarios distintos:
|
|
# 1. la función ha generado resultados y estan en el itemlist
|
|
# 2. la función no ha generado resultados y por tanto el itemlist contiene 0 items, itemlist = []
|
|
# 3. la función realiza alguna accion con la cual no se generan nuevos items, en ese caso el resultado deve ser: itemlist = None para que no modifique el listado
|
|
# A partir de aquí ya se ha ejecutado la funcion en el lugar adecuado, si queremos realizar alguna acción sobre los resultados, este es el lugar.
|
|
|
|
|
|
|
|
# Filtrado de Servers
|
|
if item.action == "findvideos":
|
|
itemlist = servertools.filter_servers(itemlist)
|
|
|
|
# Si la accion no ha devuelto ningún resultado, añade un item con el texto "No hay elementos para mostrar"
|
|
if type(itemlist) == list:
|
|
if len(itemlist) == 0:
|
|
from channelselector import get_thumb
|
|
itemlist = [Item(title="No hay elementos para mostrar", thumbnail=get_thumb("error.png"))]
|
|
|
|
# Imprime en el log el resultado
|
|
print_items(itemlist)
|
|
|
|
# Muestra los resultados en pantalla
|
|
platformtools.render_items(itemlist, item)
|
|
|
|
|
|
def import_channel(item):
|
|
channel = item.channel
|
|
channelmodule = ""
|
|
if os.path.exists(os.path.join(config.get_runtime_path(), "channels", channel + ".py")):
|
|
exec "from channels import " + channel + " as channelmodule"
|
|
elif os.path.exists(os.path.join(config.get_runtime_path(), "core", channel + ".py")):
|
|
exec "from core import " + channel + " as channelmodule"
|
|
elif os.path.exists(os.path.join(config.get_runtime_path(), channel + ".py")):
|
|
exec "import " + channel + " as channelmodule"
|
|
return channelmodule
|
|
|
|
|
|
def print_items(itemlist):
|
|
if type(itemlist) == list:
|
|
if len(itemlist) > 0:
|
|
logger.info("Items devueltos")
|
|
logger.info("-----------------------------------------------------------------------")
|
|
for item in itemlist:
|
|
logger.info(item.tostring())
|
|
logger.info("-----------------------------------------------------------------------")
|
|
else:
|
|
item = itemlist
|
|
logger.info("-----------------------------------------------------------------------")
|
|
logger.info(item.tostring())
|
|
logger.info("-----------------------------------------------------------------------")
|
|
|
|
|
|
def findvideos(item):
|
|
logger.info()
|
|
itemlist = servertools.find_video_items(item)
|
|
return itemlist
|
|
|
|
|
|
def add_pelicula_to_library(item):
|
|
videolibrarytools.add_movie(item)
|
|
|
|
|
|
def add_serie_to_library(item):
|
|
channel = import_channel(item)
|
|
videolibrarytools.add_tvshow(item, channel)
|
|
|
|
|
|
def download_all_episodes(item, first_episode="", preferred_server="vidspot", filter_language=""):
|
|
logger.info("show=" + item.show)
|
|
channel = import_channel(item)
|
|
show_title = item.show
|
|
|
|
# Obtiene el listado desde el que se llamó
|
|
action = item.extra
|
|
|
|
# Esta marca es porque el item tiene algo más aparte en el atributo "extra"
|
|
if "###" in item.extra:
|
|
action = item.extra.split("###")[0]
|
|
item.extra = item.extra.split("###")[1]
|
|
|
|
exec "episode_itemlist = channel." + action + "(item)"
|
|
|
|
# Ordena los episodios para que funcione el filtro de first_episode
|
|
episode_itemlist = sorted(episode_itemlist, key=lambda Item: Item.title)
|
|
|
|
from core import downloadtools
|
|
from core import scrapertools
|
|
|
|
best_server = preferred_server
|
|
worst_server = "moevideos"
|
|
|
|
# Para cada episodio
|
|
if first_episode == "":
|
|
empezar = True
|
|
else:
|
|
empezar = False
|
|
|
|
for episode_item in episode_itemlist:
|
|
try:
|
|
logger.info("episode=" + episode_item.title)
|
|
episode_title = scrapertools.get_match(episode_item.title, "(\d+x\d+)")
|
|
logger.info("episode=" + episode_title)
|
|
except:
|
|
import traceback
|
|
logger.error(traceback.format_exc())
|
|
continue
|
|
|
|
if first_episode != "" and episode_title == first_episode:
|
|
empezar = True
|
|
|
|
if episodio_ya_descargado(show_title, episode_title):
|
|
continue
|
|
|
|
if not empezar:
|
|
continue
|
|
|
|
# Extrae los mirrors
|
|
try:
|
|
mirrors_itemlist = channel.findvideos(episode_item)
|
|
except:
|
|
mirrors_itemlist = servertools.find_video_items(episode_item)
|
|
print mirrors_itemlist
|
|
|
|
descargado = False
|
|
|
|
new_mirror_itemlist_1 = []
|
|
new_mirror_itemlist_2 = []
|
|
new_mirror_itemlist_3 = []
|
|
new_mirror_itemlist_4 = []
|
|
new_mirror_itemlist_5 = []
|
|
new_mirror_itemlist_6 = []
|
|
|
|
for mirror_item in mirrors_itemlist:
|
|
|
|
# Si está en español va al principio, si no va al final
|
|
if "(Español)" in mirror_item.title:
|
|
if best_server in mirror_item.title.lower():
|
|
new_mirror_itemlist_1.append(mirror_item)
|
|
else:
|
|
new_mirror_itemlist_2.append(mirror_item)
|
|
elif "(Latino)" in mirror_item.title:
|
|
if best_server in mirror_item.title.lower():
|
|
new_mirror_itemlist_3.append(mirror_item)
|
|
else:
|
|
new_mirror_itemlist_4.append(mirror_item)
|
|
elif "(VOS)" in mirror_item.title:
|
|
if best_server in mirror_item.title.lower():
|
|
new_mirror_itemlist_3.append(mirror_item)
|
|
else:
|
|
new_mirror_itemlist_4.append(mirror_item)
|
|
else:
|
|
if best_server in mirror_item.title.lower():
|
|
new_mirror_itemlist_5.append(mirror_item)
|
|
else:
|
|
new_mirror_itemlist_6.append(mirror_item)
|
|
|
|
mirrors_itemlist = new_mirror_itemlist_1 + new_mirror_itemlist_2 + new_mirror_itemlist_3 + new_mirror_itemlist_4 + new_mirror_itemlist_5 + new_mirror_itemlist_6
|
|
|
|
for mirror_item in mirrors_itemlist:
|
|
logger.info("mirror=" + mirror_item.title)
|
|
|
|
if "(Español)" in mirror_item.title:
|
|
idioma = "(Español)"
|
|
codigo_idioma = "es"
|
|
elif "(Latino)" in mirror_item.title:
|
|
idioma = "(Latino)"
|
|
codigo_idioma = "lat"
|
|
elif "(VOS)" in mirror_item.title:
|
|
idioma = "(VOS)"
|
|
codigo_idioma = "vos"
|
|
elif "(VO)" in mirror_item.title:
|
|
idioma = "(VO)"
|
|
codigo_idioma = "vo"
|
|
else:
|
|
idioma = "(Desconocido)"
|
|
codigo_idioma = "desconocido"
|
|
|
|
logger.info("filter_language=#" + filter_language + "#, codigo_idioma=#" + codigo_idioma + "#")
|
|
if filter_language == "" or (filter_language != "" and filter_language == codigo_idioma):
|
|
logger.info("downloading mirror")
|
|
else:
|
|
logger.info("language " + codigo_idioma + " filtered, skipping")
|
|
continue
|
|
|
|
if hasattr(channel, 'play'):
|
|
video_items = channel.play(mirror_item)
|
|
else:
|
|
video_items = [mirror_item]
|
|
|
|
if len(video_items) > 0:
|
|
video_item = video_items[0]
|
|
|
|
# Comprueba que esté disponible
|
|
video_urls, puedes, motivo = servertools.resolve_video_urls_for_playing(video_item.server,
|
|
video_item.url,
|
|
video_password="",
|
|
muestra_dialogo=False)
|
|
|
|
# Lo añade a la lista de descargas
|
|
if puedes:
|
|
logger.info("downloading mirror started...")
|
|
# El vídeo de más calidad es el último
|
|
mediaurl = video_urls[len(video_urls) - 1][1]
|
|
devuelve = downloadtools.downloadbest(video_urls,
|
|
show_title + " " + episode_title + " " + idioma + " [" + video_item.server + "]",
|
|
continuar=False)
|
|
|
|
if devuelve == 0:
|
|
logger.info("download ok")
|
|
descargado = True
|
|
break
|
|
elif devuelve == -1:
|
|
try:
|
|
|
|
platformtools.dialog_ok("plugin", "Descarga abortada")
|
|
except:
|
|
pass
|
|
return
|
|
else:
|
|
logger.info("download error, try another mirror")
|
|
continue
|
|
|
|
else:
|
|
logger.info("downloading mirror not available... trying next")
|
|
|
|
if not descargado:
|
|
logger.info("EPISODIO NO DESCARGADO " + episode_title)
|
|
|
|
|
|
def add_to_favorites(item):
|
|
# Proviene del menu contextual:
|
|
if "item_action" in item:
|
|
item.action = item.item_action
|
|
del item.item_action
|
|
item.context = []
|
|
|
|
from channels import favorites
|
|
from core import downloadtools
|
|
if not item.fulltitle: item.fulltitle = item.title
|
|
title = platformtools.dialog_input(
|
|
default=downloadtools.limpia_nombre_excepto_1(item.fulltitle) + " [" + item.channel + "]")
|
|
if title is not None:
|
|
item.title = title
|
|
favorites.addFavourite(item)
|
|
platformtools.dialog_ok("Alfa", config.get_localized_string(
|
|
30102) + "\n" + item.title + "\n" + config.get_localized_string(30108))
|
|
return
|
|
|
|
|
|
def remove_from_favorites(item):
|
|
from channels import favorites
|
|
# En "extra" está el nombre del fichero en favoritos
|
|
favorites.delFavourite(item.extra)
|
|
platformtools.dialog_ok("Alfa",
|
|
config.get_localized_string(30102) + "\n" + item.title + "\n" + config.get_localized_string(
|
|
30105))
|
|
platformtools.itemlist_refresh()
|
|
return
|
|
|
|
|
|
def download(item):
|
|
from channels import downloads
|
|
if item.contentType == "list" or item.contentType == "tvshow":
|
|
item.contentType = "video"
|
|
item.play_menu = True
|
|
downloads.save_download(item)
|
|
return
|
|
|
|
|
|
def add_to_library(item):
|
|
if "item_action" in item:
|
|
item.action = item.item_action
|
|
del item.item_action
|
|
|
|
if not item.fulltitle == "":
|
|
item.title = item.fulltitle
|
|
videolibrarytools.savelibrary(item)
|
|
platformtools.dialog_ok("Alfa",
|
|
config.get_localized_string(30101) + "\n" + item.title + "\n" + config.get_localized_string(
|
|
30135))
|
|
return
|
|
|
|
|
|
def delete_file(item):
|
|
os.remove(item.url)
|
|
platformtools.itemlist_refresh()
|
|
return
|
|
|
|
|
|
def search_trailer(item):
|
|
config.set_setting("subtitulo", False)
|
|
item.channel = "trailertools"
|
|
item.action = "buscartrailer"
|
|
item.contextual = True
|
|
run(item)
|
|
return
|
|
|
|
|
|
# Crea la lista de opciones para el menu de reproduccion
|
|
def check_video_options(item, video_urls):
|
|
itemlist = []
|
|
# Opciones Reproducir
|
|
playable = (len(video_urls) > 0)
|
|
|
|
for video_url in video_urls:
|
|
itemlist.append(
|
|
item.clone(option=config.get_localized_string(30151) + " " + video_url[0], video_url=video_url[1],
|
|
action="play_video"))
|
|
|
|
if item.server == "local":
|
|
itemlist.append(item.clone(option=config.get_localized_string(30164), action="delete_file"))
|
|
|
|
if not item.server == "local" and playable:
|
|
itemlist.append(item.clone(option=config.get_localized_string(30153), action="download", video_urls=video_urls))
|
|
|
|
if item.channel == "favorites":
|
|
itemlist.append(item.clone(option=config.get_localized_string(30154), action="remove_from_favorites"))
|
|
|
|
if not item.channel == "favorites" and playable:
|
|
itemlist.append(
|
|
item.clone(option=config.get_localized_string(30155), action="add_to_favorites", item_action=item.action))
|
|
|
|
if not item.strmfile and playable and item.contentType == "movie":
|
|
itemlist.append(
|
|
item.clone(option=config.get_localized_string(30161), action="add_to_library", item_action=item.action))
|
|
|
|
if not item.channel in ["Trailer", "ecarteleratrailers"] and playable:
|
|
itemlist.append(item.clone(option=config.get_localized_string(30162), action="search_trailer"))
|
|
|
|
return itemlist
|
|
|
|
|
|
# play_menu, abre el menu con las opciones para reproducir
|
|
def play_menu(item):
|
|
if item.server == "": item.server = "directo"
|
|
|
|
if item.video_urls:
|
|
video_urls, puedes, motivo = item.video_urls, True, ""
|
|
else:
|
|
video_urls, puedes, motivo = servertools.resolve_video_urls_for_playing(item.server, item.url, item.password,
|
|
True)
|
|
|
|
if not "strmfile" in item: item.strmfile = False
|
|
# TODO: unificar show y Serie ya que se usan indistintamente.
|
|
if not "Serie" in item: item.Serie = item.show
|
|
if item.server == "": item.server = "directo"
|
|
|
|
opciones = check_video_options(item, video_urls)
|
|
if not puedes:
|
|
if item.server != "directo":
|
|
motivo = motivo.replace("<br/>", "\n")
|
|
platformtools.dialog_ok("No puedes ver ese vídeo porque...", motivo + "\n" + item.url)
|
|
else:
|
|
platformtools.dialog_ok("No puedes ver ese vídeo porque...",
|
|
"El servidor donde está alojado no está\nsoportado en Alfa todavía\n" + item.url)
|
|
|
|
if len(opciones) == 0:
|
|
return
|
|
|
|
default_action = config.get_setting("default_action")
|
|
logger.info("default_action=%s" % (default_action))
|
|
# Si la accion por defecto es "Preguntar", pregunta
|
|
if default_action == 0:
|
|
seleccion = platformtools.dialog_select(config.get_localized_string(30163),
|
|
[opcion.option for opcion in opciones])
|
|
elif default_action == 1:
|
|
seleccion = 0
|
|
elif default_action == 2:
|
|
seleccion = len(video_urls) - 1
|
|
elif default_action == 3:
|
|
seleccion = seleccion
|
|
else:
|
|
seleccion = 0
|
|
|
|
if seleccion > -1:
|
|
logger.info("seleccion=%d" % seleccion)
|
|
logger.info("seleccion=%s" % opciones[seleccion].option)
|
|
selecteditem = opciones[seleccion]
|
|
del selecteditem.option
|
|
run(opciones[seleccion])
|
|
|
|
return
|
|
|
|
|
|
# play_video, Llama a la función especifica de la plataforma para reproducir
|
|
def play_video(item):
|
|
platformtools.play_video(item)
|