def getPage(self, baseUrl, addParams={}, post_data=None): tries = 0 cUrl = '' while tries < 4: tries += 1 if addParams == {}: addParams = dict(self.defaultParams) sts, data = self.cm.getPage(baseUrl, addParams, post_data) if not sts: return sts, data cUrl = self.cm.meta['url'] if 'DDoS' in data: if tries == 1: rm(self.COOKIE_FILE) continue timestamp = time.time() * 1000 jscode = '' tmp = ph.findall(data, ('<script', '>'), '</script>', flags=0) for item in tmp: if 'xhr.open' in item: jscode = item break js_params = [{'path': GetJSScriptFile('cinemaxx1.byte')}] js_params.append({'code': jscode}) ret = js_execute_ext(js_params) if ret['sts'] and 0 == ret['code']: try: tmp = ret['data'].split('\n', 1) sleep_time = int(float(tmp[1])) tmp = json_loads(tmp[0]) url = self.getFullUrl(tmp['1'], cUrl) params = dict(addParams) params['header'] = MergeDicts(self.HTTP_HEADER, {'Referer': cUrl}) sts2, data2 = self.cm.getPage(url, params) if not sts2: break js_params = [{'path': GetJSScriptFile('cinemaxx2.byte')}] js_params.append({'code': data2 + 'print(JSON.stringify(e2iobj));'}) ret = js_execute_ext(js_params) if ret['sts'] and 0 == ret['code']: cj = self.cm.getCookie(self.COOKIE_FILE) for item in json_loads(ret['data'])['cookies']: for cookieKey, cookieValue in item.iteritems(): cookieItem = cookielib.Cookie(version=0, name=cookieKey, value=cookieValue, port=None, port_specified=False, domain='.' + self.cm.getBaseUrl(cUrl, True), domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=time.time() + 3600 * 48, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False) cj.set_cookie(cookieItem) cj.save(self.COOKIE_FILE, ignore_discard=True) sleep_time -= time.time() * 1000 - timestamp if sleep_time > 0: GetIPTVSleep().Sleep(int(math.ceil(sleep_time / 1000.0))) continue else: break except Exception: printExc() else: break if sts and cUrl: self.cm.meta['url'] = cUrl return sts, data
def decryptSignatures(self, encSignatures, playerUrl): decSignatures = [] code = '' jsname = 'ytsigndec' jshash = 'hash7_' + playerUrl.split('://', 1)[-1] if not is_js_cached(jsname, jshash): # get main function sts, self.playerData = self.cm.getPage(playerUrl) if not sts: return [] t1 = time.time() code = [] mainFunctionName = self._findMainFunctionName() if not mainFunctionName: SetIPTVPlayerLastHostError( _('Encryption function name extraction failed!\nPlease report the problem to %s' ) % 'https://github.com/persianpros/e2iplayer/issues') return [] printDBG("mainFunctionName >> %s" % mainFunctionName) mainFunction = self._findFunction(mainFunctionName) if not mainFunction: SetIPTVPlayerLastHostError( _('Encryption function body extraction failed!\nPlease report the problem to %s' ) % 'https://github.com/persianpros/e2iplayer/issues') return [] code.append(mainFunction) funNames = self._getAllLocalSubFunNames(mainFunction) for funName in funNames: fun = self._findFunction(funName) code.insert(0, fun) objects = self._getAllObjectsWithMethods(mainFunction) for objName, methods in objects.iteritems(): obj = self._findObject(objName, methods) code.insert(0, obj) code.append( 'e2i_dec=[];for (var idx in e2i_enc){e2i_dec.push(%s(e2i_enc[idx]));};print(JSON.stringify(e2i_dec));' % mainFunctionName) code = '\n'.join(code) printDBG("---------------------------------------") printDBG("| ALGO FOR SIGNATURE DECRYPTION |") printDBG("---------------------------------------") printDBG(code) printDBG("---------------------------------------") else: printDBG("USE ALGO FROM CACHE: %s" % jshash) js_params = [{'code': 'e2i_enc = %s;' % json_dumps(encSignatures)}] js_params.append({'name': jsname, 'code': code, 'hash': jshash}) ret = js_execute_ext(js_params) if ret['sts'] and 0 == ret['code']: try: decSignatures = json_loads(ret['data']) except Exception: printExc() return decSignatures
def getLinksForVideo(self, cItem): urlTab = [] if len(self.cacheLinks.get(cItem['url'], [])): return self.cacheLinks[cItem['url']] sts, data = self.getPage(cItem['url']) if not sts: return [] data = ph.findall(data, ('<tr', '>', 'download_link_'), '</tr>') for item in data: host = ph.search(item, '''"download_link_([^'^"]+?)['"]''')[0] #if self.up.checkHostSupport('http://'+host+'/') != 1: continue #printDBG(item) printDBG('------') url = '' item = ph.findall(item, '<a', '</a>') for it in item: #printDBG(it) if self.isNeedProxy(): url = urllib.unquote( ph.search( it, '''href=['"][^'^"]*?%3Fr%3D([^'^"^&]+?)['"&]''') [0]) else: url = ph.search( it, '''href=['"][^'^"]*?\?r=([^'^"]+?)['"]''')[0] if url: #use javascript function to decode url printDBG("crypted url -----> %s" % url) js_params = [{ 'path': GetJSScriptFile('swatchseries_max.byte') }] js_params.append({'code': "pippo('%s'); " % url}) ret = js_execute_ext(js_params) printDBG(ret) if ret: url = ret['data'].replace('\n', '').replace( '\/', '/').replace('"', '') if self.up.checkHostSupport(url): url = strwithmeta(self.getFullUrl(url), {'Referer': self.cm.meta['url']}) urlTab.append({ 'name': host, 'url': url, 'need_resolve': 1 }) break else: continue if len(urlTab): self.cacheLinks[cItem['url']] = urlTab return urlTab
def listSearchResult(self, cItem, searchPattern, searchType): printDBG("CartoonHD.listSearchResult cItem[%s], searchPattern[%s] searchType[%s]" % (cItem, searchPattern, searchType)) sts, data = self.cm.getPage(self.MAIN_URL, self.defaultParams) if not sts: return vars = self.cm.ph.getDataBeetwenMarkers(data, 'var ', '</script>')[1] if vars == '': return vars = vars[:-9] jsUrl = self.getFullUrl(self.cm.ph.getSearchGroups(data, '''<script[^>]+?src=['"]([^'^"]*?foxycomplete.js[^'^"]*?)['"]''')[0]) if not self.cm.isValidUrl(jsUrl): return jsHash = jsUrl.rsplit('=', 1)[-1] js_execute_ext, is_js_cached if not is_js_cached('cartoonhd', jsHash): sts, jsdata = self.cm.getPage(jsUrl, self.defaultParams) if not sts: return else: jsdata = '' post_data = {'q':searchPattern, 'limit':100, 'timestamp':str(int(time.time()*1000))} try: js_params = [{'path':GetJSScriptFile('cartoonhd.byte')}] js_params.append({'code':vars}) js_params.append({'name':'cartoonhd', 'hash':jsHash, 'code':jsdata}) ret = js_execute_ext( js_params ) if ret['sts'] and 0 == ret['code']: decoded = ret['data'].strip() printDBG('DECODED DATA -> [%s]' % decoded) decoded = json_loads(decoded) self.SEARCH_URL = decoded.pop('url', None) post_data.update(decoded) except Exception: printExc() httpParams = dict(self.defaultParams) httpParams['header'] = {'Referer':self.MAIN_URL, 'User-Agent':self.cm.HOST, 'X-Requested-With':'XMLHttpRequest', 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'} sts, data = self.cm.getPage(self.SEARCH_URL, httpParams, post_data=post_data) if not sts: return printDBG(data) try: data = json_loads(data) for item in data: desc = item['meta'] if 'movie' in desc.lower(): category = 'explore_item' elif 'tv show' in desc.lower(): category = 'list_seasons' else: category = None if None != category: title = item['title'] url = item['permalink'].replace('\\/', '/') icon = item.get('image', '').replace('\\/', '/') if '' != url: params = {'good_for_fav':True, 'name':'category', 'title':title, 'url':self.getFullUrl(url), 'desc':desc, 'icon':self.getFullUrl(icon), 'category':category} if category == 'explore_item': self.addVideo(params) else: self.addDir(params) except Exception: printExc()
def _getLinks(self, cUrl, data): linksTab = [] ad = self.cm.ph.getSearchGroups( data, '''var\s+?ad\s*?=\s*?['"]([^'^"]+?)['"]''', 1, True)[0] tmp = re.compile( '''<script[^>]+?src=['"]([^'^"]*?(?:view|providers)[^'^"]*?\.js(?:\?[^'^"]*?)?)['"]''', re.I).findall(data) tabJs = {} for item in tmp: version = item.split('?', 1)[-1] if 'providers' in item: tabJs['providers'] = { 'url': self.getFullUrl(item), 'hash': version + '.1' } elif 'view' in item: tabJs['view'] = { 'url': self.getFullUrl(item), 'hash': version + '.1' } for key in tabJs.iterkeys(): tabJs[key]['name'] = 'hdfull.me_%s' % key if not is_js_cached(tabJs[key]['name'], tabJs[key]['hash']): sts, jsdata = self.getPage(tabJs[key]['url']) if sts: if 'providers' == key: idx1 = jsdata.find('providers') idx2 = jsdata.find(';', idx1 + 9) funName = self.cm.ph.getSearchGroups( jsdata[idx2 + 1:], '''function\s+?([^\(]+?)\(''')[0] tabJs[key][ 'code'] = 'function buildIframeEmbed(){return arguments[0];}\nbuildIframeGenericEmbed=buildIframeEmbed;\n' + jsdata[:idx2 + 1] + '; function %s(){return function(){};}' % funName printDBG(">>>>") printDBG(tabJs[key]['code']) printDBG("<<<<") else: tmp = [ 'window=this,window.atob=function(e){e.length%4==3&&(e+="="),e.length%4==2&&(e+="=="),e=Duktape.dec("base64",e),decText="";for(var t=0;t<e.byteLength;t++)decText+=String.fromCharCode(e[t]);return decText};' ] start = 0 while True: idx1 = jsdata.find('String.prototype.', start) if idx1 < 0: break idx2 = jsdata.find('{', idx1 + 17) if idx2 < 0: break num = 1 while num > 0: idx2 += 1 if idx2 >= len(jsdata): break if jsdata[idx2] == '{': num += 1 elif jsdata[idx2] == '}': num -= 1 if num == 0: tmp.append(jsdata[idx1:idx2 + 1]) start = idx2 + 1 else: break mark = 'this.options.links' tt = 'function e2iLinks(r){r=%s;for(var i in r)provider=providers[r[i].provider],r[i].provider=provider.d.split("://")[1],r[i].embed=provider.e(r[i].code,"800","600"),r[i].download=provider.l(r[i].code,"800","600");print(JSON.stringify(r))}' tmp.append(tt % self.cm.ph.getDataBeetwenMarkers( jsdata, mark + '=', ';', False)[1].replace( mark, 'r')) tabJs[key]['code'] = '\n'.join(tmp) printDBG(">>>>") printDBG(tabJs[key]['code']) printDBG("<<<<") try: js_params = [tabJs['providers']] js_params.append(tabJs['view']) js_params.append({'code': 'e2iLinks("%s");' % ad}) ret = js_execute_ext(js_params) data = json_loads(ret['data']) for item in data: name = '%s | %s | %s ' % (item['lang'], item['provider'], item['quality']) url = item['embed'] if not url: url = item['download'] linksTab.append({ 'name': name, 'url': strwithmeta(url, {'Referer': cUrl}), 'need_resolve': 1 }) except Exception: printExc() return linksTab
def getVideoLink(self, cItem): printDBG("UstvgoApi.getVideoLink %s" % cItem) urlsTab = [] url = cItem.get('url', '') if url: sts, data = self.cm.getPage(url, self.http_params) if sts: #<div class="iframe-container"> # <iframe src='/player.php?stream=ABC' scrolling="no" allowfullscreen></iframe> #</div> tmp = self.cm.ph.getDataBeetwenNodes(data, ('<div', '>', 'iframe'), ('</div>'), False)[1] if tmp: iframe_url = self.getFullUrl( self.cm.ph.getSearchGroups( tmp, '''src=['"]([^'^"]+?)['"]''')[0]) printDBG("UstvgoApi - iframe url: %s" % iframe_url) params = MergeDicts(self.http_params, {'Referer': url}) sts, data = self.cm.getPage(iframe_url, params) else: printDBG( "UstvgoApi - iframe not found... trying with main page" ) if sts: printDBG( "------------- iframe player html code ----------") printDBG(data) #search for javascript scripts = self.cm.ph.getAllItemsBeetwenMarkers( data, ('<script', '>'), '</script>') for s in scripts: base64Url = re.findall( "filePath\s?=\s?atob\('([^']+?)'", s) base64Url.extend( re.findall("hlsURL\s?=\s?atob\('([^']+?)'", s)) if base64Url: video_url = base64.b64decode(base64Url[0]) if self.cm.isValidUrl(video_url): video_url = self.up.decorateUrl( video_url, { 'iptv_proto': 'm3u8', 'iptv_livestream': True, 'Referer': 'https://ustvgo.tv', 'User-Agent': self.HTTP_HEADER['User-Agent'] }) urlsTab.append({ 'name': 'link', 'url': video_url }) urlsTab.extend( getDirectM3U8Playlist(video_url, checkExt=False, checkContent=True)) if 'Clappr.Player' in s: # s is the right javascript code #search span tags, name of function and useful code spans = re.findall( "<span style='display:none' id=([a-zA-Z]+)>(.*?)</span>", data) fName = re.findall("source:\s?([a-zA-Z]+)\(\)", s) code = re.findall( "(function [a-zA-Z]{19,}\(.*?)var player", s, re.S) if len(code) > 0 and len(fName) > 0: code = code[0] code = re.sub("\\blet\\b", "var", code) fName = fName[0] code2 = "" for num_span in range(len(spans)): code2 = code2 + "\ndocument.children.push ( new element('', '%s', 'div')); document.children[%d].innerHTML = \"%s\";" % ( spans[num_span][0], num_span, spans[num_span][1]) js_code = "%s\n%s\n\nconsole.log(%s()); " % ( code2, code, fName) printDBG( "--------------- javascript code to get url ---------------------" ) printDBG(js_code) js_params = [{ 'path': GetJSScriptFile('ustvgo_max.byte') }] js_params.append({'code': js_code}) ret = js_execute_ext(js_params) if ret['sts'] and 0 == ret['code']: video_url = ret['data'].replace("\n", "") printDBG("Url found: %s" % video_url) video_url = self.up.decorateUrl( video_url, { 'iptv_proto': 'm3u8', 'iptv_livestream': True, 'Referer': 'https://ustvgo.tv', 'User-Agent': self.HTTP_HEADER['User-Agent'] }) urlsTab.append({ 'name': 'link', 'url': video_url }) urlsTab.extend( getDirectM3U8Playlist( video_url, checkExt=False, checkContent=True)) else: printDBG( "Duktape wrong execution... check code" ) return urlsTab