Advertisement
ludopotte

SOURCE VSTREAM "ZONE STREAM"

Jan 4th, 2021
2,417
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.02 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. # vStream https://github.com/Kodi-vStream/venom-xbmc-addons
  3. # Ludo Potte https://github.com/ludopotte/vStream/
  4.  
  5. import re
  6. from resources.lib.gui.hoster import cHosterGui
  7. from resources.lib.gui.gui import cGui
  8. from resources.lib.handler.inputParameterHandler import cInputParameterHandler
  9. from resources.lib.handler.outputParameterHandler import cOutputParameterHandler
  10. from resources.lib.handler.requestHandler import cRequestHandler
  11. from resources.lib.parser import cParser
  12. from resources.lib.comaddon import progress, VSlog
  13.  
  14. # from resources.lib.util import cUtil
  15.  
  16. SITE_IDENTIFIER = 'zone_stream'
  17. SITE_NAME = 'Zone Stream'
  18. SITE_DESC = 'Films et Séries en Streaming'
  19.  
  20. URL_MAIN = 'http://zestream.club/'
  21.  
  22. URL_SEARCH = (URL_MAIN + 'index.php?do=search', 'showMovies')
  23. # recherche global films
  24. URL_SEARCH_MOVIES = (URL_SEARCH[0], 'showMovies')
  25. # recherche global serie, manga
  26. URL_SEARCH_SERIES = (URL_SEARCH[0], 'showMovies')
  27. # recherche global divers
  28. URL_SEARCH_MISC = (URL_SEARCH[0], 'showMovies')
  29. #
  30. FUNCTION_SEARCH = 'showMovies'
  31.  
  32. MOVIE_NEWS = (URL_MAIN, 'showMovies')
  33. MOVIE_MOVIE = ('http://zestream.club/zone-stream-films/', 'load')
  34. MOVIE_VIEWS = (URL_MAIN + 'lastnews/', 'showMovies')
  35.  
  36. SERIE_SERIES = ('http://zestream.club/zone-stream-series/', 'load')
  37. SERIE_VFS = (URL_MAIN + 'zone-stream-series/zone-stream-series-fr/', 'showMovies')
  38. SERIE_VOSTFRS = (URL_MAIN + 'zone-stream-series/zone-stream-series-vostfr/', 'showMovies')
  39.  
  40.  
  41. def load():
  42. oGui = cGui()
  43.  
  44. oOutputParameterHandler = cOutputParameterHandler()
  45. oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
  46. oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche', 'search.png', oOutputParameterHandler)
  47.  
  48. oOutputParameterHandler = cOutputParameterHandler()
  49. oOutputParameterHandler.addParameter('siteUrl', MOVIE_NEWS[0])
  50. oGui.addDir(SITE_IDENTIFIER, MOVIE_NEWS[1], 'Films (Derniers ajouts)', 'news.png', oOutputParameterHandler)
  51.  
  52. oOutputParameterHandler = cOutputParameterHandler()
  53. oOutputParameterHandler.addParameter('siteUrl', MOVIE_MOVIE[0])
  54. oGui.addDir(SITE_IDENTIFIER, MOVIE_MOVIE[1], 'Films', 'films.png', oOutputParameterHandler)
  55.  
  56. oOutputParameterHandler = cOutputParameterHandler()
  57. oOutputParameterHandler.addParameter('siteUrl', MOVIE_VIEWS[0])
  58. oGui.addDir(SITE_IDENTIFIER, MOVIE_VIEWS[1], 'Films (Les plus vus)', 'views.png', oOutputParameterHandler)
  59.  
  60. oOutputParameterHandler = cOutputParameterHandler()
  61. oOutputParameterHandler.addParameter('siteUrl', SERIE_SERIES[0])
  62. oGui.addDir(SITE_IDENTIFIER, SERIE_SERIES[1], 'Séries', 'series.png', oOutputParameterHandler)
  63.  
  64. oOutputParameterHandler = cOutputParameterHandler()
  65. oOutputParameterHandler.addParameter('siteUrl', SERIE_VFS[0])
  66. oGui.addDir(SITE_IDENTIFIER, SERIE_VFS[1], 'Séries (VF) ', 'vf.png', oOutputParameterHandler)
  67.  
  68. oOutputParameterHandler = cOutputParameterHandler()
  69. oOutputParameterHandler.addParameter('siteUrl', SERIE_VOSTFRS[0])
  70. oGui.addDir(SITE_IDENTIFIER, SERIE_VOSTFRS[1], 'Séries (VOSTFR)', 'vostfr.png', oOutputParameterHandler)
  71.  
  72. oGui.setEndOfDirectory() # ferme l'affichage
  73.  
  74.  
  75. def showSearch(): # fonction de recherche
  76. oGui = cGui()
  77.  
  78. sSearchText = oGui.showKeyBoard() # appelle le clavier xbmc
  79. if (sSearchText != False):
  80. sUrl = URL_SEARCH[0] + sSearchText
  81. showMovies(sUrl)
  82. oGui.setEndOfDirectory()
  83. return
  84.  
  85.  
  86. def showGenres(): # affiche les genres
  87. oGui = cGui()
  88.  
  89. # juste à entrer les categories et les liens qui vont bien
  90. liste = []
  91. liste.append(['Action', URL_MAIN + 'zone-stream-films/action/'])
  92. liste.append(['Animation', URL_MAIN + 'zone-stream-films/animation/'])
  93. liste.append(['Arts Martiaux', URL_MAIN + 'zone-stream-films/arts-martiaux/'])
  94. liste.append(['Aventure', URL_MAIN + 'zone-stream-films/aventure/'])
  95. liste.append(['Biopic', URL_MAIN + 'zone-stream-films/biopic/'])
  96. liste.append(['Comédie', URL_MAIN + 'zone-stream-films/comedie/'])
  97. liste.append(['Comédie Dramatique', URL_MAIN + 'zone-stream-films/comedie-dramatique/'])
  98. liste.append(['Comédie Musicale', URL_MAIN + 'zone-stream-films/comedie-musicale/'])
  99. liste.append(['Documentaire', URL_MAIN + 'zone-stream-films/documentaire/'])
  100. liste.append(['Drame', URL_MAIN + 'zone-stream-films/drame/'])
  101. liste.append(['Epouvante Horreur', URL_MAIN + 'zone-stream-films/horreur/'])
  102. liste.append(['Erotique', URL_MAIN + 'zone-stream-films/erotique/'])
  103. liste.append(['Espionnage', URL_MAIN + 'zone-stream-films/espionnage/'])
  104. liste.append(['Famille', URL_MAIN + 'zone-stream-films/famille/'])
  105. liste.append(['Fantastique', URL_MAIN + 'zone-stream-films/fantastique/'])
  106. liste.append(['Guerre', URL_MAIN + 'zone-stream-films/guerre/'])
  107. liste.append(['Historique', URL_MAIN + 'zone-stream-films/historique/'])
  108. liste.append(['Musical', URL_MAIN + 'zone-stream-films/musical/'])
  109. liste.append(['Policier', URL_MAIN + 'zone-stream-films/policier/'])
  110. liste.append(['Péplum', URL_MAIN + 'zone-stream-films/peplum/'])
  111. liste.append(['Romance', URL_MAIN + 'zone-stream-films/romantique/'])
  112. liste.append(['Science Fiction', URL_MAIN + 'zone-stream-films/science-fiction/'])
  113. liste.append(['Spectacle', URL_MAIN + 'zone-stream-films/spectacle/'])
  114. liste.append(['Thriller', URL_MAIN + 'zone-stream-films/thriller/'])
  115. liste.append(['Western', URL_MAIN + 'zone-stream-films/western/'])
  116. liste.append(['Divers', URL_MAIN + 'zone-stream-films/divers/'])
  117. liste.append(['VOSTFR', URL_MAIN + 'qualite/vostfr/'])
  118.  
  119. for sTitle, sUrl in liste: # boucle
  120.  
  121. oOutputParameterHandler = cOutputParameterHandler()
  122. oOutputParameterHandler.addParameter('siteUrl', sUrl)
  123. oGui.addDir(SITE_IDENTIFIER, 'showMovies', sTitle, 'genres.png', oOutputParameterHandler)
  124.  
  125. oGui.setEndOfDirectory()
  126.  
  127.  
  128. def showMovieYears():
  129. oGui = cGui()
  130.  
  131. for i in reversed(xrange(1913, 2021)):
  132. Year = str(i)
  133. oOutputParameterHandler = cOutputParameterHandler()
  134. oOutputParameterHandler.addParameter('siteUrl', URL_MAIN + 'films/annee-' + Year)
  135. oGui.addDir(SITE_IDENTIFIER, 'showMovies', Year, 'annees.png', oOutputParameterHandler)
  136.  
  137. oGui.setEndOfDirectory()
  138.  
  139.  
  140. def showSerieYears():
  141. oGui = cGui()
  142.  
  143. for i in reversed(xrange(1936, 2021)):
  144. Year = str(i)
  145. oOutputParameterHandler = cOutputParameterHandler()
  146. oOutputParameterHandler.addParameter('siteUrl', URL_MAIN + 'series/annee-' + Year)
  147. oGui.addDir(SITE_IDENTIFIER, 'showMovies', Year, 'annees.png', oOutputParameterHandler)
  148.  
  149. oGui.setEndOfDirectory()
  150.  
  151.  
  152. def showMovies(sSearch=''):
  153. oGui = cGui()
  154.  
  155. oInputParameterHandler = cInputParameterHandler()
  156. sUrl = oInputParameterHandler.getValue('siteUrl')
  157. if sSearch:
  158. sUrl = sSearch.replace(' ', '+')
  159.  
  160. oRequestHandler = cRequestHandler(sUrl) # envoye une requete a l'url
  161. sHtmlContent = oRequestHandler.request() # requete aussi
  162.  
  163. sHtmlContent = sHtmlContent.replace('<span class="likeThis">', '').replace('</span>', '')
  164. # la fonction replace est pratique pour supprimer un code du resultat
  165.  
  166. sPattern = 'class="movie movie-block"><img src="([^"]+)" alt=".+?" title="([^"]+)"/>.+?<h2 onclick="window.location.href=\'([^"]+)\'">.+?<div style="color:#F29000">.+?<div.+?>(.+?)</div>'
  167. # pour faire simple recherche ce bout de code dans le code source de l'url
  168. # - "([^"]+)" je veux cette partie de code qui se trouve entre guillemets mais pas de guillemets dans la chaine
  169. # - .+? je ne veux pas cette partie et peux importe ceux qu'elle contient
  170. # - >(.+?)< je veux cette partie de code qui se trouve entre > et < mais il peut y avoir n'inporte quoi entre les 2.
  171. # - (https*://[^"]) je veux l'adresse qui commence par https ou http jusqu'au prochain guillemet.
  172.  
  173. # Pour tester vos Regex, vous pouvez utiliser le site https://regex101.com/ en mettant dans les modifiers "gmis"
  174.  
  175. oParser = cParser()
  176. aResult = oParser.parse(sHtmlContent, sPattern)
  177. # le plus simple et de faire un VSlog(str(aResult))
  178. # dans le fichier log de Kodi vous pourrez voir un array de ce que recupere le script
  179. # et modifier sPattern si besoin
  180. VSlog(str(aResult)) # Commenter ou supprimer cette ligne une fois fini
  181.  
  182. # affiche une information si aucun resulat
  183. if (aResult[0] == False):
  184. oGui.addText(SITE_IDENTIFIER)
  185.  
  186. if (aResult[0] == True):
  187. total = len(aResult[1])
  188. # dialog barre de progression
  189. progress_ = progress().VScreate(SITE_NAME)
  190.  
  191. for aEntry in aResult[1]:
  192. # dialog update
  193. progress_.VSupdate(progress_, total)
  194. if progress_.iscanceled():
  195. break
  196.  
  197. # L'array affiche vos info dans l'ordre de sPattern en commencant a 0, attention dans ce cas la on recupere 6 information
  198. # Mais selon votre regex il ne peut y en avoir que 2 ou 3.
  199. sThumb = aEntry[0]
  200. sTitle = aEntry[1]
  201. sUrl2 = aEntry[2]
  202. sLang = aEntry[3]
  203. sQual = aEntry[4]
  204. sHoster = aEntry[5]
  205. sDesc = ''
  206.  
  207. sTitle = sTitle.replace('En streaming', '')
  208.  
  209. # Si vous avez des information dans aEntry Qualiter lang organiser un peux vos titre exemple.
  210. # Si vous pouvez la langue et la Qualite en MAJ ".upper()" vostfr.upper() = VOSTFR
  211. sTitle = ('%s [%s] (%s) [COLOR coral]%s[/COLOR]') % (sTitle, sQual, sLang.upper(), sHoster)
  212. # mettre les informations de streaming entre [] et le reste entre () vStream s'occupe de la couleur automatiquement.
  213.  
  214. # Utile si les liens recupere ne commencent pas par (http://www.nomdusite.com/)
  215. # sUrl2 = URL_MAIN + sUrl2
  216.  
  217. oOutputParameterHandler = cOutputParameterHandler()
  218. oOutputParameterHandler.addParameter('siteUrl', sUrl2) # sortie de l'url
  219. oOutputParameterHandler.addParameter('sMovieTitle', sTitle) # sortie du titre
  220. oOutputParameterHandler.addParameter('sThumb', sThumb) # sortie du poster
  221. oOutputParameterHandler.addParameter('sDesc', sDesc) # sortie de la description
  222. oOutputParameterHandler.addParameter('referer', sUrl) # URL d'origine, parfois utile comme référence
  223.  
  224. if '/series' in sUrl:
  225. oGui.addTV(SITE_IDENTIFIER, 'ShowSerieSaisonEpisodes', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
  226. # addTV pour sortir les series tv (identifiant, fonction, titre, icon, poster, description, sortie parametre)
  227. elif '/animes' in sUrl:
  228. oGui.addAnime(SITE_IDENTIFIER, 'ShowSerieSaisonEpisodes', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
  229. # addAnime pour sortir les series animés (mangas) (identifiant, fonction, titre, icon, poster, description, sortie parametre)
  230. else:
  231. oGui.addMovie(SITE_IDENTIFIER, 'showHosters', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
  232. # addMovies pour sortir les films (identifiant, fonction, titre, icon, poster, description, sortie parametre)
  233.  
  234. # Il existe aussi addMisc(identifiant, function, titre, icon, poster, description, sortie parametre)
  235. # A utiliser pour les autres types, tels que : documentaires, spectacles, etc.
  236. # qui ne nécessitent pas de metadonnées (recherches de la description, de la bande annonces, des acteurs, etc.)
  237.  
  238. progress_.VSclose(progress_) # fin du dialog
  239.  
  240. if not sSearch:
  241. sNextPage = __checkForNextPage(sHtmlContent) # cherche la page suivante
  242. if (sNextPage != False):
  243. oOutputParameterHandler = cOutputParameterHandler()
  244. oOutputParameterHandler.addParameter('siteUrl', sNextPage)
  245. sNumPage = re.search('/page/([0-9]+)', sNextPage).group(1)
  246. oGui.addNext(SITE_IDENTIFIER, 'showSeries', 'Page ' + sNumPage, oOutputParameterHandler)
  247. # Si pas de numero de page dans l'url du nextPage, utiliser la ligne suivante et désactiver les 2 précédentes
  248. # oGui.addNext(SITE_IDENTIFIER, 'showMovies', Suivant, oOutputParameterHandler)
  249. # Ajoute une entree pour le lien Suivant | pas de addMisc pas de poster et de description inutile donc
  250.  
  251. oGui.setEndOfDirectory() # ferme l'affichage
  252.  
  253.  
  254. def __checkForNextPage(sHtmlContent): # cherche la page suivante
  255. oParser = cParser()
  256. sPattern = '<div class="navigation".+? <span.+? <a href="([^"]+)">'
  257. aResult = oParser.parse(sHtmlContent, sPattern)
  258.  
  259. if (aResult[0] == True):
  260. return aResult[1][0]
  261.  
  262. return False
  263.  
  264.  
  265. def showHosters(): # recherche et affiche les hotes
  266. oGui = cGui() # ouvre l'affichage
  267. oInputParameterHandler = cInputParameterHandler() # apelle l'entree de parametre
  268. sUrl = oInputParameterHandler.getValue('siteUrl') # apelle siteUrl
  269. sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') # appelle le titre
  270. sThumb = oInputParameterHandler.getValue('sThumb') # appelle le poster
  271. referer = oInputParameterHandler.getValue('referer') # récupere l'URL appelante
  272.  
  273. oRequestHandler = cRequestHandler(sUrl) # requete sur l'url
  274. oRequestHandler.addHeaderEntry('Referer', referer) # parametre pour passer l'URL appelante (n'est pas forcement necessaire)
  275. sHtmlContent = oRequestHandler.request() # requete sur l'url
  276.  
  277. oParser = cParser()
  278. sPattern = '<iframe.+?src="([^"]+)"'
  279. # ici nous cherchons toute les sources iframe
  280.  
  281. aResult = oParser.parse(sHtmlContent, sPattern)
  282. # pensez a faire un VSlog(str(aResult)) pour verifier
  283.  
  284. # si un lien ne s'affiche pas, peut etre que l'hote n'est pas supporte par l'addon
  285. if (aResult[0] == True):
  286. for aEntry in aResult[1]:
  287.  
  288. sHosterUrl = aEntry
  289. oHoster = cHosterGui().checkHoster(sHosterUrl) # recherche l'hote dans l'addon
  290. if (oHoster != False):
  291. oHoster.setDisplayName(sMovieTitle) # nom affiche
  292. oHoster.setFileName(sMovieTitle) # idem
  293. cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
  294. # affiche le lien (oGui, oHoster, url du lien, poster)
  295.  
  296. oGui.setEndOfDirectory() # fin
  297.  
  298.  
  299. # Pour les series, il y a generalement une etape en plus pour la selection des episodes ou saisons.
  300. def ShowSerieSaisonEpisodes():
  301. oGui = cGui()
  302.  
  303. oInputParameterHandler = cInputParameterHandler()
  304. sUrl = oInputParameterHandler.getValue('siteUrl')
  305. sThumb = oInputParameterHandler.getValue('sThumb')
  306. sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  307. sDesc = oInputParameterHandler.getValue('sDesc')
  308.  
  309. oRequestHandler = cRequestHandler(sUrl)
  310. sHtmlContent = oRequestHandler.request()
  311.  
  312. # Pattern servant à retrouver les éléments dans la page
  313. sPattern = '?????????????????????'
  314.  
  315. oParser = cParser()
  316. aResult = oParser.parse(sHtmlContent, sPattern)
  317.  
  318. if (aResult[0] == True):
  319. total = len(aResult[1])
  320. progress_ = progress().VScreate(SITE_NAME)
  321.  
  322. for aEntry in aResult[1]:
  323. progress_.VSupdate(progress_, total)
  324. if progress_.iscanceled():
  325. break
  326.  
  327. sTitle = sMovieTitle + aEntry[0]
  328. sUrl2 = aEntry[1]
  329.  
  330. oOutputParameterHandler = cOutputParameterHandler()
  331. oOutputParameterHandler.addParameter('siteUrl', sUrl2)
  332. oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
  333. oOutputParameterHandler.addParameter('sThumb', sThumb)
  334.  
  335. oGui.addEpisode(SITE_IDENTIFIER, 'seriesHosters', sTitle, 'series.png', sThumb, sDesc, oOutputParameterHandler)
  336. # il y a aussi addAnime pour les mangas
  337. # oGui.addAnime(SITE_IDENTIFIER, 'seriesHosters', sTitle, 'animes.png', sThumb, sDesc, oOutputParameterHandler)
  338.  
  339. progress_.VSclose(progress_)
  340.  
  341. oGui.setEndOfDirectory()
  342.  
  343.  
  344. def seriesHosters(): # cherche les episodes de series
  345. oGui = cGui()
  346. oInputParameterHandler = cInputParameterHandler()
  347. sUrl = oInputParameterHandler.getValue('siteUrl')
  348. sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
  349. sThumb = oInputParameterHandler.getValue('sThumb')
  350.  
  351. oRequestHandler = cRequestHandler(sUrl)
  352. sHtmlContent = oRequestHandler.request()
  353.  
  354. # Exemple de pattern à changer
  355. sPattern = '<dd><a href="([^<]+)" class="zoombox.+?" title="(.+?)"><button class="btn">.+?</button></a></dd>'
  356.  
  357. oParser = cParser()
  358. aResult = oParser.parse(sHtmlContent, sPattern)
  359. if (aResult[0] == True):
  360. for aEntry in aResult[1]:
  361.  
  362. sHosterUrl = aEntry[0]
  363. oHoster = cHosterGui().checkHoster(sHosterUrl)
  364. if (oHoster != False):
  365. oHoster.setDisplayName(aEntry[1])
  366. oHoster.setFileName(aEntry[1])
  367. cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
  368.  
  369. oGui.setEndOfDirectory()
  370.  
  371. # n'hesitez pas à poser vos questions et même à partager vos sources.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement