Buenas Noches,
Aprovecho la ocasion para presentarme a la comunidad, hace muucho tiempo que sigo al xbmc, desde la epoca en que solo era para Xbox, conocia pelisalacarta, pero no llegue a utilizarlo, ahora tras años de tener un WD live aburrido, me he decidido a meterle mano y ha sido cuando me he reencontrado con pelisalacarta.
No quiero dejar de agradecer el gran trabaje de Jesus y el resto de colaboradores.
Bueno al tajo, en primer lugar es lo primero que intento en pyton, y es lo primero que intento en el "Framework" de pelisalacarta, por lo que no tengo muy claro que sirva de mucho, pero al menos espero que sirva para facilitar el trabajo de Jesus y lo pueda completar.
servertools.py a la carpeta servers :
- Código: Seleccionar todo
# -*- coding: utf-8 -*-
#------------------------------------------------------------
# pelisalacarta - XBMC Plugin
# Utilidades para detectar vídeos de los diferentes conectores
# http://blog.tvalacarta.info/plugin-xbmc/pelisalacarta/
#------------------------------------------------------------
import re,sys
from core import scrapertools
from core import config
from core import logger
# Listas de servidores empleadas a la hora de reproducir para explicarle al usuario por qué no puede ver un vídeo
# Lista de los servidores que se pueden ver sin cuenta premium de ningún tipo
FREE_SERVERS = []
FREE_SERVERS.extend(['directo','allmyvideos','adnstream','bliptv','divxstage','downupload','facebook','fourshared'])
FREE_SERVERS.extend(['googlevideo','gigabyteupload','hdplay','filebox','mediafire','modovideo','movshare','novamov','ovfile','putlocker'])
FREE_SERVERS.extend(['rapidtube','royalvids','rutube','sockshare','stagevu','stagero','tutv','userporn','veoh','veevr','videobam'])
FREE_SERVERS.extend(['vidbux','videoweed','vidxden','vimeo','vk','watchfreeinhd','youtube'])
# Lista de TODOS los servidores que funcionan con cuenta premium individual
PREMIUM_SERVERS = ['wupload','fileserve']#,'uploadedto']
# Lista de TODOS los servidores soportados por Filenium
FILENIUM_SERVERS = ['linkto','uploadedto','gigasize','youtube','filepost','hotfile','rapidshare','turbobit','wupload','mediafire','bitshare','depositfiles','oron',
'downupload','allmyvideos','novamov','videoweed','movshare','fooget','letitbit','fileserve','shareonline']
# Lista de TODOS los servidores soportados por Real-Debrid
REALDEBRID_SERVERS = ['tenupload','onefichier','twoshared','fourfastfile','fourshared','abc','badongo','bayfiles','bitshare','bulletupload','cbscom','cramit','crocko','cwtv','dailymotion','dateito',
'dengee','depositfiles','diglo','easybytez','extabit','fileape','filebox','filedino','filefactory','fileflyer','filejungle','filekeen','filemade','fileover','filepost',
'filesend','fileserve','filesmonster','filevelocity','freakshare','free','furk','fyels','gigapeta','gigasize','gigaup','glumbouploads','goldfile','grupload','hitfile',
'hotfile','hulkshare','hulu','ifile','jakfile','jumbofiles','justintv','kickload','letitbit','loadto','mediafire','megashare','megashares','mixturevideo','netload',
'novamov','przeklej','purevid','putlocker','rapidgator','redtube','rapidshare','rutube','scribd','sendspace','shareonline','shareflare','shragle','slingfile','sockshare',
'soundcloud','speedyshare','turbobit','unibytes','uploadboost','uploadc','uploadedto','uploadhere','uploading','uploadking','uploadspace','uploadstation','uptobox',
'userporn','videoweed','vidxden','vimeo','vipfile','wattv','wupload','youporn','youtube','yunfile','zippyshare','zshare']
ALLDEBRID_SERVERS = ['tenupload','onefichier','twoshared','fourfastfile','fourshared','badongo','bayfiles','bitshare','bulletupload','cramit','crocko','dateito','dengee',
'diglo','easybytez','extabit','fileape','filebox','filedino','filefactory','fileflyer','filejungle','filekeen','filemade','fileover','filepost',
'filesend','fileserve','filesmonster','filevelocity','freakshare','free','furk','fyels','gigapeta','gigasize','gigaup','glumbouploads','goldfile','grupload','hitfile',
'hotfile','ifile','jumbofiles','letitbit','loadto','mediafire','megashare','megashares','mixturevideo','netload',
'przeklej','purevid','putlocker','rapidgator','rapidshare','scribd','sendspace','shareonline','shareflare','shragle','slingfile','sockshare',
'soundcloud','speedyshare','turbobit','unibytes', 'uploadc','uploadedto','uploadhere','uploading','uploadking','uploadspace','uploadstation','uptobox',
'userporn','vidxden','vipfile','wupload','youtube','yunfile','zippyshare','zshare'
]
#Resultado de http://alldebrid.com/api.php?action=get_host
#"10upload.com", "1fichier.com", "180upload.com", "2shared.com", "4fastfile.com", "4shared.com", "asfile.com", "badongo.com", "bayfiles.com", "bitshare.com", "buckshare.com", "bulletupload.com", "cloudnator.com",
#"cloudnxt.net", "cramit.in", "crocko.com", "datei.to", "ddlstorage.com", "dengee.net", "diglo.com", "easybytez.com", "enterupload.com", "exoshare.com", "extabit.com", "fiberupload.com", "fileape.com", "filebox.com",
# "filebase.com", "fileden.com", "filedino.com", "filefactory.com", "fileflyer.com", "filefrog.com", "fileforth.com", "filegag.com", "filejungle.com", "filekeen.com", "filelaser.com", "filemade.com", "filemates.com",
# "fileover.com", "filepost.com", "files-save.com", "filesend.com", "fileserve.com", "filesmonster.net", "filevelocity.com", "filemarkets.com", "filereactor.com", "freakshare.com", "free.fr", "furk.net", "fyels.com",
# "gigapeta.com", "gigasize.com", "gigaup.fr", "glumbouploads.com", "goldfile.eu", "grupload", "hitfile.net", "hotfile.com", "hu.lk", "ifile.com", "jumbofiles.com", "keepfile.com", "letitbit.net", "load.to", "mediafire.com",
# "MegaShare.com", "megashares.com", "mixturevideo.com", "movbay.com", "muchshare.net", "novafile.com", "nowdownload.eu", "netload.in", "piggyshare.com", "pigsonic.com", "przeklej.pl", "purevid.com", "putlocker.com",
# "pyramidfiles.com", "rapidgator.net", "rapidshare.com", "ryushare.com", "scribd.com", "sendspace.com", "shareflare.net", "share-online.biz", "shragle.com", "simpleupload.com", "slingfile.com", "sockshare.com",
# "soundcloud.com", "speedy.sh", "speedyshare.com", "squillion.com", "turbobit.net", "turboupload".com, "ugotfile.com", "unibytes.com", "uploadbox.com", "uploadc.com", "uploaded.to", "uploadhere.com", "uploadhero.com",
# "uploading.com", "uploadking.com", "uploadspace.pl", "uploadstation.com", "uptobox.com", "userporn.com", "usershare.com", "vidbux.com", "videobb.com", "videozer.com", "vidxden.com", "vip-file.com", "wupload.com",
# "x7.com", "youtube.com", "yunfile.com", "zippyshare.com", "zshare.net"
# Lista completa de todos los servidores soportados por pelisalacarta, usada para buscar patrones
ALL_SERVERS = list( set(FREE_SERVERS) | set(FILENIUM_SERVERS) | set(REALDEBRID_SERVERS) |set(ALLDEBRID_SERVERS) )
ALL_SERVERS.sort()
# Función genérica para encontrar vídeos en una página
def find_video_items(item=None, data=None, channel=""):
logger.info("[launcher.py] findvideos")
# Descarga la página
if data is None:
from core import scrapertools
data = scrapertools.cache_page(item.url)
#logger.info(data)
# Busca los enlaces a los videos
from core.item import Item
from servers import servertools
listavideos = servertools.findvideos(data)
if item is None:
item = Item()
itemlist = []
for video in listavideos:
scrapedtitle = item.title.strip() + " - " + video[0]
scrapedurl = video[1]
server = video[2]
itemlist.append( Item(channel=item.channel, title=scrapedtitle , action="play" , server=server, page=item.page, url=scrapedurl, thumbnail=item.thumbnail, show=item.show , plot=item.plot , folder=False) )
return itemlist
def findvideos(data):
logger.info("[servertools.py] findvideos")
encontrados = set()
devuelve = []
# Ejecuta el findvideos en cada servidor
for serverid in ALL_SERVERS:
try:
exec "from servers import "+serverid
exec "devuelve.extend("+serverid+".find_videos(data))"
except ImportError:
logger.info("No existe conector para "+serverid)
except:
logger.info("Error en el conector "+serverid)
import traceback,sys
from pprint import pprint
exc_type, exc_value, exc_tb = sys.exc_info()
lines = traceback.format_exception(exc_type, exc_value, exc_tb)
for line in lines:
line_splits = line.split("\n")
for line_split in line_splits:
logger.error(line_split)
return devuelve
def resolve_video_urls_for_playing(server,url,video_password="",muestra_dialogo=False):
video_urls = []
# Si el vídeo es "directo", no hay que buscar más
if server=="directo" or server=="local":
video_urls = [[ "%s [%s]" % (url[-4:],server) , url ]]
return video_urls,True,""
# Averigua las URL de los vídeos
else:
# Carga el conector
try:
# Muestra un diálogo de progreso
if muestra_dialogo:
import xbmcgui
progreso = xbmcgui.DialogProgress()
progreso.create( "pelisalacarta" , "Conectando con "+server)
exec "from servers import "+server+" as server_connector"
if muestra_dialogo:
progreso.update( 20 , "Conectando con "+server)
# Si tiene una función para ver si el vídeo existe, lo comprueba ahora
if hasattr(server_connector, 'test_video_exists'):
puedes,motivo = server_connector.test_video_exists( page_url=url )
# Si la funcion dice que no existe, fin
if not puedes:
if muestra_dialogo: progreso.close()
return video_urls,puedes,motivo
# Obtiene enlaces free
if server in FREE_SERVERS:
video_urls = server_connector.get_video_url( page_url=url , video_password=video_password )
# Si no se encuentran vídeos en modo free, es porque el vídeo no existe
if len(video_urls)==0:
if muestra_dialogo: progreso.close()
return video_urls,False,"No se puede encontrar el vídeo en "+server
# Obtiene enlaces premium si tienes cuenta en el server
if server in PREMIUM_SERVERS and config.get_setting(server+"premium")=="true":
video_urls = server_connector.get_video_url( page_url=url , premium=(config.get_setting(server+"premium")=="true") , user=config.get_setting(server+"user") , password=config.get_setting(server+"password"), video_password=video_password )
# Si no se encuentran vídeos en modo premium directo, es porque el vídeo no existe
if len(video_urls)==0:
if muestra_dialogo: progreso.close()
return video_urls,False,"No se puede encontrar el vídeo en "+server
# Obtiene enlaces filenium si tienes cuenta
if server in FILENIUM_SERVERS and config.get_setting("fileniumpremium")=="true":
# Muestra un diálogo de progreso
if muestra_dialogo:
progreso.update( 40 , "Conectando con Filenium")
exec "from servers import filenium as gen_conector"
video_gen = gen_conector.get_video_url( page_url=url , premium=(config.get_setting("fileniumpremium")=="true") , user=config.get_setting("fileniumuser") , password=config.get_setting("fileniumpassword"), video_password=video_password )
logger.info("[xbmctools.py] filenium url="+video_gen)
video_urls.append( [ "[filenium]", video_gen ] )
# Obtiene enlaces realdebrid si tienes cuenta
if server in REALDEBRID_SERVERS and config.get_setting("realdebridpremium")=="true":
# Muestra un diálogo de progreso
if muestra_dialogo:
progreso.update( 60 , "Conectando con Real-Debrid")
exec "from servers import realdebrid as gen_conector"
video_gen = gen_conector.get_video_url( page_url=url , premium=(config.get_setting("realdebridpremium")=="true") , user=config.get_setting("realdebriduser") , password=config.get_setting("realdebridpassword"), video_password=video_password )
logger.info("[xbmctools.py] realdebrid url="+video_gen)
if not "REAL-DEBRID" in video_gen:
video_urls.append( [ "."+video_gen.rsplit('.',1)[1]+" [realdebrid]", video_gen ] )
else:
if muestra_dialogo: progreso.close()
# Si RealDebrid da error pero tienes un enlace válido, no te dice nada
if len(video_urls)==0:
return video_urls,False,video_gen
if server in ALLDEBRID_SERVERS and config.get_setting("alldebridpremium")=="true":
# Muestra un diálogo de progreso
if muestra_dialogo:
progreso.update( 80 , "Conectando con All-Debrid")
exec "from servers import alldebrid as gen_conector"
video_gen = gen_conector.get_video_url( page_url=url , premium=(config.get_setting("alldebridpremium")=="true") , user=config.get_setting("alldebriduser") , password=config.get_setting("alldebridpassword"), video_password=video_password )
logger.info("[xbmctools.py] alldebrid url="+video_gen)
video_urls.append( [ "[AllDebrid]", video_gen ] )
if muestra_dialogo:
progreso.update( 100 , "Proceso finalizado")
# Cierra el diálogo de progreso
if muestra_dialogo: progreso.close()
# Llegas hasta aquí y no tienes ningún enlace para ver, así que no vas a poder ver el vídeo
if len(video_urls)==0:
# ¿Cual es el motivo?
# 1) No existe -> Ya está controlado
# 2) No tienes alguna de las cuentas premium compatibles
# Lista de las cuentas que soportan este servidor
listapremium = ""
if server in ALLDEBRID_SERVERS: listapremium+="All-Debrid o "
if server in REALDEBRID_SERVERS: listapremium+="Real-Debrid o "
if server in FILENIUM_SERVERS: listapremium+="Filenium o "
if server in PREMIUM_SERVERS: listapremium+=server+" o "
listapremium = listapremium[:-3]
return video_urls,False,"Para ver un vídeo en "+server+" necesitas<br/>una cuenta en "+listapremium
except:
if muestra_dialogo: progreso.close()
import traceback
from pprint import pprint
exc_type, exc_value, exc_tb = sys.exc_info()
lines = traceback.format_exception(exc_type, exc_value, exc_tb)
for line in lines:
line_splits = line.split("\n")
for line_split in line_splits:
logger.error(line_split)
return video_urls,False,"Se ha producido un error en<br/>el conector con "+server
return video_urls,True,""
alldebrid.py a la carpeta servers :
- Código: Seleccionar todo
# -*- coding: utf-8 -*-
#------------------------------------------------------------
# pelisalacarta - XBMC Plugin
# Conector para AllDebrid
# http://blog.tvalacarta.info/plugin-xbmc/pelisalacarta/
#------------------------------------------------------------
import urlparse,urllib2,urllib,re
import os
from core import scrapertools
from core import logger
from core import config
# Returns an array of possible video url's from the page_url
def get_video_url( page_url , premium = False , user="" , password="", video_password="" ):
logger.info("[alldebrid.py] get_video_url( page_url='%s' , user='%s' , password='%s', video_password=%s)" % (page_url , user , "**************************"[0:len(password)] , video_password) )
page_url = correct_url(page_url)
url = 'http://www.alldebrid.com/' # O bien miras la home a ver si te pone sign-in
#url = 'http://www.alldebrid.com/account/' # O intentas acceder al panel de control
data = scrapertools.cache_page(url)
logger.info(data)
if data is None or not re.search('Create an account</a>', data) or not re.search(user, data):
# Hace el login y consigue la cookie
post = urllib.urlencode({'login_login' : user, 'login_password' : password})
login_url = 'https://www.alldebrid.com/register/?action=login&'+post
data = scrapertools.cache_page(url=login_url)
#print data
if re.search('Control panel', data):
logger.info("Se ha logueado correctamente en All-Debrid ")
else:
logger.info(data)
patron = 'message":"(.+?)"'
matches = re.compile(patron).findall(data)
if len(matches)>0:
server_error = "ALL-DEBRID: "+urllib.unquote_plus(matches[0].replace("\\u00","%"))
else:
server_error = "ALL-DEBRID: A ocurrido un error con tu login"
return server_error
else:
logger.info("Ya estas logueado en All-Debrid")
url = 'http://alldebrid.com/service.php?link=%s' % page_url
data = scrapertools.cache_page(url)
#print data
patron = "href='(.+?)'"
matches = re.compile(patron).findall(data)
if len(matches)>0:
return matches[0]
else:
if re.search('login', data):
server_error = " AllDebrid : Tu Cuenta puede haber expirado."
if re.search('Hoster unsupported or under maintenance', source):
server_error = " AllDebrid : Host no soportado o en mantenimiento."
logger.info(data)
return server_error
def correct_url(url):
if "userporn.com" in url:
url = url.replace("/e/","/video/")
return url
añadir a pelisalacarta.conf :
- Código: Seleccionar todo
# All Debrid
alldebridpremium=false
alldebriduser=usuario
alldebridpassword=password
Lo dicho, seguro que me dejo muchas cosas y lo mas probable es que sea un cumulo de despropositos, pero lo tenia que intentar, con que sirva para darle un empujoncito a su desarrollo me doy por satisfecho.
No tengo a mano el WDLive, por lo que no lo he llegado a probar ni lo tengo facil para debugear.
Por ejemplo la lista de servidore de alldebrid la he reducido a los servidores que he podido identificar de la lista de RealDebrid, no se como añadirlos todos ya que no se, ni donde mirarlo, el "Alias" que tiene cada servidor.
Alguien se atreve a probar?

Supongo que los cambios seran muy parecidos para tvalacarta.
SalU2
Edito : He modificado dos Real-debrid que me habian quedado en el fichero alldebrid.py y creo que ya he visto el tema de los "Alias" de los servidores, son somplemente el nombre del fichero .py
A ver si este fin de semana lo puedo probar...