Advertisement
Guest User

series.ly

a guest
Oct 25th, 2012
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 20.00 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. #------------------------------------------------------------
  3. # pelisalacarta - XBMC Plugin
  4. # Canal para series.ly
  5. # http://blog.tvalacarta.info/plugin-xbmc/pelisalacarta/
  6. #------------------------------------------------------------
  7. import re
  8. import sys
  9. import os
  10. import urllib2
  11.  
  12. from core import logger
  13. from core import config
  14. from core import scrapertools
  15. from core.item import Item
  16. from servers import servertools
  17.  
  18. __channel__ = "seriesly"
  19. __category__ = "S,A"
  20. __type__ = "generic"
  21. __title__ = "Series.ly"
  22. __language__ = "ES"
  23. __creationdate__ = "20111119"
  24.  
  25. DEBUG = config.get_setting("debug")
  26.  
  27. def isGeneric():
  28.     return True
  29.  
  30. def mainlist(item):
  31.     logger.info("[seriesly.py] mainlist")
  32.    
  33.     itemlist = []
  34.  
  35.     if config.get_setting("serieslyaccount")!="true":
  36.         itemlist.append( Item( channel=__channel__ , title="Habilita tu cuenta en la configuración..." , action="" , url="" , folder=False ) )
  37.     else:
  38.         auth_token, user_token = perform_login()
  39.         if not "invalid login" in user_token:
  40.             extra_params = '%s|%s' % ( auth_token, user_token )
  41.        
  42.             itemlist.append( Item(channel=__channel__, title="Buscar", action="search") )
  43.             itemlist.append( Item(channel=__channel__, title="Mis series", action="mis_series", extra=extra_params ) )
  44.             itemlist.append( Item(channel=__channel__, title="Mis pelis", action="mis_pelis", extra=extra_params ) )
  45.             itemlist.append( Item(channel=__channel__, title="Series Mas Votadas", action="series_mas_votadas", extra=extra_params ) )
  46.             itemlist.append( Item(channel=__channel__, title="Peliculas Mas Vistas", action="pelis_mas_vistas", extra=extra_params ) )
  47.             itemlist.append( Item(channel=__channel__, title="Ultimas Pelis Modificadas", action="ultimas_pelis_modificadas", extra=extra_params ) )
  48.         else:
  49.             itemlist.append( Item( channel=__channel__ , title="Cuenta incorrecta, revisa la configuración..." , action="" , url="" , folder=False ) )
  50.  
  51.     return itemlist
  52.  
  53. def getCredentials():
  54.     logged = False
  55.    
  56.     try:
  57.         count = 0
  58.         while (not logged and count<6):
  59.             auth_token,user_token = perform_login()
  60.             post = 'auth_token=%s&user_token=%s' % ( qstr(auth_token), qstr(user_token) )
  61.             url='http://series.ly/api/isUserLogged.php?type=&format=json'
  62.             logresult = load_json(scrapertools.cache_page(url, post=post))
  63.             if logresult == None or logresult['result'] != '1':
  64.                 count = count + 1
  65.             else:
  66.                 logged=True
  67.     except:
  68.         return [auth_token,user_token, logged, "Error al obtener credenciales"]
  69.      
  70.     if(not logged):
  71.         return [auth_token,user_token, logged, "Despues de 5 intentos no hemos podido loguear"]
  72.    
  73.     return [auth_token,user_token, logged, user_token]
  74.  
  75. def mis_pelis(item):
  76.    
  77.     logger.info("[seriesly.py] mis_pelis")
  78.  
  79.     # Obtiene de nuevo los tokens
  80.     auth_token, user_token, logged, loginmessage = getCredentials()
  81.    
  82.     # Extrae las entradas (carpetas)
  83.     post = 'auth_token=%s&user_token=%s' % ( qstr(auth_token), qstr(user_token) )
  84.  
  85.     # Peliculas Usuario (Filtradas por categoria)
  86.     url='http://series.ly/api/userMovies.php?format=json'
  87.     data = scrapertools.cache_page(url, post=post)
  88.     movieList = load_json(data)
  89.     if movieList == None : movieList = []    
  90.     logger.info("hay %d peliculas" % len(movieList))
  91.  
  92.     # compare function
  93.     def movie_compare_criteria( x, y) :
  94.         strx = x['title'].strip().lower()
  95.         stry = y['title'].strip().lower()
  96.         if strx == stry :
  97.             return 0
  98.         elif strx < stry :
  99.             return -1
  100.         else :
  101.             return 1
  102.  
  103.     itemlist = []
  104.     try:
  105.         movieList = limpia_lista(movieList, 'title')
  106.         sortedlist = sorted(movieList, lambda x, y: movie_compare_criteria(x, y))
  107.     except:
  108.         sortedlist = movieList
  109.        
  110.     for movieItem in sortedlist:
  111.         status = movieItem['status']
  112.         if status == 'Pending' : movieItem['estado'] = 'Pendiente'
  113.         elif status == 'Watched' : movieItem['estado'] = 'Vista'
  114.         elif status == 'Favourite' : movieItem['estado'] = 'Favorita'
  115.         else : movieItem['estado'] = '?';
  116.         # A√±ade al listado de XBMC
  117.         itemlist.append(
  118.             Item(channel=item.channel,
  119.                 action = "peli_links",
  120.                 title = '%(title)s (%(year)s) [%(estado)s]' % movieItem,
  121.                 url = 'http://series.ly/api/detailMovie.php?idFilm=%s&format=json' % qstr(movieItem['idFilm']),
  122.                 thumbnail = movieItem['poster'],
  123.                 plot = "",
  124.                 extra = '%s|%s' % ( qstr(auth_token), qstr(user_token) )
  125.             )
  126.         )
  127.    
  128.     return itemlist
  129.  
  130. def mis_series(item):
  131.    
  132.     logger.info("[seriesly.py] mis_series")
  133.  
  134.     # Obtiene de nuevo los tokens
  135.     auth_token, user_token, logged, loginmessage = getCredentials()
  136.    
  137.     # Series Usuario
  138.     post = 'auth_token=%s&user_token=%s' % ( qstr(auth_token), qstr(user_token) )
  139.     url='http://series.ly/api/userSeries.php?type=&format=json'
  140.     serieList = load_json(scrapertools.cache_page(url, post=post))
  141.     if serieList == None : serieList = []
  142.    
  143.     logger.info('[seriesly.py] hay %d series' % len(serieList))
  144.    
  145.     itemlist = []
  146.     for serieItem in serieList:
  147.         logger.info("serieItem="+str(serieItem))
  148.         #serieItem={u'status': 'Watching', u'thumb': 'http://cdn.opensly.com/series/HV9RTVP6XN-p.jpg', u'title': 'Digimon: Digital Monsters', u'poster': 'http://cdn.opensly.com/series/HV9RTVP6XN.jpg', u'episodes': 343, u'small_thumb': 'http://cdn.opensly.com/series/HV9RTVP6XN-xs.jpg', u'seasons': 7, u'idSerie': 'HV9RTVP6XN'}
  149.  
  150.         if serieItem['title'] is not None:
  151.             status = serieItem['status']
  152.             if status == 'Pending' : serieItem['estado'] = 'Pendiente'
  153.             elif status == 'Watching' : serieItem['estado'] = 'Viendo'
  154.             elif status == 'Finished' : serieItem['estado'] = 'Finalizada'
  155.             else : serieItem['estado'] = '?'
  156.             # Añade al listado de XBMC
  157.             itemlist.append(
  158.                 Item(channel=item.channel,
  159.                      action = 'serie_capitulos',
  160.                      title = '%(title)s (%(seasons)d Temporadas) (%(episodes)d Episodios) [%(estado)s]' % serieItem,
  161.                      url = 'http://series.ly/api/detailSerie.php?idSerie=%(idSerie)s&caps=1&format=json' % serieItem,
  162.                      thumbnail = serieItem['thumb'],
  163.                      plot = "",
  164.                      show = serieItem['title'],
  165.                      extra = item.extra
  166.                 )
  167.             )
  168.            
  169.     itemlist = sorted( itemlist , key=lambda item: item.title)
  170.        
  171.     return itemlist
  172.  
  173. def serie_capitulos(item):
  174.    
  175.     logger.info('[seriesly.py] serie_capitulos')
  176.    
  177.     # Obtiene de nuevo los tokens
  178.     auth_token, user_token, logged, loginmessage = getCredentials()
  179.    
  180.     # Extrae las entradas (carpetas)
  181.     post = 'auth_token=%s&user_token=%s' % ( qstr(auth_token), qstr(user_token) )
  182.     serieInfo = load_json(scrapertools.cache_page(item.url, post=post))
  183.     if serieInfo == None : serieInfo = {}
  184.     if (not serieInfo.has_key('episode')) or serieInfo['episode'] == None : serieInfo['episode'] = []
  185.    
  186.     logger.info('hay %d capitulos' % len(serieInfo['episode']))
  187.  
  188.     itemlist = []
  189.     for episode in serieInfo['episode'] :
  190.         if episode.has_key('viewed'):
  191.             viewed = episode['viewed']
  192.             if viewed == '0' : episode['estado'] = ' [Pendiente]'
  193.             elif viewed == '1' : episode['estado'] = ' [Visto]'
  194.             else : episode['estado'] = ' [?]'
  195.         else:
  196.             episode['estado'] = ''
  197.        
  198.         itemlist.append(
  199.             Item(channel=item.channel,
  200.                 action = 'capitulo_links',
  201.                 title = '%(season)s - %(title)s%(estado)s' % episode,
  202.                 url = 'http://series.ly/api/linksCap.php?idCap=%(idc)s&format=json' % episode,
  203.                 thumbnail = item.thumbnail,
  204.                 plot = "",
  205.                 show = item.show,
  206.                 extra = item.extra
  207.             )
  208.         )
  209.  
  210.     #if config.get_platform().startswith("xbmc") or config.get_platform().startswith("boxee"):
  211.     #    itemlist.append( Item(channel=item.channel, title="Añadir esta serie a la biblioteca de XBMC", url=item.url, action="add_serie_to_library", extra="serie_capitulos###"+item.extra, show=item.show) )
  212.  
  213.     return itemlist
  214.  
  215. def capitulo_links(item):
  216.     logger.info("[seriesly.py] capitulo_links")
  217.    
  218.     # Obtiene de nuevo los tokens
  219.     auth_token, user_token, logged, loginmessage = getCredentials()
  220.    
  221.     # Extrae las entradas (carpetas)
  222.     post = 'auth_token=%s&user_token=%s' % ( qstr(auth_token), qstr(user_token) )
  223.     data = scrapertools.cache_page(item.url+"&"+post)
  224.     linkList = load_json(data)
  225.     if linkList == None : linkList = []
  226.    
  227.     logger.info("hay %d videos" % len(linkList))
  228.    
  229.     itemlist = []        
  230.     for link in linkList:
  231.  
  232.         #hd = link['hd']
  233.         #if hd == '0' : link['hdtag'] = ''
  234.         #elif hd == '1' : link['hdtag'] = ' (HD)'
  235.         #else : link['hdtag'] = ' (?)'
  236.  
  237.         itemlist.append(
  238.             Item(channel=item.channel,
  239.                 action = "links",
  240.                 title = '%(info)s - %(host)s - %(lang)s(sub %(sub)s)' % link,
  241.                 url = link['url'],
  242.                 thumbnail = item.thumbnail,
  243.                 plot = "",
  244.                 extra = ''
  245.             )
  246.         )
  247.  
  248.     return itemlist
  249.  
  250. def links(item):    
  251.        
  252.     itemlist = []
  253.     try:
  254.         count = 0
  255.         exit = False
  256.         while(not exit and count < 5):
  257.             #A veces da error al intentar acceder
  258.             try:
  259.                 page = urllib2.urlopen(item.url)
  260.                 urlvideo = "\"" + page.geturl() + "\""
  261.                 exit = True
  262.             except:
  263.                 count = count + 1
  264.  
  265.         logger.info("urlvideo="+urlvideo)
  266.         for video in servertools.findvideos(urlvideo) :
  267.             #scrapedtitle = title.strip() + " " + match[1] + " " + match[2] + " " + video[0]
  268.             scrapedtitle = scrapertools.htmlclean(video[0])
  269.             scrapedurl = video[1]
  270.             server = video[2]
  271.             itemlist.append( Item(channel=__channel__, action="play" , title=scrapedtitle, url=scrapedurl, thumbnail=item.thumbnail, plot="", server=server, extra="", category=item.category, fanart=item.thumbnail, folder=False))
  272.     except:  
  273.         import sys
  274.         for line in sys.exc_info():
  275.             logger.error( "%s" % line )
  276.                
  277.        
  278.     return itemlist
  279.  
  280. def limpia_lista(movielist, campo):
  281.        
  282.     cleanlist = []
  283.     for movieItem in movielist:
  284.         if(movieItem[campo] is not None):
  285.             cleanlist.append( movieItem)
  286.     return cleanlist
  287.  
  288. def peli_links(item):
  289.  
  290.     logger.info("[seriesly.py] peli_links")
  291.    
  292.     # Obtiene de nuevo los tokens
  293.     auth_token, user_token, logged, loginmessage = getCredentials()
  294.    
  295.     # Extrae las entradas (carpetas)
  296.     post = 'auth_token=%s&user_token=%s' % ( qstr(auth_token), qstr(user_token) )
  297.     data = scrapertools.cache_page(item.url, post=post)
  298.     linkList = load_json(data)
  299.     if linkList == None : linkList = []
  300.    
  301.     logger.info("hay %d videos" % len(linkList))
  302.     itemlist = []
  303.     try:
  304.         for link in linkList['links']:
  305.            
  306.             #hd = link['highDef']
  307.             #if hd == '0' : link['hdtag'] = ''
  308.             #elif hd == '1' : link['hdtag'] = ' (HD)'
  309.             #else : link['hdtag'] = ' (?)'
  310.            
  311.             #Neofreno: Cambio a partir de aquí
  312.             link['titletag'] =linkList['title'];
  313.            
  314.             itemlist.append(
  315.                 Item(channel=item.channel,
  316.                     action = "links",
  317.                     title = '%(host)s - %(lang)s %(quality)s' % link,
  318.                     url = qstr(link['url'].strip()),
  319.                     thumbnail = item.thumbnail,
  320.                     plot = linkList['synopsis'],
  321.                     extra = ''
  322.                 )
  323.             )
  324.     except:
  325.         import sys
  326.         for line in sys.exc_info():
  327.             logger.error( "%s" % line )
  328.        
  329.     return itemlist
  330.  
  331. def series_mas_votadas(item):
  332.  
  333.     logger.info("[seriesly.py] series_mas_votadas")
  334.    
  335.     # Obtiene de nuevo los tokens
  336.     auth_token, user_token, logged, loginmessage = getCredentials()
  337.    
  338.     # Extrae las entradas (carpetas)
  339.     url="http://series.ly/api/top.php?&format=json&id=1"
  340.     post = 'auth_token=%s&user_token=%s' % ( qstr(auth_token), qstr(user_token) )
  341.     topInfo = load_json(scrapertools.cache_page(url, post=post))
  342.     if topInfo == None : topInfo = {}
  343.     if topInfo['series_mes_votades'] == None : topInfo['series_mes_votades'] = []
  344.    
  345.     logger.info("hay %d series" % len(topInfo['series_mes_votades']))
  346.    
  347.     itemlist = []
  348.     for serieItem in topInfo['series_mes_votades']:
  349.         # Añade al listado de XBMC
  350.         itemlist.append(
  351.             Item(channel=item.channel,
  352.                  action = 'serie_capitulos',
  353.                  title = '%(nom_serie)s [%(vots)s Votos]' % serieItem,
  354.                  url = 'http://series.ly/api/detailSerie.php?idSerie=%s&caps=1&format=json' % qstr(serieItem['id_serie']),
  355.                  thumbnail = '',
  356.                  plot = "",
  357.                  extra = item.extra
  358.             )
  359.         )  
  360.     return itemlist
  361.  
  362. def pelis_mas_vistas(item):
  363.  
  364.     logger.info("[seriesly.py] pelis_mas_vistas")
  365.    
  366.     # Obtiene de nuevo los tokens
  367.     auth_token, user_token, logged, loginmessage = getCredentials()
  368.     post = 'auth_token=%s&user_token=%s' % ( qstr(auth_token), qstr(user_token) )
  369.    
  370.     # Extrae las entradas (carpetas)
  371.     url="http://series.ly/api/top.php?&format=json&id=2"
  372.     topInfo = load_json(scrapertools.cache_page(url, post=post))
  373.     if topInfo == None : topInfo = {}
  374.     if topInfo['pelis_mes_vistes'] == None : topInfo['pelis_mes_vistes'] = []
  375.    
  376.     logger.info("hay %d pelis" % len(topInfo['pelis_mes_vistes']))
  377.    
  378.     itemlist = []
  379.     for movieItem in topInfo['pelis_mes_vistes']:
  380.         # Añade al listado de XBMC
  381.         itemlist.append(
  382.             Item(channel=item.channel,
  383.                  action = 'peli_links',
  384.                  title = '%(nom_peli)s' % movieItem,
  385.                  url = 'http://series.ly/api/detailMovie.php?idFilm=%s&format=json' % qstr(movieItem['id_peli']),
  386.                  thumbnail = '',
  387.                  plot = "",
  388.                  extra = item.extra
  389.             )
  390.         )  
  391.     return itemlist
  392.  
  393. def ultimas_pelis_modificadas(item):
  394.  
  395.     logger.info("[seriesly.py] ultimas_pelis_modificadas")
  396.    
  397.     # Obtiene de nuevo los tokens
  398.     auth_token, user_token, logged, loginmessage = getCredentials()
  399.     post = 'auth_token=%s&user_token=%s' % ( qstr(auth_token), qstr(user_token) )
  400.    
  401.    
  402.     # Extrae las entradas (carpetas)
  403.     url="http://series.ly/api/top.php?&format=json&id=3"
  404.     topInfo = load_json(scrapertools.cache_page(url, post=post))
  405.     if topInfo == None : topInfo = {}
  406.     if topInfo['ultimes_pelis'] == None : topInfo['ultimes_pelis'] = []
  407.    
  408.     logger.info("hay %d pelis" % len(topInfo['ultimes_pelis']))
  409.    
  410.     itemlist = []
  411.     for movieItem in topInfo['ultimes_pelis']:
  412.         # Añade al listado de XBMC
  413.         itemlist.append(
  414.             Item(channel=item.channel,
  415.                  action = 'peli_links',
  416.                  title = '%(nom_peli)s [%(any)s]' % movieItem,
  417.                  url = 'http://series.ly/api/detailMovie.php?idFilm=%s&format=json' % qstr(movieItem['id_peli']),
  418.                  thumbnail = '',
  419.                  plot = "",
  420.                  extra = item.extra
  421.             )
  422.         )  
  423.     return itemlist
  424.  
  425.  
  426. def search(item,texto, categoria="*"):
  427.    
  428.     # Obtiene de nuevo los tokens
  429.     auth_token, user_token, logged, loginmessage = getCredentials()
  430.    
  431.     item.channel="seriesly"
  432.    
  433.     res = search_series(auth_token, user_token, item, texto)
  434.     res.extend(search_films(auth_token, user_token, item, texto))
  435.    
  436.     return res
  437.    
  438. def search_series(auth_token, user_token, item, texto):
  439.     logger.info("[seriesly.py] search")
  440.    
  441.     # Obtiene de nuevo los tokens
  442.     auth_token, user_token, logged, loginmessage = getCredentials()
  443.     post = 'auth_token=%s' % ( qstr(auth_token) )
  444.    
  445.     url = 'http://series.ly/api/search.php?search=%s&type=serie&format=json' % ( qstr(texto) )
  446.    
  447.     # Extrae las entradas (carpetas)
  448.     serieList = load_json(scrapertools.cache_page(url, post=post))
  449.     if serieList == None : serieList = []
  450.    
  451.     logger.info("hay %d series" % len(serieList))
  452.    
  453.     itemlist = []
  454.     for serieItem in serieList:
  455.        
  456.         itemlist.append(
  457.             Item(channel=item.channel,
  458.                 action = 'serie_capitulos',
  459.                 title = 'Serie: %(title)s (%(seasons)d Temporadas) (%(episodes)d Episodios)' % serieItem,
  460.                 url = "http://series.ly/api/detailSerie.php?caps=1&auth_token=" + auth_token + "&user_token=" + user_token + "&idSerie=" + serieItem['idSerie'] + "&format=json",
  461.                 thumbnail = serieItem['poster'],
  462.                 plot = '',
  463.                 extra = '%s|%s' % (auth_token, user_token)
  464.             )
  465.         )
  466.          
  467.     return itemlist
  468.  
  469. def search_films(auth_token, user_token, item, texto):
  470.     logger.info("[seriesly.py] search_films")
  471.    
  472.     # Obtiene de nuevo los tokens
  473.     auth_token, user_token, logged, loginmessage = getCredentials()
  474.     post = 'auth_token=%s' % ( qstr(auth_token) )
  475.    
  476.     url = 'http://series.ly/api/search.php?search=%s&type=film&format=json' % ( qstr(texto) )
  477.    
  478.     # Extrae las entradas (carpetas)
  479.     # [{"idFilm":"?","title":"?","year":"?","genre":"?","poster":"http://?","thumb":"http://?","small_thumb":"http://?"}
  480.    
  481.     movieList = load_json(scrapertools.cache_page(url, post=post))
  482.     if movieList == None : movieList = []
  483.    
  484.     logger.info("hay %d peliculas" % len(movieList))
  485.    
  486.     itemlist = []
  487.     for movieItem in movieList:
  488.        
  489.         itemlist.append(
  490.             Item(channel=item.channel,
  491.                 action = 'peli_links',
  492.                 title = 'Peli: %(title)s (%(year)s) (%(genre)s)' % movieItem,
  493.                 url = "http://series.ly/api/detailMovie.php?idFilm=" + movieItem['idFilm'] + "&format=json",
  494.                 thumbnail = movieItem['poster'],
  495.                 plot = '',
  496.                 extra = '%s|%s' % (auth_token, user_token)
  497.             )
  498.         )
  499.          
  500.     return itemlist
  501.  
  502. def load_json(data):
  503.     # callback to transform json string values to utf8
  504.     def to_utf8(dct):
  505.         rdct = {}
  506.         for k, v in dct.items() :
  507.             if isinstance(v, (str, unicode)) :
  508.                 rdct[k] = v.encode('utf8', 'ignore')
  509.             else :
  510.                 rdct[k] = v
  511.         return rdct
  512.     try :        
  513.         import json
  514.         json_data = json.loads(data, object_hook=to_utf8)
  515.         return json_data
  516.     except:
  517.         import sys
  518.         for line in sys.exc_info():
  519.             logger.error( "%s" % line )
  520.  
  521. ''' URLEncode a string '''
  522. def qstr(string):
  523.     return string # urllib2.quote(string)  
  524.  
  525. def perform_login():
  526.  
  527.     LOGIN = config.get_setting("serieslyuser")
  528.     PASSWORD = config.get_setting("serieslypassword")
  529.  
  530.     # AuthToken
  531.     url = "http://series.ly/api/auth.php?api=8&secret=N5X54c4OeDUwU8dWBbMW"
  532.     data = scrapertools.cache_page(url)
  533.     logger.info("****")
  534.     logger.info(data)
  535.     logger.info("****")
  536.     auth_token = data.strip()
  537.    
  538.     # UserToken
  539.     url = "http://series.ly/scripts/login/login.php"
  540.     post = "lg_login=%s&lg_pass=%s&callback_url=no&auth_token=%s&autologin=" % ( qstr(LOGIN), qstr(PASSWORD), qstr(auth_token) )
  541.     data = scrapertools.cache_page(url,post=post)
  542.     logger.info("****")
  543.     logger.info(data)
  544.     logger.info("****")
  545.     user_token=data.strip()
  546.    
  547.     return [auth_token,user_token]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement