Advertisement
Guest User

NewPCT1

a guest
Nov 21st, 2015
636
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 32.91 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. #------------------------------------------------------------
  3. # pelisalacarta - XBMC Plugin
  4. # Canal para newpct1
  5. # http://blog.tvalacarta.info/plugin-xbmc/pelisalacarta/
  6. #------------------------------------------------------------
  7.  
  8. import urlparse,urllib2,urllib,re
  9. import os, sys
  10.  
  11. from core import logger
  12. from core import config
  13. from core import scrapertools
  14. from core.item import Item
  15. from servers import servertools
  16.  
  17. DEBUG = config.get_setting("debug")
  18.  
  19. __category__ = "A"
  20. __type__ = "generic"
  21. __title__ = "Newpct1"
  22. __channel__ = "newpct1"
  23. __adult__ = "false"
  24. __thumbnail__ = "http://s3.postimg.org/c7oceldcz/logof.jpg"
  25. __language__ = "ES"
  26. __creationdate__ = "20141102"
  27.  
  28. def isGeneric():
  29.     return True
  30.  
  31. def mainlist(item):
  32.     logger.info("[newpct1.py] mainlist")
  33.  
  34.     itemlist = []
  35.     itemlist.append( Item(channel=__channel__, action="submenu", title="Películas", url="http://www.newpct1.com/", extra="peliculas") )
  36.     itemlist.append( Item(channel=__channel__, action="submenu", title="Series", url="http://www.newpct1.com/", extra="series") )
  37.     itemlist.append( Item(channel=__channel__, action="search", title="Buscar") )
  38.  
  39.     return itemlist
  40.  
  41. def search(item,texto):
  42.     logger.info("[newpct1.py] search:" + texto)
  43.  
  44.     item.url = "http://www.newpct1.com/index.php?page=buscar&q=%27" + texto +"%27&ordenar=Fecha&inon=Descendente"
  45.     item.extra="buscar-list"
  46.     return completo(item)
  47.  
  48. def submenu(item):
  49.     logger.info("[newpct1.py] submenu")
  50.     itemlist=[]
  51.  
  52.     data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)","",scrapertools.cache_page(item.url))
  53.     data = unicode( data, "iso-8859-1" , errors="replace" ).encode("utf-8")
  54.  
  55.     patron = '<li><a href="http://www.newpct1.com/'+item.extra+'/">.*?<ul>(.*?)</ul>'
  56.     data = scrapertools.get_match(data,patron)
  57.  
  58.     patron = '<a href="([^"]+)".*?>([^>]+)</a>'
  59.     matches = re.compile(patron,re.DOTALL).findall(data)
  60.  
  61.     for scrapedurl,scrapedtitle in matches:
  62.         title = scrapedtitle.strip()
  63.         url = scrapedurl
  64.  
  65.         itemlist.append( Item(channel=__channel__, action="listado" ,title=title, url=url, extra="pelilist") )
  66.         itemlist.append( Item(channel=__channel__, action="alfabeto" ,title=title+" [A-Z]", url=url, extra="pelilist") )
  67.  
  68.     return itemlist
  69.  
  70. def alfabeto(item):
  71.     logger.info("[newpct1.py] alfabeto")
  72.     itemlist = []
  73.  
  74.     data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)","",scrapertools.cache_page(item.url))
  75.     data = unicode( data, "iso-8859-1" , errors="replace" ).encode("utf-8")
  76.  
  77.     patron = '<ul class="alfabeto">(.*?)</ul>'
  78.     data = scrapertools.get_match(data,patron)
  79.  
  80.     patron = '<a href="([^"]+)"[^>]+>([^>]+)</a>'
  81.     matches = re.compile(patron,re.DOTALL).findall(data)
  82.  
  83.     for scrapedurl,scrapedtitle in matches:
  84.         title = scrapedtitle.upper()
  85.         url = scrapedurl
  86.  
  87.         itemlist.append( Item(channel=__channel__, action="completo" ,title=title, url=url, extra=item.extra) )
  88.  
  89.     return itemlist
  90.  
  91. def listado(item):
  92.     logger.info("[newpct1.py] listado")
  93.     itemlist = []
  94.  
  95.     data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)","",scrapertools.cache_page(item.url))
  96.     data = unicode( data, "iso-8859-1" , errors="replace" ).encode("utf-8")
  97.  
  98.     patron = '<ul class="'+item.extra+'">(.*?)</ul>'
  99.     logger.info("[newpct1.py] patron="+patron)
  100.     fichas = scrapertools.get_match(data,patron)
  101.  
  102.     #<li><a href="http://www.newpct1.com/pelicula/x-men-dias-del-futuro-pasado/ts-screener/" title="Descargar XMen Dias Del Futuro gratis"><img src="http://www.newpct1.com/pictures/f/58066_x-men-dias-del-futuro--blurayrip-ac3-5.1.jpg" width="130" height="180" alt="Descargar XMen Dias Del Futuro gratis"><h2>XMen Dias Del Futuro </h2><span>BluRayRip AC3 5.1</span></a></li>
  103.     patron  = '<li><a href="([^"]+).*?' #url
  104.     patron += 'title="([^"]+).*?' #titulo
  105.     patron += '<img src="([^"]+)"[^>]+>.*?' #thumbnail
  106.     patron += '<span>([^<]*)</span>' #calidad
  107.  
  108.     matches = re.compile(patron,re.DOTALL).findall(fichas)
  109.  
  110.     for scrapedurl,scrapedtitle,scrapedthumbnail,calidad in matches:
  111.         url = scrapedurl
  112.         title = scrapedtitle
  113.         thumbnail = scrapedthumbnail
  114.         action = "findvideos"
  115.         extra = ""
  116.  
  117.         logger.info("[newpct1.py] Content {0}: {1}".format(title, url))
  118.  
  119.         if "1.com/series" in url:
  120.             action = "completo"
  121.             extra="serie"
  122.  
  123.             title=scrapertools.find_single_match(title,'([^-]+)')
  124.             title= title.replace("Ver online","",1).replace("Descarga Serie HD","",1).replace("Ver en linea","",1).strip()
  125.             #logger.info("[newpct1.py] titulo="+title)
  126.  
  127.             if "1.com/series-hd" in url:
  128.                 extra="serie-hd"
  129.             elif "1.com/series-vo" in url:
  130.                 extra="serie-vo"
  131.             elif "1.com/series/" in url:
  132.                 extra="serie-tv"
  133.  
  134.         else:
  135.             title= title.replace("Descargar","",1).strip()
  136.             if title.endswith("gratis"): title= title[:-7]
  137.  
  138.         show = title
  139.         if item.extra!="buscar-list":
  140.             title = title + ' ' + calidad
  141.  
  142.         itemlist.append( Item(channel=__channel__, action=action, title=title, url=url, thumbnail=thumbnail, extra=extra, show=show ) )
  143.  
  144.     if "pagination" in data:
  145.         patron = '<ul class="pagination">(.*?)</ul>'
  146.         paginacion = scrapertools.get_match(data,patron)
  147.  
  148.         if "Next" in paginacion:
  149.             url_next_page  = scrapertools.get_match(paginacion,'<a href="([^>]+)>Next</a>')[:-1].replace(" ","%20")
  150.             itemlist.append( Item(channel=__channel__, action="listado" , title=">> Página siguiente" , url=url_next_page, extra=item.extra))
  151.     #logger.info("[newpct1.py] listado items:" + str(len(itemlist)))
  152.     return itemlist
  153.  
  154. def completo(item):
  155.     logger.info("[newpct1.py] completo")
  156.     itemlist = []
  157.     categoryID=""
  158.  
  159.     # Guarda el valor por si son etiquetas para que lo vea 'listadofichas'
  160.     item_extra = item.extra
  161.     item_show= item.show
  162.     item_title= item.title
  163.  
  164.     # Lee las entradas
  165.     if item_extra.startswith("serie"):
  166.         ultimo_action="get_episodios"
  167.  
  168.         if item.extra !="serie_add":
  169.             # Afinar mas la busqueda
  170.             if item_extra=="serie-hd":
  171.                 categoryID=buscar_en_subcategoria(item.show,'1469')
  172.             elif item_extra=="serie-vo":
  173.                 categoryID=buscar_en_subcategoria(item.show,'775')
  174.             elif item_extra=="serie-tv":
  175.                 categoryID=buscar_en_subcategoria(item.show,'767')
  176.             if categoryID !="":
  177.                 item.url=item.url.replace("categoryID=","categoryID="+categoryID)
  178.  
  179.             #Fanart
  180.             oTvdb= TvDb()
  181.             serieID=oTvdb.get_serieId_by_title(item.show)
  182.             fanart = oTvdb.get_graphics_by_serieId(serieID)
  183.             if len(fanart)>0:
  184.                 item.fanart = fanart[0]
  185.         else:
  186.             item_title= item.show
  187.             item.title= item.show
  188.  
  189.         items_programas = get_episodios(item)
  190.     else:
  191.         ultimo_action="listado"
  192.         items_programas = listado(item)
  193.  
  194.     if len(items_programas) ==0:
  195.             return itemlist # devolver lista vacia
  196.  
  197.     salir = False
  198.     while not salir:
  199.  
  200.         # Saca la URL de la siguiente página
  201.         ultimo_item = items_programas[ len(items_programas)-1 ]
  202.  
  203.         # Páginas intermedias
  204.         if ultimo_item.action==ultimo_action:
  205.             # Quita el elemento de "Página siguiente"
  206.             ultimo_item = items_programas.pop()
  207.  
  208.             # Añade las entradas de la página a la lista completa
  209.             itemlist.extend( items_programas )
  210.  
  211.             # Carga la siguiente página
  212.             ultimo_item.extra = item_extra
  213.             ultimo_item.show = item_show
  214.             ultimo_item.title = item_title
  215.             logger.info("[newpct1.py] completo url=" + ultimo_item.url)
  216.             if item_extra.startswith("serie"):
  217.                 items_programas = get_episodios(ultimo_item)
  218.             else:
  219.                 items_programas = listado(ultimo_item)
  220.  
  221.         # Última página
  222.         else:
  223.             # Añade a la lista completa y sale
  224.             itemlist.extend( items_programas )
  225.             salir = True
  226.  
  227.     if config.get_library_support() and len(itemlist)>0 and (item.extra.startswith("serie") ):
  228.         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="completo###serie_add" , show= item.show))
  229.     logger.info("[newpct1.py] completo items="+ str(len(itemlist)))
  230.     return itemlist
  231.  
  232. def get_episodios(item):
  233.     logger.info("[newpct1.py] get_episodios")
  234.     itemlist=[]
  235.     logger.info("[newpct1.py] get_episodios url=" +item.url)
  236.     data = re.sub(r'\n|\r|\t|\s{2}|<!--.*?-->|<i class="icon[^>]+"></i>',"",scrapertools.cache_page(item.url))
  237.     data = unicode( data, "iso-8859-1" , errors="replace" ).encode("utf-8")
  238.  
  239.     #logger.info("[newpct1.py] data=" +data)
  240.  
  241.     patron = '<ul class="buscar-list">(.*?)</ul>'
  242.     #logger.info("[newpct1.py] patron=" + patron)
  243.  
  244.     fichas = scrapertools.get_match(data,patron)
  245.     #logger.info("[newpct1.py] matches=" + str(len(fichas)))
  246.  
  247.     #<li><a href="http://www.newpct1.com/serie/forever/capitulo-101/" title="Serie Forever 1x01"><img src="http://www.newpct1.com/pictures/c/minis/1880_forever.jpg" alt="Serie Forever 1x01"></a> <div class="info"> <a href="http://www.newpct1.com/serie/forever/capitulo-101/" title="Serie Forever 1x01"><h2 style="padding:0;">Serie <strong style="color:red;background:none;">Forever - Temporada 1 </strong> - Temporada<span style="color:red;background:none;">[ 1 ]</span>Capitulo<span style="color:red;background:none;">[ 01 ]</span><span style="color:red;background:none;padding:0px;">Espa�ol Castellano</span> Calidad <span style="color:red;background:none;">[ HDTV ]</span></h2></a> <span>27-10-2014</span> <span>450 MB</span> <span class="color"><ahref="http://www.newpct1.com/serie/forever/capitulo-101/" title="Serie Forever 1x01"> Descargar</a> </div></li>
  248.     #logger.info("[newpct1.py] get_episodios: " + fichas)
  249.     patron  = '<li><a href="([^"]+).*?' #url
  250.     patron += '<img src="([^"]+)".*?' #thumbnail
  251.     patron += '<h2 style="padding(.*?)/h2>' #titulo, idioma y calidad
  252.  
  253.     matches = re.compile(patron,re.DOTALL).findall(fichas)
  254.     #logger.info("[newpct1.py] get_episodios matches: " + str(len(matches)))
  255.     for scrapedurl,scrapedthumbnail,scrapedinfo in matches:
  256.         try:
  257.             url = scrapedurl
  258.             if '</span>' in scrapedinfo:
  259.                 #logger.info("[newpct1.py] get_episodios: scrapedinfo="+scrapedinfo)
  260.                 #<h2 style="padding:0;">Serie <strong style="color:red;background:none;">The Big Bang Theory - Temporada 6 </strong> - Temporada<span style="color:red;background:none;">[ 6 ]</span>Capitulo<span style="color:red;background:none;">[ 03 ]</span><span style="color:red;background:none;padding:0px;">Español Castellano</span> Calidad <span style="color:red;background:none;">[ HDTV ]</span></h2>
  261.                 patron = '<span style=".*?">\[\s*(.*?)\]</span>.*?' #temporada
  262.                 patron += '<span style=".*?">\[\s*(.*?)\].*?' #capitulo
  263.                 patron += ';([^/]+)' #idioma
  264.  
  265.                 info_extra = re.compile(patron,re.DOTALL).findall(scrapedinfo)
  266.                 (temporada,capitulo,idioma)=info_extra[0]
  267.  
  268.                 #logger.info("[newpct1.py] get_episodios: temporada=" + temporada)
  269.                 #logger.info("[newpct1.py] get_episodios: capitulo=" + capitulo)
  270.                 #logger.info("[newpct1.py] get_episodios: idioma=" + idioma)
  271.                 if '">' in idioma:
  272.                     idioma= " [" + scrapertools.find_single_match(idioma,'">([^<]+)').strip() +"]"
  273.                 elif '&nbsp' in idioma:
  274.                     idioma= " [" + scrapertools.find_single_match(idioma,'&nbsp;([^<]+)').strip() +"]"
  275.                 else:
  276.                     idioma=""
  277.                 title =  item.title + " (" + temporada.strip() + "x" + capitulo.strip()  + ")" + idioma
  278.  
  279.             else:
  280.                 #<h2 style="padding:0;">The Big Bang Theory - Temporada 6 [HDTV][Cap.602][Español Castellano]</h2>
  281.                 #<h2 style="padding:0;">The Beast - Temporada 1 [HDTV] [Capítulo 13] [Español]</h2
  282.                 #<h2 style="padding:0;">The Beast - Temp.1 [DVD-DVB][Cap.103][Spanish]</h2>
  283.                 try:
  284.                     temp ,cap = scrapertools.get_season_and_episode(scrapedinfo).split('x')
  285.                 except:
  286.                     #Formatear temporadaXepisodio
  287.                     patron= re.compile('Cap.*?\s*([\d]+)',re.IGNORECASE)
  288.                     info_extra=patron.search(scrapedinfo)
  289.  
  290.                     if len(str(info_extra.group(1)))>=3:
  291.                         cap=info_extra.group(1)[-2:]
  292.                         temp=info_extra.group(1)[:-2]
  293.                     else:
  294.                         cap=info_extra.group(1)
  295.                         patron='Temp.*?\s*([\d]+)'
  296.                         temp= re.compile(patron,re.IGNORECASE).search(scrapedinfo).group(1)
  297.  
  298.                 title = item.title + " ("+ temp + 'x' + cap + ")"
  299.  
  300.             #logger.info("[newpct1.py] get_episodios: fanart= " +item.fanart)
  301.             itemlist.append( Item(channel=__channel__, action="findvideos", title=title, url=url, thumbnail=item.thumbnail, show=item.show, fanart=item.fanart) )
  302.         except:
  303.             logger.info("[newpct1.py] ERROR al añadir un episodio")
  304.     if "pagination" in data:
  305.         patron = '<ul class="pagination">(.*?)</ul>'
  306.         paginacion = scrapertools.get_match(data,patron)
  307.         #logger.info("[newpct1.py] get_episodios: paginacion= " + paginacion)
  308.         if "Next" in paginacion:
  309.             url_next_page  = scrapertools.get_match(paginacion,'<a href="([^>]+)>Next</a>')[:-1]
  310.             url_next_page= url_next_page.replace(" ","%20")
  311.             #logger.info("[newpct1.py] get_episodios: url_next_page= " + url_next_page)
  312.             itemlist.append( Item(channel=__channel__, action="get_episodios" , title=">> Página siguiente" , url=url_next_page))
  313.  
  314.     return itemlist
  315.  
  316. def buscar_en_subcategoria(titulo, categoria):
  317.     data= scrapertools.cache_page("http://www.newpct1.com/pct1/library/include/ajax/get_subcategory.php", post="categoryIDR=" + categoria)
  318.     data=data.replace("</option>"," </option>")
  319.     patron = '<option value="(\d+)">(' + titulo.replace(" ","\s").replace("(","/(").replace(")","/)") + '\s[^<]*)</option>'
  320.     logger.info("[newpct1.py] buscar_en_subcategoria: data=" + data)
  321.     logger.info("[newpct1.py] buscar_en_subcategoria: patron=" + patron)
  322.     matches = re.compile(patron,re.DOTALL | re.IGNORECASE).findall(data)
  323.  
  324.     if len(matches)==0: matches=[('','')]
  325.  
  326.     return matches [0][0]
  327.  
  328. def findvideos(item):
  329.     logger.info("[newpct1.py] findvideos")
  330.     itemlist=[]
  331.  
  332.     ## Cualquiera de las tres opciones son válidas
  333.     #item.url = item.url.replace("1.com/","1.com/ver-online/")
  334.     #item.url = item.url.replace("1.com/","1.com/descarga-directa/")
  335.     item.url = item.url.replace("1.com/","1.com/descarga-torrent/")
  336.  
  337.     # Descarga la página
  338.     data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)","",scrapertools.cache_page(item.url))
  339.     data = unicode( data, "iso-8859-1" , errors="replace" ).encode("utf-8")
  340.  
  341.     title = scrapertools.find_single_match(data,"<h1><strong>([^<]+)</strong>[^<]+</h1>")
  342.     title+= scrapertools.find_single_match(data,"<h1><strong>[^<]+</strong>([^<]+)</h1>")
  343.     caratula = scrapertools.find_single_match(data,'<div class="entry-left">.*?src="([^"]+)"')
  344.  
  345.     #<a href="http://tumejorjuego.com/download/index.php?link=descargar-torrent/058310_yo-frankenstein-blurayrip-ac3-51.html" title="Descargar torrent de Yo Frankenstein " class="btn-torrent" target="_blank">Descarga tu Archivo torrent!</a>
  346.  
  347.     patron = '<a href="([^"]+)" title="[^"]+" class="btn-torrent" target="_blank">'
  348.  
  349.     # escraped torrent
  350.     url = scrapertools.find_single_match(data,patron)
  351.     if url!="":
  352.         itemlist.append( Item(channel=__channel__, action="play", server="torrent", title=title+" [torrent]", fulltitle=title, url=url , thumbnail=caratula, plot=item.plot, folder=False) )
  353.  
  354.     # escraped ver vídeos, descargar vídeos un link, múltiples liks
  355.     data = data.replace("'",'"')
  356.     data = data.replace('javascript:;" onClick="popup("http://www.newpct1.com/pct1/library/include/ajax/get_modallinks.php?links=',"")
  357.     data = data.replace("http://tumejorserie.com/descargar/url_encript.php?link=","")
  358.     data = data.replace("$!","#!")
  359.  
  360.     patron_descargar = '<div id="tab2"[^>]+>.*?</ul>'
  361.     patron_ver = '<div id="tab3"[^>]+>.*?</ul>'
  362.  
  363.     match_ver = scrapertools.find_single_match(data,patron_ver)
  364.     match_descargar = scrapertools.find_single_match(data,patron_descargar)
  365.  
  366.     patron = '<div class="box1"><img src="([^"]+)".*?' # logo
  367.     patron+= '<div class="box2">([^<]+)</div>'         # servidor
  368.     patron+= '<div class="box3">([^<]+)</div>'         # idioma
  369.     patron+= '<div class="box4">([^<]+)</div>'         # calidad
  370.     patron+= '<div class="box5"><a href="([^"]+)".*?'  # enlace
  371.     patron+= '<div class="box6">([^<]+)</div>'         # titulo
  372.  
  373.     enlaces_ver = re.compile(patron,re.DOTALL).findall(match_ver)
  374.     enlaces_descargar = re.compile(patron,re.DOTALL).findall(match_descargar)
  375.  
  376.     for logo, servidor, idioma, calidad, enlace, titulo in enlaces_ver:
  377.         servidor = servidor.replace("played","playedto")
  378.         titulo = titulo+" ["+servidor+"]"
  379.         mostrar_server= True
  380.         if config.get_setting("hidepremium")=="true":
  381.             mostrar_server= servertools.is_server_enabled (servidor)
  382.         if mostrar_server:
  383.             itemlist.append( Item(channel=__channel__, action="play", server=servidor, title=titulo , fulltitle = item.title, url=enlace , thumbnail=logo , plot=item.plot , folder=False) )
  384.  
  385.     for logo, servidor, idioma, calidad, enlace, titulo in enlaces_descargar:
  386.         servidor = servidor.replace("uploaded","uploadedto")
  387.         partes = enlace.split(" ")
  388.         p = 1
  389.         for enlace in partes:
  390.             parte_titulo = titulo+" (%s/%s)" % (p,len(partes)) + " ["+servidor+"]"
  391.             p+= 1
  392.             mostrar_server= True
  393.             if config.get_setting("hidepremium")=="true":
  394.                 mostrar_server= servertools.is_server_enabled (servidor)
  395.             if mostrar_server:
  396.                 itemlist.append( Item(channel=__channel__, action="play", server=servidor, title=parte_titulo , fulltitle = item.title, url=enlace , thumbnail=logo , plot=item.plot , folder=False) )
  397.  
  398.     return itemlist
  399.  
  400. def episodios(item):
  401.     # Necesario para las actualizaciones automaticas
  402.     return completo(Item(url=item.url, show=item.show, extra= "serie_add"))
  403.  
  404.  
  405. # Verificación automática de canales: Esta función debe devolver "True" si todo está ok en el canal.
  406. def test():
  407.     bien = True
  408.  
  409.     # mainlist
  410.     mainlist_items = mainlist(Item())
  411.     submenu_items = submenu(mainlist_items[0])
  412.     listado_items = listado(submenu_items[0])
  413.     for listado_item in listado_items:
  414.         play_items = findvideos(listado_item)
  415.  
  416.         if len(play_items)>0:
  417.             return True
  418.  
  419.     return False
  420.  
  421.  
  422. '''
  423.   Clase TvDb
  424.   Esta clase podria ir en un fichero externo para ser utilizado por otros canales
  425. '''
  426. class TvDb():
  427.  
  428.     def __init__(self,idiomaDef="es"):
  429.         self.__idiomaDef = idiomaDef #fija el idioma por defecto para el resto de metodos
  430.  
  431.     def get_series_by_title(self, title, idioma=""):
  432.         '''
  433.        Busqueda de series por titulo
  434.        @return:
  435.            Devuelve un documento que representa el xml con todas las series encontradas por orden de mayor similitud
  436.        @params:
  437.            title: Titulo de la serie.
  438.            idioma: Argumento opcional que especifica el idioma de la serie a buscar. Por defecto: idioma seleccionado por defecto al iniciar el objeto
  439.        '''
  440.         from xml.dom import minidom
  441.         if idioma=="": idioma= self.__idiomaDef
  442.         __getSeriesByTitleUrl ='http://thetvdb.com/api/GetSeries.php?seriesname=%s&language=%s' %(title.replace(' ','%20'), idioma)
  443.         __data = scrapertools.cache_page(__getSeriesByTitleUrl)
  444.         xmldoc= None
  445.         if len(__data)>0:
  446.             xmldoc = minidom.parseString(__data)
  447.             logger.info("[TvDb.get_series_by_title] Titulo= " +title+ "; Series encontradas: " + str(len(xmldoc.getElementsByTagName('Series'))))
  448.         else:
  449.             logger.info("[TvDb.get_series_by_title] Error de lectura")
  450.         return xmldoc
  451.  
  452.     def get_series_by_remoteId(self, imdbid="", zap2it="", idioma=""):
  453.         '''
  454.        Busqueda de series por el identificador de Imdb o Zap2it
  455.        @return:
  456.            Devuelve un documento que representa el xml con las series encontradas
  457.        @params:
  458.            imdbid: The imdb id you're trying to find. Do not use with zap2itid
  459.            zap2it: The Zap2it / SchedulesDirect ID you're trying to find. Do not use with imdbid
  460.            language: The language abbreviation, if not provided default is used.
  461.        '''
  462.         from xml.dom import minidom
  463.         if idioma=="": idioma= self.__idiomaDef
  464.         __getSeriesByRemoteIdUrl="http://thetvdb.com/api/GetSeriesByRemoteID.php?language=%s" %idioma
  465.         xmldoc= None
  466.  
  467.         if imdbid!='':
  468.             codigo="imdbid=" + imdbid
  469.         elif zap2it !='':
  470.             codigo="zap2it=" + zap2it
  471.         else:
  472.             logger.info("[TvDb.get_series_by_remoteId] Error de parametros")
  473.  
  474.         __data = scrapertools.cache_page(__getSeriesByRemoteIdUrl +"&" + codigo)
  475.         if len(__data)>0:
  476.             xmldoc = minidom.parseString(__data)
  477.             logger.info("[TvDb.get_series_by_remoteId] Codigo " + codigo + "; Series encontradas: " + str(len(xmldoc.getElementsByTagName('Series'))))
  478.         else:
  479.             logger.info("[TvDb.get_series_by_remoteId] Error de lectura")
  480.         return xmldoc
  481.  
  482.     def get_serieId_by_remoteId(self, imdbid="", zap2it="", idioma=""):
  483.         '''
  484.        Convierte un identificador Imdb o Zap2it en un identificador TvDb
  485.        @return:
  486.            Devuelve una cadena con el identificador TvDb de la serie
  487.        @params:
  488.            imdbid: The imdb id you're trying to find. Do not use with zap2itid
  489.            zap2it: The Zap2it / SchedulesDirect ID you're trying to find. Do not use with imdbid
  490.            language: The language abbreviation, if not provided default is used.
  491.        '''
  492.         from xml.dom import minidom
  493.         xmldoc = self.get_series_by_remoteId(imdbid, zap2it, idioma)
  494.         itemlist = xmldoc.getElementsByTagName('seriesid')
  495.  
  496.         if imdbid!='':
  497.             codigo="imdbid=" + imdbid
  498.         elif zap2it !='':
  499.             codigo="zap2it=" + zap2it
  500.  
  501.         if len(itemlist)>0:
  502.             serieId = itemlist[0].childNodes[0].nodeValue
  503.             logger.info("[TvDb.get_serieId_by_remoteId] Codigo " + codigo + "; serieId= " +serieId)
  504.             return serieId
  505.         else:
  506.             logger.info("[TvDb.get_serieId_by_remoteId] Codigo " + codigo + " no encontrado")
  507.             return '0'
  508.  
  509.     def get_serieId_by_title(self,title, idioma=""):
  510.         '''
  511.        Lleva a cabo una busqueda por titulo de series y devuelve el identificador de la serie con mayor similitud
  512.        @return:
  513.            Devuelve una cadena con el identificador de la serie cuyo titulo mas se asemeje al buscado
  514.        @params:
  515.            title: Titulo de la serie.
  516.            idioma: Argumento opcional que especifica el idioma de la serie a buscar. Por defecto: idioma seleccionado por defecto al iniciar el objeto
  517.        '''
  518.         from xml.dom import minidom
  519.         xmldoc = self.get_series_by_title(title, idioma)
  520.         itemlist = xmldoc.getElementsByTagName('seriesid')
  521.         if len(itemlist)>0:
  522.             serieId = itemlist[0].childNodes[0].nodeValue
  523.             logger.info("[TvDb.get_serieId_by_title] Titulo= " +title+ "; serieId= " +serieId)
  524.             return serieId
  525.         else:
  526.             logger.info("[TvDb.get_serieId_by_title] Titulo= " +title+ "No encontrada")
  527.             return '0'
  528.  
  529.     def get_banners_by_serieId (self, serieId):
  530.         '''
  531.        @return:
  532.            Devuelve un documento que representa el xml con todos los graficos de la serie
  533.        @params:
  534.            serieId: Identificador de la serie.
  535.        '''
  536.         from xml.dom import minidom
  537.         __getBannersBySeriesIdUrl = 'http://thetvdb.com/api/1D62F2F90030C444/series/%s/banners.xml' %serieId
  538.         __data = scrapertools.cache_page(__getBannersBySeriesIdUrl)
  539.         xmldoc= None
  540.  
  541.         if len(__data)>0:
  542.             xmldoc = minidom.parseString(__data)
  543.             logger.info("[TvDb.get_banners_by_serieId] serieId= " +str(serieId) + "; Banners encontrados: " + str(len(xmldoc.getElementsByTagName('Banner'))))
  544.         else:
  545.             logger.info("[TvDb.get_banners_by_serieId] Error de lectura")
  546.         #return str(len(xmldoc.getElementsByTagName('Banner')))
  547.         return xmldoc
  548.  
  549.     def get_banners_by_title(self,title, idioma=""):
  550.         '''
  551.        @return:
  552.            Devuelve un documento que representa el xml con todos los graficos de la serie
  553.        @params:
  554.            title: Titulo de la serie.
  555.            idioma: Argumento opcional que especifica el idioma de la serie a buscar. Por defecto: idioma seleccionado por defecto al iniciar el objeto
  556.        '''
  557.         from xml.dom import minidom
  558.         xmldoc= None
  559.         id= self.get_serieId_by_title(title,idioma)
  560.         if id>0:
  561.             xmldoc = self.get_banners_by_serieId(id)
  562.         #return str(len(xmldoc.getElementsByTagName('Banner')))
  563.         return xmldoc
  564.  
  565.     def get_graphics_by_serieId (self, serieId, bannerType='fanart_vignette', bannerType2='', season=0, *languages  ):
  566.         '''
  567.        Busqueda por identificador de los graficos de una serie.
  568.        @return:
  569.            Devuelve una lista de urls de banners de que coinciden con los criterios solicitado.
  570.        @params:
  571.            serieId: Identificador de la serie.
  572.            bannerType: This can be poster, fanart, fanart_vignette, series or season.
  573.            bannerType2: For series banners it can be text, graphical, or blank. For season banners it can be season or seasonwide. For fanart it can be 1280x720 or 1920x1080. For poster it will always be 680x1000.
  574.            season: Opcionalmente se puede especificar una temporada en concreto (Por defecto 0, todas las temporadas)
  575.            languages: Es posible añadir varios separados por comas. (Por defecto se incluyen en ingles y el idioma seleccionado por defecto al iniciar el objeto)
  576.        '''
  577.         from xml.dom import minidom
  578.         ret= []
  579.         vignette=False
  580.  
  581.         # Comprobamos los parametros pasados
  582.         if bannerType in ('poster', 'fanart', 'fanart_vignette', 'series', 'season'):
  583.             if not str(serieId).isdigit() or not str(season).isdigit():
  584.                 logger.info("[TvDb.get_graphics_by_serieId] Error lo argumentos 'serieId' y 'season' deben ser numericos")
  585.                 return []
  586.             else:
  587.                 if bannerType== 'fanart_vignette':
  588.                     bannerType= 'fanart'
  589.                     vignette= True
  590.  
  591.                 if bannerType== 'poster': bannerType2='680x1000'
  592.                 elif bannerType== 'fanart' and bannerType2 in ('1280x720', '1920x1080',''): pass
  593.                 elif bannerType== 'series ' and bannerType2 in ('text', 'graphical', 'blank'): pass
  594.                 elif bannerType== 'season' and bannerType2 in ('season', 'seasonwide'): pass
  595.                 else:
  596.                     logger.info("[TvDb.get_graphics_by_serieId] Error argumento 'bannerType2' no valido")
  597.                     return []
  598.         else:
  599.             logger.info("[TvDb.get_graphics_by_serieId] Error argumento 'bannerType' no valido")
  600.             return []
  601.         if len(languages)==0:
  602.             languages= ['en']
  603.             if self.__idiomaDef not in languages: languages.insert(0,self.__idiomaDef)
  604.         else:
  605.             if type(languages[0]) is tuple:  languages= list(languages[0])
  606.  
  607.             for lenguage in languages:
  608.                 if len(lenguage) != 2:
  609.                     logger.info("[TvDb.get_graphics_by_serieId] Error argumento 'languages' no valido")
  610.                     return []
  611.  
  612.         # Obtener coleccion de elementos banner de banners.xml
  613.         banners = self.get_banners_by_serieId(serieId).getElementsByTagName('Banner')
  614.  
  615.         for banner in banners:
  616.             # Comprobar si es del mismo tipo
  617.             if banner.getElementsByTagName('BannerType')[0].firstChild.data == bannerType:
  618.                 if bannerType2=="" or banner.getElementsByTagName('BannerType2')[0].firstChild.data == bannerType2:
  619.                     idiomas= banner.getElementsByTagName('Language')
  620.                     # Comprobar idioma
  621.                     if len(idiomas)!=0:
  622.                         fi=False
  623.                         for lenguage in languages:
  624.                             if lenguage== idiomas[0].firstChild.data:
  625.                                 fi=True
  626.                     else: #no expecifica idioma
  627.                         fi=True
  628.                     # Comprobar temporada
  629.                     if season==0 or banner.getElementsByTagName('Season')[0].firstChild.data== season:
  630.                         ft=True
  631.                     else:
  632.                         ft=False
  633.                     if fi and ft:
  634.                         if vignette and banner.getElementsByTagName('VignettePath')[0].firstChild.data!="":
  635.                             ret.append('http://thetvdb.com/banners/' + banner.getElementsByTagName('VignettePath')[0].firstChild.data)
  636.                         else:
  637.                             ret.append('http://thetvdb.com/banners/' + banner.getElementsByTagName('BannerPath')[0].firstChild.data)
  638.                         logger.info("[TvDb.get_graphics_by_serieId] bannerType2=" +banner.getElementsByTagName('BannerType2')[0].firstChild.data)
  639.         logger.info("[TvDb.get_graphics_by_serieId] serieId=" +str(serieId)+", bannerType="+  bannerType +", bannerType2="+ bannerType2  +", season="+ str(season) +", languages="+ str(languages))
  640.         logger.info("[TvDb.get_graphics_by_serieId] Banners encontrados: "+ str(len(ret)))
  641.         return ret
  642.  
  643.     def get_graphics_by_title (self, title, bannerType='fanart_vignette', bannerType2='', season=0, *languages  ):
  644.         '''
  645.        Busqueda por titulo de los graficos de una serie.
  646.        @return:
  647.            Devuelve una lista de urls de banners de que coinciden con los criterios solicitado.
  648.        @params:
  649.            serieId: Identificador de la serie.
  650.            bannerType: This can be poster, fanart, fanart_vignette, series or season.
  651.            bannerType2: For series banners it can be text, graphical, or blank. For season banners it can be season or seasonwide. For fanart it can be 1280x720 or 1920x1080. For poster it will always be 680x1000.
  652.            season: Opcionalmente se puede especificar una temporada en concreto (Por defecto 0, todas las temporadas)
  653.            languages: Es posible añadir varios separados por comas. (Por defecto se incluyen en ingles y el idioma seleccionado por defecto al iniciar el objeto)
  654.        '''
  655.         from xml.dom import minidom
  656.         ret= []
  657.         if len(languages)==0:
  658.            idioma= self.__idiomaDef
  659.            languages= None
  660.         else:
  661.             idioma= languages[0]
  662.         id= self.get_serieId_by_title(title,idioma)
  663.         if id>0:
  664.             if languages is None:
  665.                 ret= self.get_graphics_by_serieId (id, bannerType, bannerType2, season)
  666.             else:
  667.                 ret= self.get_graphics_by_serieId (id, bannerType, bannerType2, season, languages)
  668.         return ret
  669.  
  670.     def get_episode_by_seasonEpisode (self, serieId, season, episode, idioma=""):
  671.         '''
  672.        Busca datos de un capitulo en concreto
  673.        @return:
  674.            Devuelve un documento que representa el xml con los datos del capitulo buscado
  675.        @params:
  676.            serieId: Identificador de la serie.
  677.            season: Numero de temporada buscada.
  678.            episode: Numero del episodio dentro de la temporada buscado.
  679.            idioma: Argumento opcional que especifica el idioma de la serie a buscar. Por defecto: idioma seleccionado por defecto al iniciar el objeto
  680.        '''
  681.         from xml.dom import minidom
  682.         if idioma=="": idioma= self.__idiomaDef
  683.         __getEpisodeBySeasonEpisodeUrl= 'http://thetvdb.com/api/1D62F2F90030C444/series/%s/default/%s/%s/%s.xml' %(serieId, season, episode, idioma)
  684.         __data = scrapertools.cache_page(__getEpisodeBySeasonEpisodeUrl)
  685.         xmldoc= None
  686.  
  687.         if len(__data)>0:
  688.             xmldoc = minidom.parseString(__data)
  689.             logger.info("[TvDb.get_episode_by_seasonEpisode] serieId= " +str(serieId) + ", season="+  str(season) +", episode="+ str(episode) +", idioma="+ idioma)
  690.         else:
  691.             logger.info("[TvDb.get_episode_by_seasonEpisode] Error de lectura")
  692.         #return xmldoc
  693.         return str(len(xmldoc.getElementsByTagName('Episode')))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement