123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- # -*- coding: UTF-8 -*-
- #/*
- # * Copyright (C) 2011 Libor Zoubek
- # *
- # *
- # * This Program is free software; you can redistribute it and/or modify
- # * it under the terms of the GNU General Public License as published by
- # * the Free Software Foundation; either version 2, or (at your option)
- # * any later version.
- # *
- # * This Program is distributed in the hope that it will be useful,
- # * but WITHOUT ANY WARRANTY; without even the implied warranty of
- # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # * GNU General Public License for more details.
- # *
- # * You should have received a copy of the GNU General Public License
- # * along with this program; see the file COPYING. If not, write to
- # * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- # * http://www.gnu.org/copyleft/gpl.html
- # *
- # thanks to Lynx187 and his fix in https://github.com/t0mm0/xbmc-urlresolver
- import util,re,base64
-
- from base64 import b64decode
- from binascii import unhexlify
- __name__ = 'videobb'
- def supports(url):
- return not _regex(url) == None
-
- def _regex(url):
- return re.search('http://(www\.)?videobb.com/[\w\d]+/(?P<id>[^$]+)', url, re.IGNORECASE | re.DOTALL)
-
- def resolve(url):
- m = _regex(url)
- if not m == None:
- util.init_urllib()
- data = util.request('http://videobb.com/player_control/settings.php?v=%s&em=TRUE&fv=v1.1.67' % m.group('id'))
- json = data.replace('false','False').replace('true','True').replace('null','None')
- aData = eval('('+json+')')
- max_res = 99999
- r = re.finditer('"l".*?:.*?"(.+?)".+?"u".*?:.*?"(.+?)"', json)
- chosen_res = 0
- stream_url = False
- stream_url_part1 = False
- if r:
-
- for match in r:
- print match.groups()
- res, url = match.groups()
- res = int(res.strip('p'))
- if res > chosen_res and res <= max_res:
- stream_url_part1 = url.decode('base-64')
- chosen_res = res
- else:
- return
-
- if not stream_url_part1:
- return
- # Decode the link from the json data settings
- spn_ik = unhexlify(__decrypt(aData["settings"]["login_status"]["spen"], aData["settings"]["login_status"]["salt"], 950569)).split(';')
- spn = spn_ik[0].split('&')
- ik = spn_ik[1]
-
- for item in ik.split('&') :
- temp = item.split('=')
- if temp[0] == 'ik' :
- key = __get_key(temp[1])
-
- sLink = ""
- for item in spn :
- item = item.split('=')
- if(int(item[1])==1):
- sLink = sLink + item[0]+ '=' + __decrypt(aData["settings"]["info"]["sece2"], aData["settings"]["config"]["rkts"], key) + '&' #decrypt32byte
- elif(int(item[1]==2)):
- sLink = sLink + item[0]+ '=' + __decrypt(aData["settings"]["banner"]["g_ads"]["url"],aData["settings"]["config"]["rkts"], key) + '&'
- elif(int(item[1])==3):
- sLink = sLink + item[0]+ '=' + __decrypt(aData["settings"]["banner"]["g_ads"]["type"],aData["settings"]["config"]["rkts"], key,26,25431,56989,93,32589,784152) + '&'
- elif(int(item[1])==4):
- sLink = sLink + item[0]+ '=' + __decrypt(aData["settings"]["banner"]["g_ads"]["time"],aData["settings"]["config"]["rkts"], key,82,84669,48779,32,65598,115498) + '&'
- elif(int(item[1])==5):
- sLink = sLink + item[0]+ '=' + __decrypt(aData["settings"]["login_status"]["euno"],aData["settings"]["login_status"]["pepper"], key,10,12254,95369,39,21544,545555) + '&'
- elif(int(item[1])==6):
- sLink = sLink + item[0]+ '=' + __decrypt(aData["settings"]["login_status"]["sugar"],aData["settings"]["banner"]["lightbox2"]["time"], key,22,66595,17447,52,66852,400595) + '&'
-
- sLink = sLink + "start=0"
-
- stream_url = stream_url_part1 + '&' + sLink
-
- return [{'url':stream_url}]
-
- def __decrypt(str, k1, k2, p4 = 11, p5 = 77213, p6 = 81371, p7 = 17, p8 = 92717, p9 = 192811):
- tobin = hex2bin(str,len(str)*4)
- tobin_lenght = len(tobin)
- keys = []
- index = 0
-
- while (index < tobin_lenght*3):
- k1 = ((int(k1) * p4) + p5) % p6
- k2 = ((int(k2) * p7) + p8) % p9
- keys.append((int(k1) + int(k2)) % tobin_lenght)
- index += 1
-
- index = tobin_lenght*2
-
- while (index >= 0):
- val1 = keys[index]
- mod = index%tobin_lenght
- val2 = tobin[val1]
- tobin[val1] = tobin[mod]
- tobin[mod] = val2
- index -= 1
-
- index = 0
- while(index < tobin_lenght):
- tobin[index] = int(tobin[index]) ^ int(keys[index+(tobin_lenght*2)]) & 1
- index += 1
- decrypted = bin2hex(tobin)
- return decrypted
-
- def hex2bin(val,fill):
- bin_array = []
- string = bin(int(val, 16))[2:].zfill(fill)
- for value in string:
- bin_array.append(value)
- return bin_array
-
- def bin2hex(val):
- string = str("")
- for char in val:
- string+=str(char)
- return "%x" % int(string, 2)
-
- def bin( x):
- '''
- bin(number) -> string
- Stringifies an int or long in base 2.
- '''
- if x < 0:
- return '-' + bin(-x)
- out = []
- if x == 0: out.append('0')
- while x > 0:
- out.append('01'[x & 1])
- x >>= 1
- pass
- try:
- return '0b' + ''.join(reversed(out))
- except NameError, ne2:
- out.reverse()
- return '0b' + ''.join(out)
-
- def __get_key(nbr):
- if nbr == '1': return 226593
- elif nbr == '2': return 441252
- elif nbr == '3': return 301517
- elif nbr == '4': return 596338
- elif nbr == '5': return 852084
- else: return False
|