URBANTV

TIREXO VSTREAM

Nov 19th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 60.30 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. # vStream https://github.com/Kodi-vStream/venom-xbmc-addons
  3. from resources.lib.gui.hoster import cHosterGui
  4. from resources.lib.gui.gui import cGui
  5. from resources.lib.handler.inputParameterHandler import cInputParameterHandler
  6. from resources.lib.handler.outputParameterHandler import cOutputParameterHandler
  7. from resources.lib.handler.requestHandler import cRequestHandler
  8. from resources.lib.parser import cParser
  9. from resources.lib.comaddon import progress, dialog, VSlog
  10. from resources.lib.config import GestionCookie
  11. import time
  12. import xbmc
  13. import xbmcvfs
  14. import xbmcplugin
  15.  
  16. import re, random, requests
  17. # from test.test_socket import try_address
  18.  
  19.  
  20. UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
  21.  
  22. SITE_IDENTIFIER = 'tirexo'
  23. SITE_NAME = '[COLOR violet]Tirexo[/COLOR]'
  24. SITE_DESC = 'Films/Séries/Reportages/Concerts'
  25. # URL_HOST = 'https://ww2.tirexo.cc/'
  26.  
  27.  
  28. # def getURL():
  29. # oParser = cParser()
  30. # oRequestHandler = cRequestHandler(URL_HOST)
  31. # oRequestHandler.addHeaderEntry('User-Agent', UA)
  32. # sHtmlContent = oRequestHandler.request()
  33.  
  34. # sPattern = '<a class="full-wrap clearfix btn btn-danger" href="([^"]+)">Acc&eacute;der au site</a></div>'
  35. # aResult = oParser.parse(sHtmlContent, sPattern)
  36. # if aResult[0]:
  37. # return aResult[1][0]
  38.  
  39.  
  40. #def GetURL_MAIN():
  41. #ADDON = addon()
  42. #oInputParameterHandler = cInputParameterHandler()
  43. #sUrl = oInputParameterHandler.getValue('siteUrl')
  44. #Sources = oInputParameterHandler.getValue('function')
  45.  
  46. # z = oInputParameterHandler.getAllParameter()
  47. # VSlog(z)
  48.  
  49. # quand vstream load tous les sites on passe >> globalSources
  50. # quand vstream load a partir du menu home on passe >> callplugin
  51. # quand vstream fabrique une liste de plugin pour menu(load site globalRun and call function search) >> search
  52. # quand l'url ne contient pas celle déjà enregistrer dans settings et que c'est pas dlprotect on active.
  53. #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:
  54. #MemorisedHost = getURL()
  55. #if MemorisedHost is not None and MemorisedHost != '' :
  56. #if not 'cf_chl_jschl_tk' in MemorisedHost:
  57. #ADDON.setSetting('Tirexo', MemorisedHost)
  58. #VSlog("Tirexo url >> " + str(MemorisedHost) + ' sauvegarder >> ' + ADDON.getSetting('Tirexo'))
  59. #else:
  60. #ADDON.setSetting('Tirexo', URL_HOST)
  61. #VSlog("Url non changer car égal à None le site peux être surcharger utilisation de >> ADDON.getSetting('Tirexo')")
  62.  
  63. #return ADDON.getSetting('Tirexo')
  64. #else:
  65. # si pas de zt dans settings on récup l'url une fois dans le site
  66. #if not ADDON.getSetting('Tirexo') and not (Sources == 'callpluging' or Sources == 'globalSources' or Sources == 'search'):
  67. #MemorisedHost = getURL()
  68. #if MemorisedHost is not None and MemorisedHost != '':
  69. #if not 'cf_chl_jschl_tk' in MemorisedHost:
  70. #ADDON.setSetting('Tirexo', MemorisedHost)
  71. #VSlog("Tirexo url vide >> " + str(MemorisedHost) + ' sauvegarder >> ' + ADDON.getSetting('Tirexo'))
  72. #else:
  73. #ADDON.setSetting('Tirexo', URL_HOST)
  74. #VSlog("Url non changer car égal à None le site peux être surcharger utilisation de >> ADDON.getSetting('Tirexo')")
  75.  
  76. #return ADDON.getSetting('Tirexo')
  77. #else:
  78. #VSlog("Tirexo pas besoin d'url")
  79. #return ADDON.getSetting('Tirexo')
  80.  
  81. # Teste pour le moment avec une url fixe.
  82. URL_MAIN = "https://ww2.tirexo.cc/"
  83. # URL_MAIN = "https://tirexo.net/" # Les regex sont différent mais il y a pas cloudflare
  84. URL_SEARCH_MOVIES = (URL_MAIN + 'index.php?do=search&subaction=search&search_start=0&full_search=1&result_from=1&story=', 'showMovies')
  85. URL_SEARCH_SERIES = (URL_MAIN + 'index.php?do=search&subaction=search&catlist=15&story=', 'showMovies')
  86. URL_SEARCH_ANIMS = (URL_MAIN + 'index.php?do=search&subaction=search&catlist=32&story=', 'showMovies')
  87. URL_SEARCH_MISC = (URL_MAIN + 'index.php?do=search&subaction=search&catlist=39&story=', 'showMovies')
  88.  
  89. MOVIE_MOVIE = (True, 'showMenuMovies')
  90. MOVIE_COLLECTION = (URL_MAIN + 'collections/', 'showMovies')
  91. MOVIE_EXCLUS = (URL_MAIN + 'exclus/', 'showMovies')
  92. MOVIE_3D = (URL_MAIN + 'films-bluray-3d/', 'showMovies')
  93. MOVIE_SD = (URL_MAIN + 'films-bluray-hd/', 'showMovies')
  94. MOVIE_MKV = (URL_MAIN + 'films-mkv/', 'showMovies')
  95. MOVIE_HD = (URL_MAIN + 'films-bluray-hd-1080/', 'showMovies')
  96. MOVIE_BDRIP = (URL_MAIN + 'films-dvdrip-bdrip/', 'showMovies')
  97. MOVIE_SDLIGHT = (URL_MAIN + 'hdlight-720/', 'showMovies')
  98. MOVIE_HDLIGHT = (URL_MAIN + 'hdlight-1080/', 'showMovies')
  99. MOVIE_4KL = (URL_MAIN + 'film-ultra-hdlight-x265/', 'showMovies')
  100. MOVIE_4K = (URL_MAIN + 'film-ultra-hd-x265/', 'showMovies')
  101. MOVIE_NEWS = (URL_MAIN + 'films-gratuit/', 'showMovies')
  102.  
  103. MOVIE_2010 = (URL_MAIN + 'films-2010-2019/', 'showMovies')
  104. MOVIE_2000 = (URL_MAIN + 'films-2000-2009/', 'showMovies')
  105. MOVIE_1990 = (URL_MAIN + 'films-1990-1999/', 'showMovies')
  106. MOVIE_1980 = (URL_MAIN + 'films-1980-1989/', 'showMovies')
  107. MOVIE_1970 = (URL_MAIN + 'films-1970-1979/', 'showMovies')
  108. MOVIE_1960 = (URL_MAIN + 'films-1960-1969/', 'showMovies')
  109. MOVIE_1950 = (URL_MAIN + 'films-1950-1959/', 'showMovies')
  110. MOVIE_1900 = (URL_MAIN + 'films-1900-1950/', 'showMovies')
  111.  
  112. MOVIE_GENRES = ('films-gratuit/', 'showGenre')
  113. SERIE_GENRES = ('telecharger-series/', 'showGenre')
  114.  
  115. SERIE_SERIES = (True, 'showMenuSeries')
  116. SERIE_VFS = (URL_MAIN + 'series-vf/', 'showMovies')
  117. SERIE_VF_720 = (URL_MAIN + 'series-vf-en-hd/','showMovies')
  118. SERIE_VF_1080 = (URL_MAIN + 'series-vf-1080p/','showMovies')
  119. SERIE_VOSTFRS = (URL_MAIN + 'series-vostfr/', 'showMovies')
  120. SERIE_VOSTFRS_720 = (URL_MAIN + 'series-vostfr-hd/','showMovies')
  121. SERIE_VOSTFRS_1080 = (URL_MAIN + 'series-vostfr-1080p/','showMovies')
  122. SERIE_VO = (URL_MAIN + 'series-vo/', 'showMovies')
  123. SERIE_NEWS = (URL_MAIN + 'telecharger-series/', 'showMovies')
  124.  
  125. ANIM_ANIMS = (True, 'showMenuMangas')
  126. ANIM_VFS = (URL_MAIN + 'animes-vf/', 'showMovies')
  127. ANIM_VF_720 = (URL_MAIN + 'animes-vf-720p/', 'showMovies')
  128. ANIM_VF_1080 = (URL_MAIN + 'animes-vf-1080p/', 'showMovies')
  129. ANIM_VOSTFRS = (URL_MAIN + 'animes-vostfr/', 'showMovies')
  130. ANIM_VOSTFRS_720 = (URL_MAIN + 'animes-vostfr-720p/', 'showMovies')
  131. ANIM_VOSTFRS_1080 = (URL_MAIN + 'animes-vostfr-1080p/', 'showMovies')
  132. FILM_ANIM = (URL_MAIN + 'films-animes/', 'showMovies')
  133. ANIM_NEWS = (URL_MAIN + 'animes/', 'showMovies')
  134.  
  135. DOC_NEWS = (URL_MAIN + 'emissions-tv-documentaires/souscate_doc-Documentaire/', 'showMovies')
  136. SPORT_SPORTS = (URL_MAIN + 'emissions-tv-documentaires/souscate_doc-Sport/', 'showMovies')
  137. TV_NEWS = (URL_MAIN + 'emissions-tv-documentaires/souscate_doc-Émissions+TV/', 'showMovies')
  138. SPECT_NEWS = (URL_MAIN + 'emissions-tv-documentaires/souscate_doc-Spectacle/', 'showMovies')
  139. CONCERT_NEWS = (URL_MAIN + 'musiques-mp3-gratuite/souscat_music-Concerts/', 'showMovies')
  140.  
  141.  
  142. # bypass cloudflare avec Selenium
  143.  
  144. def redi(url): # Pour la redirection avec /link
  145. if url:
  146. try: # On passe par la méthode request quand cloudflare n'est pas présent
  147. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0',
  148. 'Content-Type': 'text/html; charset=UTF-8',
  149. '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',
  150. 'Accept-encoding': 'gzip, deflate, br',
  151. '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'}
  152. r = requests.get(url, allow_redirects=False, headers=headers)
  153. r.status_code
  154. r.url
  155. result = r.headers['location']
  156. return result
  157. except:
  158. pass
  159.  
  160. try:
  161. from selenium import webdriver
  162. from selenium.webdriver.common.driver_utils import get_driver_path
  163. from selenium.webdriver.support.ui import WebDriverWait
  164.  
  165. from selenium.webdriver import Chrome
  166. from selenium.webdriver.chrome.options import Options
  167.  
  168. # from selenium.webdriver.firefox.options import Options
  169. # from selenium.webdriver import Firefox
  170.  
  171. # from selenium.webdriver.common.by import By
  172. # from selenium.webdriver.support import expected_conditions as EC
  173.  
  174. VSlog("Chargement Selenium ok")
  175.  
  176. except:
  177. pass
  178. driverPath = get_driver_path('chromedriver')
  179. options = Options()
  180. options.headless = True
  181. browser = webdriver.Chrome(driverPath, options=options)
  182. browser.get(url)
  183.  
  184. # On attends la redirection
  185. wait = WebDriverWait(browser, 10)
  186. wait.until(lambda driver: browser.current_url != url)
  187.  
  188. current_url = browser.current_url
  189.  
  190. browser.close()
  191. print(current_url)
  192. return current_url
  193.  
  194.  
  195. def resolvenocloudflare(url, cookie): # Méthode classique
  196. oRequestHandler = cRequestHandler(url)
  197. oRequestHandler.addHeaderEntry('User-Agent', UA)
  198. if cookie:
  199. oRequestHandler.addHeaderEntry('Cookie', cookie)
  200. # oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
  201. sHtmlContent = oRequestHandler.request()
  202. return sHtmlContent
  203.  
  204.  
  205. def cloudflare(url): # Bypass cloudflare avec selenium
  206.  
  207. if url: # On passe par la méthode classique en cas ou cloudflare n'est pas présent
  208. try:
  209. c = GestionCookie().Readcookie('tirexo_com') # On lie le cookie enregistré
  210. sHtmlContent = resolvenocloudflare(url, c) # On passe par la fonction resolvenocloudflare avec l'url et le cookie
  211. VSlog("cookies encore valables") # Un log en cas que le cookie est valide
  212. return sHtmlContent # On renvoie le contenu html de l'url qui a été validé
  213. except: # En cas d'exception /ou erreur
  214. pass # On ignore et on passe le code précédent si le cookie n'est plus valide
  215.  
  216. try:
  217. from selenium import webdriver
  218. from selenium.webdriver.common.driver_utils import get_driver_path
  219. from selenium.webdriver.support.ui import WebDriverWait
  220.  
  221. from selenium.webdriver import Chrome
  222. from selenium.webdriver.chrome.options import Options
  223. from selenium.webdriver import DesiredCapabilities
  224.  
  225. # from selenium.webdriver.firefox.options import Options
  226. # from selenium.webdriver import Firefox
  227.  
  228. # from selenium.webdriver.common.by import By
  229. # from selenium.webdriver.support import expected_conditions as EC
  230.  
  231. VSlog("Chargement Selenium ok")
  232.  
  233. except:
  234. pass
  235.  
  236. CloudflarePassed = False
  237.  
  238. if True:
  239. driverPath = get_driver_path('chromedriver')
  240. options = Options()
  241.  
  242. # options.add_argument("headless")
  243. # options.add_argument("window-size=1920,1080")
  244. options.add_argument("'user-agent={}".format(UA))
  245. # options.add_argument("disable-gpu")
  246.  
  247. capabilities = DesiredCapabilities.CHROME.copy()
  248. capabilities['acceptSslCerts'] = True
  249. capabilities['acceptInsecureCerts'] = True
  250.  
  251. browser = webdriver.Chrome(driverPath, options=options, desired_capabilities=capabilities)
  252. else:
  253. path = r"C:\Users\XXXX\AppData\Roaming\Kodi\addons\script.module.selenium\bin\geckodriver\win32\geckodriver\geckodriver.exe"
  254. # path sert pour firefox
  255. browser = webdriver.Firefox(executable_path=path, options=options, log_path="")
  256.  
  257. browser.get(url)
  258.  
  259. # On boucle si Cloudflare n'est pas résolu.
  260. # On loop que 3 fois maxi.
  261. loop = 0
  262. while (CloudflarePassed == False):
  263. if loop > 3:
  264. break
  265.  
  266. # On se sert du cookie pour voir si Cloudflare est résolu
  267. Cookies = browser.get_cookies()
  268. if "cf_clearance" in str(Cookies):
  269. break
  270.  
  271. # Si pas de protection CF
  272. if 'Checking your browser before accessing' not in browser.page_source:
  273. break
  274.  
  275. # On récupere le timeout de maniere dynamique
  276. try:
  277. time.sleep(float(
  278. re.search(
  279. r'submit\(\);\r?\n\s*},\s*([0-9]+)',
  280. browser.page_source
  281. ).group(1)
  282. ) / float(1000) + 1)
  283.  
  284. except:
  285. # Sauf sur la nouvelle version où il n'est pas présent
  286. time.sleep(6)
  287.  
  288. VSlog("loop : " + str(loop))
  289.  
  290. loop = loop + 1
  291.  
  292. VSlog("""Cloudflare Passed, Cookie : """ + str({cookie['name']:cookie['value'] for cookie in browser.get_cookies()})
  293. + """\n User Agent : """ + browser.execute_script("return navigator.userAgent"))
  294.  
  295. # Sauvegarde des cookies
  296. c = ""
  297. for cookie in browser.get_cookies():
  298. c = c + cookie['name'] + '=' + cookie['value'] + ';'
  299. c = str(c[:-1])
  300.  
  301. GestionCookie().SaveCookie('tirexo_com', c)
  302.  
  303. page_source = (browser.page_source).encode('utf-8', errors='replace')
  304. browser.close()
  305.  
  306. return page_source
  307.  
  308.  
  309. def showInstall():
  310. xbmc.executebuiltin('InstallAddon(script.module.selenium)')
  311.  
  312.  
  313. def load():
  314. oGui = cGui()
  315.  
  316. #oOutputParameterHandler = cOutputParameterHandler()
  317. #oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
  318. #oGui.addDir(SITE_IDENTIFIER, 'showDetail', '[COLOR red]Explication pour le site[/COLOR]', 'films.png', oOutputParameterHandler)
  319. #
  320. # oOutputParameterHandler = cOutputParameterHandler()
  321. # oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
  322. # oGui.addDir(SITE_IDENTIFIER, 'showInstall', '[COLOR blue]Cliquer ici pour installer selenium[/COLOR]', 'films.png', oOutputParameterHandler)
  323.  
  324. oOutputParameterHandler = cOutputParameterHandler()
  325. oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
  326. oGui.addDir(SITE_IDENTIFIER, 'showMenuMovies', 'Films', 'films.png', oOutputParameterHandler)
  327.  
  328. oOutputParameterHandler = cOutputParameterHandler()
  329. oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
  330. oGui.addDir(SITE_IDENTIFIER, 'showMenuSeries', 'Séries', 'series.png', oOutputParameterHandler)
  331.  
  332. oOutputParameterHandler = cOutputParameterHandler()
  333. oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
  334. oGui.addDir(SITE_IDENTIFIER, 'showMenuMangas', 'Animés', 'animes.png', oOutputParameterHandler)
  335.  
  336. oOutputParameterHandler = cOutputParameterHandler()
  337. oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
  338. oGui.addDir(SITE_IDENTIFIER, 'showMenuAutres', 'Autres', 'tv.png', oOutputParameterHandler)
  339.  
  340. oGui.setEndOfDirectory()
  341.  
  342.  
  343. def showMenuMovies():
  344. oGui = cGui()
  345.  
  346. oOutputParameterHandler = cOutputParameterHandler()
  347. oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH_MOVIES[0])
  348. oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Rechercher films', 'search.png', oOutputParameterHandler)
  349.  
  350. oOutputParameterHandler = cOutputParameterHandler()
  351. oOutputParameterHandler.addParameter('siteUrl', MOVIE_NEWS[0])
  352. oGui.addDir(SITE_IDENTIFIER, MOVIE_NEWS[1], 'Derniers ajouts', 'news.png', oOutputParameterHandler)
  353.  
  354. oOutputParameterHandler = cOutputParameterHandler()
  355. oOutputParameterHandler.addParameter('siteUrl', MOVIE_COLLECTION[0])
  356. oGui.addDir(SITE_IDENTIFIER, MOVIE_COLLECTION[1], 'Les collections', 'news.png', oOutputParameterHandler)
  357.  
  358. oOutputParameterHandler = cOutputParameterHandler()
  359. oOutputParameterHandler.addParameter('siteUrl', MOVIE_EXCLUS[0])
  360. oGui.addDir(SITE_IDENTIFIER, MOVIE_EXCLUS[1], 'Exclus (Films populaires)', 'news.png', oOutputParameterHandler)
  361.  
  362. oOutputParameterHandler = cOutputParameterHandler()
  363. oOutputParameterHandler.addParameter('siteUrl', MOVIE_GENRES[0])
  364. oGui.addDir(SITE_IDENTIFIER, MOVIE_GENRES[1], 'Films (Genres)', 'genres.png', oOutputParameterHandler)
  365.  
  366. oOutputParameterHandler = cOutputParameterHandler()
  367. oOutputParameterHandler.addParameter('siteUrl', MOVIE_SD[0])
  368. oGui.addDir(SITE_IDENTIFIER, MOVIE_SD[1], 'Films (720p)', 'films.png', oOutputParameterHandler)
  369.  
  370. oOutputParameterHandler = cOutputParameterHandler()
  371. oOutputParameterHandler.addParameter('siteUrl', MOVIE_HD[0])
  372. oGui.addDir(SITE_IDENTIFIER, MOVIE_HD[1], 'Films (1080p)', 'films.png', oOutputParameterHandler)
  373.  
  374. oOutputParameterHandler = cOutputParameterHandler()
  375. oOutputParameterHandler.addParameter('siteUrl', MOVIE_BDRIP[0])
  376. oGui.addDir(SITE_IDENTIFIER, MOVIE_BDRIP[1], 'Films (BDRIP)', 'films.png', oOutputParameterHandler)
  377.  
  378. oOutputParameterHandler = cOutputParameterHandler()
  379. oOutputParameterHandler.addParameter('siteUrl', MOVIE_4K[0])
  380. oGui.addDir(SITE_IDENTIFIER, MOVIE_4K[1], 'Films (4K)', 'films.png', oOutputParameterHandler)
  381.  
  382. oOutputParameterHandler = cOutputParameterHandler()
  383. oOutputParameterHandler.addParameter('siteUrl', MOVIE_MKV[0])
  384. oGui.addDir(SITE_IDENTIFIER, MOVIE_MKV[1], 'Films (dvdrip mkv)', 'films.png', oOutputParameterHandler)
  385.  
  386. oOutputParameterHandler = cOutputParameterHandler()
  387. oOutputParameterHandler.addParameter('siteUrl', MOVIE_SDLIGHT[0])
  388. oGui.addDir(SITE_IDENTIFIER, MOVIE_SDLIGHT[1], 'Films (720p - Light)', 'films.png', oOutputParameterHandler)
  389.  
  390. oOutputParameterHandler = cOutputParameterHandler()
  391. oOutputParameterHandler.addParameter('siteUrl', MOVIE_HDLIGHT[0])
  392. oGui.addDir(SITE_IDENTIFIER, MOVIE_HDLIGHT[1], 'Films (1080p - Light)', 'films.png', oOutputParameterHandler)
  393.  
  394. oOutputParameterHandler = cOutputParameterHandler()
  395. oOutputParameterHandler.addParameter('siteUrl', MOVIE_4KL[0])
  396. oGui.addDir(SITE_IDENTIFIER, MOVIE_4KL[1], 'Films (4K - light)', 'films.png', oOutputParameterHandler)
  397.  
  398. oOutputParameterHandler = cOutputParameterHandler()
  399. oOutputParameterHandler.addParameter('siteUrl', MOVIE_3D[0])
  400. oGui.addDir(SITE_IDENTIFIER, MOVIE_3D[1], 'Films (3D)', 'films.png', oOutputParameterHandler)
  401.  
  402. oOutputParameterHandler = cOutputParameterHandler()
  403. oOutputParameterHandler.addParameter('siteUrl', MOVIE_2010[0])
  404. oGui.addDir(SITE_IDENTIFIER, MOVIE_2010[1], 'Films (2010)', 'films.png', oOutputParameterHandler)
  405.  
  406. oOutputParameterHandler = cOutputParameterHandler()
  407. oOutputParameterHandler.addParameter('siteUrl', MOVIE_2000[0])
  408. oGui.addDir(SITE_IDENTIFIER, MOVIE_2000[1], 'Films (2000)', 'films.png', oOutputParameterHandler)
  409.  
  410. oOutputParameterHandler = cOutputParameterHandler()
  411. oOutputParameterHandler.addParameter('siteUrl', MOVIE_1990[0])
  412. oGui.addDir(SITE_IDENTIFIER, MOVIE_1990[1], 'Films (1990)', 'films.png', oOutputParameterHandler)
  413.  
  414. oOutputParameterHandler = cOutputParameterHandler()
  415. oOutputParameterHandler.addParameter('siteUrl', MOVIE_1980[0])
  416. oGui.addDir(SITE_IDENTIFIER, MOVIE_1980[1], 'Films (1980)', 'films.png', oOutputParameterHandler)
  417.  
  418. oOutputParameterHandler = cOutputParameterHandler()
  419. oOutputParameterHandler.addParameter('siteUrl', MOVIE_1970[0])
  420. oGui.addDir(SITE_IDENTIFIER, MOVIE_1970[1], 'Films (1970)', 'films.png', oOutputParameterHandler)
  421.  
  422. oOutputParameterHandler = cOutputParameterHandler()
  423. oOutputParameterHandler.addParameter('siteUrl', MOVIE_1960[0])
  424. oGui.addDir(SITE_IDENTIFIER, MOVIE_1960[1], 'Films (1960)', 'films.png', oOutputParameterHandler)
  425.  
  426. oOutputParameterHandler = cOutputParameterHandler()
  427. oOutputParameterHandler.addParameter('siteUrl', MOVIE_1950[0])
  428. oGui.addDir(SITE_IDENTIFIER, MOVIE_1950[1], 'Films (1950)', 'films.png', oOutputParameterHandler)
  429.  
  430. oOutputParameterHandler = cOutputParameterHandler()
  431. oOutputParameterHandler.addParameter('siteUrl', MOVIE_1900[0])
  432. oGui.addDir(SITE_IDENTIFIER, MOVIE_1900[1], 'Films (1900)', 'films.png', oOutputParameterHandler)
  433.  
  434. oGui.setEndOfDirectory()
  435.  
  436.  
  437. def showMenuSeries():
  438. oGui = cGui()
  439.  
  440. oOutputParameterHandler = cOutputParameterHandler()
  441. oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH_SERIES[0])
  442. oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Rechercher séries', 'search.png', oOutputParameterHandler)
  443.  
  444. oOutputParameterHandler = cOutputParameterHandler()
  445. oOutputParameterHandler.addParameter('siteUrl', SERIE_NEWS[0])
  446. oGui.addDir(SITE_IDENTIFIER, SERIE_NEWS[1], 'Derniers ajouts', 'news.png', oOutputParameterHandler)
  447.  
  448. oOutputParameterHandler = cOutputParameterHandler()
  449. oOutputParameterHandler.addParameter('siteUrl', SERIE_GENRES[0])
  450. oGui.addDir(SITE_IDENTIFIER, SERIE_GENRES[1], 'Séries (Genres)', 'genres.png', oOutputParameterHandler)
  451.  
  452. oOutputParameterHandler = cOutputParameterHandler()
  453. oOutputParameterHandler.addParameter('siteUrl', SERIE_VFS[0])
  454. oGui.addDir(SITE_IDENTIFIER, SERIE_VFS[1], 'Séries (VF)', 'series.png', oOutputParameterHandler)
  455.  
  456. oOutputParameterHandler = cOutputParameterHandler()
  457. oOutputParameterHandler.addParameter('siteUrl', SERIE_VF_720[0])
  458. oGui.addDir(SITE_IDENTIFIER, SERIE_VFS[1], 'Séries 720p (VF)', 'series.png', oOutputParameterHandler)
  459.  
  460. oOutputParameterHandler = cOutputParameterHandler()
  461. oOutputParameterHandler.addParameter('siteUrl', SERIE_VF_1080[0])
  462. oGui.addDir(SITE_IDENTIFIER, SERIE_VFS[1], 'Séries 1080p (VF)', 'series.png', oOutputParameterHandler)
  463.  
  464. oOutputParameterHandler = cOutputParameterHandler()
  465. oOutputParameterHandler.addParameter('siteUrl', SERIE_VOSTFRS[0])
  466. oGui.addDir(SITE_IDENTIFIER, SERIE_VOSTFRS[1], 'Séries (VOSTFR)', 'series.png', oOutputParameterHandler)
  467.  
  468. oOutputParameterHandler = cOutputParameterHandler()
  469. oOutputParameterHandler.addParameter('siteUrl', SERIE_VOSTFRS_720[0])
  470. oGui.addDir(SITE_IDENTIFIER, SERIE_VOSTFRS_720[1], 'Séries 720p (VOSTFR)', 'series.png', oOutputParameterHandler)
  471.  
  472. oOutputParameterHandler = cOutputParameterHandler()
  473. oOutputParameterHandler.addParameter('siteUrl', SERIE_VOSTFRS_1080[0])
  474. oGui.addDir(SITE_IDENTIFIER, SERIE_VOSTFRS_1080[1], 'Séries 1080p (VOSTFR)', 'series.png', oOutputParameterHandler)
  475.  
  476. oOutputParameterHandler = cOutputParameterHandler()
  477. oOutputParameterHandler.addParameter('siteUrl', SERIE_VO[0])
  478. oGui.addDir(SITE_IDENTIFIER, SERIE_VO[1], 'Séries (VO)', 'series.png', oOutputParameterHandler)
  479.  
  480. oGui.setEndOfDirectory()
  481.  
  482.  
  483. def showMenuMangas():
  484. oGui = cGui()
  485.  
  486. oOutputParameterHandler = cOutputParameterHandler()
  487. oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH_ANIMS[0])
  488. oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Rechercher Animes', 'search.png', oOutputParameterHandler)
  489.  
  490. oOutputParameterHandler = cOutputParameterHandler()
  491. oOutputParameterHandler.addParameter('siteUrl', ANIM_NEWS[0])
  492. oGui.addDir(SITE_IDENTIFIER, ANIM_NEWS[1], 'Derniers ajouts', 'news.png', oOutputParameterHandler)
  493.  
  494. oOutputParameterHandler = cOutputParameterHandler()
  495. oOutputParameterHandler.addParameter('siteUrl', ANIM_VFS[0])
  496. oGui.addDir(SITE_IDENTIFIER, ANIM_VFS[1], 'Animes (VF)', 'animes.png', oOutputParameterHandler)
  497.  
  498. oOutputParameterHandler = cOutputParameterHandler()
  499. oOutputParameterHandler.addParameter('siteUrl', ANIM_VF_720[0])
  500. oGui.addDir(SITE_IDENTIFIER, ANIM_VF_720[1], 'Animes 720p (VF)', 'animes.png', oOutputParameterHandler)
  501.  
  502. oOutputParameterHandler = cOutputParameterHandler()
  503. oOutputParameterHandler.addParameter('siteUrl', ANIM_VF_1080[0])
  504. oGui.addDir(SITE_IDENTIFIER, ANIM_VF_1080[1], 'Animes 1080p (VF)', 'animes.png', oOutputParameterHandler)
  505.  
  506. oOutputParameterHandler = cOutputParameterHandler()
  507. oOutputParameterHandler.addParameter('siteUrl', ANIM_VOSTFRS[0])
  508. oGui.addDir(SITE_IDENTIFIER, ANIM_VOSTFRS[1], 'Animes (VOSTFR)', 'animes.png', oOutputParameterHandler)
  509.  
  510. oOutputParameterHandler = cOutputParameterHandler()
  511. oOutputParameterHandler.addParameter('siteUrl', ANIM_VOSTFRS_720[0])
  512. oGui.addDir(SITE_IDENTIFIER, ANIM_VOSTFRS_720[1], 'Animes 720p (VOSTFR)', 'animes.png', oOutputParameterHandler)
  513.  
  514. oOutputParameterHandler = cOutputParameterHandler()
  515. oOutputParameterHandler.addParameter('siteUrl', ANIM_VOSTFRS_1080[0])
  516. oGui.addDir(SITE_IDENTIFIER, ANIM_VOSTFRS_1080[1], 'Animes 1080p (VOSTFR)', 'animes.png', oOutputParameterHandler)
  517.  
  518. oOutputParameterHandler = cOutputParameterHandler()
  519. oOutputParameterHandler.addParameter('siteUrl', FILM_ANIM[0])
  520. oGui.addDir(SITE_IDENTIFIER, FILM_ANIM[1], 'Films d\'animes ', 'animes.png', oOutputParameterHandler)
  521.  
  522. oGui.setEndOfDirectory()
  523.  
  524.  
  525. def showMenuAutres():
  526. oGui = cGui()
  527.  
  528. oOutputParameterHandler = cOutputParameterHandler()
  529. oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH_MISC[0])
  530. oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Rechercher autres', 'search.png', oOutputParameterHandler)
  531.  
  532. oOutputParameterHandler = cOutputParameterHandler()
  533. oOutputParameterHandler.addParameter('siteUrl', DOC_NEWS[0])
  534. oGui.addDir(SITE_IDENTIFIER, DOC_NEWS[1], 'Documentaires', 'doc.png', oOutputParameterHandler)
  535.  
  536. oOutputParameterHandler = cOutputParameterHandler()
  537. oOutputParameterHandler.addParameter('siteUrl', SPORT_SPORTS[0])
  538. oGui.addDir(SITE_IDENTIFIER, SPORT_SPORTS[1], 'Sports', 'sport.png', oOutputParameterHandler)
  539.  
  540. oOutputParameterHandler = cOutputParameterHandler()
  541. oOutputParameterHandler.addParameter('siteUrl', SPECT_NEWS[0])
  542. oGui.addDir(SITE_IDENTIFIER, SPECT_NEWS[1], 'Spectacles', 'star.png', oOutputParameterHandler)
  543.  
  544. oOutputParameterHandler = cOutputParameterHandler()
  545. oOutputParameterHandler.addParameter('siteUrl', CONCERT_NEWS[0])
  546. oGui.addDir(SITE_IDENTIFIER, CONCERT_NEWS[1], 'Concerts', 'music.png', oOutputParameterHandler)
  547.  
  548. oOutputParameterHandler = cOutputParameterHandler()
  549. oOutputParameterHandler.addParameter('siteUrl', TV_NEWS[0])
  550. oGui.addDir(SITE_IDENTIFIER, TV_NEWS[1], 'Emissions TV', 'tv.png', oOutputParameterHandler)
  551.  
  552. oGui.setEndOfDirectory()
  553.  
  554.  
  555. def showDetail():
  556. dialog().VStextView(desc="""Explication pour le changement:
  557. Nous avons remarqué que ces derniers temps nous avons beaucoup de problèmes avec cloudflare.
  558. C'est pourquoi nous avons changé de méthode pour passer la protection.
  559. Nous utiliserons votre navigateur afin de récupérer le bon contenu du site et non cloudflare
  560. En aucun cas nous n'utiliseront vos données confidentielles.
  561.  
  562.  
  563. - Pour avoir plus d'information rendez vous sur notre github officiel:
  564. https://github.com/Kodi-vStream/venom-xbmc-addons.
  565. - Pour l'installation et le fonctionnement de Selenium:
  566. https://github.com/Kodi-vStream/venom-xbmc-addons/issues/2948.
  567.  
  568.  
  569. Le fonctionnement:
  570. 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.
  571. Veuillez ne pas le(s) fermer(s) il(s) se fermera(ont) automatiquement.
  572. Pour le navigateur nous passons par Google Chrome car c'est le plus simple à configurer malheureusement.
  573. Si vous n'avez pas Google Chrome alors ça ne fonctionnera pas donc je vous conseille de l'installer à jour important !!!
  574. Veuillez noter que nous réfléchissons à une solution pour utiliser les autres navigateurs
  575.  
  576.  
  577. PS:
  578. Si Jamais de temps en temps ça ne passe pas retentez une deuxième fois.
  579. Veuillez noter aussi qu'il vous faut un ordinateur Windows ou linux (Mac est incompatible pour l'instant).
  580. 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é
  581.  
  582. Merci d'avoir lu notre explication
  583. Vive vStream !!!!""", title="Fonctionnement du site")
  584.  
  585.  
  586. def showSearch():
  587. oGui = cGui()
  588. oInputParameterHandler = cInputParameterHandler()
  589. sUrl = oInputParameterHandler.getValue('siteUrl')
  590.  
  591. sSearchText = oGui.showKeyBoard()
  592. if (sSearchText != False):
  593. sUrl = sUrl + sSearchText # + '&search_start=0'
  594. showMovies(sUrl)
  595. oGui.setEndOfDirectory()
  596. return
  597.  
  598.  
  599. def showGenre():
  600. oGui = cGui()
  601. oInputParameterHandler = cInputParameterHandler()
  602. sUrl = oInputParameterHandler.getValue('siteUrl')
  603. URL_MOVIES = URL_MAIN + sUrl + 'genre-'
  604.  
  605. listeGenres = ['Action', 'Animation', 'Arts Martiaux', 'Aventure', 'Biopic', 'Bollywood', 'Comédie Dramatique',
  606. 'Comédie Musicale', 'Comédie', 'Documentaire', 'Drame', 'Epouvante-horreur', 'Espionnage',
  607. 'Famille', 'Fantastique', 'Guerre', 'Historique', 'Horreur', 'Musical', 'Péplum',
  608. 'Policier', 'Romance', 'Science Fiction', 'Thriller', 'Western']
  609. for genre in listeGenres:
  610. oOutputParameterHandler = cOutputParameterHandler()
  611. oOutputParameterHandler.addParameter('siteUrl', URL_MOVIES + genre.replace(' ', '%20') + '/')
  612. oGui.addDir(SITE_IDENTIFIER, 'showMovies', genre, 'genres.png', oOutputParameterHandler)
  613.  
  614. oGui.setEndOfDirectory()
  615.  
  616. def showMovies(sSearch=''):
  617. oGui = cGui()
  618. oParser = cParser()
  619. oInputParameterHandler = cInputParameterHandler()
  620. sUrl = oInputParameterHandler.getValue('siteUrl')
  621.  
  622. if sSearch:
  623. sUrl = sSearch
  624.  
  625. if sSearch or "index" in sUrl: # en mode recherche
  626. 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">'
  627. elif 'collections/' in sUrl:
  628. sPattern = 'class="mov-t nowrap" href=".+?".+?<img src="\/([^"]+)" width="200px" height="320px" title="([^"]+)".+?data-link="([^"]+)"'
  629. else:
  630. sPattern = 'class="mov-t nowrap" href="([^"]+)"> <.+?data-content="([^"]+)".+?img src="([^"]+)".+?title="([^"]+)"'
  631.  
  632. oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
  633. oRequestHandler.addHeaderEntry('User-Agent', UA)
  634. oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
  635. sHtmlContent = oRequestHandler.request()
  636.  
  637. aResult = oParser.parse(sHtmlContent, sPattern)
  638. # VSlog(aResult)
  639.  
  640. titles = set()
  641. if (aResult[0] == True):
  642. total = len(aResult[1])
  643. progress_ = progress().VScreate(SITE_NAME)
  644. for aEntry in aResult[1]:
  645. progress_.VSupdate(progress_, total)
  646. if progress_.iscanceled():
  647. break
  648.  
  649. if 'collections/' in sUrl:
  650. sThumb = aEntry[0]
  651. sTitle = aEntry[1]
  652. sUrl2 = aEntry[2]
  653. sDesc = ""
  654. elif sSearch or "index" in sUrl:
  655. sUrl2 = aEntry[0]
  656. sTitle = aEntry[1]
  657. sDesc = aEntry[2]
  658. sThumb = URL_MAIN + aEntry[3]
  659. else:
  660. sUrl2 = aEntry[0]
  661. sDesc = aEntry[1]
  662. sThumb = URL_MAIN + aEntry[2]
  663. sTitle = aEntry[3]
  664.  
  665. # Enlever les films en doublons (même titre)
  666. # il s'agit du même film dans une autre qualité qu'on retrouvera au moment du choix de la qualité
  667. key = sTitle
  668. if key in titles:
  669. continue
  670. titles.add(key)
  671.  
  672. # sDesc = re.sub('<[^<]+?>', '', sDesc)
  673. sDisplayTitle = sTitle
  674.  
  675. oOutputParameterHandler = cOutputParameterHandler()
  676. oOutputParameterHandler.addParameter('siteUrl', sUrl2)
  677. oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
  678. oOutputParameterHandler.addParameter('sThumb', sThumb)
  679. oOutputParameterHandler.addParameter('sDesc', sDesc)
  680.  
  681. if 'series' in sUrl2 or 'animes' in sUrl2:
  682. oGui.addTV(SITE_IDENTIFIER, 'showSeriesLinks', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
  683. elif 'collections/' in sUrl:
  684. oGui.addMoviePack(SITE_IDENTIFIER, 'showCollec', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
  685. else:
  686. oGui.addMovie(SITE_IDENTIFIER, 'showMoviesLinks', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
  687.  
  688. progress_.VSclose(progress_)
  689.  
  690. if 'index' in sUrl:
  691. sPattern = '<a name="nextlink".+?javascript:list_submit\((.+?)\)'
  692. aResult = oParser.parse(sHtmlContent, sPattern)
  693. if (aResult[0] == True):
  694. oOutputParameterHandler = cOutputParameterHandler()
  695. oOutputParameterHandler.addParameter('siteUrl', re.sub('search_start=(\d+)', 'search_start=' + str(aResult[1][0]), sUrl))
  696. number = re.search('([0-9]+)', aResult[1][0]).group(1)
  697. oGui.addNext(SITE_IDENTIFIER, 'showMovies', '[COLOR teal]Page ' + number + ' >>>[/COLOR]', oOutputParameterHandler)
  698. else:
  699. sNextPage = __checkForNextPage(sHtmlContent)
  700. if (sNextPage != False):
  701. oOutputParameterHandler = cOutputParameterHandler()
  702. oOutputParameterHandler.addParameter('siteUrl', sNextPage)
  703. number = re.search('/page/([0-9]+)', sNextPage).group(1)
  704. oGui.addNext(SITE_IDENTIFIER, 'showMovies', '[COLOR teal]Page ' + number + ' >>>[/COLOR]', oOutputParameterHandler)
  705.  
  706. if not sSearch:
  707. oGui.setEndOfDirectory()
  708.  
  709.  
  710. def __checkForNextPage(sHtmlContent):
  711. oParser = cParser()
  712. sPattern = 'href="([^"]+)"><span class="fa fa-arrow-right">'
  713. aResult = oParser.parse(sHtmlContent, sPattern)
  714. if (aResult[0] == True):
  715. nextPage = aResult[1][0]
  716. if not nextPage.startswith('https'):
  717. nextPage = URL_MAIN[:-1] + nextPage
  718. return nextPage
  719. return False
  720.  
  721.  
  722. def showCollec():
  723. oGui = cGui()
  724. oParser = cParser()
  725. oInputParameterHandler = cInputParameterHandler()
  726. sUrl = oInputParameterHandler.getValue('siteUrl')
  727.  
  728. sPattern = 'class="mov-t nowrap" href="([^"]+)">.+?data-content="([^"]+)".+?<img src="\/([^"]+)".+?title="([^"]+)"'
  729.  
  730. oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
  731. oRequestHandler.addHeaderEntry('User-Agent', UA)
  732. oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
  733. sHtmlContent = oRequestHandler.request()
  734.  
  735. aResult = oParser.parse(sHtmlContent, sPattern)
  736.  
  737. titles = set()
  738. if (aResult[0] == True):
  739. total = len(aResult[1])
  740. progress_ = progress().VScreate(SITE_NAME)
  741. for aEntry in aResult[1]:
  742. progress_.VSupdate(progress_, total)
  743. if progress_.iscanceled():
  744. break
  745.  
  746. sUrl2 = aEntry[0]
  747. sDesc = aEntry[1]
  748. sThumb = aEntry[2]
  749. sTitle = aEntry[3]
  750.  
  751. # Enlever les films en doublons (même titre)
  752. # il s'agit du même film dans une autre qualité qu'on retrouvera au moment du choix de la qualité
  753. key = sTitle
  754. if key in titles:
  755. continue
  756. titles.add(key)
  757.  
  758. sDesc = re.sub('<[^<]+?>', '', sDesc)
  759. sDisplayTitle = sTitle
  760.  
  761. if not sThumb.startswith('http'):
  762. sThumb = URL_MAIN[:-1] + sThumb
  763.  
  764. if not sUrl2.startswith('http'):
  765. sUrl2 = URL_MAIN[:-1] + sUrl2
  766.  
  767. oOutputParameterHandler = cOutputParameterHandler()
  768. oOutputParameterHandler.addParameter('siteUrl', sUrl2)
  769. oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
  770. oOutputParameterHandler.addParameter('sThumb', sThumb)
  771. oOutputParameterHandler.addParameter('sDesc', sDesc)
  772.  
  773. oGui.addMovie(SITE_IDENTIFIER, 'showMoviesLinks', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
  774.  
  775. progress_.VSclose(progress_)
  776.  
  777. oGui.setEndOfDirectory()
  778.  
  779.  
  780. def showMoviesLinks():
  781. oGui = cGui()
  782. oParser = cParser()
  783. oInputParameterHandler = cInputParameterHandler()
  784. sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  785. sUrl = oInputParameterHandler.getValue('siteUrl')
  786. sThumb = oInputParameterHandler.getValue('sThumb')
  787. sDesc = oInputParameterHandler.getValue('sDesc')
  788.  
  789. oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
  790. oRequestHandler.addHeaderEntry('User-Agent', UA)
  791. oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
  792. sHtmlContent = oRequestHandler.request()
  793.  
  794. # Affichage du texte
  795. oGui.addText(SITE_IDENTIFIER, '[COLOR olive]Qualités disponibles pour ce film:[/COLOR]')
  796.  
  797. # récupération du Synopsis
  798. sPattern = '<span data-slice="200" itemprop="description">(.+?)</span>'
  799. aResult = oParser.parse(sHtmlContent, sPattern)
  800. if aResult[0]:
  801. sDesc = aResult[1][0]
  802. sDesc = sDesc.replace('<span>', '').replace('</span>', '')
  803. sDesc = sDesc.replace('<b>', '').replace('</b>', '')
  804. sDesc = sDesc.replace('<i>', '').replace('</i>', '')
  805. sDesc = sDesc.replace('<br>', '').replace('<br />', '')
  806.  
  807. # on recherche d'abord la qualité courante
  808. sPattern = 'couleur-qualitesz"> *Qualité (.+?) <.+?"couleur-languesz">(.+?)</span>'
  809. aResult = oParser.parse(sHtmlContent, sPattern)
  810.  
  811. sTitle = sMovieTitle
  812. sQual = ''
  813. if (aResult[0]):
  814. sQual = aResult[1][0][0]
  815. sLang = aResult[1][0][1]
  816. sTitle = ('%s [%s] (%s)') % (sMovieTitle, sQual, sLang)
  817.  
  818. # On ajoute le lien même si on n'a pas réussi à déterminer la qualité
  819. oOutputParameterHandler = cOutputParameterHandler()
  820. oOutputParameterHandler.addParameter('siteUrl', sUrl)
  821. oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  822. oOutputParameterHandler.addParameter('sThumb', sThumb)
  823. oOutputParameterHandler.addParameter('sDesc', sDesc)
  824.  
  825. oGui.addLink(SITE_IDENTIFIER, 'showHosters', sTitle, sThumb, sDesc, oOutputParameterHandler)
  826.  
  827. # on regarde si dispo dans d'autres qualités
  828. sPattern = '<a href="([^"]+)"><span class="otherquality">.+?<b>([^<>]+)</b>.+?<b>([^<>]+)</b>'
  829. aResult = oParser.parse(sHtmlContent, sPattern)
  830.  
  831. if (aResult[0] == True):
  832. for aEntry in aResult[1]:
  833. sUrl2 = aEntry[0]
  834. sQual = aEntry[1]
  835. sLang = aEntry[2]
  836. sTitle = ('%s [%s] %s') % (sMovieTitle, sQual, sLang)
  837.  
  838. oOutputParameterHandler = cOutputParameterHandler()
  839. oOutputParameterHandler.addParameter('siteUrl', sUrl2)
  840. oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  841. oOutputParameterHandler.addParameter('sThumb', sThumb)
  842. oOutputParameterHandler.addParameter('sDesc', sDesc)
  843. oGui.addLink(SITE_IDENTIFIER, 'showHosters', sTitle, sThumb, sDesc, oOutputParameterHandler)
  844.  
  845. # Qualité STREAMING
  846. sPattern = '<a rel=\'nofollow\' class=\'streaming\' href="([^"]+?)"'
  847. aResult = oParser.parse(sHtmlContent, sPattern)
  848.  
  849. if (aResult[0] == True):
  850. sUrl2 = URL_MAIN + aResult[1][0]
  851. sTitle = ('%s [STREAMING]') % (sMovieTitle)
  852.  
  853. oOutputParameterHandler = cOutputParameterHandler()
  854. oOutputParameterHandler.addParameter('siteUrl', sUrl2)
  855. oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  856. oOutputParameterHandler.addParameter('sThumb', sThumb)
  857. oOutputParameterHandler.addParameter('sDesc', sDesc)
  858. oGui.addLink(SITE_IDENTIFIER, 'showHostersLink', sTitle, sThumb, sDesc, oOutputParameterHandler)
  859.  
  860. oGui.setEndOfDirectory()
  861.  
  862.  
  863. def showSeriesLinks():
  864. oGui = cGui()
  865. oParser = cParser()
  866. oInputParameterHandler = cInputParameterHandler()
  867. sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  868. sUrl = oInputParameterHandler.getValue('siteUrl')
  869. sThumb = oInputParameterHandler.getValue('sThumb')
  870. sDesc = oInputParameterHandler.getValue('sDesc')
  871.  
  872. oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
  873. oRequestHandler.addHeaderEntry('User-Agent', UA)
  874. oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
  875. sHtmlContent = oRequestHandler.request()
  876.  
  877. # Affichage du texte
  878. oGui.addText(SITE_IDENTIFIER, '[COLOR olive]Qualités disponibles pour cette saison :[/COLOR]')
  879.  
  880. # récupération du Synopsis
  881. try:
  882. sPattern = '<span data-slice="200" itemprop="description">(.+?)</span>'
  883. aResult = oParser.parse(sHtmlContent, sPattern)
  884. if aResult[0]:
  885. sDesc = aResult[1][0]
  886. sDesc = sDesc.replace('<span>', '').replace('</span>', '')
  887. sDesc = sDesc.replace('<b>', '').replace('</b>', '')
  888. sDesc = sDesc.replace('<i>', '').replace('</i>', '')
  889. sDesc = sDesc.replace('<br>', '').replace('<br />', '')
  890. except:
  891. pass
  892.  
  893. # Mise à jour du titre
  894. sPattern = '<h2>T.+?charger <b itemprop="name">(.+?)</b>.+?>(.+?)</span>'
  895. aResult = oParser.parse(sHtmlContent, sPattern)
  896.  
  897. sTitle = sMovieTitle
  898. if (aResult[0]):
  899. sTitle = aResult[1][0][0] + " " + aResult[1][0][1]
  900.  
  901. numSaison = str(aResult[1][0][1]).lower().replace("saison", "").strip()
  902. saisons = []
  903. saisons.append(numSaison)
  904.  
  905. # on recherche d'abord la qualité courante
  906. sPattern = 'couleur-qualitesz">Qualit.+? (.+?) <.+?couleur-languesz">(.+?)</span><br>.+?"couleur-seriesz">(.+?)\['
  907. aResult = oParser.parse(sHtmlContent, sPattern)
  908.  
  909. sDisplayTitle = sTitle
  910. sQual = ''
  911. if (aResult[0]):
  912. sQual = aResult[1][0][0]
  913. sLang = aResult[1][0][1]
  914. sDisplayTitle = ('%s [%s] (%s)') % (sTitle, sQual, sLang)
  915.  
  916. oOutputParameterHandler = cOutputParameterHandler()
  917. oOutputParameterHandler.addParameter('siteUrl', sUrl)
  918. oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  919. oOutputParameterHandler.addParameter('sThumb', sThumb)
  920. oOutputParameterHandler.addParameter('sDesc', sDesc)
  921. oGui.addEpisode(SITE_IDENTIFIER, 'showSeriesHosters', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
  922.  
  923. # on regarde si dispo dans d'autres qualités
  924. sHtmlContent1 = CutQual(sHtmlContent)
  925. sPattern1 = '<a href="([^"]+)"><span class="otherquality">.+?<b>([^"]+)</b>.+?<b>([^"]+)</b>.+?<b> (.+?)<'
  926. aResult1 = oParser.parse(sHtmlContent1, sPattern1)
  927.  
  928. otherSaison = False
  929.  
  930. if (aResult1[0] == True):
  931. for aEntry in aResult1[1]:
  932. # Si saison différente
  933. sSaison = aEntry[1].strip()
  934. if numSaison != sSaison:
  935. otherSaison = True
  936. continue
  937.  
  938. sQual = aEntry[2]
  939. sLang = aEntry[3]
  940. sDisplayTitle = ('%s [%s] %s') % (sTitle, sQual, sLang)
  941.  
  942. sUrl = aEntry[0]
  943. oOutputParameterHandler = cOutputParameterHandler()
  944. oOutputParameterHandler.addParameter('siteUrl', sUrl)
  945. oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  946. oOutputParameterHandler.addParameter('sThumb', sThumb)
  947. oOutputParameterHandler.addParameter('sDesc', sDesc)
  948. oGui.addEpisode(SITE_IDENTIFIER, 'showSeriesHosters', sDisplayTitle, 'series.png', sThumb, sDesc, oOutputParameterHandler)
  949.  
  950. # on regarde si dispo d'autres saisons
  951. if (otherSaison):
  952.  
  953. # Affichage du titre
  954. oGui.addText(SITE_IDENTIFIER, '[COLOR olive]Autres saisons disponibles pour cette série :[/COLOR]')
  955.  
  956. # Une ligne par saison, pas besoin d'afficher les qualités ici
  957. for aEntry in aResult1[1]:
  958.  
  959. sSaison = aEntry[1].strip()
  960. if sSaison in saisons:
  961. continue
  962. saisons.append(sSaison)
  963. sSaison = 'Saison ' + sSaison
  964. sDisplayTitle = ('%s %s') % (sMovieTitle, sSaison)
  965.  
  966. sUrl = aEntry[0]
  967.  
  968. oOutputParameterHandler = cOutputParameterHandler()
  969. oOutputParameterHandler.addParameter('siteUrl', sUrl)
  970. oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  971. oOutputParameterHandler.addParameter('sThumb', sThumb)
  972. oOutputParameterHandler.addParameter('sDesc', sDesc)
  973. oGui.addEpisode(SITE_IDENTIFIER, 'showSeriesLinks', sDisplayTitle, 'series.png', sThumb, sDesc, oOutputParameterHandler)
  974.  
  975. oGui.setEndOfDirectory()
  976.  
  977.  
  978. def showHosters():
  979. oGui = cGui()
  980. oInputParameterHandler = cInputParameterHandler()
  981. sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  982. sUrl = oInputParameterHandler.getValue('siteUrl')
  983. sThumb = oInputParameterHandler.getValue('sThumb')
  984. sDesc = oInputParameterHandler.getValue('sDesc')
  985. #oGui.addText(SITE_IDENTIFIER, '[COLOR blue]Veuillez attendre que le navigateur se ferme tout seul [/COLOR]')
  986. #oGui.addText(SITE_IDENTIFIER, '[COLOR blue]Pour qu\'il puisse récupérer automatiquement le bon lien [/COLOR]')
  987.  
  988. oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
  989. oRequestHandler.addHeaderEntry('User-Agent', UA)
  990. oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
  991. sHtmlContent = oRequestHandler.request()
  992.  
  993. oParser = cParser()
  994.  
  995. # Ajout des liens DL
  996. # Gere si un Hoster propose plusieurs liens
  997. # Retire les resultats proposés en plusieurs parties (ce sont des .rar)
  998. sPattern = '<th scope="col" class="no-sort"><img src=.+?>([^><]+)</th>|class=\'download\'.+?href=\'([^\']+)\'>T.+?charger <'
  999. aResult = oParser.parse(sHtmlContent, sPattern)
  1000. # VSlog(aResult)
  1001.  
  1002. if (aResult[0] == True):
  1003. for aEntry in aResult[1]:
  1004. if aEntry[0]:
  1005. sHoster = re.sub('\.\w+', '', aEntry[0])
  1006. continue
  1007.  
  1008. # filtrer les hosts connus
  1009. oHoster = cHosterGui().checkHoster(sHoster)
  1010. if not oHoster:
  1011. continue
  1012.  
  1013. sUrl2 = URL_MAIN[:-1] + aEntry[1]
  1014. sTitle = ('%s [COLOR coral]%s[/COLOR]') % (sMovieTitle, sHoster)
  1015.  
  1016. oOutputParameterHandler = cOutputParameterHandler()
  1017. oOutputParameterHandler.addParameter('siteUrl', sUrl2)
  1018. oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  1019. oOutputParameterHandler.addParameter('sThumb', sThumb)
  1020. oOutputParameterHandler.addParameter('sDesc', sDesc)
  1021. oGui.addLink(SITE_IDENTIFIER, 'Display_protected_link', sTitle, sThumb, sDesc, oOutputParameterHandler)
  1022.  
  1023. oGui.setEndOfDirectory()
  1024.  
  1025.  
  1026. def showHostersLink():
  1027. oGui = cGui()
  1028.  
  1029. oInputParameterHandler = cInputParameterHandler()
  1030. sUrl = oInputParameterHandler.getValue('siteUrl')
  1031. sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  1032. sThumb = oInputParameterHandler.getValue('sThumb')
  1033.  
  1034. oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
  1035. oRequestHandler.addHeaderEntry('User-Agent', UA)
  1036. oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
  1037. sHtmlContent = oRequestHandler.request()
  1038.  
  1039. oParser = cParser()
  1040. sPattern = 'src="(.+?)"'
  1041. aResult = oParser.parse(sHtmlContent, sPattern)
  1042.  
  1043. if (aResult[0] == True):
  1044. if not aResult[1][0].startswith('http'):
  1045. sHosterUrl = "https:" + aResult[1][0]
  1046. else:
  1047. sHosterUrl = aResult[1][0]
  1048.  
  1049. oHoster = cHosterGui().checkHoster(sHosterUrl)
  1050. if (oHoster != False):
  1051. oHoster.setDisplayName(sMovieTitle)
  1052. oHoster.setFileName(sMovieTitle)
  1053. cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
  1054.  
  1055. oGui.setEndOfDirectory()
  1056.  
  1057.  
  1058. def showSeriesHosters():
  1059. oGui = cGui()
  1060. oInputParameterHandler = cInputParameterHandler()
  1061. sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  1062. sUrl = oInputParameterHandler.getValue('siteUrl')
  1063. sThumb=oInputParameterHandler.getValue('sThumb')
  1064. sDesc=oInputParameterHandler.getValue('sDesc')
  1065.  
  1066. # oGui.addText(SITE_IDENTIFIER, '[COLOR blue]Veuillez attendre que le navigateur se ferme tout seul [/COLOR]')
  1067. # oGui.addText(SITE_IDENTIFIER, '[COLOR blue]Pour qu\'il puisse récupérer automatiquement le bon lien [/COLOR]')
  1068.  
  1069. oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
  1070. oRequestHandler.addHeaderEntry('User-Agent', UA)
  1071. oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
  1072. sHtmlContent = oRequestHandler.request()
  1073.  
  1074. oParser = cParser()
  1075. sPattern = '<th scope="col" class="no-sort"><img alt=.+?>([^<>]+)</th>|href=\'([^\']+?)\'>Episode ([^>]+)<'
  1076. aResult = oParser.parse(sHtmlContent, sPattern)
  1077.  
  1078. if (aResult[0] == True):
  1079. oGui = cGui()
  1080.  
  1081. for aEntry in aResult[1]:
  1082. if aEntry[0]:
  1083. oGui.addText(SITE_IDENTIFIER, '[COLOR red]' + re.sub('\.\w+', '', aEntry[0]) + '[/COLOR]')
  1084.  
  1085. else:
  1086. sUrl2 = URL_MAIN[:-1] + aEntry[1]
  1087. sTitle = sMovieTitle + ' E' + aEntry[2].replace('FINAL ', '')
  1088. oOutputParameterHandler = cOutputParameterHandler()
  1089. oOutputParameterHandler.addParameter('siteUrl', sUrl2)
  1090. oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  1091. oOutputParameterHandler.addParameter('sThumb', sThumb)
  1092. oGui.addLink(SITE_IDENTIFIER, 'Display_protected_link', sTitle, sThumb, sDesc, oOutputParameterHandler)
  1093.  
  1094. oGui.setEndOfDirectory()
  1095. else: # certains films mals classés apparaissent dans les séries
  1096. showHosters()
  1097.  
  1098.  
  1099. def Display_protected_link():
  1100. # VSlog('Display_protected_link')
  1101. oGui = cGui()
  1102. oParser = cParser()
  1103. oInputParameterHandler = cInputParameterHandler()
  1104. sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  1105. sUrl = oInputParameterHandler.getValue('siteUrl')
  1106. sThumb = oInputParameterHandler.getValue('sThumb')
  1107.  
  1108. # Ne marche pas
  1109. if (False):
  1110. code = {'123455600123455602123455610123455615': 'http://uptobox.com/',
  1111. '1234556001234556071234556111234556153': 'http://turbobit.net/',
  1112. '123455600123455605123455615': 'http://ul.to/',
  1113. '123455600123455608123455610123455615': 'http://nitroflare.com/',
  1114. '123455601123455603123455610123455615123455617': 'https://1fichier.com/?',
  1115. '123455600123455606123455611123455615': 'http://rapidgator.net/'}
  1116.  
  1117. for k in code:
  1118. match = re.search(k + '(.+)$', sUrl)
  1119. if match:
  1120. sHosterUrl = code[k] + match.group(1)
  1121. sHosterUrl = sHosterUrl.replace('123455615', '/')
  1122. oHoster = cHosterGui().checkHoster(sHosterUrl)
  1123. if (oHoster != False):
  1124. oHoster.setDisplayName(sMovieTitle)
  1125. oHoster.setFileName(sMovieTitle)
  1126. cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
  1127. oGui.setEndOfDirectory()
  1128. return
  1129.  
  1130. if 'link' in sUrl:
  1131. # Temporairement car la flemme de se battre avec les redirections
  1132. # oRequestHandler = cRequestHandler(sUrl)
  1133. # oRequestHandler.addHeaderEntry('User-Agent', UA)
  1134. oRequestHandler = cRequestHandler(sUrl.replace(' ', '%20'))
  1135. oRequestHandler.addHeaderEntry('User-Agent', UA)
  1136. oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
  1137. sHtmlContent = oRequestHandler.request()
  1138. sUrl = oRequestHandler.getRealUrl()
  1139. # VSlog(sUrl)
  1140.  
  1141. if "journaldupirate" in sUrl:
  1142. sHtmlContent = DecryptDlProtecte(sUrl)
  1143. # VSlog(sHtmlContent)
  1144.  
  1145. if sHtmlContent:
  1146. # Si redirection
  1147. if sHtmlContent.startswith('http'):
  1148. aResult_dlprotecte = (True, [sHtmlContent])
  1149. else:
  1150. sPattern_dlprotecte = '<div class="alert">.+?<a href="(.+?)"'
  1151. aResult_dlprotecte = oParser.parse(sHtmlContent, sPattern_dlprotecte)
  1152.  
  1153. else:
  1154. dialog().VSok('Erreur de décryptage du lien')
  1155. aResult_dlprotecte = (False, False)
  1156.  
  1157. # Si lien normal
  1158. else:
  1159. if not sUrl.startswith('http'):
  1160. sUrl = 'http://' + sUrl
  1161. aResult_dlprotecte = (True, [sUrl])
  1162.  
  1163. if (aResult_dlprotecte[0]):
  1164.  
  1165. episode = 1
  1166.  
  1167. for aEntry in aResult_dlprotecte[1]:
  1168. sHosterUrl = aEntry
  1169.  
  1170. sTitle = sMovieTitle
  1171. if len(aResult_dlprotecte[1]) > 1:
  1172. sTitle = sMovieTitle + ' episode ' + episode
  1173.  
  1174. episode += 1
  1175.  
  1176. oHoster = cHosterGui().checkHoster(sHosterUrl)
  1177. if (oHoster != False):
  1178. oHoster.setDisplayName(sTitle)
  1179. oHoster.setFileName(sTitle)
  1180. cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
  1181.  
  1182. oGui.setEndOfDirectory()
  1183.  
  1184.  
  1185. def CutQual(sHtmlContent):
  1186. oParser = cParser()
  1187. sPattern = 'Qualit.+?galement disponibles pour cette saison:</span><br>(.+?)</div>'
  1188. aResult = oParser.parse(sHtmlContent, sPattern)
  1189. if (aResult[0]):
  1190. return aResult[1][0]
  1191. else:
  1192. return sHtmlContent
  1193.  
  1194. return ''
  1195.  
  1196.  
  1197. def CutSais(sHtmlContent):
  1198. oParser = cParser()
  1199. sPattern = '"otherversionsspan">Saisons.+?galement disponibles pour cette série:(.+?)</div>'
  1200. aResult = oParser.parse(sHtmlContent, sPattern)
  1201. if (aResult[0]):
  1202. return aResult[1][0]
  1203. return ''
  1204.  
  1205.  
  1206. def DecryptDlProtecte(url): # Passe par Selenium
  1207. VSlog('DecryptDlProtecte : ' + url)
  1208.  
  1209. if not (url):
  1210. return ''
  1211. try:
  1212. from selenium import webdriver
  1213. from selenium.webdriver.common.driver_utils import get_driver_path
  1214. from selenium.webdriver.support.ui import WebDriverWait
  1215.  
  1216. from selenium.webdriver import Chrome
  1217. from selenium.webdriver.chrome.options import Options
  1218.  
  1219. # from selenium.webdriver.firefox.options import Options
  1220. # from selenium.webdriver import Firefox
  1221.  
  1222. from selenium.webdriver.common.by import By
  1223. from selenium.webdriver.support import expected_conditions as EC
  1224.  
  1225. VSlog("Chargement Selenium ok")
  1226.  
  1227. except:
  1228. pass
  1229.  
  1230. """ Selenium est désactivé car dl protect ne l'utilise plus mais laissé le code quand même"""
  1231.  
  1232. # CloudflarePassed = False
  1233. # driverPath = get_driver_path('chromedriver')
  1234. # options = Options()
  1235. # options.headless = True # Faut le laisser comme ça sinon ça ne fonctionne pas
  1236. # browser = webdriver.Chrome(driverPath, options=options)
  1237. # browser.get(url)
  1238.  
  1239. # On boucle si Cloudflare n'est pas résolu.
  1240. # On loop que 3 fois maxi.
  1241. # loop = 0
  1242. # while CloudflarePassed == False:
  1243. # if loop > 3:
  1244. # break
  1245.  
  1246. # On se sert du cookie pour voir si Cloudflare est résolu
  1247. # Cookies = browser.get_cookies()
  1248. # if "cf_clearance" in str(Cookies):
  1249. # break
  1250.  
  1251. # On récupere le timeout de maniere dynamique
  1252. # try:
  1253. # time.sleep(float(
  1254. # re.search(
  1255. # r'submit\(\);\r?\n\s*},\s*([0-9]+)',
  1256. # browser.page_source
  1257. # ).group(1)
  1258. # ) / float(1000) + 1)
  1259.  
  1260. # except:
  1261. # Sauf sur la nouvelle version où il n'est pas présent
  1262. # time.sleep(6)
  1263.  
  1264. # loop = loop + 1
  1265.  
  1266. # browser.find_element(By.NAME, "submit").click()
  1267. # page_source = (browser.page_source).encode('utf-8', errors='replace')
  1268. # browser.close()
  1269. # print(page_source)
  1270. # VSlog(page_source)
  1271. # return page_source
  1272.  
  1273. """ Nouvelle méthode pour dl protect qui passe par requests"""
  1274. s = requests.Session()
  1275.  
  1276. response = s.get(url)
  1277. sHtmlContent = str(response.content)
  1278. cookie_string = "; ".join([str(x)+"="+str(y) for x,y in s.cookies.items()])
  1279.  
  1280. sPattern = 'type="hidden" name="_token" value="(.+?)">'
  1281. aResult = re.search(sPattern, sHtmlContent).group(1)
  1282.  
  1283. oRequestHandler = cRequestHandler(url)
  1284. oRequestHandler.setRequestType(1)
  1285. oRequestHandler.addHeaderEntry('Host', url.split('/')[2])
  1286. oRequestHandler.addHeaderEntry('Referer', url)
  1287. oRequestHandler.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
  1288. oRequestHandler.addHeaderEntry('User-Agent', UA)
  1289. oRequestHandler.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3')
  1290. oRequestHandler.addHeaderEntry('Content-Length', len(str("_token=" + aResult + "&getlink=1")))
  1291. oRequestHandler.addHeaderEntry('Content-Type', "application/x-www-form-urlencoded")
  1292. oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
  1293. oRequestHandler.addHeaderEntry('Cookie', cookie_string)
  1294. oRequestHandler.addParameters("_token", aResult)
  1295. oRequestHandler.addParametersLine("_token=" + aResult + "&getlink=1")
  1296.  
  1297. sHtmlContent = oRequestHandler.request()
  1298.  
  1299. return sHtmlContent
  1300.  
  1301.  
  1302. def exectProtect(cookies, url): # Ne sert plus
  1303. # Tout ca a virer et utiliser oRequestHandler.addMultipartFiled('sess_id': sId, 'upload_type': 'url', 'srv_tmp_url': sTmp) quand ca marchera
  1304. import string
  1305. _BOUNDARY_CHARS = string.digits
  1306. boundary = ''.join(random.choice(_BOUNDARY_CHARS) for i in range(30))
  1307. multipart_form_data = {'hidden': 'continuer', 'hidden': 'Continuer'}
  1308. data, headersMulti = encode_multipart(multipart_form_data, {}, boundary)
  1309.  
  1310. # 2 eme requete pour avoir le lien
  1311. oRequestHandler = cRequestHandler(url)
  1312. oRequestHandler.setRequestType(1)
  1313. oRequestHandler.addHeaderEntry('Host', url.split('/')[2])
  1314. oRequestHandler.addHeaderEntry('Referer', url)
  1315. oRequestHandler.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
  1316. oRequestHandler.addHeaderEntry('User-Agent', UA)
  1317. oRequestHandler.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3')
  1318. oRequestHandler.addHeaderEntry('Content-Length', headersMulti['Content-Length'])
  1319. oRequestHandler.addHeaderEntry('Content-Type', headersMulti['Content-Type'])
  1320. oRequestHandler.addHeaderEntry('Cookie', cookies)
  1321. oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
  1322.  
  1323. oRequestHandler.addParametersLine(data)
  1324.  
  1325. sHtmlContent = oRequestHandler.request()
  1326. return sHtmlContent
  1327.  
  1328. # ******************************************************************************
  1329. # from http://code.activestate.com/recipes/578668-encode-multipart-form-data-for-uploading-files-via/
  1330.  
  1331.  
  1332. """Encode multipart form data to upload files via POST."""
  1333.  
  1334.  
  1335. def encode_multipart(fields, files, boundary):
  1336. r"""Encode dict of form fields and dict of files as multipart/form-data.
  1337. Return tuple of (body_string, headers_dict). Each value in files is a dict
  1338. with required keys 'filename' and 'content', and optional 'mimetype' (if
  1339. not specified, tries to guess mime type or uses 'application/octet-stream').
  1340.  
  1341. >>> body, headers = encode_multipart({'FIELD': 'VALUE'},
  1342. ... {'FILE': {'filename': 'F.TXT', 'content': 'CONTENT'}},
  1343. ... boundary='BOUNDARY')
  1344. >>> print('\n'.join(repr(l) for l in body.split('\r\n')))
  1345. '--BOUNDARY'
  1346. 'Content-Disposition: form-data; name="FIELD"'
  1347. ''
  1348. 'VALUE'
  1349. '--BOUNDARY'
  1350. 'Content-Disposition: form-data; name="FILE"; filename="F.TXT"'
  1351. 'Content-Type: text/plain'
  1352. ''
  1353. 'CONTENT'
  1354. '--BOUNDARY--'
  1355. ''
  1356. >>> print(sorted(headers.items()))
  1357. [('Content-Length', '193'), ('Content-Type', 'multipart/form-data; boundary=BOUNDARY')]
  1358. >>> len(body)
  1359. 193
  1360. """
  1361.  
  1362. import mimetypes
  1363. import string
  1364.  
  1365. _BOUNDARY_CHARS = string.digits
  1366.  
  1367. def escape_quote(s):
  1368. return s.replace('"', '\\"')
  1369.  
  1370. lines = []
  1371.  
  1372. for name, value in fields.items():
  1373. lines.extend((
  1374. '-----------------------------{0}'.format(boundary),
  1375. 'Content-Disposition: form-data; name="{0}"'.format(escape_quote(name)),
  1376. '',
  1377. str(value),
  1378. '-----------------------------{0}--'.format(boundary),
  1379. ''))
  1380.  
  1381. for name, value in files.items():
  1382. filename = value['filename']
  1383. if 'mimetype' in value:
  1384. mimetype = value['mimetype']
  1385. else:
  1386. mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
  1387. lines.extend((
  1388. '--{0}'.format(boundary),
  1389. 'Content-Disposition: form-data; name="{0}"'.format(escape_quote(name), escape_quote(filename)),
  1390. 'Content-Type: {0}'.format(mimetype),
  1391. '',
  1392. value['content']))
  1393.  
  1394. body = '\r\n'.join(lines)
  1395.  
  1396. headers = {'Content-Type': 'multipart/form-data; boundary=---------------------------{0}'.format(boundary),
  1397. 'Content-Length': str(len(body))}
  1398.  
  1399. return (body, headers)
Advertisement
Add Comment
Please, Sign In to add comment