astrXbian/.install/.kodi/addons/plugin.video.vstream/resources/sites/tirexo.py

1400 lines
59 KiB
Python

# -*- coding: utf-8 -*-
# vStream https://github.com/Kodi-vStream/venom-xbmc-addons
from resources.lib.gui.hoster import cHosterGui
from resources.lib.gui.gui import cGui
from resources.lib.handler.inputParameterHandler import cInputParameterHandler
from resources.lib.handler.outputParameterHandler import cOutputParameterHandler
from resources.lib.handler.requestHandler import cRequestHandler
from resources.lib.parser import cParser
from resources.lib.comaddon import progress, dialog, VSlog
from resources.lib.config import GestionCookie
import time
import xbmc
import xbmcvfs
import xbmcplugin
import re, random, requests
# from test.test_socket import try_address
UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
SITE_IDENTIFIER = 'tirexo'
SITE_NAME = '[COLOR violet]Tirexo[/COLOR]'
SITE_DESC = 'Films/Séries/Reportages/Concerts'
# URL_HOST = 'https://www2.tirexo.lol/'
# def getURL():
# oParser = cParser()
# oRequestHandler = cRequestHandler(URL_HOST)
# oRequestHandler.addHeaderEntry('User-Agent', UA)
# sHtmlContent = oRequestHandler.request()
# sPattern = '<a class="full-wrap clearfix btn btn-danger" href="([^"]+)">Acc&eacute;der au site</a></div>'
# aResult = oParser.parse(sHtmlContent, sPattern)
# if aResult[0]:
# return aResult[1][0]
#def GetURL_MAIN():
#ADDON = addon()
#oInputParameterHandler = cInputParameterHandler()
#sUrl = oInputParameterHandler.getValue('siteUrl')
#Sources = oInputParameterHandler.getValue('function')
# z = oInputParameterHandler.getAllParameter()
# VSlog(z)
# quand vstream load tous les sites on passe >> globalSources
# quand vstream load a partir du menu home on passe >> callplugin
# quand vstream fabrique une liste de plugin pour menu(load site globalRun and call function search) >> search
# quand l'url ne contient pas celle déjà enregistrer dans settings et que c'est pas dlprotect on active.
#if not (Sources == 'callpluging' or Sources == 'globalSources' or Sources == 'search') and not ADDON.getSetting('Tirexo')[6:] in sUrl and not 'dl-protect.' in sUrl and not 'zt-protect.' in sUrl:
#MemorisedHost = getURL()
#if MemorisedHost is not None and MemorisedHost != '' :
#if not 'cf_chl_jschl_tk' in MemorisedHost:
#ADDON.setSetting('Tirexo', MemorisedHost)
#VSlog("Tirexo url >> " + str(MemorisedHost) + ' sauvegarder >> ' + ADDON.getSetting('Tirexo'))
#else:
#ADDON.setSetting('Tirexo', URL_HOST)
#VSlog("Url non changer car égal à None le site peux être surcharger utilisation de >> ADDON.getSetting('Tirexo')")
#return ADDON.getSetting('Tirexo')
#else:
# si pas de zt dans settings on récup l'url une fois dans le site
#if not ADDON.getSetting('Tirexo') and not (Sources == 'callpluging' or Sources == 'globalSources' or Sources == 'search'):
#MemorisedHost = getURL()
#if MemorisedHost is not None and MemorisedHost != '':
#if not 'cf_chl_jschl_tk' in MemorisedHost:
#ADDON.setSetting('Tirexo', MemorisedHost)
#VSlog("Tirexo url vide >> " + str(MemorisedHost) + ' sauvegarder >> ' + ADDON.getSetting('Tirexo'))
#else:
#ADDON.setSetting('Tirexo', URL_HOST)
#VSlog("Url non changer car égal à None le site peux être surcharger utilisation de >> ADDON.getSetting('Tirexo')")
#return ADDON.getSetting('Tirexo')
#else:
#VSlog("Tirexo pas besoin d'url")
#return ADDON.getSetting('Tirexo')
# Teste pour le moment avec une url fixe.
URL_MAIN = "https://www2.tirexo.lol/"
# URL_MAIN = "https://www.tirexo......./" # Les regex sont différentes mais il n'y a pas cloudflare
URL_SEARCH_MOVIES = (URL_MAIN + 'index.php?do=search&subaction=search&search_start=0&full_search=1&result_from=1&story=', 'showMovies')
URL_SEARCH_SERIES = (URL_MAIN + 'index.php?do=search&subaction=search&catlist=15&story=', 'showMovies')
URL_SEARCH_ANIMS = (URL_MAIN + 'index.php?do=search&subaction=search&catlist=32&story=', 'showMovies')
URL_SEARCH_MISC = (URL_MAIN + 'index.php?do=search&subaction=search&catlist=39&story=', 'showMovies')
MOVIE_MOVIE = (True, 'showMenuMovies')
MOVIE_COLLECTION = (URL_MAIN + 'collections/', 'showMovies')
MOVIE_EXCLUS = (URL_MAIN + 'exclus/', 'showMovies')
MOVIE_3D = (URL_MAIN + 'films-bluray-3d/', 'showMovies')
MOVIE_SD = (URL_MAIN + 'films-bluray-hd/', 'showMovies')
MOVIE_MKV = (URL_MAIN + 'films-mkv/', 'showMovies')
MOVIE_HD = (URL_MAIN + 'films-bluray-hd-1080/', 'showMovies')
MOVIE_BDRIP = (URL_MAIN + 'films-dvdrip-bdrip/', 'showMovies')
MOVIE_SDLIGHT = (URL_MAIN + 'hdlight-720/', 'showMovies')
MOVIE_HDLIGHT = (URL_MAIN + 'hdlight-1080/', 'showMovies')
MOVIE_4KL = (URL_MAIN + 'film-ultra-hdlight-x265/', 'showMovies')
MOVIE_4K = (URL_MAIN + 'film-ultra-hd-x265/', 'showMovies')
MOVIE_NEWS = (URL_MAIN + 'films-gratuit/', 'showMovies')
MOVIE_2010 = (URL_MAIN + 'films-2010-2019/', 'showMovies')
MOVIE_2000 = (URL_MAIN + 'films-2000-2009/', 'showMovies')
MOVIE_1990 = (URL_MAIN + 'films-1990-1999/', 'showMovies')
MOVIE_1980 = (URL_MAIN + 'films-1980-1989/', 'showMovies')
MOVIE_1970 = (URL_MAIN + 'films-1970-1979/', 'showMovies')
MOVIE_1960 = (URL_MAIN + 'films-1960-1969/', 'showMovies')
MOVIE_1950 = (URL_MAIN + 'films-1950-1959/', 'showMovies')
MOVIE_1900 = (URL_MAIN + 'films-1900-1950/', 'showMovies')
MOVIE_GENRES = ('films-gratuit/', 'showGenre')
SERIE_GENRES = ('telecharger-series/', 'showGenre')
SERIE_SERIES = (True, 'showMenuSeries')
SERIE_VFS = (URL_MAIN + 'series-vf/', 'showMovies')
SERIE_VF_720 = (URL_MAIN + 'series-vf-en-hd/','showMovies')
SERIE_VF_1080 = (URL_MAIN + 'series-vf-1080p/','showMovies')
SERIE_VOSTFRS = (URL_MAIN + 'series-vostfr/', 'showMovies')
SERIE_VOSTFRS_720 = (URL_MAIN + 'series-vostfr-hd/','showMovies')
SERIE_VOSTFRS_1080 = (URL_MAIN + 'series-vostfr-1080p/','showMovies')
SERIE_VO = (URL_MAIN + 'series-vo/', 'showMovies')
SERIE_NEWS = (URL_MAIN + 'telecharger-series/', 'showMovies')
ANIM_ANIMS = (True, 'showMenuMangas')
ANIM_VFS = (URL_MAIN + 'animes-vf/', 'showMovies')
ANIM_VF_720 = (URL_MAIN + 'animes-vf-720p/', 'showMovies')
ANIM_VF_1080 = (URL_MAIN + 'animes-vf-1080p/', 'showMovies')
ANIM_VOSTFRS = (URL_MAIN + 'animes-vostfr/', 'showMovies')
ANIM_VOSTFRS_720 = (URL_MAIN + 'animes-vostfr-720p/', 'showMovies')
ANIM_VOSTFRS_1080 = (URL_MAIN + 'animes-vostfr-1080p/', 'showMovies')
FILM_ANIM = (URL_MAIN + 'films-animes/', 'showMovies')
ANIM_NEWS = (URL_MAIN + 'animes/', 'showMovies')
DOC_NEWS = (URL_MAIN + 'emissions-tv-documentaires/souscate_doc-Documentaire/', 'showMovies')
SPORT_SPORTS = (URL_MAIN + 'emissions-tv-documentaires/souscate_doc-Sport/', 'showMovies')
TV_NEWS = (URL_MAIN + 'emissions-tv-documentaires/souscate_doc-Émissions+TV/', 'showMovies')
SPECT_NEWS = (URL_MAIN + 'emissions-tv-documentaires/souscate_doc-Spectacle/', 'showMovies')
CONCERT_NEWS = (URL_MAIN + 'musiques-mp3-gratuite/souscat_music-Concerts/', 'showMovies')
# bypass cloudflare avec Selenium
def redi(url): # Pour la redirection avec /link
if url:
try: # On passe par la méthode request quand cloudflare n'est pas présent
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0',
'Content-Type': 'text/html; charset=UTF-8',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-encoding': 'gzip, deflate, br',
'Accept-language': 'fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7,nl;q=0.6,it;q=0.5,es;q=0.4,de;q=0.3'}
r = requests.get(url, allow_redirects=False, headers=headers)
r.status_code
r.url
result = r.headers['location']
return result
except:
pass
try:
from selenium import webdriver
from selenium.webdriver.common.driver_utils import get_driver_path
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
# from selenium.webdriver.firefox.options import Options
# from selenium.webdriver import Firefox
# from selenium.webdriver.common.by import By
# from selenium.webdriver.support import expected_conditions as EC
VSlog("Chargement Selenium ok")
except:
pass
driverPath = get_driver_path('chromedriver')
options = Options()
options.headless = True
browser = webdriver.Chrome(driverPath, options=options)
browser.get(url)
# On attends la redirection
wait = WebDriverWait(browser, 10)
wait.until(lambda driver: browser.current_url != url)
current_url = browser.current_url
browser.close()
print(current_url)
return current_url
def resolvenocloudflare(url, cookie): # Méthode classique
oRequestHandler = cRequestHandler(url)
oRequestHandler.addHeaderEntry('User-Agent', UA)
if cookie:
oRequestHandler.addHeaderEntry('Cookie', cookie)
# oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
sHtmlContent = oRequestHandler.request()
return sHtmlContent
def cloudflare(url): # Bypass cloudflare avec selenium
if url: # On passe par la méthode classique en cas ou cloudflare n'est pas présent
try:
c = GestionCookie().Readcookie('tirexo_com') # On lie le cookie enregistré
sHtmlContent = resolvenocloudflare(url, c) # On passe par la fonction resolvenocloudflare avec l'url et le cookie
VSlog("cookies encore valables") # Un log en cas que le cookie est valide
return sHtmlContent # On renvoie le contenu html de l'url qui a été validé
except: # En cas d'exception /ou erreur
pass # On ignore et on passe le code précédent si le cookie n'est plus valide
try:
from selenium import webdriver
from selenium.webdriver.common.driver_utils import get_driver_path
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import DesiredCapabilities
# from selenium.webdriver.firefox.options import Options
# from selenium.webdriver import Firefox
# from selenium.webdriver.common.by import By
# from selenium.webdriver.support import expected_conditions as EC
VSlog("Chargement Selenium ok")
except:
pass
CloudflarePassed = False
if True:
driverPath = get_driver_path('chromedriver')
options = Options()
# options.add_argument("headless")
# options.add_argument("window-size=1920,1080")
options.add_argument("'user-agent={}".format(UA))
# options.add_argument("disable-gpu")
capabilities = DesiredCapabilities.CHROME.copy()
capabilities['acceptSslCerts'] = True
capabilities['acceptInsecureCerts'] = True
browser = webdriver.Chrome(driverPath, options=options, desired_capabilities=capabilities)
else:
path = r"C:\Users\XXXX\AppData\Roaming\Kodi\addons\script.module.selenium\bin\geckodriver\win32\geckodriver\geckodriver.exe"
# path sert pour firefox
browser = webdriver.Firefox(executable_path=path, options=options, log_path="")
browser.get(url)
# On boucle si Cloudflare n'est pas résolu.
# On loop que 3 fois maxi.
loop = 0
while (CloudflarePassed == False):
if loop > 3:
break
# On se sert du cookie pour voir si Cloudflare est résolu
Cookies = browser.get_cookies()
if "cf_clearance" in str(Cookies):
break
# Si pas de protection CF
if 'Checking your browser before accessing' not in browser.page_source:
break
# On récupere le timeout de maniere dynamique
try:
time.sleep(float(
re.search(
r'submit\(\);\r?\n\s*},\s*([0-9]+)',
browser.page_source
).group(1)
) / float(1000) + 1)
except:
# Sauf sur la nouvelle version où il n'est pas présent
time.sleep(6)
VSlog("loop : " + str(loop))
loop = loop + 1
VSlog("""Cloudflare Passed, Cookie : """ + str({cookie['name']:cookie['value'] for cookie in browser.get_cookies()})
+ """\n User Agent : """ + browser.execute_script("return navigator.userAgent"))
# Sauvegarde des cookies
c = ""
for cookie in browser.get_cookies():
c = c + cookie['name'] + '=' + cookie['value'] + ';'
c = str(c[:-1])
GestionCookie().SaveCookie('tirexo_com', c)
page_source = (browser.page_source).encode('utf-8', errors='replace')
browser.close()
return page_source
def showInstall():
xbmc.executebuiltin('InstallAddon(script.module.selenium)')
def load():
oGui = cGui()
#oOutputParameterHandler = cOutputParameterHandler()
#oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
#oGui.addDir(SITE_IDENTIFIER, 'showDetail', '[COLOR red]Explication pour le site[/COLOR]', 'films.png', oOutputParameterHandler)
#
# oOutputParameterHandler = cOutputParameterHandler()
# oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
# oGui.addDir(SITE_IDENTIFIER, 'showInstall', '[COLOR blue]Cliquer ici pour installer selenium[/COLOR]', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
oGui.addDir(SITE_IDENTIFIER, 'showMenuMovies', 'Films', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
oGui.addDir(SITE_IDENTIFIER, 'showMenuSeries', 'Séries', 'series.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
oGui.addDir(SITE_IDENTIFIER, 'showMenuMangas', 'Animés', 'animes.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
oGui.addDir(SITE_IDENTIFIER, 'showMenuAutres', 'Autres', 'tv.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def showMenuMovies():
oGui = cGui()
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH_MOVIES[0])
oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Rechercher films', 'search.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_NEWS[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_NEWS[1], 'Derniers ajouts', 'news.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_COLLECTION[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_COLLECTION[1], 'Les collections', 'news.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_EXCLUS[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_EXCLUS[1], 'Exclus (Films populaires)', 'news.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_GENRES[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_GENRES[1], 'Films (Genres)', 'genres.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_SD[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_SD[1], 'Films (720p)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_HD[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_HD[1], 'Films (1080p)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_BDRIP[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_BDRIP[1], 'Films (BDRIP)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_4K[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_4K[1], 'Films (4K)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_MKV[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_MKV[1], 'Films (dvdrip mkv)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_SDLIGHT[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_SDLIGHT[1], 'Films (720p - Light)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_HDLIGHT[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_HDLIGHT[1], 'Films (1080p - Light)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_4KL[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_4KL[1], 'Films (4K - light)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_3D[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_3D[1], 'Films (3D)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_2010[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_2010[1], 'Films (2010)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_2000[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_2000[1], 'Films (2000)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_1990[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_1990[1], 'Films (1990)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_1980[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_1980[1], 'Films (1980)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_1970[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_1970[1], 'Films (1970)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_1960[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_1960[1], 'Films (1960)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_1950[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_1950[1], 'Films (1950)', 'films.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_1900[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_1900[1], 'Films (1900)', 'films.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def showMenuSeries():
oGui = cGui()
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH_SERIES[0])
oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Rechercher séries', 'search.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SERIE_NEWS[0])
oGui.addDir(SITE_IDENTIFIER, SERIE_NEWS[1], 'Derniers ajouts', 'news.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SERIE_GENRES[0])
oGui.addDir(SITE_IDENTIFIER, SERIE_GENRES[1], 'Séries (Genres)', 'genres.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SERIE_VFS[0])
oGui.addDir(SITE_IDENTIFIER, SERIE_VFS[1], 'Séries (VF)', 'series.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SERIE_VF_720[0])
oGui.addDir(SITE_IDENTIFIER, SERIE_VFS[1], 'Séries 720p (VF)', 'series.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SERIE_VF_1080[0])
oGui.addDir(SITE_IDENTIFIER, SERIE_VFS[1], 'Séries 1080p (VF)', 'series.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SERIE_VOSTFRS[0])
oGui.addDir(SITE_IDENTIFIER, SERIE_VOSTFRS[1], 'Séries (VOSTFR)', 'series.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SERIE_VOSTFRS_720[0])
oGui.addDir(SITE_IDENTIFIER, SERIE_VOSTFRS_720[1], 'Séries 720p (VOSTFR)', 'series.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SERIE_VOSTFRS_1080[0])
oGui.addDir(SITE_IDENTIFIER, SERIE_VOSTFRS_1080[1], 'Séries 1080p (VOSTFR)', 'series.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SERIE_VO[0])
oGui.addDir(SITE_IDENTIFIER, SERIE_VO[1], 'Séries (VO)', 'series.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def showMenuMangas():
oGui = cGui()
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH_ANIMS[0])
oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Rechercher Animes', 'search.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', ANIM_NEWS[0])
oGui.addDir(SITE_IDENTIFIER, ANIM_NEWS[1], 'Derniers ajouts', 'news.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', ANIM_VFS[0])
oGui.addDir(SITE_IDENTIFIER, ANIM_VFS[1], 'Animes (VF)', 'animes.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', ANIM_VF_720[0])
oGui.addDir(SITE_IDENTIFIER, ANIM_VF_720[1], 'Animes 720p (VF)', 'animes.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', ANIM_VF_1080[0])
oGui.addDir(SITE_IDENTIFIER, ANIM_VF_1080[1], 'Animes 1080p (VF)', 'animes.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', ANIM_VOSTFRS[0])
oGui.addDir(SITE_IDENTIFIER, ANIM_VOSTFRS[1], 'Animes (VOSTFR)', 'animes.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', ANIM_VOSTFRS_720[0])
oGui.addDir(SITE_IDENTIFIER, ANIM_VOSTFRS_720[1], 'Animes 720p (VOSTFR)', 'animes.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', ANIM_VOSTFRS_1080[0])
oGui.addDir(SITE_IDENTIFIER, ANIM_VOSTFRS_1080[1], 'Animes 1080p (VOSTFR)', 'animes.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', FILM_ANIM[0])
oGui.addDir(SITE_IDENTIFIER, FILM_ANIM[1], 'Films d\'animes ', 'animes.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def showMenuAutres():
oGui = cGui()
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH_MISC[0])
oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Rechercher autres', 'search.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', DOC_NEWS[0])
oGui.addDir(SITE_IDENTIFIER, DOC_NEWS[1], 'Documentaires', 'doc.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SPORT_SPORTS[0])
oGui.addDir(SITE_IDENTIFIER, SPORT_SPORTS[1], 'Sports', 'sport.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SPECT_NEWS[0])
oGui.addDir(SITE_IDENTIFIER, SPECT_NEWS[1], 'Spectacles', 'star.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', CONCERT_NEWS[0])
oGui.addDir(SITE_IDENTIFIER, CONCERT_NEWS[1], 'Concerts', 'music.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', TV_NEWS[0])
oGui.addDir(SITE_IDENTIFIER, TV_NEWS[1], 'Emissions TV', 'tv.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def showDetail():
dialog().VStextView(desc="""Explication pour le changement:
Nous avons remarqué que ces derniers temps nous avons beaucoup de problèmes avec cloudflare.
C'est pourquoi nous avons changé de méthode pour passer la protection.
Nous utiliserons votre navigateur afin de récupérer le bon contenu du site et non cloudflare
En aucun cas nous n'utiliseront vos données confidentielles.
- Pour avoir plus d'information rendez vous sur notre github officiel:
https://github.com/Kodi-vStream/venom-xbmc-addons.
- Pour l'installation et le fonctionnement de Selenium:
https://github.com/Kodi-vStream/venom-xbmc-addons/issues/2948.
Le fonctionnement:
Une fenêtre va s'ouvrir pour ouvrir un serveur local(et aussi le navigateur de temps en temps) et récupérer le contenu du site.
Veuillez ne pas le(s) fermer(s) il(s) se fermera(ont) automatiquement.
Pour le navigateur nous passons par Google Chrome car c'est le plus simple à configurer malheureusement.
Si vous n'avez pas Google Chrome alors ça ne fonctionnera pas donc je vous conseille de l'installer à jour important !!!
Veuillez noter que nous réfléchissons à une solution pour utiliser les autres navigateurs
PS:
Si Jamais de temps en temps ça ne passe pas retentez une deuxième fois.
Veuillez noter aussi qu'il vous faut un ordinateur Windows ou linux (Mac est incompatible pour l'instant).
Pour les appareils de types Android, Ios, Libreelec, Xbox et autres ne sont pas compatible avec Selenium et c'est impossible de résoudre ce problème désolé
Merci d'avoir lu notre explication
Vive vStream !!!!""", title="Fonctionnement du site")
def showSearch():
oGui = cGui()
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl')
sSearchText = oGui.showKeyBoard()
if (sSearchText != False):
sUrl = sUrl + sSearchText # + '&search_start=0'
showMovies(sUrl)
oGui.setEndOfDirectory()
return
def showGenre():
oGui = cGui()
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl')
URL_MOVIES = URL_MAIN + sUrl + 'genre-'
listeGenres = ['Action', 'Animation', 'Arts Martiaux', 'Aventure', 'Biopic', 'Bollywood', 'Comédie Dramatique',
'Comédie Musicale', 'Comédie', 'Documentaire', 'Drame', 'Epouvante-horreur', 'Espionnage',
'Famille', 'Fantastique', 'Guerre', 'Historique', 'Horreur', 'Musical', 'Péplum',
'Policier', 'Romance', 'Science Fiction', 'Thriller', 'Western']
for genre in listeGenres:
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', URL_MOVIES + genre.replace(' ', '%20') + '/')
oGui.addDir(SITE_IDENTIFIER, 'showMovies', genre, 'genres.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def showMovies(sSearch=''):
oGui = cGui()
oParser = cParser()
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl')
if sSearch:
sUrl = sSearch
if sSearch or "index" in sUrl: # en mode recherche
sPattern = 'class="mov-t nowrap" href="(https://www.tirexo.pro/films.+?|https://www.tirexo.pro/telecharger-series.+?|https://www.tirexo.pro/animes.+?|https://www.tirexo.pro/emissions-tv-documentaires.+?)" title="([^"]+)".+?data-content="([^"]+)".+?<img src="\/([^"]+)".+?<div style="height: 51px" class="mov-c nowrap">'
elif 'collections/' in sUrl:
sPattern = 'class="mov-t nowrap" href=".+?".+?<img src="\/([^"]+)" width="200px" height="320px" title="([^"]+)".+?data-link="([^"]+)"'
else:
sPattern = 'class="mov-t nowrap" href="([^"]+)"> <.+?data-content="([^"]+)".+?img src="([^"]+)".+?title="([^"]+)"'
oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
sHtmlContent = oRequestHandler.request()
aResult = oParser.parse(sHtmlContent, sPattern)
# VSlog(aResult)
titles = set()
if (aResult[0] == True):
total = len(aResult[1])
progress_ = progress().VScreate(SITE_NAME)
for aEntry in aResult[1]:
progress_.VSupdate(progress_, total)
if progress_.iscanceled():
break
if 'collections/' in sUrl:
sThumb = aEntry[0]
sTitle = aEntry[1]
sUrl2 = aEntry[2]
sDesc = ""
elif sSearch or "index" in sUrl:
sUrl2 = aEntry[0]
sTitle = aEntry[1]
sDesc = aEntry[2]
sThumb = URL_MAIN + aEntry[3]
else:
sUrl2 = aEntry[0]
sDesc = aEntry[1]
sThumb = URL_MAIN + aEntry[2]
sTitle = aEntry[3]
# Enlever les films en doublons (même titre)
# il s'agit du même film dans une autre qualité qu'on retrouvera au moment du choix de la qualité
key = sTitle
if key in titles:
continue
titles.add(key)
# sDesc = re.sub('<[^<]+?>', '', sDesc)
sDisplayTitle = sTitle
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
if 'series' in sUrl2 or 'animes' in sUrl2:
oGui.addTV(SITE_IDENTIFIER, 'showSeriesLinks', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
elif 'collections/' in sUrl:
oGui.addMoviePack(SITE_IDENTIFIER, 'showCollec', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
else:
oGui.addMovie(SITE_IDENTIFIER, 'showMoviesLinks', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
progress_.VSclose(progress_)
if 'index' in sUrl:
sPattern = '<a name="nextlink".+?javascript:list_submit\((.+?)\)'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == True):
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', re.sub('search_start=(\d+)', 'search_start=' + str(aResult[1][0]), sUrl))
number = re.search('([0-9]+)', aResult[1][0]).group(1)
oGui.addNext(SITE_IDENTIFIER, 'showMovies', '[COLOR teal]Page ' + number + ' >>>[/COLOR]', oOutputParameterHandler)
else:
sNextPage = __checkForNextPage(sHtmlContent)
if (sNextPage != False):
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sNextPage)
number = re.search('/page/([0-9]+)', sNextPage).group(1)
oGui.addNext(SITE_IDENTIFIER, 'showMovies', '[COLOR teal]Page ' + number + ' >>>[/COLOR]', oOutputParameterHandler)
if not sSearch:
oGui.setEndOfDirectory()
def __checkForNextPage(sHtmlContent):
oParser = cParser()
sPattern = 'href="([^"]+)"><span class="fa fa-arrow-right">'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == True):
nextPage = aResult[1][0]
if not nextPage.startswith('https'):
nextPage = URL_MAIN[:-1] + nextPage
return nextPage
return False
def showCollec():
oGui = cGui()
oParser = cParser()
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl')
sPattern = 'class="mov-t nowrap" href="([^"]+)">.+?data-content="([^"]+)".+?<img src="\/([^"]+)".+?title="([^"]+)"'
oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
sHtmlContent = oRequestHandler.request()
aResult = oParser.parse(sHtmlContent, sPattern)
titles = set()
if (aResult[0] == True):
total = len(aResult[1])
progress_ = progress().VScreate(SITE_NAME)
for aEntry in aResult[1]:
progress_.VSupdate(progress_, total)
if progress_.iscanceled():
break
sUrl2 = aEntry[0]
sDesc = aEntry[1]
sThumb = aEntry[2]
sTitle = aEntry[3]
# Enlever les films en doublons (même titre)
# il s'agit du même film dans une autre qualité qu'on retrouvera au moment du choix de la qualité
key = sTitle
if key in titles:
continue
titles.add(key)
sDesc = re.sub('<[^<]+?>', '', sDesc)
sDisplayTitle = sTitle
if not sThumb.startswith('http'):
sThumb = URL_MAIN[:-1] + sThumb
if not sUrl2.startswith('http'):
sUrl2 = URL_MAIN[:-1] + sUrl2
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oGui.addMovie(SITE_IDENTIFIER, 'showMoviesLinks', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
progress_.VSclose(progress_)
oGui.setEndOfDirectory()
def showMoviesLinks():
oGui = cGui()
oParser = cParser()
oInputParameterHandler = cInputParameterHandler()
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
sUrl = oInputParameterHandler.getValue('siteUrl')
sThumb = oInputParameterHandler.getValue('sThumb')
sDesc = oInputParameterHandler.getValue('sDesc')
oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
sHtmlContent = oRequestHandler.request()
# Affichage du texte
oGui.addText(SITE_IDENTIFIER, '[COLOR olive]Qualités disponibles pour ce film:[/COLOR]')
# récupération du Synopsis
sPattern = '<span data-slice="200" itemprop="description">(.+?)</span>'
aResult = oParser.parse(sHtmlContent, sPattern)
if aResult[0]:
sDesc = aResult[1][0]
sDesc = sDesc.replace('<span>', '').replace('</span>', '')
sDesc = sDesc.replace('<b>', '').replace('</b>', '')
sDesc = sDesc.replace('<i>', '').replace('</i>', '')
sDesc = sDesc.replace('<br>', '').replace('<br />', '')
# on recherche d'abord la qualité courante
sPattern = 'couleur-qualitesz"> *Qualité (.+?) <.+?"couleur-languesz">(.+?)</span>'
aResult = oParser.parse(sHtmlContent, sPattern)
sTitle = sMovieTitle
sQual = ''
if (aResult[0]):
sQual = aResult[1][0][0]
sLang = aResult[1][0][1]
sTitle = ('%s [%s] (%s)') % (sMovieTitle, sQual, sLang)
# On ajoute le lien même si on n'a pas réussi à déterminer la qualité
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oGui.addLink(SITE_IDENTIFIER, 'showHosters', sTitle, sThumb, sDesc, oOutputParameterHandler)
# on regarde si dispo dans d'autres qualités
sPattern = '<a href="([^"]+)"><span class="otherquality">.+?<b>([^<>]+)</b>.+?<b>([^<>]+)</b>'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == True):
for aEntry in aResult[1]:
sUrl2 = aEntry[0]
sQual = aEntry[1]
sLang = aEntry[2]
sTitle = ('%s [%s] %s') % (sMovieTitle, sQual, sLang)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oGui.addLink(SITE_IDENTIFIER, 'showHosters', sTitle, sThumb, sDesc, oOutputParameterHandler)
# Qualité STREAMING
sPattern = '<a rel=\'nofollow\' class=\'streaming\' href="([^"]+?)"'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == True):
sUrl2 = URL_MAIN + aResult[1][0]
sTitle = ('%s [STREAMING]') % (sMovieTitle)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oGui.addLink(SITE_IDENTIFIER, 'showHostersLink', sTitle, sThumb, sDesc, oOutputParameterHandler)
oGui.setEndOfDirectory()
def showSeriesLinks():
oGui = cGui()
oParser = cParser()
oInputParameterHandler = cInputParameterHandler()
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
sUrl = oInputParameterHandler.getValue('siteUrl')
sThumb = oInputParameterHandler.getValue('sThumb')
sDesc = oInputParameterHandler.getValue('sDesc')
oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
sHtmlContent = oRequestHandler.request()
# Affichage du texte
oGui.addText(SITE_IDENTIFIER, '[COLOR olive]Qualités disponibles pour cette saison :[/COLOR]')
# récupération du Synopsis
try:
sPattern = '<span data-slice="200" itemprop="description">(.+?)</span>'
aResult = oParser.parse(sHtmlContent, sPattern)
if aResult[0]:
sDesc = aResult[1][0]
sDesc = sDesc.replace('<span>', '').replace('</span>', '')
sDesc = sDesc.replace('<b>', '').replace('</b>', '')
sDesc = sDesc.replace('<i>', '').replace('</i>', '')
sDesc = sDesc.replace('<br>', '').replace('<br />', '')
except:
pass
# Mise à jour du titre
sPattern = '<h2>T.+?charger <b itemprop="name">(.+?)</b>.+?>(.+?)</span>'
aResult = oParser.parse(sHtmlContent, sPattern)
sTitle = sMovieTitle
if (aResult[0]):
sTitle = aResult[1][0][0] + " " + aResult[1][0][1]
numSaison = str(aResult[1][0][1]).lower().replace("saison", "").strip()
saisons = []
saisons.append(numSaison)
# on recherche d'abord la qualité courante
sPattern = 'couleur-qualitesz">Qualit.+? (.+?) <.+?couleur-languesz">(.+?)</span><br>.+?"couleur-seriesz">(.+?)\['
aResult = oParser.parse(sHtmlContent, sPattern)
sDisplayTitle = sTitle
sQual = ''
if (aResult[0]):
sQual = aResult[1][0][0]
sLang = aResult[1][0][1]
sDisplayTitle = ('%s [%s] (%s)') % (sTitle, sQual, sLang)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oGui.addEpisode(SITE_IDENTIFIER, 'showSeriesHosters', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
# on regarde si dispo dans d'autres qualités
sHtmlContent1 = CutQual(sHtmlContent)
sPattern1 = '<a href="([^"]+)"><span class="otherquality">.+?<b>([^"]+)</b>.+?<b>([^"]+)</b>.+?<b> (.+?)<'
aResult1 = oParser.parse(sHtmlContent1, sPattern1)
otherSaison = False
if (aResult1[0] == True):
for aEntry in aResult1[1]:
# Si saison différente
sSaison = aEntry[1].strip()
if numSaison != sSaison:
otherSaison = True
continue
sQual = aEntry[2]
sLang = aEntry[3]
sDisplayTitle = ('%s [%s] %s') % (sTitle, sQual, sLang)
sUrl = aEntry[0]
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oGui.addEpisode(SITE_IDENTIFIER, 'showSeriesHosters', sDisplayTitle, 'series.png', sThumb, sDesc, oOutputParameterHandler)
# on regarde si dispo d'autres saisons
if (otherSaison):
# Affichage du titre
oGui.addText(SITE_IDENTIFIER, '[COLOR olive]Autres saisons disponibles pour cette série :[/COLOR]')
# Une ligne par saison, pas besoin d'afficher les qualités ici
for aEntry in aResult1[1]:
sSaison = aEntry[1].strip()
if sSaison in saisons:
continue
saisons.append(sSaison)
sSaison = 'Saison ' + sSaison
sDisplayTitle = ('%s %s') % (sMovieTitle, sSaison)
sUrl = aEntry[0]
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oGui.addEpisode(SITE_IDENTIFIER, 'showSeriesLinks', sDisplayTitle, 'series.png', sThumb, sDesc, oOutputParameterHandler)
oGui.setEndOfDirectory()
def showHosters():
oGui = cGui()
oInputParameterHandler = cInputParameterHandler()
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
sUrl = oInputParameterHandler.getValue('siteUrl')
sThumb = oInputParameterHandler.getValue('sThumb')
sDesc = oInputParameterHandler.getValue('sDesc')
#oGui.addText(SITE_IDENTIFIER, '[COLOR blue]Veuillez attendre que le navigateur se ferme tout seul [/COLOR]')
#oGui.addText(SITE_IDENTIFIER, '[COLOR blue]Pour qu\'il puisse récupérer automatiquement le bon lien [/COLOR]')
oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
sHtmlContent = oRequestHandler.request()
oParser = cParser()
# Ajout des liens DL
# Gere si un Hoster propose plusieurs liens
# Retire les resultats proposés en plusieurs parties (ce sont des .rar)
sPattern = '<th scope="col" class="no-sort"><img src=.+?>([^><]+)</th>|class=\'download\'.+?href=\'([^\']+)\'>T.+?charger <'
aResult = oParser.parse(sHtmlContent, sPattern)
# VSlog(aResult)
if (aResult[0] == True):
for aEntry in aResult[1]:
if aEntry[0]:
sHoster = re.sub('\.\w+', '', aEntry[0])
continue
# filtrer les hosts connus
oHoster = cHosterGui().checkHoster(sHoster)
if not oHoster:
continue
sUrl2 = URL_MAIN[:-1] + aEntry[1]
sTitle = ('%s [COLOR coral]%s[/COLOR]') % (sMovieTitle, sHoster)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oGui.addLink(SITE_IDENTIFIER, 'Display_protected_link', sTitle, sThumb, sDesc, oOutputParameterHandler)
oGui.setEndOfDirectory()
def showHostersLink():
oGui = cGui()
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl')
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
sThumb = oInputParameterHandler.getValue('sThumb')
oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
sHtmlContent = oRequestHandler.request()
oParser = cParser()
sPattern = 'src="(.+?)"'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == True):
if not aResult[1][0].startswith('http'):
sHosterUrl = "https:" + aResult[1][0]
else:
sHosterUrl = aResult[1][0]
oHoster = cHosterGui().checkHoster(sHosterUrl)
if (oHoster != False):
oHoster.setDisplayName(sMovieTitle)
oHoster.setFileName(sMovieTitle)
cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
oGui.setEndOfDirectory()
def showSeriesHosters():
oGui = cGui()
oInputParameterHandler = cInputParameterHandler()
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
sUrl = oInputParameterHandler.getValue('siteUrl')
sThumb=oInputParameterHandler.getValue('sThumb')
sDesc=oInputParameterHandler.getValue('sDesc')
# oGui.addText(SITE_IDENTIFIER, '[COLOR blue]Veuillez attendre que le navigateur se ferme tout seul [/COLOR]')
# oGui.addText(SITE_IDENTIFIER, '[COLOR blue]Pour qu\'il puisse récupérer automatiquement le bon lien [/COLOR]')
oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
sHtmlContent = oRequestHandler.request()
oParser = cParser()
sPattern = '<th scope="col" class="no-sort"><img alt=.+?>([^<>]+)</th>|href=\'([^\']+?)\'>Episode ([^>]+)<'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == True):
oGui = cGui()
for aEntry in aResult[1]:
if aEntry[0]:
oGui.addText(SITE_IDENTIFIER, '[COLOR red]' + re.sub('\.\w+', '', aEntry[0]) + '[/COLOR]')
else:
sUrl2 = URL_MAIN[:-1] + aEntry[1]
sTitle = sMovieTitle + ' E' + aEntry[2].replace('FINAL ', '')
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oGui.addLink(SITE_IDENTIFIER, 'Display_protected_link', sTitle, sThumb, sDesc, oOutputParameterHandler)
oGui.setEndOfDirectory()
else: # certains films mals classés apparaissent dans les séries
showHosters()
def Display_protected_link():
# VSlog('Display_protected_link')
oGui = cGui()
oParser = cParser()
oInputParameterHandler = cInputParameterHandler()
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
sUrl = oInputParameterHandler.getValue('siteUrl')
sThumb = oInputParameterHandler.getValue('sThumb')
# Ne marche pas
if (False):
code = {'123455600123455602123455610123455615': 'http://uptobox.com/',
'1234556001234556071234556111234556153': 'http://turbobit.net/',
'123455600123455605123455615': 'http://ul.to/',
'123455600123455608123455610123455615': 'http://nitroflare.com/',
'123455601123455603123455610123455615123455617': 'https://1fichier.com/?',
'123455600123455606123455611123455615': 'http://rapidgator.net/'}
for k in code:
match = re.search(k + '(.+)$', sUrl)
if match:
sHosterUrl = code[k] + match.group(1)
sHosterUrl = sHosterUrl.replace('123455615', '/')
oHoster = cHosterGui().checkHoster(sHosterUrl)
if (oHoster != False):
oHoster.setDisplayName(sMovieTitle)
oHoster.setFileName(sMovieTitle)
cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
oGui.setEndOfDirectory()
return
if 'link' in sUrl:
# Temporairement car la flemme de se battre avec les redirections
# oRequestHandler = cRequestHandler(sUrl)
# oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
sHtmlContent = oRequestHandler.request()
sUrl = oRequestHandler.getRealUrl()
# VSlog(sUrl)
if "journaldupirate" in sUrl:
sHtmlContent = DecryptDlProtecte(sUrl)
# VSlog(sHtmlContent)
if sHtmlContent:
# Si redirection
if sHtmlContent.startswith('http'):
aResult_dlprotecte = (True, [sHtmlContent])
else:
sPattern_dlprotecte = '<div class="alert">.+?<a href="(.+?)"'
aResult_dlprotecte = oParser.parse(sHtmlContent, sPattern_dlprotecte)
else:
dialog().VSok('Erreur de décryptage du lien')
aResult_dlprotecte = (False, False)
# Si lien normal
else:
if not sUrl.startswith('http'):
sUrl = 'http://' + sUrl
aResult_dlprotecte = (True, [sUrl])
if (aResult_dlprotecte[0]):
episode = 1
for aEntry in aResult_dlprotecte[1]:
sHosterUrl = aEntry
sTitle = sMovieTitle
if len(aResult_dlprotecte[1]) > 1:
sTitle = sMovieTitle + ' episode ' + episode
episode += 1
oHoster = cHosterGui().checkHoster(sHosterUrl)
if (oHoster != False):
oHoster.setDisplayName(sTitle)
oHoster.setFileName(sTitle)
cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
oGui.setEndOfDirectory()
def CutQual(sHtmlContent):
oParser = cParser()
sPattern = 'Qualit.+?galement disponibles pour cette saison:</span><br>(.+?)</div>'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0]):
return aResult[1][0]
else:
return sHtmlContent
return ''
def CutSais(sHtmlContent):
oParser = cParser()
sPattern = '"otherversionsspan">Saisons.+?galement disponibles pour cette série:(.+?)</div>'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0]):
return aResult[1][0]
return ''
def DecryptDlProtecte(url): # Passe par Selenium
VSlog('DecryptDlProtecte : ' + url)
if not (url):
return ''
try:
from selenium import webdriver
from selenium.webdriver.common.driver_utils import get_driver_path
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
# from selenium.webdriver.firefox.options import Options
# from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
VSlog("Chargement Selenium ok")
except:
pass
""" Selenium est désactivé car dl protect ne l'utilise plus mais laissé le code quand même"""
# CloudflarePassed = False
# driverPath = get_driver_path('chromedriver')
# options = Options()
# options.headless = True # Faut le laisser comme ça sinon ça ne fonctionne pas
# browser = webdriver.Chrome(driverPath, options=options)
# browser.get(url)
# On boucle si Cloudflare n'est pas résolu.
# On loop que 3 fois maxi.
# loop = 0
# while CloudflarePassed == False:
# if loop > 3:
# break
# On se sert du cookie pour voir si Cloudflare est résolu
# Cookies = browser.get_cookies()
# if "cf_clearance" in str(Cookies):
# break
# On récupere le timeout de maniere dynamique
# try:
# time.sleep(float(
# re.search(
# r'submit\(\);\r?\n\s*},\s*([0-9]+)',
# browser.page_source
# ).group(1)
# ) / float(1000) + 1)
# except:
# Sauf sur la nouvelle version où il n'est pas présent
# time.sleep(6)
# loop = loop + 1
# browser.find_element(By.NAME, "submit").click()
# page_source = (browser.page_source).encode('utf-8', errors='replace')
# browser.close()
# print(page_source)
# VSlog(page_source)
# return page_source
""" Nouvelle méthode pour dl protect qui passe par requests"""
s = requests.Session()
response = s.get(url)
sHtmlContent = str(response.content)
cookie_string = "; ".join([str(x)+"="+str(y) for x,y in s.cookies.items()])
sPattern = 'type="hidden" name="_token" value="(.+?)">'
aResult = re.search(sPattern, sHtmlContent).group(1)
oRequestHandler = cRequestHandler(url)
oRequestHandler.setRequestType(1)
oRequestHandler.addHeaderEntry('Host', url.split('/')[2])
oRequestHandler.addHeaderEntry('Referer', url)
oRequestHandler.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3')
oRequestHandler.addHeaderEntry('Content-Length', len(str("_token=" + aResult + "&getlink=1")))
oRequestHandler.addHeaderEntry('Content-Type', "application/x-www-form-urlencoded")
oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
oRequestHandler.addHeaderEntry('Cookie', cookie_string)
oRequestHandler.addParameters("_token", aResult)
oRequestHandler.addParametersLine("_token=" + aResult + "&getlink=1")
sHtmlContent = oRequestHandler.request()
return sHtmlContent
def exectProtect(cookies, url): # Ne sert plus
# Tout ca a virer et utiliser oRequestHandler.addMultipartFiled('sess_id': sId, 'upload_type': 'url', 'srv_tmp_url': sTmp) quand ca marchera
import string
_BOUNDARY_CHARS = string.digits
boundary = ''.join(random.choice(_BOUNDARY_CHARS) for i in range(30))
multipart_form_data = {'hidden': 'continuer', 'hidden': 'Continuer'}
data, headersMulti = encode_multipart(multipart_form_data, {}, boundary)
# 2 eme requete pour avoir le lien
oRequestHandler = cRequestHandler(url)
oRequestHandler.setRequestType(1)
oRequestHandler.addHeaderEntry('Host', url.split('/')[2])
oRequestHandler.addHeaderEntry('Referer', url)
oRequestHandler.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3')
oRequestHandler.addHeaderEntry('Content-Length', headersMulti['Content-Length'])
oRequestHandler.addHeaderEntry('Content-Type', headersMulti['Content-Type'])
oRequestHandler.addHeaderEntry('Cookie', cookies)
oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
oRequestHandler.addParametersLine(data)
sHtmlContent = oRequestHandler.request()
return sHtmlContent
# ******************************************************************************
# from http://code.activestate.com/recipes/578668-encode-multipart-form-data-for-uploading-files-via/
"""Encode multipart form data to upload files via POST."""
def encode_multipart(fields, files, boundary):
r"""Encode dict of form fields and dict of files as multipart/form-data.
Return tuple of (body_string, headers_dict). Each value in files is a dict
with required keys 'filename' and 'content', and optional 'mimetype' (if
not specified, tries to guess mime type or uses 'application/octet-stream').
>>> body, headers = encode_multipart({'FIELD': 'VALUE'},
... {'FILE': {'filename': 'F.TXT', 'content': 'CONTENT'}},
... boundary='BOUNDARY')
>>> print('\n'.join(repr(l) for l in body.split('\r\n')))
'--BOUNDARY'
'Content-Disposition: form-data; name="FIELD"'
''
'VALUE'
'--BOUNDARY'
'Content-Disposition: form-data; name="FILE"; filename="F.TXT"'
'Content-Type: text/plain'
''
'CONTENT'
'--BOUNDARY--'
''
>>> print(sorted(headers.items()))
[('Content-Length', '193'), ('Content-Type', 'multipart/form-data; boundary=BOUNDARY')]
>>> len(body)
193
"""
import mimetypes
import string
_BOUNDARY_CHARS = string.digits
def escape_quote(s):
return s.replace('"', '\\"')
lines = []
for name, value in fields.items():
lines.extend((
'-----------------------------{0}'.format(boundary),
'Content-Disposition: form-data; name="{0}"'.format(escape_quote(name)),
'',
str(value),
'-----------------------------{0}--'.format(boundary),
''))
for name, value in files.items():
filename = value['filename']
if 'mimetype' in value:
mimetype = value['mimetype']
else:
mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
lines.extend((
'--{0}'.format(boundary),
'Content-Disposition: form-data; name="{0}"'.format(escape_quote(name), escape_quote(filename)),
'Content-Type: {0}'.format(mimetype),
'',
value['content']))
body = '\r\n'.join(lines)
headers = {'Content-Type': 'multipart/form-data; boundary=---------------------------{0}'.format(boundary),
'Content-Length': str(len(body))}
return (body, headers)