Advertisement
Guest User

Untitled

a guest
Jul 20th, 2018
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 37.87 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.util import cUtil
  10. from resources.lib.comaddon import progress, dialog, VSlog
  11.  
  12. import urllib, re, urllib2
  13. import random
  14.  
  15. #from resources.lib.dl_deprotect import DecryptDlProtect
  16.  
  17. UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0'
  18. headers = { 'User-Agent' : UA }
  19.  
  20. SITE_IDENTIFIER = 'zone_telechargement_ws'
  21. SITE_NAME = '[COLOR violet]Zone-Telechargement[/COLOR]'
  22. SITE_DESC = 'Fichier en DDL, HD'
  23.  
  24. URL_MAIN = 'https://ww2.zone-telechargement1.ws/' #Le https ne marche pas bien sur zt erreur SSL
  25. URL_DECRYPT =  ''
  26.  
  27. URL_SEARCH = (URL_MAIN + 'index.php?', 'showMovies')
  28. URL_SEARCH_MOVIES = (URL_MAIN + 'index.php?', 'showMovies')
  29. URL_SEARCH_SERIES = (URL_MAIN  + 'index.php?', 'showMovies')
  30. FUNCTION_SEARCH = 'showMovies'
  31.  
  32. MOVIE_NEWS = (URL_MAIN + 'nouveaute/', 'showMovies') # films (derniers ajouts)
  33. MOVIE_EXCLUS = (URL_MAIN + 'exclus/', 'showMovies') # exclus (films populaires)
  34. MOVIE_3D = (URL_MAIN + 'films-bluray-3d/', 'showMovies') # films en 3D
  35. MOVIE_HD = (URL_MAIN + 'films-bluray-hd/', 'showMovies') # films en HD
  36. MOVIE_HDLIGHT = (URL_MAIN + 'x265-x264-hdlight/', 'showMovies') # films en x265 et x264
  37. MOVIE_VOSTFR = (URL_MAIN + 'filmsenvostfr/', 'showMovies') # films VOSTFR
  38. MOVIE_4K = (URL_MAIN + 'film-ultra-hd-4k/', 'showMovies') # films "4k"
  39.  
  40. MOVIE_ANIME = (URL_MAIN + 'dessins-animes/', 'showMovies') # dessins animes
  41.  
  42. SERIE_VFS = (URL_MAIN + 'series-vf/', 'showMovies') # serie VF
  43. SERIE_VOSTFRS = (URL_MAIN + 'series-vostfr/', 'showMovies') # serie VOSTFR
  44.  
  45. ANIM_VFS = (URL_MAIN + 'animes-vf/', 'showMovies')
  46. ANIM_VOSTFRS = (URL_MAIN + 'animes-vostfr/', 'showMovies')
  47.  
  48. DOC_NEWS = (URL_MAIN + 'documentaires-gratuit/', 'showMovies') # docs
  49. DOC_DOCS = ('http://', 'load')
  50.  
  51. SPORT_SPORTS = (URL_MAIN + 'sport/', 'showMovies') # sports
  52. TV_NEWS = (URL_MAIN + 'emissions-tv/', 'showMovies') # dernieres emissions tv
  53. SPECT_NEWS = (URL_MAIN + 'spectacles/', 'showMovies') # dernieres spectacles
  54. CONCERT_NEWS = (URL_MAIN + 'concerts/', 'showMovies') # dernieres concerts
  55. AUTOFORM_VID = (URL_MAIN + 'autoformations-videos/', 'showMovies')
  56.  
  57. def load():
  58.     oGui = cGui()
  59.  
  60.     oOutputParameterHandler = cOutputParameterHandler()
  61.     oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
  62.     oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche', 'search.png', oOutputParameterHandler)
  63.  
  64.     oOutputParameterHandler = cOutputParameterHandler()
  65.     oOutputParameterHandler.addParameter('siteUrl', MOVIE_NEWS[0])
  66.     oGui.addDir(SITE_IDENTIFIER, MOVIE_NEWS[1], 'Films (Derniers ajouts)', 'films_news.png', oOutputParameterHandler)
  67.  
  68.     oOutputParameterHandler = cOutputParameterHandler()
  69.     oOutputParameterHandler.addParameter('siteUrl', MOVIE_EXCLUS[0])
  70.     oGui.addDir(SITE_IDENTIFIER, MOVIE_EXCLUS[1], 'Exclus (Films populaires)', 'news.png', oOutputParameterHandler)
  71.  
  72.     oOutputParameterHandler = cOutputParameterHandler()
  73.     oOutputParameterHandler.addParameter('siteUrl', MOVIE_HD[0])
  74.     oGui.addDir(SITE_IDENTIFIER, MOVIE_HD[1], 'Blu-rays (720p & 1080p)', 'films_hd.png', oOutputParameterHandler)
  75.  
  76.     oOutputParameterHandler = cOutputParameterHandler()
  77.     oOutputParameterHandler.addParameter('siteUrl', MOVIE_3D[0])
  78.     oGui.addDir(SITE_IDENTIFIER, MOVIE_3D[1], 'Films 3D', 'news.png', oOutputParameterHandler)
  79.  
  80.     oOutputParameterHandler = cOutputParameterHandler()
  81.     oOutputParameterHandler.addParameter('siteUrl', MOVIE_HDLIGHT[0])
  82.     oGui.addDir(SITE_IDENTIFIER, MOVIE_HDLIGHT[1], 'Films (x265 & x264)', 'films_hd.png', oOutputParameterHandler)
  83.  
  84.     oOutputParameterHandler = cOutputParameterHandler()
  85.     oOutputParameterHandler.addParameter('siteUrl', MOVIE_4K[0])
  86.     oGui.addDir(SITE_IDENTIFIER, MOVIE_4K[1], 'Films 4k', 'films_hd.png', oOutputParameterHandler)
  87.  
  88.     oOutputParameterHandler = cOutputParameterHandler()
  89.     oOutputParameterHandler.addParameter('siteUrl', MOVIE_ANIME[0])
  90.     oGui.addDir(SITE_IDENTIFIER, MOVIE_ANIME[1], 'Dessins Animés', 'animes.png', oOutputParameterHandler)
  91.  
  92.     #oOutputParameterHandler = cOutputParameterHandler()
  93.     #oOutputParameterHandler.addParameter('siteUrl', MOVIE_GENRES[0])
  94.     #oGui.addDir(SITE_IDENTIFIER, MOVIE_GENRES[1], 'Films (Genres)', 'films_genres.png', oOutputParameterHandler)
  95.  
  96.     oOutputParameterHandler = cOutputParameterHandler()
  97.     oOutputParameterHandler.addParameter('siteUrl', SERIE_VFS[0])
  98.     oGui.addDir(SITE_IDENTIFIER, SERIE_VFS[1], 'Séries VF (Derniers ajouts)', 'series_vf.png', oOutputParameterHandler)
  99.  
  100.     oOutputParameterHandler = cOutputParameterHandler()
  101.     oOutputParameterHandler.addParameter('siteUrl', SERIE_VOSTFRS[0])
  102.     oGui.addDir(SITE_IDENTIFIER, SERIE_VOSTFRS[1], 'Séries VOSTFR (Derniers ajouts)', 'series_vostfr.png', oOutputParameterHandler)
  103.  
  104.     oOutputParameterHandler = cOutputParameterHandler()
  105.     oOutputParameterHandler.addParameter('siteUrl', ANIM_VFS[0])
  106.     oGui.addDir(SITE_IDENTIFIER, ANIM_VFS[1], 'Animés VF', 'animes_vf.png', oOutputParameterHandler)
  107.  
  108.     oOutputParameterHandler = cOutputParameterHandler()
  109.     oOutputParameterHandler.addParameter('siteUrl', ANIM_VOSTFRS[0])
  110.     oGui.addDir(SITE_IDENTIFIER, ANIM_VOSTFRS[1], 'Animés VOSTFR', 'animes_vostfr.png', oOutputParameterHandler)
  111.  
  112.     oOutputParameterHandler = cOutputParameterHandler()
  113.     oOutputParameterHandler.addParameter('siteUrl', DOC_NEWS[0])
  114.     oGui.addDir(SITE_IDENTIFIER, DOC_NEWS[1], 'Documentaires', 'doc.png', oOutputParameterHandler)
  115.  
  116.     oOutputParameterHandler = cOutputParameterHandler()
  117.     oOutputParameterHandler.addParameter('siteUrl', TV_NEWS[0])
  118.     oGui.addDir(SITE_IDENTIFIER, TV_NEWS[1], 'Emissions TV', 'tv.png', oOutputParameterHandler)
  119.  
  120.     oOutputParameterHandler = cOutputParameterHandler()
  121.     oOutputParameterHandler.addParameter('siteUrl', SPECT_NEWS[0])
  122.     oGui.addDir(SITE_IDENTIFIER, SPECT_NEWS[1], 'Spectacles', 'star.png', oOutputParameterHandler)
  123.  
  124.     oGui.setEndOfDirectory()
  125.  
  126. def showSearch():
  127.     oGui = cGui()
  128.     sSearchText = oGui.showKeyBoard()
  129.     if (sSearchText != False):
  130.         sUrl = sSearchText
  131.         showMovies(sUrl)
  132.         oGui.setEndOfDirectory()
  133.         return
  134.  
  135. def showGenre(basePath):
  136.     oGui = cGui()
  137.  
  138.     liste = []
  139.     liste.append( ['Action', URL_MAIN + basePath + '?genrelist[]=1'] )
  140.     liste.append( ['Animation', URL_MAIN +  basePath + '?genrelist[]=2'] )
  141.     liste.append( ['Arts Martiaux', URL_MAIN +  basePath + '?genrelist[]=3'] )
  142.     liste.append( ['Aventure', URL_MAIN +  basePath + '?genrelist[]=4'] )
  143.     liste.append( ['Biopic', URL_MAIN +  basePath + '?genrelist[]=5'] )
  144.     liste.append( ['Comédie Dramatique', URL_MAIN +  basePath + '?genrelist[]=7'] )
  145.     liste.append( ['Comédie Musicale', URL_MAIN +  basePath + '?genrelist[]=8'] )
  146.     liste.append( ['Comédie', URL_MAIN +  basePath + '?genrelist[]=9'] )
  147.     liste.append( ['Divers', URL_MAIN +  basePath + '?genrelist[]=10'] )
  148.     liste.append( ['Documentaires', URL_MAIN +  basePath + '?genrelist[]=11'] )
  149.     liste.append( ['Drame', URL_MAIN +  basePath + '?genrelist[]=12'] )
  150.     liste.append( ['Epouvante Horreur', URL_MAIN +  basePath + '?genrelist[]=13'] )
  151.     liste.append( ['Espionnage', URL_MAIN +  basePath + '?genrelist[]=14'] )
  152.     liste.append( ['Famille', URL_MAIN +  basePath + '?genrelist[]=15'] )
  153.     liste.append( ['Fantastique', URL_MAIN +  basePath + '?genrelist[]=16'] )
  154.     liste.append( ['Guerre', URL_MAIN +  basePath + '?genrelist[]=17'] )
  155.     liste.append( ['Historique', URL_MAIN +  basePath + '?genrelist[]=18'] )
  156.     liste.append( ['Musical', URL_MAIN +  basePath + '?genrelist[]=19'] )
  157.     liste.append( ['Péplum', URL_MAIN +  basePath + '?genrelist[]=6'] )
  158.     liste.append( ['Policier', URL_MAIN +  basePath + '?genrelist[]=20'] )
  159.     liste.append( ['Romance', URL_MAIN +  basePath + '?genrelist[]=21'] )
  160.     liste.append( ['Science Fiction', URL_MAIN +  basePath + '?genrelist[]=22'] )
  161.     liste.append( ['Thriller', URL_MAIN +  basePath + '?genrelist[]=23'] )
  162.     liste.append( ['Western', URL_MAIN +  basePath + '?genrelist[]=24'] )
  163.  
  164.     for sTitle, sUrl in liste:
  165.  
  166.         oOutputParameterHandler = cOutputParameterHandler()
  167.         oOutputParameterHandler.addParameter('siteUrl', sUrl)
  168.         oGui.addDir(SITE_IDENTIFIER, 'showMovies', sTitle, 'genres.png', oOutputParameterHandler)
  169.  
  170.     oGui.setEndOfDirectory()
  171.  
  172. def showMovies(sSearch = ''):
  173.     oGui = cGui()
  174.    
  175.     oInputParameterHandler = cInputParameterHandler()
  176.     Nextpagesearch = oInputParameterHandler.getValue('Nextpagesearch')
  177.     sUrl = oInputParameterHandler.getValue('siteUrl')
  178.     if Nextpagesearch:
  179.         sSearch = sUrl
  180.    
  181.     bGlobal_Search = False
  182.     qual = False
  183.    
  184.     if sSearch:
  185.  
  186.         if URL_SEARCH[0] in sSearch:
  187.             bGlobal_Search = True
  188.             sSearch=sSearch.replace(URL_SEARCH[0],'')
  189.  
  190.         if Nextpagesearch:
  191.             query_args = (('do', 'search'), ('subaction', 'search'), ('story', sSearch) , ('titleonly', '3') ,('search_start', Nextpagesearch))
  192.         else:
  193.             query_args = (('do', 'search'), ('subaction', 'search'), ('story', sSearch), ('titleonly', '3'))
  194.            
  195.         VSlog(query_args)
  196.  
  197.         url = URL_MAIN + 'index.php?do=search'
  198.         data = urllib.urlencode(query_args)
  199.         request = urllib2.Request(url, data, headers)
  200.         #sPattern = '<a href="(.+?)" *><img class=".+?" src="(.+?)".+?\s*<.+?>\s*<div style=".+?">\s*<.+?>\s*<div style=".+?"><div class=".+?">\s*<div class=".+?\s*<a href=".+?" *>(.+?)<'
  201.         sPattern = '<a href="(.+?)" *><img class="mainimg.+?src="(.+?)"(?:.|\s)+?<a href=".+?" *>(.+?)<'
  202.  
  203.     else:
  204.         request = urllib2.Request(sUrl, None, headers)
  205.         sPattern = '<div style="height:[0-9]{3}px;"> *<a href="([^"]+)"><img class="[^"]+?" data-newsid="[^"]+?" src="([^<"]+)".+?<div class="[^"]+?" style="[^"]+?"> *<a href="[^"]+?"> ([^<]+?)<'
  206.  
  207.     reponse = urllib2.urlopen(request)
  208.     sHtmlContent = reponse.read()
  209.     #VSlog(sHtmlContent)
  210.     reponse.close()
  211.    
  212.     #fh = open('c:\\test.txt', "w")
  213.     #fh.write(sHtmlContent)
  214.     #fh.close()
  215.  
  216.     oParser = cParser()
  217.     aResult = oParser.parse(sHtmlContent, sPattern)
  218.  
  219.     #print aResult
  220.     if (aResult[0] == False):
  221.         oGui.addText(SITE_IDENTIFIER)
  222.  
  223.     if (aResult[0] == True):
  224.         total = len(aResult[1])
  225.         progress_ = progress().VScreate(SITE_NAME)
  226.         for aEntry in aResult[1]:
  227.             progress_.VSupdate(progress_, total)
  228.             if progress_.iscanceled():
  229.                 break
  230.  
  231.             sTitle = str(aEntry[2])
  232.             #on vire le tiret des series
  233.             sTitle = sTitle.replace(' - Saison', ' Saison')
  234.             sDisplayTitle = sTitle
  235.             #nettoyage du titre
  236.             sTitle = sTitle.replace('[COMPLETE]', '').replace('[Complete]', '')
  237.             sUrl2 = str(aEntry[0]).replace('https','http')
  238.  
  239.             #traite les qualités
  240.             liste = ['4k', '1080p', '720p', 'bdrip', 'hdrip', 'dvdrip', 'cam-md']
  241.             for i in liste:
  242.                 if i in sUrl2:
  243.                     sDisplayTitle = ('%s [%s]') % (sTitle, i.upper())
  244.  
  245.             #Si recherche et trop de resultat, on nettoye
  246.             #31/12/17 Ne fonctionne plus ?
  247.             if sSearch and total > 2:
  248.                 if cUtil().CheckOccurence(sSearch, sTitle) == 0:
  249.                     continue
  250.  
  251.             sThumb = str(aEntry[1])
  252.             if not sThumb.startswith('http'):
  253.                 sThumb = URL_MAIN + sThumb
  254.  
  255.             oOutputParameterHandler = cOutputParameterHandler()
  256.             oOutputParameterHandler.addParameter('siteUrl', sUrl2)
  257.             oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
  258.             oOutputParameterHandler.addParameter('sThumb', sThumb)
  259.  
  260.             if 'films-gratuit' in sUrl2 or '4k' in sUrl2:
  261.                   oGui.addMovie(SITE_IDENTIFIER, 'showMoviesLinks', sDisplayTitle, '', sThumb, '', oOutputParameterHandler)
  262.             else:
  263.                 oGui.addTV(SITE_IDENTIFIER, 'showSeriesLinks', sDisplayTitle, '', sThumb, '', oOutputParameterHandler)
  264.  
  265.         progress_.VSclose(progress_)
  266.  
  267.         if sSearch:
  268.             sPattern = '<a name="nextlink" id="nextlink" onclick="javascript:list_submit\(([0-9]+)\); return\(false\)" href="#">Suivant'
  269.             aResult = oParser.parse(sHtmlContent, sPattern)
  270.             if (aResult[0] == True):
  271.                 oOutputParameterHandler = cOutputParameterHandler()
  272.                 oOutputParameterHandler.addParameter('siteUrl', sSearch)
  273.                 oOutputParameterHandler.addParameter('Nextpagesearch', aResult[1][0])
  274.                 oGui.addNext(SITE_IDENTIFIER, 'showMovies', '[COLOR teal]Next >>>[/COLOR]', oOutputParameterHandler)
  275.                
  276.             oGui.setEndOfDirectory()
  277.         else:
  278.             sNextPage = __checkForNextPage(sHtmlContent)
  279.             if (sNextPage != False):
  280.                 oOutputParameterHandler = cOutputParameterHandler()
  281.                 oOutputParameterHandler.addParameter('siteUrl', sNextPage)
  282.                 if sSearch:
  283.                     oOutputParameterHandler.addParameter('Nextpagesearch', Nextpagesearch)
  284.                 oGui.addNext(SITE_IDENTIFIER, 'showMovies', '[COLOR teal]Next >>>[/COLOR]', oOutputParameterHandler)
  285.  
  286.     if not sSearch:
  287.         oGui.setEndOfDirectory()
  288.  
  289.  
  290. def __checkForNextPage(sHtmlContent):
  291.     oParser = cParser()
  292.     sPattern = '<div class="navigation" align="center" >.+?<a href="([^"]+)">Suivant</a></div>'
  293.     aResult = oParser.parse(sHtmlContent, sPattern)
  294.  
  295.     if (aResult[0] == True):
  296.         return aResult[1][0]
  297.  
  298.     return False
  299.  
  300.  
  301. def showMoviesLinks():
  302.     #VSlog('mode film')
  303.     oGui = cGui()
  304.     oParser = cParser()
  305.     oInputParameterHandler = cInputParameterHandler()
  306.     sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  307.     sThumb = oInputParameterHandler.getValue('sThumb')
  308.     sUrl = oInputParameterHandler.getValue('siteUrl')
  309.  
  310.     oRequestHandler = cRequestHandler(sUrl)
  311.     sHtmlContent = oRequestHandler.request()
  312.  
  313.     sDesc = ''
  314.     #Affichage du menu
  315.     oGui.addText(SITE_IDENTIFIER, '[COLOR olive]' + 'Qualités disponibles pour ce film :' + '[/COLOR]')
  316.  
  317.     #on recherche d'abord la qualité courante
  318.     sPattern = '<div style=".+?">.+?Qualité (.+?) [|] (.+?)</div>'
  319.     aResult = oParser.parse(sHtmlContent, sPattern)
  320.     #print aResult
  321.  
  322.     sQual = ''
  323.     if (aResult[0]):
  324.         sQual = aResult[1][0]
  325.         sTitle = ('%s [COLOR coral]%s[/COLOR]') % (sMovieTitle, sQual)
  326.  
  327.         oOutputParameterHandler = cOutputParameterHandler()
  328.         oOutputParameterHandler.addParameter('siteUrl', sUrl)
  329.         oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  330.         oOutputParameterHandler.addParameter('sThumb', sThumb)
  331.         oGui.addMovie(SITE_IDENTIFIER, 'showHosters', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
  332.  
  333.     #on regarde si dispo dans d'autres qualités
  334.     sPattern = '<a href="([^"]+)"><span class="otherquality"><span style="color:#.{6}"><b>([^<]+)<\/b><\/span><span style="color:#.{6}"><b>([^<]+)<\/b><\/span>'
  335.  
  336.     aResult = oParser.parse(sHtmlContent, sPattern)
  337.     #print aResult
  338.  
  339.     if (aResult[0] == True):
  340.         total = len(aResult[1])
  341.         progress_ = progress().VScreate(SITE_NAME)
  342.         for aEntry in aResult[1]:
  343.             progress_.VSupdate(progress_, total)
  344.             if progress_.iscanceled():
  345.                 break
  346.  
  347.             sUrl = URL_MAIN[:-1] + str(aEntry[0])
  348.             sQual = str(aEntry[1])
  349.             sLang = str(aEntry[2])
  350.             sTitle = ('%s [%s] %s') % (sMovieTitle, sQual, sLang)
  351.  
  352.             oOutputParameterHandler = cOutputParameterHandler()
  353.             oOutputParameterHandler.addParameter('siteUrl', sUrl)
  354.             oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  355.             oOutputParameterHandler.addParameter('sThumb', sThumb)
  356.             oGui.addMovie(SITE_IDENTIFIER, 'showHosters', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
  357.  
  358.         progress_.VSclose(progress_)
  359.  
  360.     oGui.setEndOfDirectory()
  361.  
  362. def showSeriesLinks():
  363.     #VSlog('mode serie')
  364.     oGui = cGui()
  365.     oParser = cParser()
  366.     oInputParameterHandler = cInputParameterHandler()
  367.     sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  368.     sThumb = oInputParameterHandler.getValue('sThumb')
  369.     sUrl = oInputParameterHandler.getValue('siteUrl')
  370.  
  371.     oRequestHandler = cRequestHandler(sUrl)
  372.     sHtmlContent = oRequestHandler.request()
  373.  
  374.     #Mise àjour du titre
  375.     sPattern = '<meta name="description" content="Telecharger (.+?)Qualité.+?\|[^\|](.+?) Episode .+?\|[^\|](.+?)      la serie'
  376.     aResult = oParser.parse(sHtmlContent, sPattern)
  377.     #print aResult
  378.     if (aResult[0]):
  379.         sMovieTitle = aResult[1][0][0] + aResult[1][0][1] + aResult[1][0][2]
  380.  
  381.     oGui.addText(SITE_IDENTIFIER,'[COLOR olive]Qualités disponibles pour cette saison :[/COLOR]')
  382.  
  383.     #on recherche d'abord la qualité courante
  384.     sPattern = '<div style="[^"]+?">.+?Qualité (.+?)<'
  385.     aResult = oParser.parse(sHtmlContent, sPattern)
  386.     #print aResult
  387.  
  388.     sQual = ''
  389.     if (aResult[1]):
  390.         sQual = aResult[1][0]
  391.  
  392.     sDisplayTitle = ('%s [%s]') % (sMovieTitle, sQual.replace('|',''))
  393.  
  394.     oOutputParameterHandler = cOutputParameterHandler()
  395.     oOutputParameterHandler.addParameter('siteUrl', sUrl)
  396.     oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  397.     oOutputParameterHandler.addParameter('sThumb', sThumb)
  398.     oGui.addTV(SITE_IDENTIFIER, 'showSeriesHosters', sDisplayTitle, '', sThumb, '', oOutputParameterHandler)
  399.  
  400.     #on regarde si dispo dans d'autres qualités
  401.     sHtmlContent1 = CutQual(sHtmlContent)
  402.     sPattern1 = '<a href="([^"]+)"><span class="otherquality"><span style="color:#.{6}"><b>([^<]+)<\/b><\/span><span style="color:#.{6}"><b>([^<]+)<\/b><\/span>'
  403.  
  404.     aResult1 = oParser.parse(sHtmlContent1, sPattern1)
  405.     #print aResult1
  406.  
  407.     if (aResult1[0] == True):
  408.         total = len(aResult1[1])
  409.         progress_ = progress().VScreate(SITE_NAME)
  410.         for aEntry in aResult1[1]:
  411.             progress_.VSupdate(progress_, total)
  412.             if progress_.iscanceled():
  413.                 break
  414.  
  415.             sUrl = URL_MAIN + 'telecharger-series' + str(aEntry[0])
  416.             sQual = str(aEntry[1])
  417.             sLang = str(aEntry[2])
  418.             sDisplayTitle = ('%s [%s] %s') % (sMovieTitle, sQual, sLang)
  419.  
  420.             oOutputParameterHandler = cOutputParameterHandler()
  421.             oOutputParameterHandler.addParameter('siteUrl', sUrl)
  422.             oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  423.             oOutputParameterHandler.addParameter('sThumb', sThumb)
  424.             oGui.addTV(SITE_IDENTIFIER, 'showSeriesHosters', sDisplayTitle, '', sThumb, '', oOutputParameterHandler)
  425.  
  426.         progress_.VSclose(progress_)
  427.  
  428.     #on regarde si dispo d'autres saisons
  429.     sHtmlContent2 = CutSais(sHtmlContent)
  430.     sPattern2 = '<a href="([^"]+)"><span class="otherquality">([^<]+)<b>([^<]+)<span style="color:#.{6}">([^<]+)<\/span><span style="color:#.{6}">([^<]+)<\/b><\/span>'
  431.  
  432.     aResult2 = oParser.parse(sHtmlContent2, sPattern2)
  433.     #print aResult2
  434.  
  435.     if (aResult2[0] == True):
  436.         oGui.addText(SITE_IDENTIFIER,'[COLOR olive]Autres Saisons disponibles pour cette série :[/COLOR]')
  437.  
  438.         for aEntry in aResult2[1]:
  439.  
  440.             sUrl = URL_MAIN + 'telecharger-series' + str(aEntry[0])
  441.             sTitle = '[COLOR skyblue]' + aEntry[1] + aEntry[2] + aEntry[3] + aEntry[4] + '[/COLOR]'
  442.  
  443.             oOutputParameterHandler = cOutputParameterHandler()
  444.             oOutputParameterHandler.addParameter('siteUrl', sUrl)
  445.             oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  446.             oOutputParameterHandler.addParameter('sThumb', sThumb)
  447.             oGui.addTV(SITE_IDENTIFIER, 'showSeriesLinks', sTitle, 'series.png', sThumb, '', oOutputParameterHandler)
  448.  
  449.     oGui.setEndOfDirectory()
  450.  
  451. def showHosters():
  452.     #VSlog('showHosters')
  453.     oGui = cGui()
  454.     oInputParameterHandler = cInputParameterHandler()
  455.     sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  456.     sUrl = oInputParameterHandler.getValue('siteUrl')
  457.     sThumb=oInputParameterHandler.getValue('sThumb')
  458.  
  459.     oRequestHandler = cRequestHandler(sUrl)
  460.     oRequestHandler.addHeaderEntry('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0')
  461.     oRequestHandler.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
  462.     oRequestHandler.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3')
  463.     sHtmlContent = oRequestHandler.request()
  464.  
  465.     #fh = open('c:\\test.txt', "w")
  466.     #fh.write(sHtmlContent.replace('\n', ''))
  467.     #fh.close()
  468.  
  469.     #Fonction pour recuperer uniquement les liens
  470.     #sHtmlContent = Cutlink(sHtmlContent)
  471.  
  472.     #Si ca ressemble aux lien premiums on vire les liens non premium
  473.     if 'Premium' in sHtmlContent or 'PREMIUM' in sHtmlContent:
  474.         oParser = cParser()
  475.         sPattern = '<font color=red>([^<]+?)</font>'
  476.         aResult = oParser.parse(sHtmlContent, sPattern)
  477.         sHtmlContent = CutNonPremiumlinks(sHtmlContent)
  478.  
  479.         #print sHtmlContent
  480.     oParser = cParser()
  481.  
  482.     sPattern = '<font color=red>([^<]+?)</font>|<div style="font-weight:bold.+?">([^>]+?)</div></b><b><a target="_blank" href="([^<>"]+?)">T.+?charger<\/a>|>\[(Liens Premium) \]<|<span style="color:#FF0000">(.+?)</div></b><b><a target="_blank" href=href="https://([^"]+)/([^"]+?)">'
  483.     aResult = oParser.parse(sHtmlContent, sPattern)
  484.  
  485.     if (aResult[0] == True):
  486.         total = len(aResult[1])
  487.         progress_ = progress().VScreate(SITE_NAME)
  488.  
  489.         for aEntry in aResult[1]:
  490.             progress_.VSupdate(progress_, total)
  491.             if progress_.iscanceled():
  492.                 break
  493.  
  494.             if aEntry[0]:
  495.                 if ('Interchangeables' not in aEntry[0]):
  496.                     oGui.addText(SITE_IDENTIFIER, '[COLOR red]' + str(aEntry[0]) + '[/COLOR]')
  497.  
  498.             #elif aEntry[1]:
  499.                 #oOutputParameterHandler = cOutputParameterHandler()
  500.                 #oOutputParameterHandler.addParameter('siteUrl', str(sUrl))
  501.                 #oOutputParameterHandler.addParameter('sMovieTitle', str(sMovieTitle))
  502.                 #oOutputParameterHandler.addParameter('sThumb', str(sThumb))
  503.                 #if 'Télécharger' in aEntry[1]:
  504.                     #oGui.addText(SITE_IDENTIFIER, '[COLOR olive]'+str(aEntry[1])+'[/COLOR]')
  505.                 #else:
  506.                     #oGui.addText(SITE_IDENTIFIER, '[COLOR red]'+str(aEntry[1])+'[/COLOR]')
  507.  
  508.             else:
  509.  
  510.                 sTitle = '[COLOR skyblue]' + aEntry[1] + '[/COLOR] ' + sMovieTitle
  511.                 URL_DECRYPT = aEntry[3]
  512.                 oOutputParameterHandler = cOutputParameterHandler()
  513.                 if sUrl.startswith('http'):
  514.                     oOutputParameterHandler.addParameter('siteUrl', aEntry[2].replace('https','http'))
  515.                 else:
  516.                     sUrl2 = 'http://' + str(aEntry[3]) + '/' + str(aEntry[4])
  517.                     oOutputParameterHandler.addParameter('siteUrl', sUrl2)
  518.  
  519.                 oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
  520.                 oOutputParameterHandler.addParameter('sThumb', sThumb)
  521.                 oGui.addMovie(SITE_IDENTIFIER, 'Display_protected_link', sTitle, '', sThumb, '', oOutputParameterHandler)
  522.  
  523.         progress_.VSclose(progress_)
  524.  
  525.     oGui.setEndOfDirectory()
  526.  
  527. def showSeriesHosters():
  528.     #VSlog('showSeriesHosters')
  529.     oGui = cGui()
  530.     oParser = cParser()
  531.     oInputParameterHandler = cInputParameterHandler()
  532.     sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  533.     sUrl = oInputParameterHandler.getValue('siteUrl')
  534.     sThumb=oInputParameterHandler.getValue('sThumb')
  535.  
  536.     oRequestHandler = cRequestHandler(sUrl)
  537.     sHtmlContent = oRequestHandler.request()
  538.  
  539.     #Fonction pour recuperer uniquement les liens
  540.     #sHtmlContent = Cutlink(sHtmlContent)
  541.  
  542.     #Pour les series on fait l'inverse des films on vire les liens premiums
  543.     if 'Premium' in sHtmlContent or 'PREMIUM' in sHtmlContent or 'premium' in sHtmlContent:
  544.         sHtmlContent = CutPremiumlinks(sHtmlContent)
  545.  
  546.  
  547.     sPattern = '<div style="font-weight:bold;color:[^"]+?">([^<]+)</div>|<a target="_blank" href="https://([^"]+)/([^"]+?)">([^<]+)<'
  548.     aResult = oParser.parse(sHtmlContent, sPattern)
  549.  
  550.     if (aResult[0] == True):
  551.         total = len(aResult[1])
  552.         progress_ = progress().VScreate(SITE_NAME)
  553.  
  554.         for aEntry in aResult[1]:
  555.             progress_.VSupdate(progress_, total)
  556.             if progress_.iscanceled():
  557.                 break
  558.  
  559.             if aEntry[0]:
  560.                 if 'Télécharger' in aEntry[0]:
  561.                     oGui.addText(SITE_IDENTIFIER, '[COLOR olive]' + str(aEntry[0]) + '[/COLOR]')
  562.                 else:
  563.                     oGui.addText(SITE_IDENTIFIER, '[COLOR red]' + str(aEntry[0]) + '[/COLOR]')
  564.             else:
  565.                 sName = str(aEntry[3])
  566.                 sName = sName.replace('Télécharger', '')
  567.                 sName = sName.replace('pisodes', 'pisode')
  568.                 sUrl2 = 'http://' + aEntry[1] +  '/' + aEntry[2]
  569.  
  570.                 sTitle = sMovieTitle + ' ' + sName
  571.                 URL_DECRYPT = aEntry[1]
  572.  
  573.                 oOutputParameterHandler = cOutputParameterHandler()
  574.                 oOutputParameterHandler.addParameter('siteUrl', sUrl2)
  575.                 oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
  576.                 oOutputParameterHandler.addParameter('sThumb', sThumb)
  577.                 oGui.addMovie(SITE_IDENTIFIER, 'Display_protected_link', sTitle, '', sThumb, '', oOutputParameterHandler)
  578.  
  579.         progress_.VSclose(progress_)
  580.  
  581.     oGui.setEndOfDirectory()
  582.  
  583. def showStreamingHosters():
  584.     oGui = cGui()
  585.     oParser = cParser()
  586.     oInputParameterHandler = cInputParameterHandler()
  587.     sUrl = oInputParameterHandler.getValue('siteUrl')
  588.     sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  589.     sThumb = oInputParameterHandler.getValue('sThumb')
  590.  
  591.     oRequestHandler = cRequestHandler(sUrl)
  592.     sHtmlContent = oRequestHandler.request()
  593.  
  594.     sPattern = '<iframe.+?src="(.+?)"'
  595.     aResult = oParser.parse(sHtmlContent, sPattern)
  596.  
  597.     if (aResult[0] == True):
  598.         for aEntry in aResult[1]:
  599.             sHosterUrl = aEntry
  600.  
  601.             oHoster = cHosterGui().checkHoster(sHosterUrl)
  602.             if (oHoster != False):
  603.                 oHoster.setDisplayName(sMovieTitle)
  604.                 oHoster.setFileName(sMovieTitle)
  605.                 cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
  606.  
  607.     oGui.setEndOfDirectory()
  608.  
  609. def Display_protected_link():
  610.     #VSlog('Display_protected_link')
  611.     oGui = cGui()
  612.     oParser = cParser()
  613.     oInputParameterHandler = cInputParameterHandler()
  614.     sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  615.     sUrl = oInputParameterHandler.getValue('siteUrl')
  616.     sThumb=oInputParameterHandler.getValue('sThumb')
  617.  
  618.     #Ne marche pas
  619.     if (False):
  620.         code = {
  621.             '123455600123455602123455610123455615': 'http://uptobox.com/',
  622.             '1234556001234556071234556111234556153': 'http://turbobit.net/',
  623.             '123455600123455605123455615': 'http://ul.to/',
  624.             '123455600123455608123455610123455615': 'http://nitroflare.com/',
  625.             '123455601123455603123455610123455615123455617': 'https://1fichier.com/?',
  626.             '123455600123455606123455611123455615': 'http://rapidgator.net/'
  627.         }
  628.  
  629.         for k in code:
  630.             match = re.search(k + '(.+)$', sUrl)
  631.             if match:
  632.                 sHosterUrl = code[k] + match.group(1)
  633.                 sHosterUrl = sHosterUrl.replace('123455615', '/')
  634.                 oHoster = cHosterGui().checkHoster(sHosterUrl)
  635.                 if (oHoster != False):
  636.                     oHoster.setDisplayName(sMovieTitle)
  637.                     oHoster.setFileName(sMovieTitle)
  638.                     cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
  639.                 oGui.setEndOfDirectory()
  640.                 return
  641.  
  642.     #Est ce un lien dl-protect ?
  643.     if URL_DECRYPT in sUrl:
  644.         sHtmlContent = DecryptDlProtecte(sUrl)
  645.  
  646.         if sHtmlContent:
  647.             #Si redirection
  648.             if sHtmlContent.startswith('http'):
  649.                 aResult_dlprotecte = (True, [sHtmlContent])
  650.             else:
  651.                 sPattern_dlprotecte = '<div class="lienet"><a href="(.+?)">'
  652.                 aResult_dlprotecte = oParser.parse(sHtmlContent, sPattern_dlprotecte)
  653.  
  654.         else:
  655.             oDialog = dialog().VSok('Erreur décryptage du lien')
  656.             aResult_dlprotecte = (False, False)
  657.  
  658.     #Si lien normal
  659.     else:
  660.         if not sUrl.startswith('http'):
  661.             sUrl = 'http://' + sUrl
  662.         aResult_dlprotecte = (True, [sUrl])
  663.  
  664.     #print aResult_dlprotecte
  665.  
  666.     if (aResult_dlprotecte[0]):
  667.  
  668.         episode = 1
  669.  
  670.         for aEntry in aResult_dlprotecte[1]:
  671.             sHosterUrl = aEntry
  672.             #print sHosterUrl
  673.  
  674.             sTitle = sMovieTitle
  675.             if len(aResult_dlprotecte[1]) > 1:
  676.                 sTitle = sMovieTitle + ' episode ' + str(episode)
  677.  
  678.  
  679.             episode+=1
  680.  
  681.             if 'stream' in str(sHosterUrl):
  682.                 oOutputParameterHandler = cOutputParameterHandler()
  683.                 oOutputParameterHandler.addParameter('siteUrl', sHosterUrl)
  684.                 oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
  685.                 oOutputParameterHandler.addParameter('sThumb', sThumb)
  686.                 oGui.addMovie(SITE_IDENTIFIER, 'showStreamingHosters', sTitle, '', sThumb, '', oOutputParameterHandler)
  687.             else:
  688.                 oHoster = cHosterGui().checkHoster(sHosterUrl)
  689.                 if (oHoster != False):
  690.                     oHoster.setDisplayName(sTitle)
  691.                     oHoster.setFileName(sTitle)
  692.                     cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
  693.  
  694.     oGui.setEndOfDirectory()
  695.  
  696. def CutQual(sHtmlContent):
  697.     oParser = cParser()
  698.     sPattern = '<h3>Qualit.+?galement disponibles pour cette saison:</h3>(.+?)</div>'
  699.     aResult = oParser.parse(sHtmlContent, sPattern)
  700.     #print aResult
  701.     if (aResult[0]):
  702.         return aResult[1][0]
  703.     else:
  704.         return sHtmlContent
  705.  
  706.     return ''
  707.  
  708. def CutSais(sHtmlContent):
  709.     oParser = cParser()
  710.     sPattern = '<h3>Saisons.+?galement disponibles pour cette saison:</h3>(.+?)<h3>Qualit.+?galement disponibles pour cette saison:</h3>'
  711.     aResult = oParser.parse(sHtmlContent, sPattern)
  712.     #print aResult
  713.     if (aResult[0]):
  714.         return aResult[1][0]
  715.     return ''
  716.  
  717. def CutNonPremiumlinks(sHtmlContent):
  718.     oParser = cParser()
  719.     sPattern = 'Lien Premium(.+?)Publie le '
  720.     aResult = oParser.parse(sHtmlContent, sPattern)
  721.     #print aResult
  722.     if (aResult[0]):
  723.         return aResult[1][0]
  724.  
  725.     #Si ca marche pas on renvois le code complet
  726.     return sHtmlContent
  727.  
  728. def CutPremiumlinks(sHtmlContent):
  729.     oParser = cParser()
  730.     sPattern = '(?i) par .{1,2}pisode(.+?)$'
  731.     aResult = oParser.parse(sHtmlContent, sPattern)
  732.     if (aResult[0]):
  733.         sHtmlContent = aResult[1][0]
  734.  
  735.     #Si ca marche pas on renvois le code complet
  736.     return sHtmlContent
  737.  
  738. def DecryptDlProtecte(url):
  739.  
  740.     VSlog('DecryptDlProtecte : ' + url)
  741.     dialogs = dialog()
  742.  
  743.     if not (url):
  744.         return ''
  745.  
  746.     #url=url.replace('https','http')
  747.  
  748.     headersBase = {
  749.     'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0',
  750.     'Referer' : url,
  751.     #'Origin' : 'https://www.dl-protecte.com',
  752.     'Accept' : 'application/json, text/javascript, */*; q=0.01',
  753.     'Accept-Language': 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4',
  754.     #'Pragma' : '',
  755.     #'Accept-Charset' : ''
  756.     }
  757.  
  758.     #url2 = 'https://www.dl-protecte.org/php/Qaptcha.jquery.php'
  759.     #url2 = 'https://www.protect-zt.com/php/Qaptcha.jquery.php'
  760.     url2 = 'https://' + url.split('/')[2] + '/php/Qaptcha.jquery.php'
  761.  
  762.     #VSlog(url2)
  763.  
  764.     #Make random key
  765.     s = "azertyupqsdfghjkmwxcvbn23456789AZERTYUPQSDFGHJKMWXCVBN_-#@";
  766.     RandomKey = ''.join(random.choice(s) for i in range(32))
  767.  
  768.     query_args = ( ('action' , 'qaptcha') , ('qaptcha_key' , RandomKey) )
  769.     data = urllib.urlencode(query_args)
  770.  
  771.     #Creation Header
  772.     headers1 = dict(headersBase)
  773.     headers1.update({'X-Requested-With':'XMLHttpRequest'})
  774.     headers1.update({'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'})
  775.  
  776.     #Requete
  777.     request = urllib2.Request(url2, data, headers1)
  778.     try:
  779.         reponse = urllib2.urlopen(request, timeout = 5)
  780.     except urllib2.URLError, e:
  781.         dialogs.VSinfo("Site Dl-Protecte HS", "Erreur", 5)
  782.         VSlog( e.read() )
  783.         VSlog( e.reason )
  784.         return ''
  785.     except urllib2.HTTPError, e:
  786.         dialogs.VSinfo("Site Dl-Protecte HS", "Erreur", 5)
  787.         VSlog( e.read() )
  788.         VSlog( e.reason )
  789.         return ''
  790.     except timeout:
  791.         VSlog('timeout')
  792.         dialogs.VSinfo("Site Dl-Protecte HS", "Erreur", 5)
  793.         return ''
  794.  
  795.     sHtmlContent = reponse.read()
  796.  
  797.     #VSlog( 'result'  + str(sHtmlContent))
  798.  
  799.     #Recuperatioen et traitement cookies ???
  800.     cookies=reponse.info()['Set-Cookie']
  801.     c2 = re.findall('(?:^|,) *([^;,]+?)=([^;,\/]+?);', cookies)
  802.     if not c2:
  803.         VSlog( 'Probleme de cookies')
  804.         return ''
  805.     cookies = ''
  806.     for cook in c2:
  807.         cookies = cookies + cook[0] + '=' + cook[1] + ';'
  808.  
  809.     #VSlog( 'Cookie'  + str(cookies))
  810.  
  811.     reponse.close()
  812.  
  813.     if not '"error":false' in sHtmlContent:
  814.         VSlog('Captcha rate')
  815.         VSlog(sHtmlContent)
  816.         return
  817.  
  818.     #Creation Header
  819.     headers2 = dict(headersBase)
  820.  
  821.     #tempo pas necessaire
  822.     #cGui().showInfo("Patientez", 'Décodage en cours', 2)
  823.     #xbmc.sleep(1000)
  824.  
  825.     #Ancienne methode avec POST
  826.     #query_args = ( ( 'YnJYHKk4xYUUu4uWQdxxuH@JEJ2yrmJS' , '' ) , ('submit' , 'Valider' ) )
  827.     #data = urllib.urlencode(query_args)
  828.  
  829.     #Nouvelle methode avec multipart
  830.     #multipart_form_data = { RandomKey : '', 'submit' : 'Valider'  }
  831.  
  832.     import string
  833.     _BOUNDARY_CHARS = string.digits + string.ascii_letters
  834.     boundary = ''.join(random.choice(_BOUNDARY_CHARS) for i in range(30))
  835.  
  836.     multipart_form_data = { RandomKey : '', 'submit' : 'Valider' }
  837.     data, headersMulti = encode_multipart(multipart_form_data, {}, boundary)
  838.     headers2.update(headersMulti)
  839.     #VSlog( 'header 2'  + str(headersMulti))
  840.     #VSlog( 'data 2'  + str(data))
  841.  
  842.     #rajout des cookies
  843.     headers2.update({'Cookie': cookies})
  844.  
  845.     #Modifications
  846.     headers2.update({'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'})
  847.  
  848.     #VSlog( str(headers2) )
  849.  
  850.     #Requete
  851.     request = urllib2.Request(url, data, headers2)
  852.     try:
  853.         reponse = urllib2.urlopen(request)
  854.     except urllib2.URLError, e:
  855.         print e.read()
  856.         print e.reason
  857.  
  858.     sHtmlContent = reponse.read()
  859.  
  860.     #fh = open('c:\\test.txt', "w")
  861.     #fh.write(sHtmlContent)
  862.     #fh.close()
  863.  
  864.     reponse.close()
  865.  
  866.     return sHtmlContent
  867.  
  868. #******************************************************************************
  869. #from http://code.activestate.com/recipes/578668-encode-multipart-form-data-for-uploading-files-via/
  870.  
  871. """Encode multipart form data to upload files via POST."""
  872.  
  873. def encode_multipart(fields, files, boundary = None):
  874.     r"""Encode dict of form fields and dict of files as multipart/form-data.
  875.    Return tuple of (body_string, headers_dict). Each value in files is a dict
  876.    with required keys 'filename' and 'content', and optional 'mimetype' (if
  877.    not specified, tries to guess mime type or uses 'application/octet-stream').
  878.  
  879.    >>> body, headers = encode_multipart({'FIELD': 'VALUE'},
  880.    ...                                  {'FILE': {'filename': 'F.TXT', 'content': 'CONTENT'}},
  881.    ...                                  boundary='BOUNDARY')
  882.    >>> print('\n'.join(repr(l) for l in body.split('\r\n')))
  883.    '--BOUNDARY'
  884.    'Content-Disposition: form-data; name="FIELD"'
  885.    ''
  886.    'VALUE'
  887.    '--BOUNDARY'
  888.    'Content-Disposition: form-data; name="FILE"; filename="F.TXT"'
  889.    'Content-Type: text/plain'
  890.    ''
  891.    'CONTENT'
  892.    '--BOUNDARY--'
  893.    ''
  894.    >>> print(sorted(headers.items()))
  895.    [('Content-Length', '193'), ('Content-Type', 'multipart/form-data; boundary=BOUNDARY')]
  896.    >>> len(body)
  897.    193
  898.    """
  899.  
  900.     import mimetypes
  901.     import random
  902.     import string
  903.  
  904.     _BOUNDARY_CHARS = string.digits + string.ascii_letters
  905.  
  906.     def escape_quote(s):
  907.         return s.replace('"', '\\"')
  908.  
  909.     if boundary is None:
  910.         boundary = ''.join(random.choice(_BOUNDARY_CHARS) for i in range(30))
  911.     lines = []
  912.  
  913.     for name, value in fields.items():
  914.         lines.extend((
  915.             '--{0}'.format(boundary),
  916.             'Content-Disposition: form-data; name="{0}"'.format(escape_quote(name)),
  917.             '',
  918.             str(value),
  919.         ))
  920.  
  921.     for name, value in files.items():
  922.         filename = value['filename']
  923.         if 'mimetype' in value:
  924.             mimetype = value['mimetype']
  925.         else:
  926.             mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
  927.         lines.extend((
  928.             '--{0}'.format(boundary),
  929.             'Content-Disposition: form-data; name="{0}"; filename="{1}"'.format(
  930.                     escape_quote(name), escape_quote(filename)),
  931.             'Content-Type: {0}'.format(mimetype),
  932.             '',
  933.             value['content'],
  934.         ))
  935.  
  936.     lines.extend((
  937.         '--{0}--'.format(boundary),
  938.         '',
  939.     ))
  940.     body = '\r\n'.join(lines)
  941.  
  942.     headers = {
  943.         'Content-Type': 'multipart/form-data; boundary={0}'.format(boundary),
  944.         'Content-Length': str(len(body)),
  945.     }
  946.  
  947.     return (body, headers)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement