PageRenderTime 99ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/script.module.dmd-czech.common/lib/megavideo.py

http://dmd-xbmc.googlecode.com/
Python | 310 lines | 289 code | 9 blank | 12 comment | 5 complexity | 5e8cfde89ac5eedef1c6b1a7764ec5a0 MD5 | raw file
Possible License(s): GPL-2.0, AGPL-1.0
  1. # -*- coding: utf-8 -*-
  2. #------------------------------------------------------------
  3. # pelisalacarta - XBMC Plugin
  4. # Megavideo server connector
  5. # http://blog.tvalacarta.info/plugin-xbmc/pelisalacarta/
  6. #------------------------------------------------------------
  7. # Python Video Decryption and resolving routines.
  8. # Courtesy of Voinage, Coolblaze.
  9. #------------------------------------------------------------
  10. # Modify: 2011-10-09, by Ivo Brhel
  11. #------------------------------------------------------------
  12. import os
  13. import re
  14. import urlparse, urllib, urllib2
  15. DEBUG = False
  16. _UserAgent_ = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14'
  17. def getcode(mega):
  18. if mega.startswith('http://www.megavideo.com/?v='):
  19. mega = mega[-8:]
  20. if mega.startswith('http://wwwstatic.megavideo.com'):
  21. mega = re.compile('.*v=(.+?)$').findall(mega)
  22. mega = mega[0]
  23. if mega.startswith('http://www.megavideo.com/v/'):
  24. mega = re.compile('.*/v/(.+?)$').findall(mega)
  25. mega = mega[0][0:8]
  26. return mega
  27. def geturl(url):
  28. req = urllib2.Request(url)
  29. req.add_header('User-Agent', _UserAgent_)
  30. req.add_header('Referer', 'http://www.megavideo.com/')
  31. page = urllib2.urlopen(req);response=page.read();page.close()
  32. return response
  33. # Returns an array of possible video url's from the page_url, supporting premium user account and password protected video
  34. def getURL( page_url , premium = False , user="" , password="", video_password="" ):
  35. print("[megavideo.py] getURL( page_url='%s' , user='%s' , password='%s', video_password=%s)" % (page_url , user , "**************************"[0:len(password)] , video_password) )
  36. video_urls = []
  37. # If user has premium account, retrieve the cookie_id from the cookie store and passes to the request as parameter "u"
  38. if premium:
  39. #megavideo_cookie_id = get_megavideo_cookie_id(user, password)
  40. megavideo_cookie_id = login(user, password)
  41. if megavideo_cookie_id == "":
  42. print("[megavideo.py] No hay cookie de Megavideo válida (error en login o password?)")
  43. premium = False
  44. if premium:
  45. account_type = "(Premium) [megavideo.com]"
  46. else:
  47. account_type = "(Free) [megavideo.com]"
  48. '''
  49. video_urls.append( [ "SD (Free)" , get_sd_video_url(page_url,premium,user,password,video_password) ] )
  50. else:
  51. do_login(premium,user,password)
  52. video_urls.append( [ "SD (Premium)" , get_sd_video_url(page_url,premium,user,password,video_password) ] )
  53. video_urls.append( [ "Original (Premium)" , get_original_video_url(page_url,premium,user,password,video_password) ] )
  54. '''
  55. # Extract vídeo code from page URL
  56. # http://www.megavideo.com/?v=ABCDEFGH -> ABCDEFGH
  57. #megavideo_video_id = extract_video_id(page_url)
  58. megavideo_video_id = page_url
  59. if megavideo_video_id=="":
  60. print("[megavideo.py] Megavideo URL not valid, or video not available")
  61. return video_urls
  62. # Base URL for obtaining Megavideo URL
  63. url = "http://www.megavideo.com/xml/videolink.php?v="+megavideo_video_id
  64. if premium:
  65. url = url + "&u="+megavideo_cookie_id
  66. # If video is password protected, it is sent with the request as parameter "password"
  67. if video_password!="":
  68. url = url + "&password="+video_password
  69. # Perform the request to Megavideo
  70. print("[megavideo.py] calling Megavideo")
  71. #data = scrapertools.cache_page( url , headers=[['User-Agent','Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14'],['Referer', 'http://www.megavideo.com/']] , )
  72. data = geturl(url)
  73. # Search for an SD link
  74. print("[megavideo.py] SD Link")
  75. try:
  76. s = re.compile(' s="(.+?)"').findall(data)
  77. k1 = re.compile(' k1="(.+?)"').findall(data)
  78. k2 = re.compile(' k2="(.+?)"').findall(data)
  79. un = re.compile(' un="(.+?)"').findall(data)
  80. video_url = "http://www" + s[0] + ".megavideo.com/files/" + decrypt(un[0], k1[0], k2[0]) + "/?.flv"
  81. video_urls.append( ["SD "+account_type , video_url ])
  82. # Video is not available
  83. except:
  84. import sys
  85. for line in sys.exc_info():
  86. print( "%s" % line )
  87. print("[megavideo.py] Megavideo URL not valid, or video not available")
  88. return []
  89. # Search for an HD link if it exists
  90. print("[megavideo.py] HD Link")
  91. hd = re.compile(' hd="(.+?)"').findall(data)
  92. if len(hd)>0 and hd[0]=="1":
  93. s = re.compile(' hd_s="(.+?)"').findall(data)
  94. k1 = re.compile(' hd_k1="(.+?)"').findall(data)
  95. k2 = re.compile(' hd_k2="(.+?)"').findall(data)
  96. un = re.compile(' hd_un="(.+?)"').findall(data)
  97. video_url = "http://www" + s[0] + ".megavideo.com/files/" + decrypt(un[0], k1[0], k2[0]) + "/?.flv"
  98. video_urls.append( ["HD "+account_type , video_url ])
  99. # If premium account, search for the original video link
  100. if premium:
  101. print("[megavideo.py] ORIGINAL Link")
  102. url = "http://www.megavideo.com/xml/player_login.php?u="+megavideo_cookie_id+"&v="+megavideo_video_id+"&password="+video_password
  103. #data2 = scrapertools.cache_page( url , headers=[['User-Agent','Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14'],['Referer', 'http://www.megavideo.com/']] , )
  104. data2 = geturl(url)
  105. #print data2
  106. patronvideos = 'downloadurl="([^"]+)"'
  107. matches = re.compile(patronvideos,re.DOTALL).findall(data2)
  108. video_url = matches[0].replace("%3A",":").replace("%2F","/").replace("%20"," ")
  109. video_urls.append( ["ORIGINAL "+video_url[-4:]+" [megavideo]" , video_url ])
  110. # Truco http://www.protegerurl.com.es/v9v/00Z8VNVZ.flv
  111. #if not premium:
  112. # print("[megavideo.py] SIN LIMITE Link")
  113. # video_urls.append( ["SIN LIMITE [megavideo]" , "http://www.protegerurl.com.es/v9v/"+megavideo_video_id+".flv" ])
  114. # Search for error conditions
  115. errortext = re.compile(' errortext="(.+?)"').findall(data)
  116. if len(errortext)>0:
  117. password_required = re.compile('password_required="(.*?)"').findall(data)
  118. if len(password_required) > 0:
  119. # Launches an exception to force the user to input the password
  120. raise PasswordRequiredException()
  121. print("[megavideo.py] Ended with %d links" % len(video_urls))
  122. return video_urls
  123. # Extract vídeo code from page URL
  124. # http://www.megavideo.com/?v=ABCDEFGH -> ABCDEFGH
  125. def extract_video_id( page_url ):
  126. print("[megavideo.py] extract_video_id(page_url="+page_url+")")
  127. if page_url.startswith('http://www.megavideo.com/?v='):
  128. patron = 'http://www.megavideo.com.*\?v\=([A-Z0-9a-z]{8})'
  129. matches = re.compile(patron,re.DOTALL).findall(page_url)
  130. video_id = matches[0]
  131. elif page_url.startswith('http://www.megavideo.com/?d='):
  132. patron = 'http://www.megavideo.com.*\?d\=([A-Z0-9a-z]{8})'
  133. matches = re.compile(patron,re.DOTALL).findall(page_url)
  134. video_id = matches[0]
  135. import megaupload
  136. video_id = megaupload.convertcode(video_id)
  137. else:
  138. video_id = page_url
  139. print("[megavideo.py] video_id="+video_id)
  140. return video_id
  141. # Get the Megavideo user ID (cookie) from the user and password credentials
  142. def login(user, password):
  143. print("[megavideo.py] login(user="+user+", password="+"**************************"[0:len(password)]+")")
  144. url = "http://www.megavideo.com/?c=login"
  145. post = "login=1&redir=1&username="+user+"&password="+urllib.quote(password)
  146. headers = [ ['User-Agent','Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'],['Referer','http://www.megavideo.com/?s=signup'] ]
  147. #data = scrapertools.cache_page(url=url, post=post)
  148. return get_megavideo_cookie_id()
  149. def get_megavideo_cookie_id():
  150. cookie_data = config.get_cookie_data()
  151. print("cookie_data="+cookie_data)
  152. lines = cookie_data.split("\n")
  153. for line in lines:
  154. print("line="+line)
  155. if "megavideo.com" in line:
  156. print("[megavideo.py] patron1")
  157. patron = 'user="([^"]+)"'
  158. matches = re.compile(patron,re.DOTALL).findall(line)
  159. if len(matches)>0:
  160. cookie = matches[0]
  161. break
  162. else:
  163. print("[megavideo.py] patron2")
  164. patron = 'user=([^\;]+);'
  165. matches = re.compile(patron,re.DOTALL).findall(line)
  166. if len(matches)>0:
  167. cookie = matches[0]
  168. break
  169. else:
  170. print("[megavideo.py] No se ha encontrado la cookie de Megavideo")
  171. cookie=""
  172. print("cookie="+cookie)
  173. return cookie
  174. # Megavideo decryption routines
  175. def ajoin(arr):
  176. strtest = ''
  177. for num in range(len(arr)):
  178. strtest = strtest + str(arr[num])
  179. return strtest
  180. def asplit(mystring):
  181. arr = []
  182. for num in range(len(mystring)):
  183. arr.append(mystring[num])
  184. return arr
  185. def decrypt(str1, key1, key2):
  186. __reg1 = []
  187. __reg3 = 0
  188. while (__reg3 < len(str1)):
  189. __reg0 = str1[__reg3]
  190. holder = __reg0
  191. # Optimización de aabilio@gmail.com :)
  192. for i in range(16):
  193. if i == 0:
  194. tmp = holder
  195. else:
  196. tmp = __reg0
  197. if tmp == hex(i).split("x")[1]:
  198. __reg1.append("".join([str((i >> y) & 1) for y in range(3, -1, -1)]))
  199. break
  200. __reg3 = __reg3 + 1
  201. mtstr = ajoin(__reg1)
  202. __reg1 = asplit(mtstr)
  203. __reg6 = []
  204. __reg3 = 0
  205. while (__reg3 < 384):
  206. key1 = (int(key1) * 11 + 77213) % 81371
  207. key2 = (int(key2) * 17 + 92717) % 192811
  208. __reg6.append((int(key1) + int(key2)) % 128)
  209. __reg3 = __reg3 + 1
  210. __reg3 = 256
  211. while (__reg3 >= 0):
  212. __reg5 = __reg6[__reg3]
  213. __reg4 = __reg3 % 128
  214. __reg8 = __reg1[__reg5]
  215. __reg1[__reg5] = __reg1[__reg4]
  216. __reg1[__reg4] = __reg8
  217. __reg3 = __reg3 - 1
  218. __reg3 = 0
  219. while (__reg3 < 128):
  220. __reg1[__reg3] = int(__reg1[__reg3]) ^ int(__reg6[__reg3 + 256]) & 1
  221. __reg3 = __reg3 + 1
  222. __reg12 = ajoin(__reg1)
  223. __reg7 = []
  224. __reg3 = 0
  225. while (__reg3 < len(__reg12)):
  226. __reg9 = __reg12[__reg3:__reg3 + 4]
  227. __reg7.append(__reg9)
  228. __reg3 = __reg3 + 4
  229. __reg2 = []
  230. __reg3 = 0
  231. while (__reg3 < len(__reg7)):
  232. __reg0 = __reg7[__reg3]
  233. holder2 = __reg0
  234. # Optimización de aabilio@gmail.com :)
  235. for i in range(16):
  236. if i == 0:
  237. tmp = holder2
  238. else:
  239. tmp = __reg0
  240. if tmp == "".join([str((i >> y) & 1) for y in range(3, -1, -1)]):
  241. __reg2.append(hex(i).split("x")[1])
  242. break
  243. __reg3 = __reg3 + 1
  244. endstr = ajoin(__reg2)
  245. return endstr