def GET_SUBTILES(url, subtitle_completion1, subtitle_completion2): srtsubs_path1 = 'special://temp/vstream_viki_SubFrench.srt' srtsubs_path2 = 'special://temp/vstream_viki_SubEnglish.srt' try: if (int(subtitle_completion1) > 79 and se == 'true'): urlreq = SIGN(url, '/subtitles/fr.srt') oRequestHandler = cRequestHandler(urlreq) oRequestHandler.addHeaderEntry('User-Agent', UA) data = oRequestHandler.request() if isMatrix(): data = data.encode('latin-1') with xbmcvfs.File(srtsubs_path1, "w") as subfile: subfile.write(data) if (int(subtitle_completion2) > 0 and se == 'true'): urlreq = SIGN(url, '/subtitles/en.srt') oRequestHandler = cRequestHandler(urlreq) oRequestHandler.addHeaderEntry('User-Agent', UA) data = oRequestHandler.request() if isMatrix(): data = data.encode('latin-1') with xbmcvfs.File(srtsubs_path2, "w") as subfile: subfile.write(data) else: # VSlog('GET_SUBTILES:erreur completion') pass except: # VSlog('GET_SUBTILES:erreur exception') pass return srtsubs_path1, srtsubs_path2
def GET_SUBTILES(url, subtitle_completion1, subtitle_completion2): if (int(subtitle_completion1)) != 0 or (int(subtitle_completion2)) != 0: if (int(subtitle_completion1) == 100 and se == 'true'): srtsubs_path1 = 'special://temp/vstream_viki_SubFrench.srt' urlreq = SIGN(url, '/subtitles/fr.srt') oRequestHandler = cRequestHandler(urlreq) oRequestHandler.addHeaderEntry('User-Agent', UA) data = oRequestHandler.request() if isMatrix(): data = data.encode('latin-1') subfile = xbmcvfs.File("special://temp/vstream_viki_SubFrench.srt", "w") subfile.write(data) subfile.close() elif (int(subtitle_completion2) > 0 and se == 'true'): srtsubs_path1 = "special://temp/vstream_viki_SubEnglish.srt" urlreq = SIGN(url, '/subtitles/en.srt') oRequestHandler = cRequestHandler(urlreq) oRequestHandler.addHeaderEntry('User-Agent', UA) data = oRequestHandler.request() if isMatrix(): data = data.encode('latin-1') subfile = xbmcvfs.File( "special://temp/vstream_viki_SubEnglish.srt", "w") subfile.write(data) subfile.close() return srtsubs_path1 else: return False
def sDecode(r, o): t = [] e = [] n = 0 a = "" for f in range(256): e.append(f) for f in range(256): n = (n + e[f] + ord(r[f % len(r)])) % 256 t = e[f] e[f] = e[n] e[n] = t f = 0 n = 0 for h in range(len(o)): f = f + 1 n = (n + e[f % 256]) % 256 if not f in e: f = 0 t = e[f] e[f] = e[n] e[n] = t if isMatrix(): a += chr(o[h] ^ e[(e[f] + e[n]) % 256]) else: a += chr(ord(o[h]) ^ e[(e[f] + e[n]) % 256]) return a
def titleWatched(self, title): if not isMatrix(): if isinstance(title, str): # Must be encoded in UTF-8 try: title = title.decode('utf8') except AttributeError: pass title = unicodedata.normalize('NFKD', title).encode('ascii', 'ignore') # cherche la saison et episode puis les balises [color]titre[/color] # title, saison = self.getSaisonTitre(title) # title, episode = self.getEpisodeTitre(title) # supprimer les balises title = re.sub(r'\[.*\]|\(.*\)', r'', str(title)) title = title.replace('VF', '').replace('VOSTFR', '').replace('FR', '') # title = re.sub(r'[0-9]+?', r'', str(title)) title = title.replace( '-', ' ' ) # on garde un espace pour que Orient-express ne devienne pas Orientexpress pour la recherche tmdb title = title.replace('Saison', '').replace('saison', '').replace( 'Season', '').replace('Episode', '').replace('episode', '') title = re.sub('[^%s]' % (string.ascii_lowercase + string.digits), ' ', title.lower()) # title = QuotePlus(title) # title = title.decode('string-escape') return title
def str_conv(self, data): # Pas d'autre solution pour le moment que de faire comme ca. if not isMatrix(): if isinstance(data, str): # Must be encoded in UTF-8 try: data = data.decode('utf8') except AttributeError: pass data = unicodedata.normalize('NFKD', data).encode('ascii', 'ignore') # cherche la saison et episode puis les balises [color]titre[/color] # data, saison = self.getSaisonTitre(data) # data, episode = self.getEpisodeTitre(data) # supprimer les balises data = re.sub(r'\[.*\]|\(.*\)', r'', str(data)) data = data.replace('VF', '').replace('VOSTFR', '').replace('FR', '') # data = re.sub(r'[0-9]+?', r'', str(data)) data = data.replace('-', ' ') # on garde un espace pour que Orient-express ne devienne pas Orientexpress pour la recherche tmdb data = data.replace('Saison', '').replace('saison', '').replace('Season', '').replace('Episode', '').replace('episode', '') data = re.sub('[^%s]' % (string.ascii_lowercase + string.digits), ' ', data.lower()) # data = QuotePlus(data) # data = data.decode('string-escape') return data
def showTV(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') clientID, deviceID, sid = getData() oRequestHandler = cRequestHandler(sUrl) oRequestHandler.addHeaderEntry('User-Agent', UA) sHtmlContent = oRequestHandler.request(jsonDecode=True) if sHtmlContent: oOutputParameterHandler = cOutputParameterHandler() for aEntry in sHtmlContent: sThumb = aEntry["featuredImage"]["path"] sTitle = aEntry["name"] if not isMatrix(): sTitle = sTitle.encode('utf8') sUrl2 = "https://boot.pluto.tv/v4/start?deviceId=" + deviceID sUrl2 += "&deviceMake=Firefox&deviceType=web&deviceVersion=87.0&deviceModel=web&DNT=0&appName=web" sUrl2 += "&appVersion=5.14.0-0f5ca04c21649b8c8aad4e56266a23b96d73b83a&serverSideAds=true&channelSlug=" sUrl2 += aEntry[ "slug"] + "&episodeSlugs=&clientID=" + clientID + "&clientModelNumber=na" oOutputParameterHandler.addParameter('siteUrl', sUrl2) oOutputParameterHandler.addParameter('sMovieTitle', sTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oGui.addMisc(SITE_IDENTIFIER, 'showHosters', sTitle, 'tv.png', sThumb, '', oOutputParameterHandler) oGui.setEndOfDirectory()
def showGenre(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') oRequestHandler = cRequestHandler(sUrl) oRequestHandler.addHeaderEntry('User-Agent', UA) sHtmlContent = oRequestHandler.request(jsonDecode=True) sID = 1 if sHtmlContent: oOutputParameterHandler = cOutputParameterHandler() for aEntry in sHtmlContent["categories"]: sTitle = aEntry["name"] if not isMatrix(): sTitle = sTitle.encode('utf8') oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sID', int(sID)) sID = sID + 1 oGui.addDir(SITE_IDENTIFIER, 'showVOD', sTitle, 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory()
def loadTypelist(typemovie, typelist): # typelist genre ou year # <select name="genre" # <select name="year" sUrl = URL_MAIN + 'series-0-1/' + typemovie oRequestHandler = cRequestHandler(sUrl) sHtmlContent = oRequestHandler.request() oParser = cParser() sPattern = '<select name="([^"]+)|<option value=\'([^\']+).*?>([^<]+)' aResult = oParser.parse(sHtmlContent, sPattern) list_typelist = {} if (aResult[0] == True): for aEntry in aResult[1]: if aEntry[0]: if aEntry[0] == typelist: bfind = True else: bfind = False if bfind and aEntry[1]: if not isMatrix(): title = aEntry[2].decode('iso-8859-1').encode('utf8') else: title = aEntry[2] title = title.replace('e', 'E').strip() list_typelist[title] = aEntry[1] list_typelist = sorted(list_typelist.items(), key=lambda typeList: typeList[0]) return list_typelist
def getTempFile(self): # le nom doit changer pour garantir l'enchainement des épisodes # il faut tourner sur au moins trois fichiers car on ne peut pas supprimer le fichier en cours pathFile1 = VSPath('special://temp/video_pstream1.m3u8') pathFile2 = VSPath('special://temp/video_pstream2.m3u8') pathFile3 = VSPath('special://temp/video_pstream3.m3u8') if not isMatrix(): pathFile1 = pathFile1.decode('utf-8') pathFile2 = pathFile2.decode('utf-8') pathFile3 = pathFile3.decode('utf-8') if not os.path.exists(pathFile1): if os.path.exists(pathFile2): os.remove(pathFile2) return pathFile1 if not os.path.exists(pathFile2): if os.path.exists(pathFile3): os.remove(pathFile3) return pathFile2 if not os.path.exists(pathFile3): if os.path.exists(pathFile1): os.remove(pathFile1) return pathFile3 if os.path.exists(pathFile2): os.remove(pathFile2) return pathFile1
def decodex(x): from itertools import chain import base64 x = x.replace('https://www.youtube.com/embed/', '') missing_padding = len(x) % 4 if missing_padding: x += '=' * (4 - missing_padding) VSlog(x) try: e = base64.b64decode(x) t = '' r = "ETEfazefzeaZa13MnZEe" a = 0 px = chain(e) for y in list(px): if isMatrix(): t += chr(int(175 ^ y) - ord(r[a])) else: t += chr(int(175 ^ ord(y[0])) - ord(r[a])) a = 0 if a > len(r) - 2 else a + 1 return t except: return '' return ''
def showEpisodes(): oGui = cGui() oParser = cParser() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sThumb = oInputParameterHandler.getValue('sThumb') sDesc = oInputParameterHandler.getValue('sDesc') oRequestHandler = cRequestHandler(sUrl) oRequestHandler.disableSSL() sHtmlContent = oRequestHandler.request() # On recupere l'id de l'anime dans l'url serieID = re.search('fiche-.+?-(\d+)-.+?.html', sUrl).group(1) sPattern = 'class="(?:download cell_impaire|download)" id="([^"]+)".+?(\d+).+?class="cell".+?>([^<]+)</td' aResult = oParser.parse(sHtmlContent, sPattern) if (aResult[0] == False): oGui.addText(SITE_IDENTIFIER) if (aResult[0] == True): oOutputParameterHandler = cOutputParameterHandler() for aEntry in sorted(aResult[1], key=lambda aResult: aResult[1]): sQual = aEntry[2] if isMatrix(): sQual = sQual.encode('latin-1').decode() # Changemement de formats ...x... -> ....P if '1920×' in sQual or '1440×' in sQual or '1904×' in sQual: sQual = re.sub('(\d+×\d+)px', '[1080P]', sQual) elif '1728×' in sQual: sQual = re.sub('(\d+×\d+)px', '[800P]', sQual) elif '1280×' in sQual: # VSlog(sQual) sQual = re.sub('(\d+×\d+)px', '[720P]', sQual) elif '1024×' in sQual: sQual = re.sub('(\d+×\d+)px', '[600P]', sQual) elif '480×' in sQual: sQual = re.sub('(\d+×\d+)px', '[360P]', sQual) else: sQual = re.sub('(\d+×\d+)px', '[480P]', sQual) sTitle = 'E' + aEntry[1] + ' ' + sMovieTitle + ' ' + sQual idEpisode = aEntry[0] oOutputParameterHandler.addParameter('sMovieTitle', sTitle) oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('serieID', serieID) oOutputParameterHandler.addParameter('idEpisode', idEpisode) oGui.addEpisode(SITE_IDENTIFIER, 'showHosters', sTitle, '', sThumb, sDesc, oOutputParameterHandler) oGui.setEndOfDirectory()
def getSerieTitre(self, sTitle): serieTitle = re.sub(r'\[.*\]|\(.*\)', r'', sTitle) serieTitle = re.sub('[- –]+$', '', serieTitle) if '|' in serieTitle: serieTitle = serieTitle[:serieTitle.index('|')] # on repasse en utf-8 if not isMatrix(): return serieTitle.encode('utf-8') return serieTitle
def setDescription(self, sDescription): #Py3 if isMatrix(): try: if 'Ã' in sDescription or '\\xc' in sDescription: self.__sDescription = str(sDescription.encode('latin-1'),'utf-8') else: self.__sDescription = sDescription except: self.__sDescription = sDescription else: self.__sDescription = sDescription
def showEpisode(): oGui = cGui() oParser = cParser() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sThumb = oInputParameterHandler.getValue('sThumb') oRequestHandler = cRequestHandler(sUrl) oRequestHandler.addHeaderEntry('User-Agent', UA) oRequestHandler.addHeaderEntry('Referer', RandomReferer()) sHtmlContent = oRequestHandler.request() try: sDesc = oParser.parse(sHtmlContent, '</headline15>.+?<font style=.+?>([^"]+)</font')[1][0] except: sDesc = "" if 'HTML/JavaScript Encoder' in sHtmlContent: sHtmlContent = ICDecode(sHtmlContent) sPattern = '<headline11>(.+?)</headline11></a>|href="*([^"]+)"* title="([^"]+)"[^>]+style="*text-decoration:none;"' aResult = oParser.parse(sHtmlContent, sPattern) if (aResult[0] == True): isPython3 = isMatrix() oOutputParameterHandler = cOutputParameterHandler() for aEntry in aResult[1]: if not isPython3: sTitle = unicode(aEntry[2], 'iso-8859-1') sTitle = unicodedata.normalize('NFD', sTitle).encode('ascii', 'ignore') sTitle = sTitle.encode('ascii', 'ignore').decode('ascii').replace(' VF', '').replace(' VOSTFR', '') else: sTitle = aEntry[2] sTitle = cUtil().unescape(sTitle) sUrl2 = cUtil().unescape(aEntry[1]) if not sUrl2.startswith('http'): sUrl2 = URL_MAIN + sUrl2 if aEntry[0]: oGui.addText(SITE_IDENTIFIER, '[COLOR red]' + aEntry[0] + '[/COLOR]') else: oOutputParameterHandler.addParameter('siteUrl', sUrl2) oOutputParameterHandler.addParameter('sMovieTitle', sTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('sDesc', sDesc) oGui.addEpisode(SITE_IDENTIFIER, 'showHosters', sTitle, '', sThumb, sDesc, oOutputParameterHandler) oGui.setEndOfDirectory()
def showVOD(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sID = oInputParameterHandler.getValue('sID') oRequestHandler = cRequestHandler(sUrl) oRequestHandler.addHeaderEntry('User-Agent', UA) sHtmlContent = oRequestHandler.request(jsonDecode=True) if sHtmlContent: items = sHtmlContent["categories"][int(sID) - 1]["items"] total = len(items) progress_ = progress().VScreate(SITE_NAME) oOutputParameterHandler = cOutputParameterHandler() for aEntry in items: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break sThumb = aEntry["featuredImage"]["path"] sTitle = aEntry["name"] ids = aEntry["_id"] sDesc = aEntry["description"] if not isMatrix(): sTitle = sTitle.encode('utf8') sDesc = sDesc.encode('utf8') oOutputParameterHandler.addParameter('sMovieTitle', sTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('sDesc', sDesc) if aEntry["type"] == "series": sUrl = "https://service-vod.clusters.pluto.tv/v3/vod/series/" + ids + "/seasons?includeItems=true&deviceType=web" oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addTV(SITE_IDENTIFIER, 'ShowSerieSaisonEpisodes', sTitle, '', sThumb, sDesc, oOutputParameterHandler) elif aEntry["type"] == "Anime": sUrl = "https://service-vod.clusters.pluto.tv/v3/vod/series/" + ids + "/seasons?includeItems=true&deviceType=web" oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addAnime(SITE_IDENTIFIER, 'ShowSerieSaisonEpisodes', sTitle, '', sThumb, sDesc, oOutputParameterHandler) else: siteUrl = "https://service-stitcher.clusters.pluto.tv/stitch/hls/episode/" + ids + "/master.m3u8" oOutputParameterHandler.addParameter('siteUrl', siteUrl) oGui.addMovie(SITE_IDENTIFIER, 'seriesHosters', sTitle, '', sThumb, sDesc, oOutputParameterHandler) progress_.VSclose(progress_) oGui.setEndOfDirectory()
def decodex(x): from itertools import chain import base64 e = base64.b64decode(x.replace('https://www.youtube.com/embed/', '')) t = '' r = "ETEfazefzeaZa13MnZEe" a = 0 px = chain(e) for y in list(px): if isMatrix(): t += chr(int(175 ^ y) - ord(r[a])) else: t += chr(int(175 ^ ord(y[0])) - ord(r[a])) a = 0 if a > len(r) - 2 else a + 1 return t
def __randy_boundary(length=10, reshuffle=False): import string import random if isMatrix(): character_string = string.ascii_letters + string.digits else: character_string = string.letters + string.digits boundary_string = [] for i in range(0, length): rand_index = random.randint(0, len(character_string) - 1) boundary_string.append(character_string[rand_index]) if reshuffle: random.shuffle(boundary_string) else: pass return ''.join(boundary_string)
def CleanName(self, name): if not isMatrix(): # vire accent et '\' try: name = unicode( name, 'utf-8') # converti en unicode pour aider aux convertions except: pass try: name = unicodedata.normalize('NFD', name).encode( 'ascii', 'ignore').decode('unicode_escape') name = name.encode('utf-8') # on repasse en utf-8 except TypeError: # name = unicodedata.normalize('NFKD', name.decode("utf-8")).encode('ASCII', 'ignore') pass # on cherche l'annee annee = '' m = re.search('(\([0-9]{4}\))', name) if m: annee = str(m.group(0)) name = name.replace(annee, '') # vire tag name = re.sub('[\(\[].+?[\)\]]', '', name) # les apostrophes remplacer par des espaces name = name.replace("'", " ") # vire caractere special # name = re.sub('[^a-zA-Z0-9 ]', '', name) name = re.sub('[^a-zA-Z0-9 : -]', '', name) # tout en minuscule name = name.lower() # vire espace debut et fin name = name.strip() # vire espace double au milieu name = re.sub(' +', ' ', name) # on remet l'annee if annee: name = name + ' ' + annee return name
def __getMediaLinkForGuest(self): api_call = False oParser = cParser() sPattern = 'return decodeURIComponent\(escape\(r\)\)}\("([^,]+)",([^,]+),"([^,]+)",([^,]+),([^,]+),([^,\))]+)\)' oRequest = cRequestHandler(self.__sUrl) oRequest.addHeaderEntry('Cookie', 'popads2=opened') sHtmlContent = oRequest.request() aResult = oParser.parse(sHtmlContent, sPattern) #Get decode page #oRequest = cRequestHandler("https://upvideo.to/assets/js/tabber.js") #oRequest.addHeaderEntry('Referer', self.__sUrl) #sHtmlContent2 = oRequest.request() #aResult2 = oParser.parse(sHtmlContent2, sPattern) #if (aResult2[0] == True): # j = aResult2[1][0] # decoder = hunter(j[0],int(j[1]),j[2],int(j[3]),int(j[4]),int(j[5])) # VSlog("Decoder ok") if (aResult[0] == True): l = aResult[1] for j in l: data = hunter(j[0], int(j[1]), j[2], int(j[3]), int(j[4]), int(j[5])) if "fcbbbdddebad" in data: r = re.search('var fcbbbdddebad *= *"([^"]+)" *;', data) if not r: VSlog('er2') v2 = r.group(1).split('aHR0')[1].split('YTk0NT')[0] if isMatrix(): api_call = "htt" + (base64.b64decode(v2).decode()) else: api_call = "htt" + base64.b64decode(v2) if (api_call): return True, api_call return False, False
def setTitle(self, sTitle): #Convertie les bytes en strs pour le replace. self.__sCleanTitle = sTitle.replace('[]', '').replace('()', '').strip() if isMatrix(): #Python 3 decode sTitle try: sTitle = str(sTitle.encode('latin-1'), 'utf-8') except: pass else: try: sTitle = str(sTitle.strip().decode('utf-8')) except: pass if not sTitle.startswith('[COLOR'): self.__sTitle = self.TraiteTitre(sTitle) else: self.__sTitle = sTitle
def __getMediaLinkForGuest(self): api_call = '' url = self.__sUrl oRequest = cRequestHandler(url) oRequest.addHeaderEntry('User-Agent', UA) oRequest.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8') oRequest.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3') sHtmlContent = oRequest.request() oParser = cParser() sPattern = '<script type="text/javascript" src="(.+?)"' aResult = oParser.parse(sHtmlContent, sPattern)[1][1] oRequest = cRequestHandler(aResult) oRequest.addHeaderEntry('User-Agent', UA) oRequest.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8') oRequest.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3') sHtmlContent = oRequest.request() sPattern = '(?:parseJSON|atob).+?ey(.+?)"' code = oParser.parse(sHtmlContent, sPattern) for i in code[1]: try: if isMatrix(): code = base64.b64decode("ey" + i).decode('ascii') else: code = base64.b64decode("ey" + i) break except: pass api_call = json.loads(code)['url'] if (api_call): return True, api_call + '|' + urlEncode(headers) return False, False
def showGenreMovie(): oGui = cGui() grab = cTMDb() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') result = grab.getUrl(sUrl) total = len(result) if (total > 0): oOutputParameterHandler = cOutputParameterHandler() for i in result['genres']: sId, sTitle = i['id'], i['name'] if not isMatrix(): sTitle = sTitle.encode("utf-8") sUrl = 'genre/' + str(sId) + '/movies' oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addDir(SITE_IDENTIFIER, 'showMovies', str(sTitle), 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory()
def str_conv(self, data): if not isMatrix(): if isinstance(data, str): # Must be encoded in UTF-8 try: data = data.decode('utf8') except AttributeError: pass import unicodedata data = unicodedata.normalize('NFKD', data).encode('ascii', 'ignore') try: data = data.decode( 'string-escape' ) # ATTENTION: provoque des bugs pour les chemins a cause du caractere '/' except: pass else: data = data.encode().decode() return data
def new_getaddrinfo(self, *args): try: import sys import dns.resolver if isMatrix(): path = VSPath( 'special://home/addons/script.module.dnspython/lib/') else: path = VSPath( 'special://home/addons/script.module.dnspython/lib/' ).decode('utf-8') if path not in sys.path: sys.path.append(path) host = args[0] port = args[1] # Keep the domain only: http://example.com/foo/bar => example.com if "//" in host: host = host[host.find("//"):] if "/" in host: host = host[:host.find("/")] resolver = dns.resolver.Resolver(configure=False) # Résolveurs DNS ouverts: https://www.fdn.fr/actions/dns/ resolver.nameservers = [ '80.67.169.12', '2001:910:800::12', '80.67.169.40', '2001:910:800::40' ] answer = resolver.query(host, 'a') host_found = str(answer[0]) VSlog("new_getaddrinfo found host %s" % host_found) # Keep same return schema as socket.getaddrinfo (family, type, proto, canonname, sockaddr) return [(2, 1, 0, '', (host_found, port)), (2, 1, 0, '', (host_found, port))] except Exception as e: VSlog("new_getaddrinfo ERROR: {0}".format(e)) return self.save_getaddrinfo(*args)
def showLists(): oGui = cGui() grab = cTMDb() addons = addon() oInputParameterHandler = cInputParameterHandler() iPage = 1 if (oInputParameterHandler.exist('page')): iPage = oInputParameterHandler.getValue('page') sUrl = oInputParameterHandler.getValue('siteUrl') result = grab.getUrl('list/' + sUrl, iPage, '') total = len(result) if (total > 0): total = len(result['items']) progress_ = progress().VScreate(SITE_NAME) oOutputParameterHandler = cOutputParameterHandler() for i in result['items']: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break # Mise en forme des infos (au format meta imdb) i = grab._format(i, '') sId, sTitle, sType, sThumb, sFanart, sVote, sDesc, sYear = i[ 'tmdb_id'], i['title'], i['media_type'], i['cover_url'], i[ 'backdrop_url'], i['rating'], i['plot'], i['year'] if not isMatrix(): sTitle = sTitle.encode("utf-8") sDisplayTitle = "%s (%s)" % (sTitle, sVote) oOutputParameterHandler.addParameter('siteUrl', 'http://tmdb/%s' % sId) oOutputParameterHandler.addParameter('sMovieTitle', sTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('sId', sId) oOutputParameterHandler.addParameter('sFanart', sFanart) oOutputParameterHandler.addParameter('sTmdbId', sId) if isMatrix(): oOutputParameterHandler.addParameter('searchtext', sTitle) else: oOutputParameterHandler.addParameter('searchtext', cUtil().CleanName(sTitle)) cGui.CONTENT = "movies" oGuiElement = cGuiElement() oGuiElement.setTmdbId(sId) oGuiElement.setSiteName('globalSearch') oGuiElement.setFunction('showSearch') oGuiElement.setTitle(sDisplayTitle) oGuiElement.setFileName(sTitle) if sType == 'movie': oGuiElement.setIcon('films.png') oGuiElement.setMeta(1) oGuiElement.setCat(1) elif sType == 'tv': oGuiElement.setIcon('series.png') oGuiElement.setMeta(2) oGuiElement.setCat(2) oGuiElement.setThumbnail(sThumb) oGuiElement.setPoster(sThumb) oGuiElement.setFanart(sFanart) oGuiElement.setDescription(sDesc) oGuiElement.setYear(sYear) if 'genre' in i: oGuiElement.setGenre(i['genre']) oGui.addFolder(oGuiElement, oOutputParameterHandler) progress_.VSclose(progress_) view = addons.getSetting('visuel-view') oGui.setEndOfDirectory(view)
def __callRequest(self, jsonDecode=False): if self.__enableDNS: import socket self.save_getaddrinfo = socket.getaddrinfo socket.getaddrinfo = self.new_getaddrinfo if self.__aParamatersLine: sParameters = self.__aParamatersLine else: sParameters = self.__aParamaters if (self.__cType == cRequestHandler.REQUEST_TYPE_GET): if (len(sParameters) > 0): if (self.__sUrl.find('?') == -1): self.__sUrl = self.__sUrl + '?' + str(sParameters) sParameters = '' else: self.__sUrl = self.__sUrl + '&' + str(sParameters) sParameters = '' sContent = '' if self.BUG_SSL == True: self.verify = False if self.__cType == cRequestHandler.REQUEST_TYPE_GET: method = "GET" else: method = "POST" oResponse = None try: _request = Request(method, self.__sUrl, headers=self.__aHeaderEntries) if method in ['POST']: _request.data = sParameters if self.__Cookie: _request.cookies = self.__Cookie if self.json: _request.json = self.json prepped = _request.prepare() self.s.headers.update(self.__aHeaderEntries) oResponse = self.s.send(prepped, timeout=self.__timeout, allow_redirects=self.redirects, verify=self.verify) self.__sResponseHeader = oResponse.headers self.__sRealUrl = oResponse.url if jsonDecode == False: sContent = oResponse.content #Necessaire pour Python 3 if isMatrix() and not 'youtube' in oResponse.url: try: sContent = sContent.decode('unicode-escape') except: try: sContent = sContent.decode() except: pass else: sContent = oResponse.json() except ConnectionError as e: # Retry with DNS only if addon is present from Plugins.Extensions.IPTVPlayer.tsiplayer.addons.resources.lib import xbmcvfs if xbmcvfs.exists('special://home/addons/script.module.dnspython/' ) and self.__enableDNS == False: self.__enableDNS = True return self.__callRequest() else: error_msg = addon().VSlang(30470) except RequestException as e: if 'CERTIFICATE_VERIFY_FAILED' in str(e) and self.BUG_SSL == False: self.BUG_SSL = True return self.__callRequest() elif 'getaddrinfo failed' in str(e) and self.__enableDNS == False: # Retry with DNS only if addon is present from Plugins.Extensions.IPTVPlayer.tsiplayer.addons.resources.lib import xbmcvfs if xbmcvfs.exists( 'special://home/addons/script.module.dnspython/'): self.__enableDNS = True return self.__callRequest() else: error_msg = addon().VSlang(30470) else: error_msg = "%s (%s),%s" % (addon().VSlang(30205), e, self.__sUrl) dialog().VSerror(error_msg) sContent = '' if oResponse.status_code in [503, 403]: if not "Forbidden" in sContent: #Default CLOUDPROXY_ENDPOINT = 'http://localhost:8191/v1' try: json_session = post(CLOUDPROXY_ENDPOINT, headers=self.__aHeaderEntries, data=dumps({'cmd': 'sessions.list'})) except: dialog().VSerror("%s" % ( "Page protege par Cloudflare, veuillez executer FlareSolverr." )) #On regarde si une session existe deja. if json_session.json()['sessions']: cloudproxy_session = json_session.json()['sessions'][0] else: json_session = post(CLOUDPROXY_ENDPOINT, headers=self.__aHeaderEntries, data=dumps({'cmd': 'sessions.create'})) response_session = loads(json_session.text) cloudproxy_session = response_session['session'] self.__aHeaderEntries[ 'Content-Type'] = 'application/x-www-form-urlencoded' if ( method == 'post') else 'application/json' #Ont fait une requete. json_response = post(CLOUDPROXY_ENDPOINT, headers=self.__aHeaderEntries, data=dumps({ 'cmd': 'request.%s' % method.lower(), 'url': self.__sUrl, 'session': cloudproxy_session, 'postData': '%s' % urlEncode(sParameters) if (method.lower() == 'post') else '' })) http_code = json_response.status_code response = loads(json_response.text) if 'solution' in response: if self.__sUrl != response['solution']['url']: self.__sRealUrl = response['solution']['url'] sContent = response['solution']['response'] if oResponse and not sContent: #Ignorer ces deux codes erreurs. ignoreStatus = [200, 302] if oResponse.status_code not in ignoreStatus: dialog().VSerror("%s (%d),%s" % (addon().VSlang(30205), oResponse.status_code, self.__sUrl)) if sContent: if (self.__bRemoveNewLines == True): sContent = sContent.replace("\n", "") sContent = sContent.replace("\r\t", "") if (self.__bRemoveBreakLines == True): sContent = sContent.replace(" ", "") if self.__enableDNS: socket.getaddrinfo = self.save_getaddrinfo self.__enableDNS = False return sContent
def showActors(sSearch=''): oGui = cGui() grab = cTMDb() addons = addon() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') iPage = 1 if (oInputParameterHandler.exist('page')): iPage = oInputParameterHandler.getValue('page') if (oInputParameterHandler.exist('sSearch')): sSearch = oInputParameterHandler.getValue('sSearch') if sSearch: # format obligatoire evite de modif le format de l'url dans la lib >> _call # a cause d'un ? pas ou il faut pour ça >> invalid api key result = grab.getUrl(sUrl, iPage, 'query=' + sSearch) else: result = grab.getUrl(sUrl, iPage) total = len(result) if (total > 0): total = len(result['results']) progress_ = progress().VScreate(SITE_NAME) oOutputParameterHandler = cOutputParameterHandler() # récup le nombre de page pour NextPage nbrpage = result['total_pages'] for i in result['results']: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break sName, sThumb = i['name'], i['profile_path'] if sThumb: POSTER_URL = grab.poster sThumb = POSTER_URL + sThumb else: sThumb = '' oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sThumb', sThumb) if not isMatrix(): sName = sName.encode('utf-8') oOutputParameterHandler.addParameter( 'siteUrl', 'person/' + str(i['id']) + '/movie_credits') sTitle = str(sName) oGuiElement = cGuiElement() oGuiElement.setSiteName(SITE_IDENTIFIER) oGuiElement.setFunction('showFilmActor') oGuiElement.setTitle(sTitle) oGuiElement.setFileName(sName) oGuiElement.setIcon('actors.png') oGuiElement.setMeta(0) oGuiElement.setThumbnail(sThumb) oGuiElement.setPoster(sThumb) oGuiElement.setCat(7) oGui.addFolder(oGuiElement, oOutputParameterHandler) progress_.VSclose(progress_) if (int(iPage) < int(nbrpage)): iNextPage = int(iPage) + 1 oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('page', iNextPage) # ajoute param sSearch pour garder le bon format d'url avec grab url if sSearch: oOutputParameterHandler.addParameter('sSearch', sSearch) oGui.addNext(SITE_IDENTIFIER, 'showActors', 'Page ' + str(iNextPage), oOutputParameterHandler) view = addons.getSetting('visuel-view') oGui.setEndOfDirectory(view)
def showSeriesEpisode(): grab = cTMDb() addons = addon() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sFanart = oInputParameterHandler.getValue('sFanart') sTmdbId = oInputParameterHandler.getValue('sTmdbId') sSeason = oInputParameterHandler.getValue('sSeason') # sId = oInputParameterHandler.getValue('sId') if sSeason == False: sSeason = sUrl.split('/')[-1] if sFanart == False: sFanart = '' oGui = cGui() # recherche saison complete oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sMovieTitle) # oOutputParameterHandler.addParameter('type', 'serie') search = '%s S%02d' % (sMovieTitle, int(sSeason)) # oOutputParameterHandler.addParameter('searchtext', search) if not isMatrix(): oOutputParameterHandler.addParameter('searchtext', cUtil().CleanName(search)) else: oOutputParameterHandler.addParameter('searchtext', search) oGuiElement = cGuiElement() oGuiElement.setSiteName('globalSearch') oGuiElement.setFunction('searchMovie') oGuiElement.setTitle(addons.VSlang(30415)) oGuiElement.setCat(2) oGuiElement.setIcon("searchtmdb.png") oGui.addFolder(oGuiElement, oOutputParameterHandler) result = grab.getUrl(sUrl) total = len(result) if (total > 0 and 'episodes' in result): total = len(result['episodes']) progress_ = progress().VScreate(SITE_NAME) oOutputParameterHandler = cOutputParameterHandler() for i in result['episodes']: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break # sId, sTitle, sOtitle, sThumb, sFanart = i['id'], i['name'], i['original_name'], i['poster_path'], i['backdrop_path'] sEpNumber = i['episode_number'] # Mise en forme des infos (au format meta imdb) i = grab._format(i, '') sTitle, sGenre, sThumb, sFanart, sDesc, sYear = i['title'], i[ 'genre'], i['cover_url'], i['backdrop_url'], i['plot'], i[ 'year'] if not isMatrix(): sTitle = sTitle.encode("utf-8") sTitle = 'S%s E%s %s' % (sSeason, str(sEpNumber), sTitle) sExtraTitle = ' S' + "%02d" % int(sSeason) + 'E' + "%02d" % int( sEpNumber) oOutputParameterHandler.addParameter( 'siteUrl', sMovieTitle + '|' + sExtraTitle) # Pour compatibilite Favoris oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('sTmdbId', sTmdbId) oOutputParameterHandler.addParameter('sSeason', sSeason) oOutputParameterHandler.addParameter('sEpisode', sEpNumber) oOutputParameterHandler.addParameter('type', 'serie') if not isMatrix(): oOutputParameterHandler.addParameter( 'searchtext', cUtil().CleanName(sMovieTitle)) else: oOutputParameterHandler.addParameter('searchtext', sMovieTitle) cGui.CONTENT = "tvshows" oGuiElement = cGuiElement() oGuiElement.setTmdbId(sTmdbId) oGuiElement.setSiteName('globalSearch') oGuiElement.setFunction('showSearch') oGuiElement.setTitle(sTitle) oGuiElement.setFileName(sMovieTitle) oGuiElement.setIcon('series.png') oGuiElement.setMeta(2) oGuiElement.setThumbnail(sThumb) oGuiElement.setFanart(sFanart) oGuiElement.setCat(2) oGuiElement.setDescription(sDesc) oGuiElement.setYear(sYear) oGuiElement.setGenre(sGenre) oGui.addFolder(oGuiElement, oOutputParameterHandler) progress_.VSclose(progress_) # tchnagement mode view = addons.getSetting('visuel-view') oGui.setEndOfDirectory(view)
def showSeriesSaison(): oGui = cGui() grab = cTMDb() addons = addon() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sFanart = oInputParameterHandler.getValue('sFanart') sTmdbId = oInputParameterHandler.getValue('sTmdbId') sId = oInputParameterHandler.getValue('sId') if sId == False: sId = sUrl.split('/')[-1] if sFanart == False: sFanart = '' # recherche la serie complete oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sMovieTitle) # oOutputParameterHandler.addParameter('type', 'serie') # oOutputParameterHandler.addParameter('searchtext', sMovieTitle) if not isMatrix(): oOutputParameterHandler.addParameter('searchtext', cUtil().CleanName(sMovieTitle)) else: oOutputParameterHandler.addParameter('searchtext', sMovieTitle) oGuiElement = cGuiElement() oGuiElement.setSiteName('globalSearch') oGuiElement.setFunction('searchMovie') oGuiElement.setTitle(addons.VSlang(30414)) oGuiElement.setCat(2) oGuiElement.setIcon("searchtmdb.png") oGui.addFolder(oGuiElement, oOutputParameterHandler) result = grab.getUrl(sUrl) total = len(result) if (total > 0): total = len(result['seasons']) progress_ = progress().VScreate(SITE_NAME) oOutputParameterHandler = cOutputParameterHandler() for i in result['seasons']: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break sNbreEp, SSeasonNum = i['episode_count'], i['season_number'] # Mise en forme des infos (au format meta imdb) i = grab._format(i, '') sTitle, sGenre, sThumb, sFanart, sDesc, sYear = i['title'], i[ 'genre'], i['cover_url'], i['backdrop_url'], i['plot'], i[ 'year'] sTitle = 'Saison ' + str(SSeasonNum) + ' (' + str(sNbreEp) + ')' sUrl = 'tv/' + str(sId) + '/season/' + str(SSeasonNum) oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('sId', sId) oOutputParameterHandler.addParameter('sSeason', SSeasonNum) oOutputParameterHandler.addParameter('sFanart', sFanart) oOutputParameterHandler.addParameter('sTmdbId', sTmdbId) cGui.CONTENT = "tvshows" oGuiElement = cGuiElement() oGuiElement.setTmdbId(sTmdbId) oGuiElement.setSiteName(SITE_IDENTIFIER) oGuiElement.setFunction('showSeriesEpisode') oGuiElement.setTitle(sTitle) oGuiElement.setFileName(sMovieTitle) oGuiElement.setIcon('series.png') oGuiElement.setMeta(2) oGuiElement.setThumbnail(sThumb) oGuiElement.setPoster(sThumb) oGuiElement.setFanart(sFanart) oGuiElement.setCat(7) oGuiElement.setDescription(sDesc) oGuiElement.setYear(sYear) oGuiElement.setGenre(sGenre) oGui.addFolder(oGuiElement, oOutputParameterHandler) progress_.VSclose(progress_) # changement mode view = addons.getSetting('visuel-view') oGui.setEndOfDirectory(view)
def showSeries(sSearch=''): grab = cTMDb() addons = addon() oInputParameterHandler = cInputParameterHandler() iPage = 1 term = '' if (oInputParameterHandler.exist('page')): iPage = oInputParameterHandler.getValue('page') if (oInputParameterHandler.exist('sSearch')): sSearch = oInputParameterHandler.getValue('sSearch') if sSearch: result = grab.getUrl('search/tv', iPage, 'query=' + sSearch) sUrl = '' else: sUrl = oInputParameterHandler.getValue('siteUrl') if (oInputParameterHandler.exist('genre')): term = 'with_genres=' + oInputParameterHandler.getValue('genre') if (oInputParameterHandler.exist('session_id')): term += 'session_id=' + oInputParameterHandler.getValue( 'session_id') result = grab.getUrl(sUrl, iPage, term) oGui = cGui() try: total = len(result) if (total > 0): total = len(result['results']) progress_ = progress().VScreate(SITE_NAME) for i in result['results']: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break # Mise en forme des infos (au format meta imdb) i = grab._format(i, '') sId, sTitle, sGenre, sThumb, sFanart, sDesc, sYear = i[ 'tmdb_id'], i['title'], i['genre'], i['cover_url'], i[ 'backdrop_url'], i['plot'], i['year'] if not isMatrix(): sTitle = sTitle.encode("utf-8") sSiteUrl = 'tv/' + str(sId) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sSiteUrl) oOutputParameterHandler.addParameter('sMovieTitle', sTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('sId', sId) oOutputParameterHandler.addParameter('sFanart', sFanart) oOutputParameterHandler.addParameter('sTmdbId', sId) if isMatrix(): oOutputParameterHandler.addParameter('searchtext', sTitle) else: oOutputParameterHandler.addParameter( 'searchtext', cUtil().CleanName(sTitle)) cGui.CONTENT = "tvshows" oGuiElement = cGuiElement() oGuiElement.setTmdbId(sId) oGuiElement.setSiteName( SITE_IDENTIFIER) # a activer pour saisons oGuiElement.setFunction('showSeriesSaison') oGuiElement.setTitle(sTitle) oGuiElement.setFileName(sTitle) oGuiElement.setIcon('series.png') oGuiElement.setMeta(2) oGuiElement.setThumbnail(sThumb) oGuiElement.setPoster(sThumb) oGuiElement.setFanart(sFanart) oGuiElement.setCat(2) oGuiElement.setDescription(sDesc) oGuiElement.setYear(sYear) oGuiElement.setGenre(sGenre) oGui.addFolder(oGuiElement, oOutputParameterHandler) progress_.VSclose(progress_) if (int(iPage) > 0): iNextPage = int(iPage) + 1 oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('page', iNextPage) if sSearch: oOutputParameterHandler.addParameter('sSearch', sSearch) if (oInputParameterHandler.exist('genre')): oOutputParameterHandler.addParameter( 'genre', oInputParameterHandler.getValue('genre')) oGui.addNext(SITE_IDENTIFIER, 'showSeries', 'Page ' + str(iNextPage), oOutputParameterHandler) except TypeError: oGui.addText(SITE_IDENTIFIER, '[COLOR red]Aucun résultat n\'a été trouvé.[/COLOR]') # changement mode view = addons.getSetting('visuel-view') oGui.setEndOfDirectory(view)