Advertisement
elxman

seriesflv

Mar 17th, 2015
1,097
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.45 KB | None | 0 0
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. # -*- coding: utf-8 -*-
  3. #------------------------------------------------------------
  4. # pelisalacarta - XBMC Plugin
  5. # Canal para seriesflv
  6. # http://blog.tvalacarta.info/plugin-xbmc/pelisalacarta/
  7. #------------------------------------------------------------
  8.  
  9. import urlparse,urllib2,urllib,re
  10. import os, sys
  11.  
  12. from core import logger
  13. from core import config
  14. from core import scrapertools
  15. from core import jsontools
  16. from core.item import Item
  17. from servers import servertools
  18.  
  19. DEBUG = config.get_setting("debug")
  20.  
  21. __category__ = "A"
  22. __type__ = "generic"
  23. __title__ = "seriesflv"
  24. __channel__ = "seriesflv"
  25. __language__ = "ES"
  26. __creationdate__ = "20140615"
  27.  
  28. DEFAULT_HEADERS = []
  29. DEFAULT_HEADERS.append( ["User-Agent","Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; es-ES; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12"] )
  30.  
  31. def isGeneric():
  32. return True
  33.  
  34. def mainlist(item):
  35. logger.info("pelisalacarta.channels.seriesflv mainlist")
  36.  
  37. itemlist = []
  38.  
  39. itemlist.append( Item(channel=__channel__, action="menuepisodios" , title="Últimos episodios..." , url="" ))
  40. itemlist.append( Item(channel=__channel__, action="series" , title="Todas las series" , url="http://www.seriesflv.net/ajax/lista.php", extra="grupo_no=0&type=series&order=titulo" ))
  41. itemlist.append( Item(channel=__channel__, action="series" , title="Series más vistas" , url="http://www.seriesflv.net/ajax/lista.php", extra="grupo_no=0&type=series&order=hits" ))
  42. itemlist.append( Item(channel=__channel__, action="series" , title="Telenovelas" , url="http://www.seriesflv.net/ajax/lista.php", extra="grupo_no=0&type=generos&order=novelas" ))
  43. itemlist.append( Item(channel=__channel__, action="search" , title="Buscar..." , url="http://www.seriesflv.net/api/search/?q=" ))
  44.  
  45. return itemlist
  46.  
  47. def menuepisodios(item):
  48. logger.info("pelisalacarta.channels.seriesflv menuepisodios")
  49.  
  50. itemlist = []
  51. itemlist.append( Item(channel=__channel__, action="ultimos_episodios" , title="Subtitulados" , url="sub" ))
  52. itemlist.append( Item(channel=__channel__, action="ultimos_episodios" , title="Español" , url="es" ))
  53. itemlist.append( Item(channel=__channel__, action="ultimos_episodios" , title="Latino" , url="la" ))
  54. itemlist.append( Item(channel=__channel__, action="ultimos_episodios" , title="Original" , url="en" ))
  55. return itemlist
  56.  
  57. def ultimos_episodios(item):
  58. logger.info("pelisalacarta.channels.seriesflv ultimos_episodios")
  59. itemlist = []
  60.  
  61. # Descarga la pagina
  62. headers = DEFAULT_HEADERS[:]
  63. data = scrapertools.cache_page("http://www.seriesflv.net/",headers=headers)
  64. #logger.info("data="+data)
  65.  
  66. # Extrae los episodios
  67. '''
  68. <a href="http://www.seriesflv.net/ver/ciega-a-citas-1x72.html" class="item-one" lang="es" title="Ciega a citas 1x72 Online Sub Español Gratis">
  69. <div class="box-tc">1x72</div>
  70. <div class="box-info">
  71. <div class="i-title">Ciega a citas</div>
  72. <div class="i-time">Hace 10 minutos</div>
  73. </div>
  74. </a>
  75. '''
  76. idioma = item.url
  77. patron = '<a href="([^"]+)" class="item-one" lang="'+idioma+'"[^<]+'
  78. patron += '<div class="box-tc">([^<]+)</div[^<]+'
  79. patron += '<div class="box-info"[^<]+'
  80. patron += '<div class="i-title">([^<]+)</div[^<]+'
  81. patron += '<div class="i-time">([^<]+)</div>'
  82.  
  83. matches = re.compile(patron,re.DOTALL).findall(data)
  84.  
  85. for scrapedurl,episodio,serie,hace in matches:
  86. title = serie+" "+episodio+" ("+hace+")"
  87. thumbnail = ""
  88. plot = ""
  89. url = scrapedurl
  90. itemlist.append( Item(channel=__channel__, action="findvideos" , title=title , url=url, thumbnail=thumbnail, plot=plot, fulltitle=title))
  91.  
  92. if (DEBUG): logger.info("title=["+title+"], url=["+url+"], thumbnail=["+thumbnail+"]")
  93.  
  94. return itemlist
  95.  
  96.  
  97. def search(item,texto):
  98. logger.info("pelisalacarta.channels.seriesflv search")
  99.  
  100. texto = texto.replace(" ","%20")
  101.  
  102. if item.url=="":
  103. item.url="http://www.seriesflv.net/api/search/?q="
  104.  
  105. item.url = item.url+texto
  106.  
  107. try:
  108. return buscar(item)
  109.  
  110. # Se captura la excepción, para no interrumpir al buscador global si un canal falla
  111. except:
  112. import sys
  113. for line in sys.exc_info():
  114. logger.error( "%s" % line )
  115. return []
  116.  
  117. def buscar(item):
  118. logger.info("pelisalacarta.channels.seriesflv buscar")
  119.  
  120. # Descarga la pagina
  121. headers = DEFAULT_HEADERS[:]
  122. headers.append(["Referer","http://www.seriesflv.net/series/"])
  123. headers.append(["X-Requested-With","XMLHttpRequest"])
  124.  
  125. post = item.extra
  126.  
  127. data = scrapertools.cache_page(item.url , headers=headers , post=post)
  128. logger.info("data="+data)
  129.  
  130. # Extrae las entradas (carpetas)
  131. '''
  132. <ul><div class="bg7 header color7">Resultados de <b>equipo a</b></div>
  133. <li><a class="on over" href="http://www.seriesflv.net/serie/el-equipo-a.html">
  134. <div class="left">
  135. <img src="http://http-s.ws/ysk/img/data/b5de7e0470eae36f8196d8fcbf897c17-size-90x120-a.jpg" />
  136. </div><div class="op">
  137. <span class="color1 bold tit">El equipo A</span>
  138. <span class="color8 font2">6 temporadas</span><span><div class="star_rating over">
  139. <ul style="float:none; left:auto;" class="star">
  140. <li style="width: 100%;" class="curr"></li>
  141. </ul>
  142. </div></span></div></a></li>
  143. </ul>
  144. '''
  145. patron = '<li><a class="on over" href="([^"]+)"[^<]+'
  146. patron += '<div class="left"[^<]+'
  147. patron += '<img src="([^"]+)"[^<]+'
  148. patron += '</div><div class="op"[^<]+'
  149. patron += '<span class="[^"]+">([^<]+)</span[^<]+'
  150. patron += '<span class="[^"]+">([^<]+)</span>'
  151.  
  152. matches = re.compile(patron,re.DOTALL).findall(data)
  153. itemlist = []
  154.  
  155. for scrapedurl,scrapedthumbnail,scrapedtitle,numtemporadas in matches:
  156.  
  157. title = scrapertools.htmlclean(scrapedtitle).strip()+" ("+numtemporadas+")"
  158. thumbnail = urlparse.urljoin(item.url,scrapedthumbnail)
  159. plot = ""
  160.  
  161. url = urlparse.urljoin(item.url,scrapedurl)
  162. itemlist.append( Item(channel=__channel__, action="episodios" , title=title , url=url, thumbnail=thumbnail, plot=plot, show=title))
  163. if (DEBUG): logger.info("title=["+title+"], url=["+url+"], thumbnail=["+thumbnail+"]")
  164.  
  165. return itemlist
  166.  
  167. def series(item):
  168. logger.info("pelisalacarta.channels.seriesflv series")
  169.  
  170. # Descarga la pagina
  171. headers = DEFAULT_HEADERS[:]
  172. headers.append(["Referer","http://www.seriesflv.net/series/"])
  173. headers.append(["X-Requested-With","XMLHttpRequest"])
  174.  
  175. post = item.extra
  176.  
  177. data = scrapertools.cache_page(item.url , headers=headers , post=post)
  178. logger.info("data="+data)
  179.  
  180. # Extrae las entradas (carpetas)
  181. '''
  182. <ul><li>
  183. <a href="http://www.seriesflv.net/serie/game-of-thrones.html" class="on over">
  184. <div class="left">
  185. <img src="http://http-s.ws/ysk/img/data/11a1a46bca5c4cca2cac0d0711225feb-size-90x120-a.jpg" width="50" height="60" />
  186. Game of Thrones (Juego de tronos)</div>
  187. <div class="rigth over">
  188.  
  189. <div class="left op">
  190. <span>4</span>
  191. <p>Temporadas</p>
  192. </div>
  193. '''
  194. patron = '<a.*?href="([^"]+)"[^<]+'
  195. patron += '<div class="left"[^<]+'
  196. patron += '<img.*?src="([^"]+)"[^>]*>([^<]+)</div[^<]+'
  197. patron += '<div class="rigth over"[^<]+'
  198. patron += '<div class="left op"[^<]+'
  199. patron += '<span>([^<]+)</span'
  200. matches = re.compile(patron,re.DOTALL).findall(data)
  201. itemlist = []
  202.  
  203. for scrapedurl,scrapedthumbnail,scrapedtitle,numtemporadas in matches:
  204.  
  205. title = scrapertools.htmlclean(scrapedtitle).strip()+" ("+numtemporadas+" temporadas)"
  206. thumbnail = urlparse.urljoin(item.url,scrapedthumbnail)
  207. plot = ""
  208.  
  209. url = urlparse.urljoin(item.url,scrapedurl)
  210. itemlist.append( Item(channel=__channel__, action="episodios" , title=title , url=url, thumbnail=thumbnail, plot=plot, show=title))
  211. if (DEBUG): logger.info("title=["+title+"], url=["+url+"], thumbnail=["+thumbnail+"]")
  212.  
  213. #grupo_no=0&type=series&order=titulo
  214. old_offset = scrapertools.find_single_match(item.extra,"grupo_no\=(\d+)")
  215. new_offset = str(int(old_offset)+1)
  216. newextra = item.extra.replace("grupo_no="+old_offset,"grupo_no="+new_offset)
  217. itemlist.append( Item(channel=__channel__, action="series" , title=">> Página siguiente" , extra=newextra, url=item.url))
  218.  
  219. return itemlist
  220.  
  221. def get_nombre_idioma(idioma):
  222.  
  223. if idioma=="es":
  224. return "Español"
  225. elif idioma=="en":
  226. return "Inglés"
  227. elif idioma=="la":
  228. return "Latino"
  229. elif idioma=="sub":
  230. return "VOS"
  231. else:
  232. return idioma
  233.  
  234. def episodios(item):
  235. logger.info("pelisalacarta.channels.seriesflv episodios")
  236. itemlist = []
  237.  
  238. # Descarga la pagina
  239. headers = DEFAULT_HEADERS[:]
  240. data = scrapertools.cache_page(item.url,headers=headers)
  241. #logger.info("data="+data)
  242.  
  243. # Extrae los episodios
  244. '''
  245. <tr>
  246. <td class="sape"><i class="glyphicon glyphicon-film"></i> <a href="http://www.seriesflv.net/ver/game-of-thrones-1x9.html" class="color4">Game of Thrones (Juego de tronos) 1x09</a></td>
  247. <td>
  248. <a href="javascript:void(0);" class="loginSF" title="Marcar Visto"><span class="no visto"></span></a>
  249. </td>
  250. <td><div class="star_rating">
  251. <ul class="star">
  252. <li class="curr" style="width: 99.6%;"></li>
  253. </ul>
  254. </div></td>
  255. <td>
  256. <img src="http://www.seriesflv.net/images/lang/es.png" width="20" />
  257. <img src="http://www.seriesflv.net/images/lang/la.png" width="20" />
  258. <img src="http://www.seriesflv.net/images/lang/sub.png" width="20" />
  259. </td>
  260. <td>40,583</td>
  261. </tr>
  262. '''
  263. patron = '<tr[^<]+<td class="sape"><i class="glyphicon glyphicon-film"></i[^<]+'
  264. patron += '<a href="([^"]+)"[^>]+>([^<]+)</a>.*?<img(.*?)</td'
  265. matches = re.compile(patron,re.DOTALL).findall(data)
  266.  
  267. for scrapedurl,scrapedtitle,bloqueidiomas in matches:
  268. title = scrapedtitle+" ("
  269.  
  270. patronidiomas="lang/([a-z]+).png"
  271. matchesidiomas = re.compile(patronidiomas,re.DOTALL).findall(bloqueidiomas)
  272. for idioma in matchesidiomas:
  273. title=title+get_nombre_idioma(idioma)+", "
  274.  
  275. title=title[:-2]+")"
  276.  
  277. thumbnail = ""
  278. plot = ""
  279. url = scrapedurl
  280. itemlist.append( Item(channel=__channel__, action="findvideos" , title=title , url=url, thumbnail=thumbnail, plot=plot, fulltitle=title))
  281.  
  282. if (DEBUG): logger.info("title=["+title+"], url=["+url+"], thumbnail=["+thumbnail+"]")
  283.  
  284. return itemlist
  285.  
  286. def findvideos(item):
  287. logger.info("pelisalacarta.channels.seriesflv findvideos")
  288.  
  289. # Descarga la pagina
  290. headers = DEFAULT_HEADERS[:]
  291. data = scrapertools.cache_page(item.url,headers=headers)
  292. data = scrapertools.find_single_match(data,'<div id="enlaces">(.*?)<div id="comentarios">')
  293. #logger.info("data="+data)
  294.  
  295. # Extrae las entradas (carpetas)
  296. '''
  297. <tr>
  298. <td width="45"><img width="20" src="http://www.seriesflv.net/images/lang/es.png"></td>
  299. <td width="86">2014-04-03</td>
  300. <td width="134" style="text-align:left;"><img width="16" src="http://www.google.com/s2/favicons?domain=gamovideo.com"> gamovideo</td>
  301. <td width="84"><a href="http://www.seriesflv.net/reproductor/?go=3Se67975zSF73F2SbnvpMlOoJWfQHQEQP7hCqqNzOqNTSUBt90wx9Lj0DUVi2vGcV32wTiKeNId%2FtnFDVGdUPQ%3D%3D" data-uri="http://gamovideo.com/i9445na28nrm" rel="nofollow" target="_blank" title="Reproducir..." class="btn btn-primary btn-xs bg2"><i class="glyphicon glyphicon-play"></i> Reproducir</a></td>
  302. <td width="96" class="usuario"><a href="http://www.seriesflv.net/usuario/natzuflv/" rel="nofollow" class="color1">Natzuflv</a></td>
  303. <td width="200">Hace 3 meses | HD 720p</td>
  304. <td width="92">
  305. <div class="report off">
  306. <a href="#" class="btn btn-danger btn-xs loginSF"><i class="glyphicon glyphicon-warning-sign"></i></a>
  307. </div>
  308. <div class="views on">2,595</div>
  309. </td>
  310. </tr>
  311. '''
  312. '''
  313. <tr>
  314. <td width="45"><img width="20" src="http://www.seriesflv.net/images/lang/sub.png"></td>
  315. <td width="86">2014-08-10</td>
  316. <td width="134" style="text-align:left;"><img width="16" src="http://www.google.com/s2/favicons?domain=tumi.tv"> tumi</td>
  317. <td width="84"><a href="http://www.seriesflv.net/goto/" data-key="qXFa+2QrDcOkQxTBiRWMDvjw9twofrTPwY6R3IV1tEU=" rel="nofollow" target="_blank" title="Reproducir..." class="btn btn-primary btn-xs bg2 enlace_link"><i class="glyphicon glyphicon-play"></i> Reproducir</a></td>
  318. <td width="96" class="usuario"><a href="http://www.seriesflv.net/usuario/natzuflv/" rel="nofollow" class="color1">Natzuflv</a></td>
  319. <td width="200">Hace 3 horas | </td>
  320.  
  321. <td width="45"><img width="20" src="http://www.seriesflv.net/images/lang/sub.png"></td>
  322. <td width="86">2014-03-22</td>
  323. <td width="134" style="text-align:left;"><img width="16" src="http://www.google.com/s2/favicons?domain=nowdownload.ch"> nowdownload</td>
  324. <td width="84"><a href="http://www.seriesflv.net/goto/" rel="nofollow" target="_blank" title="Descargar...!" data-key="eZMOyiO7JKrg7YI9FegHR97/raBhS4x3qa1gc9S0yVQ=" class="btn btn-primary btn-xs bg2 enlace_link"><i class="glyphicon glyphicon-cloud-download"></i> Descargar</a></td>
  325. <td width="96" class="usuario"><a href="http://www.seriesflv.net/usuario/mayaflv/" rel="nofollow" class="color1">MayaFLV</a></td>
  326. <td width="200">Hace 7 meses | </td>
  327.  
  328. '''
  329.  
  330. patron = '<tr[^<]+'
  331. patron += '<td[^<]+<img width="\d+" src="([^"]+)"></td[^<]+'
  332. patron += '<td[^<]+</td[^<]+'
  333. patron += '<td[^<]+<img[^>]+>([^<]+)</td[^<]+'
  334. patron += '<td[^<]+<a href="([^"]+)".*?data-key="([^"]+)"[^<]+<i[^<]+</i[^<]+</a></td[^<]+'
  335. patron += '<td[^<]+<a[^<]+</a></td[^<]+'
  336. patron += '<td[^>]+>([^<]+)</td>'
  337. matches = re.compile(patron,re.DOTALL).findall(data)
  338. itemlist = []
  339.  
  340. for url_idioma,nombre_servidor,target_url,key_url,comentario in matches:
  341. codigo_idioma = scrapertools.find_single_match(url_idioma,'lang/([a-z]+).png')
  342. idioma = get_nombre_idioma(codigo_idioma)
  343.  
  344. title = "Ver en "+nombre_servidor.strip()+" ("+idioma+") ("+comentario.strip()+")"
  345. url = target_url
  346. extra = key_url
  347. thumbnail = ""
  348. plot = ""
  349. if (DEBUG): logger.info("title=["+title+"], url=["+url+"], thumbnail=["+thumbnail+"]")
  350. itemlist.append( Item(channel=__channel__, action="play" , title=title , url=url, extra=extra, thumbnail=thumbnail, plot=plot, folder=False))
  351.  
  352. return itemlist
  353.  
  354. def play(item):
  355. logger.info("pelisalacarta.channels.seriesflv play url="+item.url)
  356.  
  357. # Hace la llamada
  358. if item.extra!="":
  359. '''
  360. Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  361. Accept-Encoding:gzip,deflate,sdch
  362. Accept-Language:es-ES,es;q=0.8,en;q=0.6
  363. Cache-Control:max-age=0
  364. Connection:keep-alive
  365. Content-Length:178
  366. Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryzyvJgsMftSHwzZNf
  367. Cookie:perseguidor-limit=COOKIE1407744675853; __utma=253162379.911083080.1407744679.1407744679.1407744679.1; __utmb=253162379.1.10.1407744679; __utmc=253162379; __utmz=253162379.1407744679.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
  368. Host:www.seriesflv.net
  369. Origin:http://www.seriesflv.net
  370. Referer:http://www.seriesflv.net/ver/satisfaction--1x03.html
  371. User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
  372. Request Payload
  373. ------WebKitFormBoundaryzyvJgsMftSHwzZNf
  374. Content-Disposition: form-data; name="url"
  375.  
  376. qXFa+2QrDcOkQxTBiRWMDvjw9twofrTPwY6R3IV1tEU=
  377. ------WebKitFormBoundaryzyvJgsMftSHwzZNf--
  378. Response Headersview source
  379. '''
  380. body = '------WebKitFormBoundaryzyvJgsMftSHwzZNf\n'
  381. body += 'Content-Disposition: form-data; name="url"\n'
  382. body += '\n'
  383. body += item.extra+'\n'
  384. body += '------WebKitFormBoundaryzyvJgsMftSHwzZNf--\n'
  385.  
  386. headers = []
  387. headers.append(["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"])
  388. headers.append(["Accept-Encoding","gzip,deflate,sdch"])
  389. headers.append(["Accept-Language","es-ES,es;q=0.8,en;q=0.6"])
  390. headers.append(["Cache-Control","max-age=0"])
  391. headers.append(["Connection","keep-alive"])
  392. headers.append(["Content-Length",str(len(body))])
  393. headers.append(["Content-Type","multipart/form-data; boundary=----WebKitFormBoundaryzyvJgsMftSHwzZNf"])
  394. headers.append(["Origin","http://www.seriesflv.net"])
  395. headers.append(["Referer","http://www.seriesflv.net/ver/satisfaction--1x03.html"])
  396. headers.append(["User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"])
  397. data = scrapertools.cache_page(item.url,headers=headers,post=body)
  398. logger.info("data="+data)
  399. else:
  400. data = item.url
  401.  
  402. itemlist = servertools.find_video_items(data=data)
  403.  
  404. for videoitem in itemlist:
  405. videoitem.title = item.title
  406. videoitem.fulltitle = item.fulltitle
  407. videoitem.thumbnail = item.thumbnail
  408. videoitem.channel = __channel__
  409.  
  410. return itemlist
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement