234 lines
6.9 KiB
Python
234 lines
6.9 KiB
Python
#coding: utf-8
|
|
#Vstream https://github.com/Kodi-vStream/venom-xbmc-addons
|
|
from resources.lib.handler.requestHandler import cRequestHandler
|
|
from resources.lib.parser import cParser
|
|
from resources.hosters.hoster import iHoster
|
|
# from resources.lib.aadecode import AADecoder
|
|
from resources.lib.jjdecode import JJDecoder
|
|
from resources.lib.packer import cPacker
|
|
from resources.lib.jsparser import JsParser
|
|
from resources.lib.comaddon import VSlog
|
|
|
|
import re
|
|
|
|
UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'
|
|
|
|
class cHoster(iHoster):
|
|
|
|
def __init__(self):
|
|
self.__sDisplayName = 'Speedvid'
|
|
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 'speedvid'
|
|
|
|
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 __getHost(self):
|
|
parts = self.__sUrl.split('//', 1)
|
|
host = parts[0] + '//' + parts[1].split('/', 1)[0]
|
|
return host
|
|
|
|
def setUrl(self, sUrl):
|
|
self.__sUrl = str(sUrl)
|
|
|
|
def checkUrl(self, sUrl):
|
|
return True
|
|
|
|
def getUrl(self):
|
|
return self.__sUrl
|
|
|
|
def getMediaLink(self):
|
|
return self.__getMediaLinkForGuest()
|
|
|
|
def __getMediaLinkForGuest(self):
|
|
|
|
oRequest = cRequestHandler(self.__sUrl.replace('sn', 'embed'))
|
|
oRequest.addHeaderEntry('User-Agent', UA)
|
|
oRequest.addHeaderEntry('Host', 'www.speedvid.net')
|
|
sHtmlContent = oRequest.request()
|
|
|
|
#suppression commentaires
|
|
sHtmlContent = re.sub( r'<!--.*?-->', '', sHtmlContent )
|
|
|
|
oParser = cParser()
|
|
|
|
#fh = open('c:\\test0.txt', "w")
|
|
#fh.write(sHtmlContent)
|
|
#fh.close()
|
|
|
|
#decodage de la pahe html
|
|
sHtmlContent3 = sHtmlContent
|
|
code = ''
|
|
maxboucle = 10
|
|
while (maxboucle > 0):
|
|
VSlog('loop : ' + str(maxboucle))
|
|
sHtmlContent3 = CheckCpacker(sHtmlContent3)
|
|
#sHtmlContent3 = CheckJJDecoder(sHtmlContent3)
|
|
sHtmlContent3 = CheckAADecoder(sHtmlContent3)
|
|
|
|
maxboucle = maxboucle - 1
|
|
|
|
sHtmlContent = sHtmlContent3
|
|
|
|
VSlog('fini')
|
|
|
|
#fh = open('c:\\test.txt', "w")
|
|
#fh.write(sHtmlContent)
|
|
#fh.close()
|
|
|
|
#Desactive pour le moment
|
|
if (True):
|
|
Realurl = ''
|
|
|
|
red = re.findall('location.href *= *[\'"]([^\'"]+)', sHtmlContent)
|
|
if red:
|
|
Realurl = red[0]
|
|
else:
|
|
VSlog("2")
|
|
red = re.findall('location\.assign *\( *"([^"]+)" \)', sHtmlContent)
|
|
if red:
|
|
Realurl = red[0]
|
|
|
|
if 'speedvid' not in Realurl:
|
|
Realurl = self.__getHost() + Realurl
|
|
|
|
if not Realurl.startswith('http'):
|
|
Realurl = 'http:' + Realurl
|
|
|
|
if not Realurl:
|
|
VSlog("mauvaise redirection")
|
|
return False, False
|
|
|
|
VSlog('Real url>> ' + Realurl)
|
|
|
|
oRequest = cRequestHandler(Realurl)
|
|
oRequest.addHeaderEntry('User-Agent', UA)
|
|
oRequest.addHeaderEntry('Referer', self.__sUrl)
|
|
|
|
sHtmlContent = oRequest.request()
|
|
|
|
#fh = open('c:\\test.txt', "w")
|
|
#fh.write(sHtmlContent)
|
|
#fh.close()
|
|
|
|
api_call = ''
|
|
|
|
sPattern = '(eval\(function\(p,a,c,k,e(?:.|\s)+?\)\))<'
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
if (aResult[0] == True):
|
|
for packed in aResult[1]:
|
|
sHtmlContent = cPacker().unpack(packed)
|
|
sHtmlContent = sHtmlContent.replace('\\', '')
|
|
if "jwplayer('vplayer').setup" in sHtmlContent:
|
|
sPattern2 = "{file:.([^']+.mp4)"
|
|
aResult2 = oParser.parse(sHtmlContent, sPattern2)
|
|
if (aResult2[0] == True):
|
|
api_call = aResult2[1][0]
|
|
break
|
|
|
|
else:
|
|
sPattern = "file\s*:\s*\'([^\']+.mp4)"
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
if (aResult[0] == True):
|
|
api_call = aResult[1][0]
|
|
|
|
VSlog('API_CALL: ' + api_call )
|
|
|
|
if (api_call):
|
|
api_call = api_call + '|User-Agent=' + UA #+ #'|Host=' + api_call.replace('http://','').rsplit('/', 2)[0]
|
|
|
|
return True, api_call
|
|
|
|
return False, False
|
|
#********************************************************************************************************************************
|
|
|
|
def CheckCpacker(str):
|
|
|
|
sPattern = '>([^>]+\(p,a,c,k,e(?:.|\s)+?\)\)\s*)<'
|
|
aResult = re.search(sPattern, str, re.DOTALL | re.UNICODE)
|
|
if (aResult):
|
|
#VSlog('Cpacker encryption')
|
|
str2 = aResult.group(1)
|
|
|
|
if not str2.endswith(';'):
|
|
str2 = str2 + ';'
|
|
|
|
#if not str2.startswith('eval'):
|
|
# str2 = 'eval(function' + str2[4:]
|
|
|
|
#Me demandez pas pourquoi mais si je l'affiche pas en log, ca freeze ?????
|
|
#VSlog(str2)
|
|
|
|
try:
|
|
tmp = cPacker().unpack(str2)
|
|
#tmp = tmp.replace("\\'", "'")
|
|
except:
|
|
tmp = ''
|
|
|
|
#VSlog(tmp)
|
|
|
|
return str[:(aResult.start() + 1)] + tmp + str[(aResult.end()-1):]
|
|
|
|
return str
|
|
|
|
def CheckJJDecoder(str):
|
|
|
|
sPattern = '([a-z]=.+?\(\)\)\(\);)'
|
|
aResult = re.search(sPattern, str, re.DOTALL | re.UNICODE)
|
|
if (aResult):
|
|
VSlog('JJ encryption')
|
|
tmp = JJDecoder(aResult.group(0)).decode()
|
|
|
|
return str[:aResult.start()] + tmp + str[aResult.end():]
|
|
|
|
return str
|
|
|
|
def CheckAADecoder(str):
|
|
aResult = re.search('([>;]\s*)(゚ω゚.+?\(\'_\'\);)', str, re.DOTALL | re.UNICODE)
|
|
if (aResult):
|
|
VSlog('AA encryption')
|
|
|
|
#tmp = aResult.group(1) + AADecoder(aResult.group(2)).decode()
|
|
|
|
JP = JsParser()
|
|
Liste_var = []
|
|
|
|
try:
|
|
JScode = aResult.group(2)
|
|
JScode = unicode(JScode, "utf-8")
|
|
|
|
tmp = JP.ProcessJS(JScode, Liste_var)
|
|
tmp = JP.LastEval.decode('string-escape').decode('string-escape')
|
|
|
|
return str[:aResult.start()] + tmp + str[aResult.end():]
|
|
except:
|
|
return ''
|
|
return str
|