Changeset 40902
- Timestamp:
- 09/04/17 00:34:38 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
titan/mediathek/localhoster/openload.py
r40087 r40902 1 # -*- coding: utf-8 -*- 2 # Based on (root)/trunk/xbmc-addons/src/plugin.video.polishtv.live/hosts/ @ 419 - Wersja 636 3 # encoding=utf8 4 import sys 5 6 reload(sys) 7 sys.setdefaultencoding('utf8') 1 8 2 9 import os … … 8 15 import lib.common as common 9 16 import json 17 from lib import jsunpack 18 19 ################################################### 20 import re 21 import time 22 import urllib 23 import socket 24 import string 25 import base64 26 import math 27 import lib.jjdecode as JJDecoder 10 28 11 29 #OL_SOURCE = 'https://offshoregit.com/tvaresolvers/ol_gmu.py' … … 18 36 19 37 38 import urllib 39 import urllib2 40 try: import ssl 41 except Exception: pass 42 import re 43 import string 44 import time 45 import htmlentitydefs 46 import cookielib 47 import unicodedata 48 #import urllib2_ssl 49 #try: import json 50 #except Exception: import simplejson as json 51 #try: 52 # try: from cStringIO import StringIO 53 # except Exception: from StringIO import StringIO 54 # import gzip 55 20 56 class OpenLoadResolver(object): 21 57 name = "openload" … … 25 61 def __init__(self): 26 62 self.net = Net() 63 self.headers = {'User-Agent': common.ANDROID_USER_AGENT} 27 64 url = str(sys.argv[1]) 28 65 host = self.get_host_and_id(url)[0] … … 56 93 print 'errormsg=Exception during openload code retrieve:' 57 94 # common.log_utils.log_warning('Exception during openload code retrieve: %s' % e) 95 96 def decode1(self, encoded): 97 tab = encoded.split('\\') 98 ret = '' 99 for item in tab: 100 try: ret += chr(int(item, 8)) 101 except Exception: 102 ret += item 103 return ret 104 105 def base10toN(self, num,n): 106 num_rep={10:'a', 11:'b',12:'c',13:'d',14:'e',15:'f',16:'g',17:'h',18:'i',19:'j',20:'k',21:'l',22:'m',23:'n',24:'o',25:'p',26:'q',27:'r',28:'s',29:'t',30:'u',31:'v',32:'w',33:'x',34:'y',35:'z'} 107 new_num_string='' 108 current=num 109 while current!=0: 110 remainder=current%n 111 if 36>remainder>9: 112 remainder_string=num_rep[remainder] 113 elif remainder>=36: 114 remainder_string='('+str(remainder)+')' 115 else: 116 remainder_string=str(remainder) 117 new_num_string=remainder_string+new_num_string 118 current=current/n 119 return new_num_string 120 121 def decodeOpenLoad(self, aastring): 122 # decodeOpenLoad made by mortael, please leave this line for proper credit :) 123 #aastring = re.search(r"<video(?:.|\s)*?<script\s[^>]*?>((?:.|\s)*?)</script", html, re.DOTALL | re.IGNORECASE).group(1) 124 125 aastring = aastring.replace("(゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((c^_^o)-(c^_^o))+ (-~0)+ (゚Д゚) ['c']+ (-~-~1)+","") 126 aastring = aastring.replace("((゚ー゚) + (゚ー゚) + (゚Θ゚))", "9") 127 aastring = aastring.replace("((゚ー゚) + (゚ー゚))","8") 128 aastring = aastring.replace("((゚ー゚) + (o^_^o))","7") 129 aastring = aastring.replace("((c^_^o)-(c^_^o))","0") 130 aastring = aastring.replace("((゚ー゚) + (゚Θ゚))","5") 131 aastring = aastring.replace("(゚ー゚)","4") 132 aastring = aastring.replace("((o^_^o) - (゚Θ゚))","2") 133 aastring = aastring.replace("(o^_^o)","3") 134 aastring = aastring.replace("(゚Θ゚)","1") 135 aastring = aastring.replace("(+!+[])","1") 136 aastring = aastring.replace("(c^_^o)","0") 137 aastring = aastring.replace("(0+0)","0") 138 aastring = aastring.replace("(゚Д゚)[゚ε゚]","\\") 139 aastring = aastring.replace("(3 +3 +0)","6") 140 aastring = aastring.replace("(3 - 1 +0)","2") 141 aastring = aastring.replace("(!+[]+!+[])","2") 142 aastring = aastring.replace("(-~-~2)","4") 143 aastring = aastring.replace("(-~-~1)","3") 144 aastring = aastring.replace("(-~0)","1") 145 aastring = aastring.replace("(-~1)","2") 146 aastring = aastring.replace("(-~3)","4") 147 aastring = aastring.replace("(0-0)","0") 148 149 aastring = aastring.replace("(゚Д゚).゚ω゚ノ","10") 150 aastring = aastring.replace("(゚Д゚).゚Θ゚ノ","11") 151 aastring = aastring.replace("(゚Д゚)[\'c\']","12") 152 aastring = aastring.replace("(゚Д゚).゚ー゚ノ","13") 153 aastring = aastring.replace("(゚Д゚).゚Д゚ノ","14") 154 aastring = aastring.replace("(゚Д゚)[゚Θ゚]","15") 155 # print "aastring", aastring 156 decodestring = re.search(r"\\\+([^(]+)", aastring, re.DOTALL | re.IGNORECASE).group(1) 157 # decodestring = re.search(r"\\\+([^(]+)", aastring, re.DOTALL | re.IGNORECASE) 158 decodestring = "\\+"+ decodestring 159 decodestring = decodestring.replace("+","") 160 decodestring = decodestring.replace(" ","") 161 162 decodestring = self.decode1(decodestring) 163 decodestring = decodestring.replace("\\/","/") 164 165 if 'toString' in decodestring: 166 base = re.compile(r"toString\(a\+(\d+)", re.DOTALL | re.IGNORECASE).findall(decodestring)[0] 167 base = int(base) 168 match = re.compile(r"(\(\d[^)]+\))", re.DOTALL | re.IGNORECASE).findall(decodestring) 169 for repl in match: 170 match1 = re.compile(r"(\d+),(\d+)", re.DOTALL | re.IGNORECASE).findall(repl) 171 base2 = base + int(match1[0][0]) 172 repl2 = self.base10toN(int(match1[0][1]),base2) 173 decodestring = decodestring.replace(repl,repl2) 174 decodestring = decodestring.replace("+","") 175 decodestring = decodestring.replace("\"","") 176 print "decodestring", decodestring 177 return decodestring 178 179 # def OPENLOADIO_decryptPlayerParams(p, a, c, k, e, d): 180 def decryptPlayerParams(self, p, a, c, k, e, d): 181 def e1(c): 182 return c 183 def e2(t=None): 184 return '\\w+' 185 def k1(matchobj): 186 return d[int(matchobj.group(0))] 187 e = e1 188 if True: 189 while c != 0: 190 c -= 1 191 d[c] = k[c] 192 if c < len(k): 193 d[c] = k[c] 194 else: 195 d[c] = c 196 c = 1 197 k = [k1] 198 e = e2 199 while c != 0: 200 c -= 1 201 if k[c]: 202 reg = '\\b' + e(c) + '\\b' 203 p = re.sub(reg, k[c], p) 204 return p 205 206 def getAllItemsBeetwenMarkers(self, data, marker1, marker2, withMarkers=True, caseSensitive=True): 207 itemsTab = [] 208 if caseSensitive: 209 sData = data 210 else: 211 sData = data.lower() 212 marker1 = marker1.lower() 213 marker2 = marker2.lower() 214 idx1 = 0 215 while True: 216 idx1 = sData.find(marker1, idx1) 217 if -1 == idx1: return itemsTab 218 idx2 = sData.find(marker2, idx1 + len(marker1)) 219 if -1 == idx2: return itemsTab 220 tmpIdx2 = idx2 + len(marker2) 221 if withMarkers: 222 idx2 = tmpIdx2 223 else: 224 idx1 = idx1 + len(marker1) 225 itemsTab.append(data[idx1:idx2]) 226 idx1 = tmpIdx2 227 return itemsTab 228 229 def getSearchGroups(self, data, pattern, grupsNum=1, ignoreCase=False): 230 tab = [] 231 if ignoreCase: 232 match = re.search(pattern, data, re.IGNORECASE) 233 else: 234 match = re.search(pattern, data) 235 236 for idx in range(grupsNum): 237 try: value = match.group(idx + 1) 238 except Exception: value = '' 239 tab.append(value) 240 return tab 241 242 def getPage(self, url, addParams = {}, post_data = None): 243 ''' wraps getURLRequestData ''' 244 try: 245 addParams['url'] = url 246 if 'return_data' not in addParams: 247 addParams['return_data'] = True 248 response = self.getURLRequestData(addParams, post_data) 249 status = True 250 except urllib2.HTTPError, e: 251 # printExc() 252 response = e 253 status = False 254 except Exception: 255 # printExc() 256 response = None 257 status = False 258 259 if addParams['return_data'] and status and not isinstance(response, basestring): 260 status = False 58 261 262 return (status, response) 263 264 def GetTmpDir(self, file = ''): 265 path = "/tmp/" 266 path = path.replace('//', '/') 267 self.mkdirs(path) 268 return path + '/' + file 269 270 def GetDukPath(self): 271 # return "/tmp/localhoster/bin/duk.arm" 272 return "/tmp/localhoster/bin/duk.mipsel" 273 # return "/tmp/localhoster/bin/duk.sh4" 274 275 # return config.plugins.iptvplayer.dukpath.value 276 277 def iptv_js_execute(self, jscode): 278 sts, tmpPath = self.CreateTmpFile('.iptv_js.js', jscode) 279 if sts: 280 cmd = self.GetDukPath() + ' ' + tmpPath + ' 2> /dev/null' 281 # printDBG("iptv_js_execute cmd[%s]" % cmd) 282 # print "iptv_js_execute cmd[%s]" % cmd 283 # test = self.command(cmd); 284 # print "test", test 285 286 ret = self.command(cmd); 287 # print "test3", os.system(cmd); 288 289 # ret = iptv_execute()( cmd ) 290 # ret = {'sts':False, 'code':-12, 'data':''} 291 # leave last script for debug purpose 292 # if getDebugMode() == '': 293 # rm(tmpPath) 294 else: 295 ret = {'sts':False, 'code':-12, 'data':''} 296 # printDBG('iptv_js_execute cmd ret[%s]' % ret) 297 # print 'iptv_js_execute cmd ret[%s]' % ret 298 299 return ret 300 301 def mkdirs(self, newdir): 302 """ Create a directory and all parent folders. 303 Features: 304 - parent directories will be created 305 - if directory already exists, then do nothing 306 - if there is another filsystem object with the same name, raise an exception 307 """ 308 # printDBG('mkdirs: "%s"' % newdir) 309 # print 'mkdirs: "%s"' % newdir 310 try: 311 if os.path.isdir(newdir): 312 pass 313 elif os.path.isfile(newdir): 314 # raise OSError("cannot create directory, file already exists: '%s'" % newdir) 315 raise #print "cannot create directory, file already exists: '%s'" % newdir 316 else: 317 head, tail = os.path.split(newdir) 318 if head and not os.path.isdir(head) and not os.path.ismount(head) and not os.path.islink(head): 319 mkdirs(head) 320 if tail: 321 os.mkdir(newdir) 322 return True 323 except Exception: 324 # printExc('!!!!!!!!!! EXCEPTION mkdirs["%s"]' % newdir) 325 print '!!!!!!!!!! EXCEPTION mkdirs["%s"]' % newdir 326 return False 327 328 def CreateTmpFile(self, filename, data=''): 329 sts = False 330 filePath = self.GetTmpDir(filename) 331 try: 332 with open(filePath, 'w') as f: 333 f.write(data) 334 sts = True 335 except Exception: 336 printExc() 337 return sts, filePath 338 339 def getDataBeetwenMarkers(self, data, marker1, marker2, withMarkers=True, caseSensitive=True): 340 if caseSensitive: 341 idx1 = data.find(marker1) 342 else: 343 idx1 = data.lower().find(marker1.lower()) 344 if -1 == idx1: return False, '' 345 if caseSensitive: 346 idx2 = data.find(marker2, idx1 + len(marker1)) 347 else: 348 idx2 = data.lower().find(marker2.lower(), idx1 + len(marker1)) 349 if -1 == idx2: return False, '' 350 351 if withMarkers: 352 idx2 = idx2 + len(marker2) 353 else: 354 idx1 = idx1 + len(marker1) 355 356 return True, data[idx1:idx2] 357 358 # edit bb , touch commands.getouput with this def # 359 def command(self, comandline, strip=1): 360 comandline = comandline + " >/tmp/command.txt" 361 os.system(comandline) 362 text = "" 363 if os.path.exists("/tmp/command.txt") is True: 364 file = open("/tmp/command.txt", "r") 365 if strip == 1: 366 for line in file: 367 text = text + line.strip() + '\n' 368 else: 369 for line in file: 370 text = text + line 371 if text[-1:] != '\n': text = text + "\n" 372 file.close 373 # if one or last line then remove linefeed 374 if text[-1:] == '\n': text = text[:-1] 375 comandline = text 376 os.system("rm /tmp/command.txt") 377 return comandline 378 59 379 def get_media_url(self, host, media_id): 60 video_url = "" 61 # js_data = self.__get_json(GET_URL.format(media_id=media_id)) 62 # print "js_data: %s" % (js_data) 63 try: 64 # self._auto_update(self.get_setting('url'), OL_PATH, self.get_setting('key')) 65 reload(ol_gmu) 66 return ol_gmu.get_media_url(self.get_url(host, media_id)) # @UndefinedVariable 67 except Exception as e: 68 # print "Exception during openload resolve parse: %s" % (e) 69 # common.log_utils.log_debug('Exception during openload resolve parse: %s' % (e)) 380 web_url = self.get_url(host, media_id) 381 # web_url = "https://openload.co/embed/SVMiyZR_yM4/Game_of_Thrones_S07E07_Der_Drache_und_der_Wolf_German_AC3_Dubbed_AmazonHD.mkv" 382 web_url = "https://openload.co/embed/8ATYb_yCakU/pso-atomic_ts.sd.mkv" 383 headers = { 384 'Referer': web_url 385 } 386 headers.update(self.headers) 387 data = self.net.http_GET(web_url, headers=headers).content 388 # print "data", data 389 baseUrl = web_url 390 # baseUrl = "https://openload.co/embed/SVMiyZR_yM4/Game_of_Thrones_S07E07_Der_Drache_und_der_Wolf_German_AC3_Dubbed_AmazonHD.mkv" 391 HTTP_HEADER= { 'User-Agent':"Mozilla/5.0", 'Referer':baseUrl} 392 HTTP_HEADER = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 393 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 394 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 395 'Accept-Encoding': 'none', 396 'Accept-Language': 'en-US,en;q=0.8', 397 'Referer':baseUrl} #'Connection': 'keep-alive' 398 399 # sts, data = self.getPage(baseUrl, {'header':HTTP_HEADER}) 400 # data = self.net.http_GET(web_url, headers=headers).content 401 402 orgData = data 403 # print "data", data 404 405 # print "222222222222222222222222" 406 407 subTracksData = self.getAllItemsBeetwenMarkers(data, '<track ', '>', False, False) 408 subTracks = [] 409 for track in subTracksData: 410 if 'kind="captions"' not in track: continue 411 subUrl = self.getSearchGroups(track, 'src="([^"]+?)"')[0] 412 # print "suburl", subUrl 413 if subUrl.startswith('/'): 414 subUrl = 'http://openload.co' + subUrl 415 if subUrl.startswith('http'): 416 subLang = self.getSearchGroups(track, 'srclang="([^"]+?)"')[0] 417 subLabel = self.getSearchGroups(track, 'label="([^"]+?)"')[0] 418 subTracks.append({'title':subLabel + '_' + subLang, 'url':subUrl, 'lang':subLang, 'format':'srt'}) 419 420 # print "33333333333333333333333" 421 422 preDataTab = self.getAllItemsBeetwenMarkers(data, 'a="0%', '{}', withMarkers=True, caseSensitive=False) 423 # print "preDataTab", preDataTab 424 425 for item in preDataTab: 426 # print "item", item 70 427 try: 71 video_url = self.__check_auth(media_id) 72 if not video_url: 73 video_url = self.__auth_ip(media_id) 74 #except ResolverError: 75 except Exception as e: 76 print "errormsg=IP address not authorized. Visit https://openload.co/pair" 77 # raise 78 79 if video_url: 80 print video_url 428 dat = self.getSearchGroups(item, 'a\s*?=\s*?"([^"]+?)"', ignoreCase=True)[0] 429 # print "dat1", dat 430 z = self.getSearchGroups(item, '\}\(([0-9]+?)\)', ignoreCase=True)[0] 431 # print "z1", z 432 z = int(z) 433 # print "z2", z 434 def checkA(c): 435 code = ord(c.group(1)) 436 if code <= ord('Z'): 437 tmp = 90 438 else: 439 tmp = 122 440 c = code + z 441 if tmp < c: 442 c -= 26 443 return chr(c) 444 445 dat = urllib.unquote( re.sub('([a-zA-Z])', checkA, dat) ) 446 # print "dat2", dat 447 dat = self.decryptPlayerParams(dat, 4, 4, ['j', '_', '__', '___'], 0, {}) 448 # pageData = unpackJS(data[idx1:-3], VIDUPME_decryptPlayerParams) 449 # dat = jsunpack.unpack(dat) 450 451 # print "dat3", dat 452 data += dat 453 except Exception: 454 print "preDataTab error" 455 # printExc() 456 457 458 459 460 461 videoUrl = '' 462 tmp = '' 463 464 encodedData = self.getAllItemsBeetwenMarkers(data, '゚ω゚', '</script>', withMarkers=False, caseSensitive=False) 465 # encodedData = re.sub('゚ω゚', '</script>', data) 466 # encodedData = re.search(r'゚ω゚\.*?</script>', data, re.DOTALL) 467 # encodedData = re.search('''゚ω゚\(\s*)</script>''', data).group(1) 468 469 # print "encodedData1", encodedData 470 471 for item in encodedData: 472 # print "item1", item 473 tmpEncodedData = item.split('┻━┻') 474 # print "tmpEncodedData1", tmpEncodedData 475 for tmpItem in tmpEncodedData: 476 # print "tmpItem", tmpItem 477 try: 478 tmp += self.decodeOpenLoad(tmpItem) 479 # print "tmpItem1", tmpItem 480 except Exception: 481 skip = 1 482 # printExc() 483 # print "encodedData1 error" 484 485 tmp2 = '' 486 encodedData = self.getAllItemsBeetwenMarkers(data, "j=~[];", "())();", withMarkers=True, caseSensitive=False) 487 # print "encodedData2", encodedData 488 for item in encodedData: 489 # print "item2", item 490 try: 491 if '' != item: 492 tmp2 += JJDecoder(item).decode() 493 # print "tmp2", tmp2 494 except Exception: 495 skip = 1 496 # printExc() 497 # print "encodedData2 error" 498 499 500 # printDBG('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') 501 # printDBG(tmp) 502 # printDBG('BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB') 503 # printDBG(tmp2) 504 # printDBG('CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC') 505 # print 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' 506 # print "tmp1:", tmp 507 # print 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB' 508 # print "tmp2:", tmp2 509 # print 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC' 510 511 ########################################################## 512 # new algo 2016-12-04 ;) 513 ########################################################## 514 varName = self.getSearchGroups(tmp, '''window.r=['"]([^'^"]+?)['"]''', ignoreCase=True)[0] 515 encTab = re.compile('''<span[^>]+?id="%s[^"]*?"[^>]*?>([^<]+?)<\/span>''' % varName).findall(data) 516 # printDBG(">>>>>>>>>>>> varName[%s] encTab[%s]" % (varName, encTab) ) 517 # print ">>>>>>>>>>>> varName[%s] encTab[%s]" % (varName, encTab) 518 519 520 if varName == '': 521 for e in encTab: 522 if len(e) > 40: 523 encTab.insert(0, e) 524 break 525 526 def __decode_k(enc, jscode): 527 decoded = '' 528 tmpPath = '' 529 try: 530 jscode = base64.b64decode('''ICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSAiJXMiDQogICAgICAgICAgICAgICAgICAgICAgLCBkZWNvZGVkDQogICAgICAgICAgICAgICAgICAgICAgLCBkb2N1bWVudCA9IHt9DQogICAgICAgICAgICAgICAgICAgICAgLCB3aW5kb3cgPSB0aGlzDQogICAgICAgICAgICAgICAgICAgICAgLCAkID0gZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBmdW5jdGlvbihhKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgPSBhOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkeTogZnVuY3Rpb24oYSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbihkLCB3KXsNCiAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKCl7fTsNCiAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICB2YXIgZGYgPSBbJ2Nsb3NlJywnY3JlYXRlQXR0cmlidXRlJywnY3JlYXRlRG9jdW1lbnRGcmFnbWVudCcsJ2NyZWF0ZUVsZW1lbnQnLCdjcmVhdGVFbGVtZW50TlMnLCdjcmVhdGVFdmVudCcsJ2NyZWF0ZU5TUmVzb2x2ZXInLCdjcmVhdGVSYW5nZScsJ2NyZWF0ZVRleHROb2RlJywnY3JlYXRlVHJlZVdhbGtlcicsJ2V2YWx1YXRlJywnZXhlY0NvbW1hbmQnLCdnZXRFbGVtZW50QnlJZCcsJ2dldEVsZW1lbnRzQnlOYW1lJywnZ2V0RWxlbWVudHNCeVRhZ05hbWUnLCdpbXBvcnROb2RlJywnb3BlbicsJ3F1ZXJ5Q29tbWFuZEVuYWJsZWQnLCdxdWVyeUNvbW1hbmRJbmRldGVybScsJ3F1ZXJ5Q29tbWFuZFN0YXRlJywncXVlcnlDb21tYW5kVmFsdWUnLCd3cml0ZScsJ3dyaXRlbG4nXTsNCiAgICAgICAgICAgICAgICAgICAgICBkZi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2RbZV09Zjt9KTsNCiAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9fID0gWydhbmNob3JzJywnYXBwbGV0cycsJ2JvZHknLCdkZWZhdWx0VmlldycsJ2RvY3R5cGUnLCdkb2N1bWVudEVsZW1lbnQnLCdlbWJlZHMnLCdmaXJzdENoaWxkJywnZm9ybXMnLCdpbWFnZXMnLCdpbXBsZW1lbnRhdGlvbicsJ2xpbmtzJywnbG9jYXRpb24nLCdwbHVnaW5zJywnc3R5bGVTaGVldHMnXTsNCiAgICAgICAgICAgICAgICAgICAgICBkb18uZm9yRWFjaChmdW5jdGlvbihlKXtkW2VdPW87fSk7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIGRzID0gWydVUkwnLCdjaGFyYWN0ZXJTZXQnLCdjb21wYXRNb2RlJywnY29udGVudFR5cGUnLCdjb29raWUnLCdkZXNpZ25Nb2RlJywnZG9tYWluJywnbGFzdE1vZGlmaWVkJywncmVmZXJyZXInLCd0aXRsZSddOw0KICAgICAgICAgICAgICAgICAgICAgIGRzLmZvckVhY2goZnVuY3Rpb24oZSl7ZFtlXT1zO30pOw0KICAgICAgICAgICAgICAgICAgICAgIHZhciB3YiA9IFsnY2xvc2VkJywnaXNTZWN1cmVDb250ZXh0J107DQogICAgICAgICAgICAgICAgICAgICAgd2IuZm9yRWFjaChmdW5jdGlvbihlKXt3W2VdPWI7fSk7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIHdmID0gWydhZGRFdmVudExpc3RlbmVyJywnYWxlcnQnLCdhdG9iJywnYmx1cicsJ2J0b2EnLCdjYW5jZWxBbmltYXRpb25GcmFtZScsJ2NhcHR1cmVFdmVudHMnLCdjbGVhckludGVydmFsJywnY2xlYXJUaW1lb3V0JywnY2xvc2UnLCdjb25maXJtJywnY3JlYXRlSW1hZ2VCaXRtYXAnLCdkaXNwYXRjaEV2ZW50JywnZmV0Y2gnLCdmaW5kJywnZm9jdXMnLCdnZXRDb21wdXRlZFN0eWxlJywnZ2V0U2VsZWN0aW9uJywnbWF0Y2hNZWRpYScsJ21vdmVCeScsJ21vdmVUbycsJ29wZW4nLCdwb3N0TWVzc2FnZScsJ3Byb21wdCcsJ3JlbGVhc2VFdmVudHMnLCdyZW1vdmVFdmVudExpc3RlbmVyJywncmVxdWVzdEFuaW1hdGlvbkZyYW1lJywncmVzaXplQnknLCdyZXNpemVUbycsJ3Njcm9sbCcsJ3Njcm9sbEJ5Jywnc2Nyb2xsVG8nLCdzZXRJbnRlcnZhbCcsJ3NldFRpbWVvdXQnLCdzdG9wJ107DQogICAgICAgICAgICAgICAgICAgICAgd2YuZm9yRWFjaChmdW5jdGlvbihlKXt3W2VdPWY7fSk7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIHduID0gWydkZXZpY2VQaXhlbFJhdGlvJywnaW5uZXJIZWlnaHQnLCdpbm5lcldpZHRoJywnbGVuZ3RoJywnb3V0ZXJIZWlnaHQnLCdvdXRlcldpZHRoJywncGFnZVhPZmZzZXQnLCdwYWdlWU9mZnNldCcsJ3NjcmVlblgnLCdzY3JlZW5ZJywnc2Nyb2xsWCcsJ3Njcm9sbFknXTsNCiAgICAgICAgICAgICAgICAgICAgICB3bi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3dbZV09bjt9KTsNCiAgICAgICAgICAgICAgICAgICAgICB2YXIgd28gPSBbJ2FwcGxpY2F0aW9uQ2FjaGUnLCdjYWNoZXMnLCdjcnlwdG8nLCdleHRlcm5hbCcsJ2ZyYW1lRWxlbWVudCcsJ2ZyYW1lcycsJ2hpc3RvcnknLCdpbmRleGVkREInLCdsb2NhbFN0b3JhZ2UnLCdsb2NhdGlvbicsJ2xvY2F0aW9uYmFyJywnbWVudWJhcicsJ25hdmlnYXRvcicsJ29uYWJvcnQnLCdvbmFuaW1hdGlvbmVuZCcsJ29uYW5pbWF0aW9uaXRlcmF0aW9uJywnb25hbmltYXRpb25zdGFydCcsJ29uYmVmb3JldW5sb2FkJywnb25ibHVyJywnb25jYW5wbGF5Jywnb25jYW5wbGF5dGhyb3VnaCcsJ29uY2hhbmdlJywnb25jbGljaycsJ29uY29udGV4dG1lbnUnLCdvbmRibGNsaWNrJywnb25kZXZpY2Vtb3Rpb24nLCdvbmRldmljZW9yaWVudGF0aW9uJywnb25kcmFnJywnb25kcmFnZW5kJywnb25kcmFnZW50ZXInLCdvbmRyYWdsZWF2ZScsJ29uZHJhZ292ZXInLCdvbmRyYWdzdGFydCcsJ29uZHJvcCcsJ29uZHVyYXRpb25jaGFuZ2UnLCdvbmVtcHRpZWQnLCdvbmVuZGVkJywnb25lcnJvcicsJ29uZm9jdXMnLCdvbmhhc2hjaGFuZ2UnLCdvbmlucHV0Jywnb25pbnZhbGlkJywnb25rZXlkb3duJywnb25rZXlwcmVzcycsJ29ua2V5dXAnLCdvbmxhbmd1YWdlY2hhbmdlJywnb25sb2FkJywnb25sb2FkZWRkYXRhJywnb25sb2FkZWRtZXRhZGF0YScsJ29ubG9hZHN0YXJ0Jywnb25tZXNzYWdlJywnb25tb3VzZWRvd24nLCdvbm1vdXNlZW50ZXInLCdvbm1vdXNlbGVhdmUnLCdvbm1vdXNlbW92ZScsJ29ubW91c2VvdXQnLCdvbm1vdXNlb3ZlcicsJ29ubW91c2V1cCcsJ29ub2ZmbGluZScsJ29ub25saW5lJywnb25wYWdlaGlkZScsJ29ucGFnZXNob3cnLCdvbnBhdXNlJywnb25wbGF5Jywnb25wbGF5aW5nJywnb25wb3BzdGF0ZScsJ29ucHJvZ3Jlc3MnLCdvbnJhdGVjaGFuZ2UnLCdvbnJlc2V0Jywnb25yZXNpemUnLCdvbnNjcm9sbCcsJ29uc2Vla2VkJywnb25zZWVraW5nJywnb25zZWxlY3QnLCdvbnNob3cnLCdvbnN0YWxsZWQnLCdvbnN0b3JhZ2UnLCdvbnN1Ym1pdCcsJ29uc3VzcGVuZCcsJ29udGltZXVwZGF0ZScsJ29udG9nZ2xlJywnb250cmFuc2l0aW9uZW5kJywnb251bmxvYWQnLCdvbnZvbHVtZWNoYW5nZScsJ29ud2FpdGluZycsJ29ud2Via2l0YW5pbWF0aW9uZW5kJywnb253ZWJraXRhbmltYXRpb25pdGVyYXRpb24nLCdvbndlYmtpdGFuaW1hdGlvbnN0YXJ0Jywnb253ZWJraXR0cmFuc2l0aW9uZW5kJywnb253aGVlbCcsJ29wZW5lcicsJ3BhcmVudCcsJ3BlcmZvcm1hbmNlJywncGVyc29uYWxiYXInLCdzY3JlZW4nLCdzY3JvbGxiYXJzJywnc2VsZicsJ3Nlc3Npb25TdG9yYWdlJywnc3BlZWNoU3ludGhlc2lzJywnc3RhdHVzYmFyJywndG9vbGJhcicsJ3RvcCddOw0KICAgICAgICAgICAgICAgICAgICAgIHdvLmZvckVhY2goZnVuY3Rpb24oZSl7d1tlXT1vO30pOw0KICAgICAgICAgICAgICAgICAgICAgIHZhciB3cyA9IFsnbmFtZSddOw0KICAgICAgICAgICAgICAgICAgICAgIHdzLmZvckVhY2goZnVuY3Rpb24oZSl7d1tlXT1zO30pOw0KICAgICAgICAgICAgICAgICAgICB9KShkb2N1bWVudCwgd2luZG93KTsNCiAgICAgICAgICAgICAgICAgICAgJXM7DQogICAgICAgICAgICAgICAgICAgIHByaW50KGRlY29kZWQpOw==''') % (enc, jscode) 531 # printDBG("+++++++++++++++++++++++ CODE ++++++++++++++++++++++++") 532 # printDBG(jscode) 533 # printDBG("+++++++++++++++++++++++++++++++++++++++++++++++++++++++") 534 # print "+++++++++++++++++++++++ CODE ++++++++++++++++++++++++" 535 # print jscode 536 # print "+++++++++++++++++++++++++++++++++++++++++++++++++++++++" 537 # return self.iptv_js_execute( jscode ) 538 return self.iptv_js_execute( jscode ) 539 540 # ret = self.iptv_js_execute( jscode ) 541 # if ret['sts'] and 0 == ret['code']: 542 # decoded = ret['data'].strip() 543 # printDBG('DECODED DATA -> [%s]' % decoded) 544 except Exception: 545 # printExc() 546 print "__decode_k error" 547 548 #rm(tmpPath) 549 return decoded 550 551 # marker = '゚ω゚ノ= /`m´)ノ' 552 marker = '゚ω゚ノ= /`m' 553 554 # marker = '゚ω゚' 555 556 orgData = marker + self.getDataBeetwenMarkers(orgData, marker, marker, False)[1] 557 orgData = re.sub('''if\s*\([^\}]+?typeof[^\}]+?\}''', '', orgData) 558 orgData = re.sub('''if\s*\([^\}]+?document[^\}]+?\}''', '', orgData) 559 # dec = self.__decode_k(encTab[0], orgData) 560 dec = __decode_k(encTab[0], orgData) 561 562 videoUrl = 'https://openload.co/stream/{0}?mime=true'.format(dec) 563 params = dict(HTTP_HEADER) 564 params['external_sub_tracks'] = subTracks 565 print videoUrl 566 # print "params:", params 81 567 82 568 def get_url(self, host, media_id): 83 return 'http ://openload.co/embed/%s' % (media_id)569 return 'https://openload.co/embed/%s' % (media_id) 84 570 85 571 def __auth_ip(self, media_id): … … 100 586 except ResolverError as e: 101 587 # except Exception as e: 102 status, ms g = e588 status, mscommandg = e 103 589 if status == 403: 104 590 print "errormsg=%s" % (e)
Note: See TracChangeset
for help on using the changeset viewer.