# -*- coding: utf-8 -*- # vStream https://github.com/Kodi-vStream/venom-xbmc-addons 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.util import cUtil from resources.lib.comaddon import progress, dialog, xbmc SITE_IDENTIFIER = 'streaming_series' SITE_NAME = 'Streaming-Séries' SITE_DESC = 'Regarder toutes vos séries en Streaming Gratuit' URL_MAIN = 'https://streaming-series.la/' SERIE_NEWS = (URL_MAIN, 'showMovies') SERIE_SERIES = ('http://', 'load') SERIE_GENRES = (True, 'showGenres') URL_SEARCH = (URL_MAIN + '?s=', 'showMovies') URL_SEARCH_SERIES = (URL_MAIN + '?s=', 'showMovies') FUNCTION_SEARCH = 'showMovies' def load(): oGui = cGui() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', URL_SEARCH[0]) oGui.addDir(SITE_IDENTIFIER, 'showSerieSearch', 'Recherche', '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) oGui.setEndOfDirectory() def showSerieSearch(): oGui = cGui() sSearchText = oGui.showKeyBoard() if (sSearchText != False): sUrl = URL_SEARCH[0] + sSearchText showMovies(sUrl) oGui.setEndOfDirectory() return def showGenres(): oGui = cGui() liste = [] liste.append(['Action', URL_MAIN + 'category/series/action/']) liste.append(['Animation', URL_MAIN + 'category/series/animation/']) liste.append(['Aventure', URL_MAIN + 'category/series/aventure/']) liste.append(['Comédie', URL_MAIN + 'category/series/comedie/']) liste.append(['Documentaire', URL_MAIN + 'category/series/documentaire/']) liste.append(['Drame', URL_MAIN + 'category/series/drame/']) liste.append(['Epouvante Horreur', URL_MAIN + 'category/series/epouvante-horreur/']) liste.append(['Espionnage', URL_MAIN + 'category/series/espionnage/']) liste.append(['Famille', URL_MAIN + 'category/series/famille/']) liste.append(['Fantastique', URL_MAIN + 'category/series/fantastique/']) liste.append(['Guerre', URL_MAIN + 'category/series/guerre/']) liste.append(['Historique', URL_MAIN + 'category/series/historique/']) liste.append(['Judiciaire', URL_MAIN + 'category/series/judiciaire/']) liste.append(['Medical', URL_MAIN + 'category/series/medical/']) liste.append(['Musical', URL_MAIN + 'category/series/musical/']) liste.append(['Policier', URL_MAIN + 'category/series/policier/']) liste.append(['Romance', URL_MAIN + 'category/series/romance/']) liste.append(['Science Fiction', URL_MAIN + 'category/series/science-fiction/']) liste.append(['Soap', URL_MAIN + 'category/series/soap/']) liste.append(['Thriller', URL_MAIN + 'category/series/thriller/']) liste.append(['Western', URL_MAIN + 'category/series/western/']) for sTitle, sUrl in liste: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addDir(SITE_IDENTIFIER, 'showMovies', sTitle, 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showMovies(sSearch=''): oGui = cGui() oParser = cParser() if sSearch: sUrl = sSearch.replace(' ', '+') else: oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') oRequestHandler = cRequestHandler(sUrl) sHtmlContent = oRequestHandler.request() sPattern = 'class="post-thumbnail">.+?href="([^"]+)" *title="([^"]+)".+?src="([^"]+)"' 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) for aEntry in aResult[1]: progress_.VSupdate(progress_, total) if progress_.iscanceled(): break sUrl = aEntry[0] sThumb = aEntry[2] sTitle = aEntry[1] # Si recherche et trop de resultat, on nettoye if sSearch and total > 2: if cUtil().CheckOccurence(sSearch.replace(URL_SEARCH[0], ''), sTitle) == 0: continue oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sMovieTitle', sTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oGui.addTV(SITE_IDENTIFIER, 'showEpisodes', sTitle, '', sThumb, '', oOutputParameterHandler) progress_.VSclose(progress_) if not sSearch: # une seule page par recherche 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 = 'href="([^"]+)">Suivant' aResult = oParser.parse(sHtmlContent, sPattern) if (aResult[0] == True): return aResult[1][0] return False def showEpisodes(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sThumb = oInputParameterHandler.getValue('sThumb') oRequestHandler = cRequestHandler(sUrl) sHtmlContent = oRequestHandler.request() oParser = cParser() sDesc = '' try: sPattern = 'style="text-align:justify">(.+?)<' aResult = oParser.parse(sHtmlContent, sPattern) if aResult[0]: sDesc = aResult[1][0] sDesc = sDesc.replace('’', '\'').replace('“', '\"').replace('”', '\"').replace('…', '...') except: pass #filtre pour ne prendre que sur une partie sStart = 'Informations' sEnd = '
' sHtmlContent = oParser.abParse(sHtmlContent, sStart, sEnd) sPattern = '([^<]+)<' aResult = oParser.parse(sHtmlContent, sPattern) if (aResult[0] == False): oGui.addText(SITE_IDENTIFIER) if (aResult[0] == True): for aEntry in aResult[1]: sUrl = aEntry[0] sTitle = 'Episode ' + aEntry[1] + sMovieTitle oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sMovieTitle', sTitle) oOutputParameterHandler.addParameter('sThumb', sThumb) oOutputParameterHandler.addParameter('sDesc', sDesc) oGui.addEpisode(SITE_IDENTIFIER, 'showLinks', sTitle, '', sThumb, sDesc, oOutputParameterHandler) oGui.setEndOfDirectory() def showLinks(): oGui = cGui() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sThumb = oInputParameterHandler.getValue('sThumb') sDesc = oInputParameterHandler.getValue('sDesc') oParser = cParser() oRequest = cRequestHandler(sUrl) sHtmlContent = oRequest.request() sPattern = '([^<]+)<|.+?([^<]+).+?href="([^"]+)"' aResult = oParser.parse(sHtmlContent, sPattern) if (aResult[0] == True): for aEntry in aResult[1]: # langue if aEntry[0]: oGui.addText(SITE_IDENTIFIER, '[COLOR red]' + aEntry[0] + '[/COLOR]') # hote else: sHost = aEntry[1] sUrl = URL_MAIN[:-1] + aEntry[2] sTitle = ('%s [COLOR coral]%s[/COLOR]') % (sMovieTitle, sHost) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle) oOutputParameterHandler.addParameter('sThumb', sThumb ) 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') sHosterUrl = ProtectstreamBypass(sUrl) oHoster = cHosterGui().checkHoster(sHosterUrl) if (oHoster != False): oHoster.setDisplayName(sMovieTitle) oHoster.setFileName(sMovieTitle) cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb) oGui.setEndOfDirectory() def ProtectstreamBypass(url): # lien commencant par VID_ Codedurl = url oRequestHandler = cRequestHandler(Codedurl) sHtmlContent = oRequestHandler.request() oParser = cParser() sPattern = 'var k=\"([^<>\"]*?)\";' aResult = oParser.parse(sHtmlContent, sPattern) if (aResult[0] == True): postdata = 'k=' + aResult[1][0] dialog().VSinfo('Décodage en cours', "Patientez", 5) xbmc.sleep(5000) UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0' oRequest = cRequestHandler(URL_MAIN + 'embed_secur.php') oRequest.setRequestType(1) oRequest.addHeaderEntry('User-Agent', UA) # oRequest.addHeaderEntry('Host', 'www.protect-stream.com') oRequest.addHeaderEntry('Referer', Codedurl) oRequest.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8') oRequest.addHeaderEntry('Content-Type', 'application/x-www-form-urlencoded') oRequest.addParametersLine(postdata) sHtmlContent = oRequest.request() # Test de fonctionnement aResult = oParser.parse(sHtmlContent, sPattern) if aResult[0]: dialog().VSinfo('Lien encore protégé', "Erreur", 5) return '' # recherche du lien embed sPattern = '