astrXbian/.install/.kodi/addons/plugin.video.vstream/resources/sites/streaming_series.py

314 lines
12 KiB
Python

# -*- 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('&#8217;', '\'').replace('&#8220;', '\"').replace('&#8221;', '\"').replace('&#8230;', '...')
except:
pass
#filtre pour ne prendre que sur une partie
sStart = '<span>Informations</span>'
sEnd = '<div class="content ">'
sHtmlContent = oParser.abParse(sHtmlContent, sStart, sEnd)
sPattern = '<a href="([^"]+)".+?<span>([^<]+)<'
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 = '<span class="lg">([^<]+)<|<span class="myLecteur">.+?<b>([^<]+)</b>.+?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 = '<iframe src=["\']([^<>"\']+?)["\']'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == True):
return aResult[1][0]
# recherche d'un lien redirige
sPattern = '<a class=.button. href=["\']([^<>"\']+?)["\'] target=._blank.>'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == True):
return aResult[1][0]
return ''