Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- # vStream https://github.com/Kodi-vStream/venom-xbmc-addons
- # Ludo Potte https://github.com/ludopotte/vStream/
- import re
- from resources.lib.gui.hoster import cHosterGui
- from resources.lib.gui.gui import cGui
- from resources.lib.handler.inputParameterHandler import cInputParameterHandler
- from resources.lib.handler.outputParameterHandler import cOutputParameterHandler
- from resources.lib.handler.requestHandler import cRequestHandler
- from resources.lib.parser import cParser
- from resources.lib.comaddon import progress, VSlog
- # from resources.lib.util import cUtil
- SITE_IDENTIFIER = 'zone_stream'
- SITE_NAME = 'Zone Stream'
- SITE_DESC = 'Films et Séries en Streaming'
- URL_MAIN = 'http://zestream.club/'
- URL_SEARCH = (URL_MAIN + 'index.php?do=search', 'showMovies')
- # recherche global films
- URL_SEARCH_MOVIES = (URL_SEARCH[0], 'showMovies')
- # recherche global serie, manga
- URL_SEARCH_SERIES = (URL_SEARCH[0], 'showMovies')
- # recherche global divers
- URL_SEARCH_MISC = (URL_SEARCH[0], 'showMovies')
- #
- FUNCTION_SEARCH = 'showMovies'
- MOVIE_NEWS = (URL_MAIN, 'showMovies')
- MOVIE_MOVIE = ('http://zestream.club/zone-stream-films/', 'load')
- MOVIE_VIEWS = (URL_MAIN + 'lastnews/', 'showMovies')
- SERIE_SERIES = ('http://zestream.club/zone-stream-series/', 'load')
- SERIE_VFS = (URL_MAIN + 'zone-stream-series/zone-stream-series-fr/', 'showMovies')
- SERIE_VOSTFRS = (URL_MAIN + 'zone-stream-series/zone-stream-series-vostfr/', 'showMovies')
- def load():
- oGui = cGui()
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
- oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche', 'search.png', oOutputParameterHandler)
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', MOVIE_NEWS[0])
- oGui.addDir(SITE_IDENTIFIER, MOVIE_NEWS[1], 'Films (Derniers ajouts)', 'news.png', oOutputParameterHandler)
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', MOVIE_MOVIE[0])
- oGui.addDir(SITE_IDENTIFIER, MOVIE_MOVIE[1], 'Films', 'films.png', oOutputParameterHandler)
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', MOVIE_VIEWS[0])
- oGui.addDir(SITE_IDENTIFIER, MOVIE_VIEWS[1], 'Films (Les plus vus)', 'views.png', oOutputParameterHandler)
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', SERIE_SERIES[0])
- oGui.addDir(SITE_IDENTIFIER, SERIE_SERIES[1], 'Séries', 'series.png', oOutputParameterHandler)
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', SERIE_VFS[0])
- oGui.addDir(SITE_IDENTIFIER, SERIE_VFS[1], 'Séries (VF) ', 'vf.png', oOutputParameterHandler)
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', SERIE_VOSTFRS[0])
- oGui.addDir(SITE_IDENTIFIER, SERIE_VOSTFRS[1], 'Séries (VOSTFR)', 'vostfr.png', oOutputParameterHandler)
- oGui.setEndOfDirectory() # ferme l'affichage
- def showSearch(): # fonction de recherche
- oGui = cGui()
- sSearchText = oGui.showKeyBoard() # appelle le clavier xbmc
- if (sSearchText != False):
- sUrl = URL_SEARCH[0] + sSearchText
- showMovies(sUrl)
- oGui.setEndOfDirectory()
- return
- def showGenres(): # affiche les genres
- oGui = cGui()
- # juste à entrer les categories et les liens qui vont bien
- liste = []
- liste.append(['Action', URL_MAIN + 'zone-stream-films/action/'])
- liste.append(['Animation', URL_MAIN + 'zone-stream-films/animation/'])
- liste.append(['Arts Martiaux', URL_MAIN + 'zone-stream-films/arts-martiaux/'])
- liste.append(['Aventure', URL_MAIN + 'zone-stream-films/aventure/'])
- liste.append(['Biopic', URL_MAIN + 'zone-stream-films/biopic/'])
- liste.append(['Comédie', URL_MAIN + 'zone-stream-films/comedie/'])
- liste.append(['Comédie Dramatique', URL_MAIN + 'zone-stream-films/comedie-dramatique/'])
- liste.append(['Comédie Musicale', URL_MAIN + 'zone-stream-films/comedie-musicale/'])
- liste.append(['Documentaire', URL_MAIN + 'zone-stream-films/documentaire/'])
- liste.append(['Drame', URL_MAIN + 'zone-stream-films/drame/'])
- liste.append(['Epouvante Horreur', URL_MAIN + 'zone-stream-films/horreur/'])
- liste.append(['Erotique', URL_MAIN + 'zone-stream-films/erotique/'])
- liste.append(['Espionnage', URL_MAIN + 'zone-stream-films/espionnage/'])
- liste.append(['Famille', URL_MAIN + 'zone-stream-films/famille/'])
- liste.append(['Fantastique', URL_MAIN + 'zone-stream-films/fantastique/'])
- liste.append(['Guerre', URL_MAIN + 'zone-stream-films/guerre/'])
- liste.append(['Historique', URL_MAIN + 'zone-stream-films/historique/'])
- liste.append(['Musical', URL_MAIN + 'zone-stream-films/musical/'])
- liste.append(['Policier', URL_MAIN + 'zone-stream-films/policier/'])
- liste.append(['Péplum', URL_MAIN + 'zone-stream-films/peplum/'])
- liste.append(['Romance', URL_MAIN + 'zone-stream-films/romantique/'])
- liste.append(['Science Fiction', URL_MAIN + 'zone-stream-films/science-fiction/'])
- liste.append(['Spectacle', URL_MAIN + 'zone-stream-films/spectacle/'])
- liste.append(['Thriller', URL_MAIN + 'zone-stream-films/thriller/'])
- liste.append(['Western', URL_MAIN + 'zone-stream-films/western/'])
- liste.append(['Divers', URL_MAIN + 'zone-stream-films/divers/'])
- liste.append(['VOSTFR', URL_MAIN + 'qualite/vostfr/'])
- for sTitle, sUrl in liste: # boucle
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', sUrl)
- oGui.addDir(SITE_IDENTIFIER, 'showMovies', sTitle, 'genres.png', oOutputParameterHandler)
- oGui.setEndOfDirectory()
- def showMovieYears():
- oGui = cGui()
- for i in reversed(xrange(1913, 2021)):
- Year = str(i)
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', URL_MAIN + 'films/annee-' + Year)
- oGui.addDir(SITE_IDENTIFIER, 'showMovies', Year, 'annees.png', oOutputParameterHandler)
- oGui.setEndOfDirectory()
- def showSerieYears():
- oGui = cGui()
- for i in reversed(xrange(1936, 2021)):
- Year = str(i)
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', URL_MAIN + 'series/annee-' + Year)
- oGui.addDir(SITE_IDENTIFIER, 'showMovies', Year, 'annees.png', oOutputParameterHandler)
- oGui.setEndOfDirectory()
- def showMovies(sSearch=''):
- oGui = cGui()
- oInputParameterHandler = cInputParameterHandler()
- sUrl = oInputParameterHandler.getValue('siteUrl')
- if sSearch:
- sUrl = sSearch.replace(' ', '+')
- oRequestHandler = cRequestHandler(sUrl) # envoye une requete a l'url
- sHtmlContent = oRequestHandler.request() # requete aussi
- sHtmlContent = sHtmlContent.replace('<span class="likeThis">', '').replace('</span>', '')
- # la fonction replace est pratique pour supprimer un code du resultat
- sPattern = 'class="movie movie-block"><img src="([^"]+)" alt=".+?" title="([^"]+)"/>.+?<h2 onclick="window.location.href=\'([^"]+)\'">.+?<div style="color:#F29000">.+?<div.+?>(.+?)</div>'
- # pour faire simple recherche ce bout de code dans le code source de l'url
- # - "([^"]+)" je veux cette partie de code qui se trouve entre guillemets mais pas de guillemets dans la chaine
- # - .+? je ne veux pas cette partie et peux importe ceux qu'elle contient
- # - >(.+?)< je veux cette partie de code qui se trouve entre > et < mais il peut y avoir n'inporte quoi entre les 2.
- # - (https*://[^"]) je veux l'adresse qui commence par https ou http jusqu'au prochain guillemet.
- # Pour tester vos Regex, vous pouvez utiliser le site https://regex101.com/ en mettant dans les modifiers "gmis"
- oParser = cParser()
- aResult = oParser.parse(sHtmlContent, sPattern)
- # le plus simple et de faire un VSlog(str(aResult))
- # dans le fichier log de Kodi vous pourrez voir un array de ce que recupere le script
- # et modifier sPattern si besoin
- VSlog(str(aResult)) # Commenter ou supprimer cette ligne une fois fini
- # affiche une information si aucun resulat
- if (aResult[0] == False):
- oGui.addText(SITE_IDENTIFIER)
- if (aResult[0] == True):
- total = len(aResult[1])
- # dialog barre de progression
- progress_ = progress().VScreate(SITE_NAME)
- for aEntry in aResult[1]:
- # dialog update
- progress_.VSupdate(progress_, total)
- if progress_.iscanceled():
- break
- # L'array affiche vos info dans l'ordre de sPattern en commencant a 0, attention dans ce cas la on recupere 6 information
- # Mais selon votre regex il ne peut y en avoir que 2 ou 3.
- sThumb = aEntry[0]
- sTitle = aEntry[1]
- sUrl2 = aEntry[2]
- sLang = aEntry[3]
- sQual = aEntry[4]
- sHoster = aEntry[5]
- sDesc = ''
- sTitle = sTitle.replace('En streaming', '')
- # Si vous avez des information dans aEntry Qualiter lang organiser un peux vos titre exemple.
- # Si vous pouvez la langue et la Qualite en MAJ ".upper()" vostfr.upper() = VOSTFR
- sTitle = ('%s [%s] (%s) [COLOR coral]%s[/COLOR]') % (sTitle, sQual, sLang.upper(), sHoster)
- # mettre les informations de streaming entre [] et le reste entre () vStream s'occupe de la couleur automatiquement.
- # Utile si les liens recupere ne commencent pas par (http://www.nomdusite.com/)
- # sUrl2 = URL_MAIN + sUrl2
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', sUrl2) # sortie de l'url
- oOutputParameterHandler.addParameter('sMovieTitle', sTitle) # sortie du titre
- oOutputParameterHandler.addParameter('sThumb', sThumb) # sortie du poster
- oOutputParameterHandler.addParameter('sDesc', sDesc) # sortie de la description
- oOutputParameterHandler.addParameter('referer', sUrl) # URL d'origine, parfois utile comme référence
- if '/series' in sUrl:
- oGui.addTV(SITE_IDENTIFIER, 'ShowSerieSaisonEpisodes', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
- # addTV pour sortir les series tv (identifiant, fonction, titre, icon, poster, description, sortie parametre)
- elif '/animes' in sUrl:
- oGui.addAnime(SITE_IDENTIFIER, 'ShowSerieSaisonEpisodes', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
- # addAnime pour sortir les series animés (mangas) (identifiant, fonction, titre, icon, poster, description, sortie parametre)
- else:
- oGui.addMovie(SITE_IDENTIFIER, 'showHosters', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
- # addMovies pour sortir les films (identifiant, fonction, titre, icon, poster, description, sortie parametre)
- # Il existe aussi addMisc(identifiant, function, titre, icon, poster, description, sortie parametre)
- # A utiliser pour les autres types, tels que : documentaires, spectacles, etc.
- # qui ne nécessitent pas de metadonnées (recherches de la description, de la bande annonces, des acteurs, etc.)
- progress_.VSclose(progress_) # fin du dialog
- if not sSearch:
- sNextPage = __checkForNextPage(sHtmlContent) # cherche la page suivante
- if (sNextPage != False):
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', sNextPage)
- sNumPage = re.search('/page/([0-9]+)', sNextPage).group(1)
- oGui.addNext(SITE_IDENTIFIER, 'showSeries', 'Page ' + sNumPage, oOutputParameterHandler)
- # Si pas de numero de page dans l'url du nextPage, utiliser la ligne suivante et désactiver les 2 précédentes
- # oGui.addNext(SITE_IDENTIFIER, 'showMovies', Suivant, oOutputParameterHandler)
- # Ajoute une entree pour le lien Suivant | pas de addMisc pas de poster et de description inutile donc
- oGui.setEndOfDirectory() # ferme l'affichage
- def __checkForNextPage(sHtmlContent): # cherche la page suivante
- oParser = cParser()
- sPattern = '<div class="navigation".+? <span.+? <a href="([^"]+)">'
- aResult = oParser.parse(sHtmlContent, sPattern)
- if (aResult[0] == True):
- return aResult[1][0]
- return False
- def showHosters(): # recherche et affiche les hotes
- oGui = cGui() # ouvre l'affichage
- oInputParameterHandler = cInputParameterHandler() # apelle l'entree de parametre
- sUrl = oInputParameterHandler.getValue('siteUrl') # apelle siteUrl
- sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') # appelle le titre
- sThumb = oInputParameterHandler.getValue('sThumb') # appelle le poster
- referer = oInputParameterHandler.getValue('referer') # récupere l'URL appelante
- oRequestHandler = cRequestHandler(sUrl) # requete sur l'url
- oRequestHandler.addHeaderEntry('Referer', referer) # parametre pour passer l'URL appelante (n'est pas forcement necessaire)
- sHtmlContent = oRequestHandler.request() # requete sur l'url
- oParser = cParser()
- sPattern = '<iframe.+?src="([^"]+)"'
- # ici nous cherchons toute les sources iframe
- aResult = oParser.parse(sHtmlContent, sPattern)
- # pensez a faire un VSlog(str(aResult)) pour verifier
- # si un lien ne s'affiche pas, peut etre que l'hote n'est pas supporte par l'addon
- if (aResult[0] == True):
- for aEntry in aResult[1]:
- sHosterUrl = aEntry
- oHoster = cHosterGui().checkHoster(sHosterUrl) # recherche l'hote dans l'addon
- if (oHoster != False):
- oHoster.setDisplayName(sMovieTitle) # nom affiche
- oHoster.setFileName(sMovieTitle) # idem
- cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
- # affiche le lien (oGui, oHoster, url du lien, poster)
- oGui.setEndOfDirectory() # fin
- # Pour les series, il y a generalement une etape en plus pour la selection des episodes ou saisons.
- def ShowSerieSaisonEpisodes():
- oGui = cGui()
- oInputParameterHandler = cInputParameterHandler()
- sUrl = oInputParameterHandler.getValue('siteUrl')
- sThumb = oInputParameterHandler.getValue('sThumb')
- sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
- sDesc = oInputParameterHandler.getValue('sDesc')
- oRequestHandler = cRequestHandler(sUrl)
- sHtmlContent = oRequestHandler.request()
- # Pattern servant à retrouver les éléments dans la page
- sPattern = '?????????????????????'
- oParser = cParser()
- aResult = oParser.parse(sHtmlContent, sPattern)
- if (aResult[0] == True):
- total = len(aResult[1])
- progress_ = progress().VScreate(SITE_NAME)
- for aEntry in aResult[1]:
- progress_.VSupdate(progress_, total)
- if progress_.iscanceled():
- break
- sTitle = sMovieTitle + aEntry[0]
- sUrl2 = aEntry[1]
- oOutputParameterHandler = cOutputParameterHandler()
- oOutputParameterHandler.addParameter('siteUrl', sUrl2)
- oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
- oOutputParameterHandler.addParameter('sThumb', sThumb)
- oGui.addEpisode(SITE_IDENTIFIER, 'seriesHosters', sTitle, 'series.png', sThumb, sDesc, oOutputParameterHandler)
- # il y a aussi addAnime pour les mangas
- # oGui.addAnime(SITE_IDENTIFIER, 'seriesHosters', sTitle, 'animes.png', sThumb, sDesc, oOutputParameterHandler)
- progress_.VSclose(progress_)
- oGui.setEndOfDirectory()
- def seriesHosters(): # cherche les episodes de series
- oGui = cGui()
- oInputParameterHandler = cInputParameterHandler()
- sUrl = oInputParameterHandler.getValue('siteUrl')
- sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
- sThumb = oInputParameterHandler.getValue('sThumb')
- oRequestHandler = cRequestHandler(sUrl)
- sHtmlContent = oRequestHandler.request()
- # Exemple de pattern à changer
- sPattern = '<dd><a href="([^<]+)" class="zoombox.+?" title="(.+?)"><button class="btn">.+?</button></a></dd>'
- oParser = cParser()
- aResult = oParser.parse(sHtmlContent, sPattern)
- if (aResult[0] == True):
- for aEntry in aResult[1]:
- sHosterUrl = aEntry[0]
- oHoster = cHosterGui().checkHoster(sHosterUrl)
- if (oHoster != False):
- oHoster.setDisplayName(aEntry[1])
- oHoster.setFileName(aEntry[1])
- cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
- oGui.setEndOfDirectory()
- # n'hesitez pas à poser vos questions et même à partager vos sources.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement