# -*- coding: utf-8 -*- # vStream https://github.com/Kodi-vStream/venom-xbmc-addons from resources.lib.gui.hoster import cHosterGui from resources.lib.gui.gui import cGui from resources.lib.handler.inputParameterHandler import cInputParameterHandler from resources.lib.handler.outputParameterHandler import cOutputParameterHandler from resources.lib.handler.requestHandler import cRequestHandler from resources.lib.comaddon import progress from resources.lib.parser import cParser from resources.lib.packer import cPacker from resources.lib.util import cUtil import re SITE_IDENTIFIER = 'zustream' SITE_NAME = 'ZuStream' SITE_DESC = 'Retrouvez un énorme répertoire de films, de séries et de mangas en streaming VF et VOSTFR complets' URL_MAIN = 'https://www.zustream.eu/' MOVIE_MOVIE = (True, 'showMenuFilms') MOVIE_NEWS = (URL_MAIN + 'film/', 'showMovies') MOVIE_GENRES = ('?post_types=movies', 'showGenres') MOVIE_ANNEES = (True, 'showYears') SERIE_SERIES = (True, 'showMenuSeries') SERIE_NEWS = (URL_MAIN + 'serie/', 'showMovies') SERIE_GENRES = ('?post_types=tvshows', 'showGenres') SERIE_MANGAS = (URL_MAIN + 'genre/mangas/', 'showMovies') SERIE_NETFLIX = (URL_MAIN + 'network/netflix/', 'showMovies') SERIE_CANAL = (URL_MAIN + 'network/canal/', 'showMovies') SERIE_AMAZON = (URL_MAIN + 'network/amazon/', 'showMovies') SERIE_DISNEY = (URL_MAIN + 'network/disney/', 'showMovies') SERIE_APPLE = (URL_MAIN + 'network/apple-tv/', 'showMovies') SERIE_YOUTUBE = (URL_MAIN + 'network/youtube-premium/', 'showMovies') SERIE_ANNEES = (True, 'showYearsSeries') URL_SEARCH = (URL_MAIN + '?s=', 'showMovies') URL_SEARCH_MOVIES = (URL_MAIN + '?post_types=movies&s=', 'showMovies') URL_SEARCH_SERIES = (URL_MAIN + '?post_types=tvshows&s=', 'showMovies') FUNCTION_SEARCH = 'showMovies' def load(): oGui = cGui() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'http://venom/') oGui.addDir(SITE_IDENTIFIER, 'showMenuFilms', 'Films', 'films.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'http://venom/') oGui.addDir(SITE_IDENTIFIER, 'showMenuSeries', 'Séries', 'series.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showMenuFilms(): oGui = cGui() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH_MOVIES[0]) oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche films', '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_GENRES[0]) oGui.addDir(SITE_IDENTIFIER, MOVIE_GENRES[1], 'Films (Genres)', 'genres.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', MOVIE_ANNEES[0]) oGui.addDir(SITE_IDENTIFIER, MOVIE_ANNEES[1], 'Films (Par années)', 'annees.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showMenuSeries(): oGui = cGui() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH_SERIES[0]) oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche séries', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_NEWS[0]) oGui.addDir(SITE_IDENTIFIER, SERIE_NEWS[1], 'Séries (Derniers ajouts)', 'news.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_GENRES[0]) oGui.addDir(SITE_IDENTIFIER, SERIE_GENRES[1], 'Séries (Genres)', 'genres.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', URL_MAIN) oGui.addDir(SITE_IDENTIFIER, 'showNetwork', 'Séries (Par diffuseurs)', 'host.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_ANNEES[0]) oGui.addDir(SITE_IDENTIFIER, SERIE_ANNEES[1], 'Séries (Par années)', 'annees.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_MANGAS[0]) oGui.addDir(SITE_IDENTIFIER, SERIE_MANGAS[1], 'Séries (Mangas)', 'animes.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showGenres(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') liste = [] liste.append(['Action', URL_MAIN + 'genre/action/' + sUrl]) liste.append(['Animation', URL_MAIN + 'genre/animation/' + sUrl]) liste.append(['Aventure', URL_MAIN + 'genre/aventure/' + sUrl]) liste.append(['Biopic', URL_MAIN + 'genre/biographie/' + sUrl]) liste.append(['Comédie', URL_MAIN + 'genre/comedie/' + sUrl]) liste.append(['Comédie musicale', URL_MAIN + 'genre/musique/' + sUrl]) liste.append(['Comédie romantique', URL_MAIN + 'genre/romance/' + sUrl]) liste.append(['Documentaire', URL_MAIN + 'genre/documentaire/' + sUrl]) liste.append(['Drame', URL_MAIN + 'genre/drame/' + sUrl]) liste.append(['Guerre', URL_MAIN + 'genre/guerre/' + sUrl]) liste.append(['Famille', URL_MAIN + 'genre/familial/' + sUrl]) liste.append(['Fantastique', URL_MAIN + 'genre/fantastique/' + sUrl]) liste.append(['Horreur', URL_MAIN + 'genre/horreur/' + sUrl]) liste.append(['Historique', URL_MAIN + 'genre/histoire/' + sUrl]) liste.append(['Mystere', URL_MAIN + 'genre/mystere/' + sUrl]) liste.append(['Noël', URL_MAIN + 'genre/noel/' + sUrl]) liste.append(['Science Fiction', URL_MAIN + 'genre/science-fiction/' + sUrl]) liste.append(['Thriller', URL_MAIN + 'genre/thriller/' + sUrl]) liste.append(['Western', URL_MAIN + 'genre/western/' + sUrl]) for sTitle, sUrl in liste: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addDir(SITE_IDENTIFIER, 'showMovies', sTitle, 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showNetwork(): oGui = cGui() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_NETFLIX[0]) oOutputParameterHandler.addParameter('sTmdbId', 213) # Utilisé par TMDB oGui.addNetwork(SITE_IDENTIFIER, SERIE_NETFLIX[1], 'Séries (Netflix)', 'host.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_CANAL[0]) oOutputParameterHandler.addParameter('sTmdbId', 285) # Utilisé par TMDB oGui.addNetwork(SITE_IDENTIFIER, SERIE_CANAL[1], 'Séries (Canal+)', 'host.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_AMAZON[0]) oOutputParameterHandler.addParameter('sTmdbId', 1024) # Utilisé par TMDB oGui.addNetwork(SITE_IDENTIFIER, SERIE_AMAZON[1], 'Séries (Amazon Prime)', 'host.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_DISNEY[0]) oOutputParameterHandler.addParameter('sTmdbId', 2739) # Utilisé par TMDB oGui.addNetwork(SITE_IDENTIFIER, SERIE_DISNEY[1], 'Séries (Disney+)', 'host.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_APPLE[0]) oOutputParameterHandler.addParameter('sTmdbId', 2552) # Utilisé par TMDB oGui.addNetwork(SITE_IDENTIFIER, SERIE_APPLE[1], 'Séries (Apple TV+)', 'host.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_YOUTUBE[0]) oOutputParameterHandler.addParameter('sTmdbId', 1436) # Utilisé par TMDB oGui.addNetwork(SITE_IDENTIFIER, SERIE_YOUTUBE[1], 'Séries (YouTube Originals)', 'host.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showYears(): oGui = cGui() for i in reversed(range(1995, 2021)): Year = str(i) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', URL_MAIN + 'sortie/' + Year + '/?post_types=movies') oGui.addDir(SITE_IDENTIFIER, 'showMovies', Year, 'annees.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showYearsSeries(): oGui = cGui() for i in reversed(range(1997, 2021)): Year = str(i) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', URL_MAIN + 'sortie/' + Year + '/?post_types=tvshows') oGui.addDir(SITE_IDENTIFIER, 'showMovies', Year, 'annees.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showSearch(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sSearchText = oGui.showKeyBoard() if (sSearchText != False): sUrl = sUrl + sSearchText showMovies(sUrl) oGui.setEndOfDirectory() return def showMovies(sSearch=''): oGui = cGui() if sSearch: sUrl = sSearch.replace(' ', '+') sPattern = '
.+?(.+?)

' else: oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sPattern = '
([^<]+)<.+?)(?:|class="dtyearfr">([^<]+)<.+?).+?
(.*?)
' oRequestHandler = cRequestHandler(sUrl) sHtmlContent = oRequestHandler.request() oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if (aResult[0] == False): oGui.addText(SITE_IDENTIFIER) if (aResult[0] == True): total = len(aResult[1]) progress_ = progress().VScreate(SITE_NAME) utils = cUtil() for aEntry in aResult[1]: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break sLang = '' sYear = '' sDesc = '' if sSearch: sUrl = aEntry[0] sThumb = aEntry[1] sTitle = aEntry[2] sDesc = aEntry[3] else: sThumb = aEntry[0] sTitle = aEntry[1] if aEntry[2]: sLang = aEntry[2] if aEntry[3]: sYear = aEntry[3] sUrl = aEntry[4] if aEntry[5]: sDesc = aEntry[5] try: sDesc = unicode(sDesc, 'utf-8') # converti en unicode sDesc = utils.unescape(sDesc).encode('utf-8') # retire les balises HTML except: pass sDisplayTitle = ('%s (%s) (%s)') % (sTitle, sLang, sYear) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sMovieTitle', sTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('sDesc', sDesc) if '/serie' in sUrl: oGui.addTV(SITE_IDENTIFIER, 'showSxE', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler) else: oGui.addMovie(SITE_IDENTIFIER, 'showLink', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler) progress_.VSclose(progress_) if not sSearch: sNextPage = __checkForNextPage(sHtmlContent) if (sNextPage != False): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sNextPage) number = re.search('/page/([0-9]+)', sNextPage).group(1) oGui.addNext(SITE_IDENTIFIER, 'showMovies', '[COLOR teal]Page ' + number + ' >>>[/COLOR]', oOutputParameterHandler) oGui.setEndOfDirectory() def __checkForNextPage(sHtmlContent): oParser = cParser() sPattern = ' Episode \g<2>', aEntry[1]) sTitle = sMovieTitle + ' ' + SxE sDisplaytitle = sMovieTitle + ' ' + re.sub('saison \d+ ', '', SxE) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sMovieTitle', sTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('sDesc', sDesc) oGui.addEpisode(SITE_IDENTIFIER, 'showLink', sDisplaytitle, '', sThumb, sDesc, oOutputParameterHandler) oGui.setEndOfDirectory() def showLink(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sThumb = oInputParameterHandler.getValue('sThumb') sDesc = oInputParameterHandler.getValue('sDesc') oRequest = cRequestHandler(sUrl) sHtmlContent = oRequest.request() sPattern = "dooplay_player_option.+?data-post='(\d+)'.+?data-nume='(.+?)'>.+?'title'>(.+?)<" oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if (aResult[0] == True): # trie par numéro de serveur sortedList = sorted(aResult[1], key=lambda item: item[2]) for aEntry in sortedList: sUrl2 = URL_MAIN + 'wp-admin/admin-ajax.php' dtype = 'movie' # fonctionne pour Film ou Série (pour info : série -> dtype = 'tv') dpost = aEntry[0] dnum = aEntry[1] pdata = 'action=doo_player_ajax&post=' + dpost + '&nume=' + dnum + '&type=' + dtype sTitle = aEntry[2].replace('Serveur', '').replace('Télécharger', '').replace('(', '').replace(')', '') if ('VIP - ' in sTitle): # Les liens VIP ne fonctionnent pas continue sTitle = ('%s [%s]') % (sMovieTitle, sTitle) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl2) oOutputParameterHandler.addParameter('referer', sUrl) oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('pdata', pdata) oGui.addLink(SITE_IDENTIFIER, 'showHosters', sTitle, sThumb, sDesc, oOutputParameterHandler) oGui.setEndOfDirectory() def showHosters(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sThumb = oInputParameterHandler.getValue('sThumb') referer = oInputParameterHandler.getValue('referer') pdata = oInputParameterHandler.getValue('pdata') oRequest = cRequestHandler(sUrl) oRequest.setRequestType(1) oRequest.addHeaderEntry('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:70.0) Gecko/20100101 Firefox/70.0') oRequest.addHeaderEntry('Referer', referer) oRequest.addHeaderEntry('Accept', '*/*') oRequest.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3') oRequest.addHeaderEntry('Content-Type', 'application/x-www-form-urlencoded') oRequest.addParametersLine(pdata) sHtmlContent = oRequest.request() oParser = cParser() # 1 sPattern = '(?: