# -*- coding: utf-8 -*- # vStream https://github.com/Kodi-vStream/venom-xbmc-addons # try: # Python 2 import urllib2 from urllib2 import URLError as UrlError from urllib2 import HTTPError as HttpError except ImportError: # Python 3 import urllib.request as urllib2 from urllib.error import URLError as UrlError from urllib.error import HTTPError as HttpError import re from resources.hosters.hoster import iHoster from resources.lib.comaddon import dialog, VSlog from resources.lib.handler.requestHandler import cRequestHandler from resources.lib.packer import cPacker from resources.lib.parser import cParser # Remarque : meme code que vodlocker UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0' def ASCIIDecode(string): i = 0 l = len(string) ret = '' while i < l: c = string[i] if string[i:(i + 2)] == '\\x': c = chr(int(string[(i + 2):(i + 4)], 16)) i += 3 if string[i:(i + 2)] == '\\u': cc = int(string[(i + 2):(i + 6)], 16) if cc > 256: # ok c'est de l'unicode, pas du ascii return '' c = chr(cc) i += 5 ret = ret + c i = i + 1 return ret def GetHtml(url, headers): request = urllib2.Request(url, None, headers) reponse = urllib2.urlopen(request) sCode = reponse.read() reponse.close() return sCode def UnlockUrl(url2=None): headers9 = { 'User-Agent': UA, 'Referer': 'https://www.flashx.co/dl?playthis' } url1 = 'https://www.flashx.co/js/code.js' if url2: url1 = url2 if not url1.startswith('http'): url1 = 'https:' + url1 VSlog('Test unlock url :' + url1) oRequest = cRequestHandler(url1) oRequest.addParameters('User-Agent', UA) # oRequest.addParameters('Accept', '*/*') # oRequest.addParameters('Accept-Encoding', 'gzip, deflate, br') # oRequest.addParameters('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3') oRequest.addParameters('Referer', 'https://www.flashx.co/dl?playthis') code = oRequest.request() url = '' if not code: url = oRequest.getRealUrl() VSlog('Redirection :' + url) else: # VSlog(code) aResult = re.search("!= null\){\s*\$.get\('([^']+)', *{(.+?)}", code, re.DOTALL) if aResult: dat = aResult.group(2) dat = dat.replace("'", '') dat = dat.replace(" ", '') dat2 = dict(x.split(':') for x in dat.split(',')) dat3 = aResult.group(1) + '?' for i, j in dat2.items(): dat3 = dat3 + str(i) + '=' + str(j) + '&' url = dat3[:-1] # url = 'https://www.flashx.tv/flashx.php?fxfx=6' if url: VSlog('Good Url :' + url1) VSlog(url) GetHtml(url, headers9) return True VSlog('Bad Url :' + url1) return False def LoadLinks(htmlcode): VSlog('Scan des liens') host = 'https://www.flashx.tv' sPattern = '[\("\'](https*:)*(\/[^,"\'\)\s]+)[\)\'"]' aResult = re.findall(sPattern, htmlcode, re.DOTALL) # VSlog(str(aResult)) for http, urlspam in aResult: sUrl = urlspam if http: sUrl = http + sUrl sUrl = sUrl.replace('/\/', '//') sUrl = sUrl.replace('\/', '/') # filtrage mauvaise url if (sUrl.count('/') < 2) or ('<' in sUrl) or ('>' in sUrl) or (len(sUrl) < 15): continue if '[' in sUrl or ']' in sUrl: continue if '.jpg' in sUrl or '.png' in sUrl: continue # VSlog('test : ' + sUrl) if '\\x' in sUrl or '\\u' in sUrl: sUrl = ASCIIDecode(sUrl) if not sUrl: continue if sUrl.startswith('//'): sUrl = 'http:' + sUrl if sUrl.startswith('/'): sUrl = host + sUrl # Url ou il ne faut pas aller if 'dok3v' in sUrl: continue # pour test if ('.js' not in sUrl) or ('.cgi' not in sUrl): continue # if 'flashx' in sUrl: # continue headers8 = {'User-Agent': UA, 'Referer': 'https://www.flashx.tv/dl?playthis' } try: request = urllib2.Request(sUrl, None, headers8) reponse = urllib2.urlopen(request) sCode = reponse.read() reponse.close() # VSlog('Worked ' + sUrl) except HttpError as e: if not e.geturl() == sUrl: try: headers9 = { 'User-Agent': UA, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate, br' } request = urllib2.Request(e.geturl().replace('https', 'http'), None, headers9) reponse = urllib2.urlopen(request) sCode = reponse.read() reponse.close() # VSlog('Worked ' + sUrl) except HttpError as e: VSlog(str(e.code)) # VSlog(e.read()) VSlog('Redirection Blocked ' + sUrl + ' Red ' + e.geturl()) pass else: # VSlog('Blocked ' + sUrl) VSlog(str(e.code)) VSlog('>>' + e.geturl()) VSlog(e.read()) VSlog('fin des unlock') class cHoster(iHoster): def __init__(self): self.__sDisplayName = 'FlashX' self.__sFileName = self.__sDisplayName self.__sHD = '' def getDisplayName(self): return self.__sDisplayName def setDisplayName(self, sDisplayName): self.__sDisplayName = sDisplayName + ' [COLOR skyblue]' + self.__sDisplayName + '[/COLOR] [COLOR khaki]' + self.__sHD + '[/COLOR]' def setFileName(self, sFileName): self.__sFileName = sFileName def getFileName(self): return self.__sFileName def getPluginIdentifier(self): return 'flashx' def setHD(self, sHD): self.__sHD = '' def getHD(self): return self.__sHD def isDownloadable(self): return True def isJDownloaderable(self): return True def getPattern(self): return '' def GetRedirectHtml(self, web_url, sId, NoEmbed=False): headers = { # 'Host': 'www.flashx.tv', 'User-Agent': UA, # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', # 'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'http://embed.flashx.tv/embed.php?c=' + sId, 'Accept-Encoding': 'identity' } MaxRedirection = 3 while MaxRedirection > 0: # generation headers # headers2 = headers # headers2['Host'] = self.GetHost(web_url) VSlog(str(MaxRedirection) + ' Test sur : ' + web_url) request = urllib2.Request(web_url, None, headers) redirection_target = web_url try: # ok ca a enfin marche reponse = urllib2.urlopen(request) sHtmlContent = reponse.read() reponse.close() if not (reponse.geturl() == web_url) and not (reponse.geturl() == ''): redirection_target = reponse.geturl() else: break except UrlError as e: if (e.code == 301) or (e.code == 302): redirection_target = e.headers['Location'] else: # VSlog(str(e.code)) # VSlog(str(e.read())) return False web_url = redirection_target if 'embed' in redirection_target and NoEmbed: # rattage, on a pris la mauvaise url VSlog('2') return False MaxRedirection = MaxRedirection - 1 return sHtmlContent def __getIdFromUrl(self, sUrl): sPattern = "https*:\/\/((?:www.|play.)?flashx.+?)\/(?:playvid-)?(?:embed-)?(?:embed.+?=)?(-*[0-9a-zA-Z]+)?(?:.html)?" oParser = cParser() aResult = oParser.parse(sUrl, sPattern) if (aResult[0] == True): return aResult[1][0][1] return '' def GetHost(self, sUrl): oParser = cParser() sPattern = 'https*:\/\/(.+?)\/' aResult = oParser.parse(sUrl, sPattern) if aResult[0]: return aResult[1][0] return '' def setUrl(self, sUrl): self.__sUrl = 'http://' + self.GetHost(sUrl) + '/embed.php?c=' + self.__getIdFromUrl(sUrl) def checkUrl(self, sUrl): return True def __getUrl(self, media_id): return '' def getMediaLink(self): return self.__getMediaLinkForGuest() def CheckGoodUrl(self, url): # VSlog('test de ' + url) headers = {'User-Agent': UA # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', # 'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3', # 'Accept-Encoding': 'gzip, deflate, br', # 'Host': 'openload.co', # 'Referer': referer } req = urllib2.Request(url) res = urllib2.urlopen(req) # pour afficher contenu # VSlog(res.read()) # pour afficher header # VSlog(str(res.info())) # Pour afficher redirection # VSlog('red ' + res.geturl()) if 'embed' is res.geturl(): return False html = res.read() res.close() return res def __getMediaLinkForGuest(self): api_call = False oParser = cParser() # on recupere le host actuel HOST = self.GetHost(self.__sUrl) # on recupere l'ID sId = self.__getIdFromUrl(self.__sUrl) if sId == '': VSlog("Id prb") return False, False # on ne garde que les chiffres # sId = re.sub(r'-.+', '', sId) # on cherche la vraie url sHtmlContent = self.GetRedirectHtml(self.__sUrl, sId) # fh = open('c:\\test.txt', "w") # fh.write(sHtmlContent) # fh.close() sPattern = 'href=["\'](https*:\/\/www\.flashx[^"\']+)' AllUrl = re.findall(sPattern, sHtmlContent, re.DOTALL) # VSlog(str(AllUrl)) # Disabled for the moment if (False): if AllUrl: # Need to find which one is the good link # Use the len don't work for i in AllUrl: if i[0] == '': web_url = i[1] else: return False,False else: web_url = AllUrl[0] web_url = AllUrl[0] # Requests to unlock video # unlock fake video LoadLinks(sHtmlContent) # unlock bubble unlock = False url2 = re.findall('["\']([^"\']+?\.js\?cache.+?)["\']', sHtmlContent, re.DOTALL) if not url2: VSlog('No special unlock url find') for i in url2: unlock = UnlockUrl(i) if unlock: break if not unlock: VSlog('No special unlock url working') return False, False # get the page sHtmlContent = self.GetRedirectHtml(web_url, sId, True) if sHtmlContent == False: VSlog('Passage en mode barbare') # ok ca a rate on passe toutes les url de AllUrl for i in AllUrl: if not i == web_url: sHtmlContent = self.GetRedirectHtml(i, sId, True) if sHtmlContent: break if not sHtmlContent: return False, False if 'reload the page!' in sHtmlContent: # VSlog("page bloquée") # On recupere la bonne url sGoodUrl = web_url # on recupere la page de refresh sPattern = 'reload the page! !! ' aResult = re.findall(sPattern, sHtmlContent) if not aResult: return False, False sRefresh = aResult[0] # on recupere le script de debloquage sPattern = "