425 lines
16 KiB
Python
425 lines
16 KiB
Python
|
# -*- 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.parser import cParser
|
||
|
from resources.lib.comaddon import progress
|
||
|
from resources.lib.util import Unquote
|
||
|
import re
|
||
|
|
||
|
UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0'
|
||
|
|
||
|
SITE_IDENTIFIER = 'tvseriestreaming'
|
||
|
SITE_NAME = 'Tv_seriestreaming'
|
||
|
SITE_DESC = 'Séries & Animés en Streaming'
|
||
|
|
||
|
URL_MAIN = 'https://seriestreamingtv.com/' # https://seriestreaming.co/
|
||
|
URL_LAST = URL_MAIN + 'acceuils-5' # URL used for list and search
|
||
|
|
||
|
SERIE_SERIES = ('http://', 'load')
|
||
|
SERIE_NEWS = (URL_MAIN + 'derniere-et-meilleures-serie-en-streaming', 'showMovies')
|
||
|
SERIE_VIEWS = (URL_MAIN + 'la-top-des-meilleures-serie', 'showMovies')
|
||
|
SERIE_COMMENT = (URL_MAIN + 'meilleur-serie-populaire-streaming', 'showMovies')
|
||
|
SERIE_LIST = (URL_MAIN, 'showAZ')
|
||
|
SERIE_GENRES = (True, 'showGenres')
|
||
|
SERIE_ANNEES = (True, 'showSerieYears')
|
||
|
|
||
|
URL_SEARCH_SERIES = ('', 'searchSerie')
|
||
|
FUNCTION_SEARCH = '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', SERIE_NEWS[0])
|
||
|
oGui.addDir(SITE_IDENTIFIER, SERIE_NEWS[1], 'Séries (Derniers ajouts)', 'news.png', oOutputParameterHandler)
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', SERIE_VIEWS[0])
|
||
|
oGui.addDir(SITE_IDENTIFIER, SERIE_VIEWS[1], 'Séries (Les plus vues)', 'views.png', oOutputParameterHandler)
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', SERIE_COMMENT[0])
|
||
|
oGui.addDir(SITE_IDENTIFIER, SERIE_COMMENT[1], 'Séries (Populaire)', 'comments.png', oOutputParameterHandler)
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', SERIE_LIST[0])
|
||
|
oGui.addDir(SITE_IDENTIFIER, SERIE_LIST[1], 'Series (Liste)', 'listes.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', SERIE_ANNEES[0])
|
||
|
oGui.addDir(SITE_IDENTIFIER, SERIE_ANNEES[1], 'Séries (Par années)', 'annees.png', oOutputParameterHandler)
|
||
|
|
||
|
oGui.setEndOfDirectory()
|
||
|
|
||
|
|
||
|
def showSearch():
|
||
|
oGui = cGui()
|
||
|
|
||
|
sSearchText = oGui.showKeyBoard()
|
||
|
if (sSearchText != False):
|
||
|
searchSerie(sSearchText)
|
||
|
oGui.setEndOfDirectory()
|
||
|
return
|
||
|
|
||
|
|
||
|
def showSerieYears():
|
||
|
# for i in itertools.chain(range(5, 7), [8, 9]): afficher dans l'ordre (pense bete ne pas effacer)
|
||
|
oGui = cGui()
|
||
|
from itertools import chain
|
||
|
generator = chain([1936, 1940, 1941, 1950, 1955], range(1958, 2021))
|
||
|
|
||
|
for i in reversed(list(generator)):
|
||
|
Year = str(i)
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', URL_MAIN + 'annee/' + Year)
|
||
|
oGui.addDir(SITE_IDENTIFIER, 'showMovies', Year, 'annees.png', oOutputParameterHandler)
|
||
|
|
||
|
oGui.setEndOfDirectory()
|
||
|
|
||
|
|
||
|
def showAZ():
|
||
|
oGui = cGui()
|
||
|
|
||
|
for i in range(0, 27):
|
||
|
if (i < 1):
|
||
|
sLetter = '\d+'
|
||
|
aLetter = '0-9'
|
||
|
else:
|
||
|
sLetter = chr(64 + i)
|
||
|
aLetter = sLetter
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('sLetter', sLetter)
|
||
|
oGui.addDir(SITE_IDENTIFIER, 'AlphaDisplay', "%s [COLOR coral]%s[/COLOR]" % ("Lettre", aLetter), 'az.png', oOutputParameterHandler)
|
||
|
|
||
|
oGui.setEndOfDirectory()
|
||
|
|
||
|
|
||
|
def AlphaDisplay():
|
||
|
oGui = cGui()
|
||
|
oParser = cParser()
|
||
|
oInputParameterHandler = cInputParameterHandler()
|
||
|
sLetter = oInputParameterHandler.getValue('sLetter')
|
||
|
|
||
|
oRequestHandler = cRequestHandler(URL_LAST)
|
||
|
sHtmlContent = oRequestHandler.request()
|
||
|
sHtmlContent = oParser.abParse(sHtmlContent, '<h1>Listes des séries:</h1>', 'Copyright')
|
||
|
|
||
|
sPattern = '<a title="(' + sLetter + '.+?)" href="([^"]+)"'
|
||
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
||
|
|
||
|
if aResult[0]:
|
||
|
|
||
|
series = []
|
||
|
|
||
|
for aEntry in aResult[1]:
|
||
|
sTitle = aEntry[0].replace('en streaming', '')
|
||
|
sUrl = aEntry[1]
|
||
|
series.append((sTitle, sUrl))
|
||
|
|
||
|
# Trie des séries par ordre alphabétique
|
||
|
series = sorted(series, key=lambda serie: serie[0])
|
||
|
|
||
|
total = len(series)
|
||
|
progress_ = progress().VScreate(SITE_NAME)
|
||
|
|
||
|
for sTitle, sUrl in series:
|
||
|
progress_.VSupdate(progress_, total)
|
||
|
if progress_.iscanceled():
|
||
|
break
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', sUrl)
|
||
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
||
|
oGui.addTV(SITE_IDENTIFIER, 'showS_E', sTitle, '', '', '', oOutputParameterHandler)
|
||
|
|
||
|
progress_.VSclose(progress_)
|
||
|
|
||
|
oGui.setEndOfDirectory()
|
||
|
|
||
|
|
||
|
def searchSerie(sSearch):
|
||
|
oGui = cGui()
|
||
|
oParser = cParser()
|
||
|
sSearch = Unquote(sSearch)
|
||
|
|
||
|
oRequestHandler = cRequestHandler(URL_LAST)
|
||
|
sHtmlContent = oRequestHandler.request()
|
||
|
sHtmlContent = oParser.abParse(sHtmlContent, '<h1>Listes des séries:</h1>', '<div class="container"><br>')
|
||
|
|
||
|
sPattern = '<a title="([^"]*' + sSearch + '.*?)\" href="([^"]+)"'
|
||
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
||
|
|
||
|
if (aResult[0] == True):
|
||
|
for aEntry in aResult[1]:
|
||
|
sTitle = aEntry[0].replace('en streaming', '')
|
||
|
sUrl = aEntry[1]
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', sUrl)
|
||
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
||
|
oGui.addDir(SITE_IDENTIFIER, 'showS_E', sTitle, 'series.png', oOutputParameterHandler)
|
||
|
|
||
|
|
||
|
def showGenres():
|
||
|
oGui = cGui()
|
||
|
|
||
|
liste = []
|
||
|
liste.append(['Action', URL_MAIN + 'category/action'])
|
||
|
liste.append(['Animation', URL_MAIN + 'category/animation'])
|
||
|
liste.append(['Anime', URL_MAIN + 'category/anime'])
|
||
|
liste.append(['Aventure', URL_MAIN + 'category/adventure'])
|
||
|
liste.append(['Biographie', URL_MAIN + 'category/biography'])
|
||
|
liste.append(['Comédie', URL_MAIN + 'category/comedy'])
|
||
|
liste.append(['Crime', URL_MAIN + 'category/crime'])
|
||
|
liste.append(['Documentaire', URL_MAIN + 'category/documentary'])
|
||
|
liste.append(['Drama', URL_MAIN + 'category/drama'])
|
||
|
liste.append(['Drame', URL_MAIN + 'category/drame'])
|
||
|
liste.append(['Enfants', URL_MAIN + 'category/children'])
|
||
|
liste.append(['Famille', URL_MAIN + 'category/family'])
|
||
|
liste.append(['Fantastique', URL_MAIN + 'category/fantasy'])
|
||
|
liste.append(['Guerre', URL_MAIN + 'category/war'])
|
||
|
liste.append(['Historique', URL_MAIN + 'category/history'])
|
||
|
liste.append(['Horreur', URL_MAIN + 'category/horror'])
|
||
|
liste.append(['Music', URL_MAIN + 'category/music'])
|
||
|
liste.append(['Musical', URL_MAIN + 'category/musical'])
|
||
|
liste.append(['Mystère', URL_MAIN + 'category/mystere'])
|
||
|
liste.append(['Policier', URL_MAIN + 'category/policier'])
|
||
|
liste.append(['Réalité', URL_MAIN + 'category/reality'])
|
||
|
liste.append(['Réalité-tv', URL_MAIN + 'category/reality-tv'])
|
||
|
liste.append(['Romance', URL_MAIN + 'category/romance'])
|
||
|
liste.append(['Sci-fi', URL_MAIN + 'category/sci-fi'])
|
||
|
liste.append(['Science-fiction', URL_MAIN + 'category/science-fiction'])
|
||
|
liste.append(['Soap', URL_MAIN + 'category/soap'])
|
||
|
liste.append(['Sport', URL_MAIN + 'category/sport'])
|
||
|
liste.append(['Super-hero', URL_MAIN + 'category/superhero'])
|
||
|
liste.append(['Suspense', URL_MAIN + 'category/suspense'])
|
||
|
liste.append(['Thriller', URL_MAIN + 'category/thriller'])
|
||
|
liste.append(['Western', URL_MAIN + 'category/western'])
|
||
|
liste.append(['Autre', URL_MAIN + 'category/na'])
|
||
|
|
||
|
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()
|
||
|
oInputParameterHandler = cInputParameterHandler()
|
||
|
|
||
|
if sSearch:
|
||
|
sUrl = sSearch.replace(' ', '+')
|
||
|
else:
|
||
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
||
|
|
||
|
oRequestHandler = cRequestHandler(sUrl)
|
||
|
sHtmlContent = oRequestHandler.request()
|
||
|
|
||
|
# derniers épisodes
|
||
|
if 'derniere-et-meilleures-serie-en-streaming' in sUrl:
|
||
|
sPattern = '<a href="([^"]+)" class="list-group-item.+?>(.+?)<b>(.+?)</b>'
|
||
|
sHtmlContent = oParser.abParse(sHtmlContent, "<h4>Les derniers episodes", "les plus vues")
|
||
|
#reste
|
||
|
else:
|
||
|
sPattern = '<a class="image" title="(.+?)" href="([^"]+)".+?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
|
||
|
|
||
|
# Derniers épisodes
|
||
|
if 'derniere-et-meilleures-serie-en-streaming' in sUrl:
|
||
|
sUrl2 = aEntry[0]
|
||
|
sTitle = aEntry[1].replace(' - ', ' ') + aEntry[2].replace(' ','')
|
||
|
sThumb = 'news.png'
|
||
|
else:
|
||
|
sTitle = aEntry[0].replace('Streaming', '')
|
||
|
sUrl2 = aEntry[1]
|
||
|
sThumb = aEntry[2]
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
|
||
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
||
|
oOutputParameterHandler.addParameter('sThumb', sThumb)
|
||
|
|
||
|
if 'derniere-et-meilleures-serie-en-streaming' in sUrl:
|
||
|
oGui.addDir(SITE_IDENTIFIER, 'showLink', sTitle, sThumb, oOutputParameterHandler)
|
||
|
else:
|
||
|
oGui.addTV(SITE_IDENTIFIER, 'showS_E', sTitle, '', sThumb, '', oOutputParameterHandler)
|
||
|
|
||
|
progress_.VSclose(progress_)
|
||
|
|
||
|
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)
|
||
|
|
||
|
if not sSearch:
|
||
|
oGui.setEndOfDirectory()
|
||
|
|
||
|
|
||
|
def __checkForNextPage(sHtmlContent):
|
||
|
sPattern = '<a class="page-link" href="([^"]+)" rel="next">'
|
||
|
oParser = cParser()
|
||
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
||
|
if (aResult[0] == True):
|
||
|
return aResult[1][0]
|
||
|
|
||
|
return False
|
||
|
|
||
|
|
||
|
def showS_E():
|
||
|
oGui = cGui()
|
||
|
oInputParameterHandler = cInputParameterHandler()
|
||
|
rUrl = oInputParameterHandler.getValue('siteUrl')
|
||
|
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
|
||
|
sThumb = oInputParameterHandler.getValue('sThumb')
|
||
|
|
||
|
oParser = cParser()
|
||
|
oRequestHandler = cRequestHandler(rUrl)
|
||
|
sHtmlContent = oRequestHandler.request()
|
||
|
|
||
|
sPattern = '<img class=".+?src="(http.+?(?:.jpe*g|.png))|<a class="btn btn-primary btn-blo.+?" href="([^"]+)">(.+?)<\/a><\/div>'
|
||
|
|
||
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
||
|
|
||
|
if (aResult[0] == True):
|
||
|
for aEntry in aResult[1]:
|
||
|
if '/saison/' in rUrl:#episode
|
||
|
if aEntry[0]:
|
||
|
sThumb = aEntry[0]
|
||
|
|
||
|
else:
|
||
|
sUrl = aEntry[1]
|
||
|
sTitle = sMovieTitle + ' ' + aEntry[2]
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', sUrl)
|
||
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
||
|
oGui.addEpisode(SITE_IDENTIFIER, 'showLink', sTitle, '', sThumb, '', oOutputParameterHandler)
|
||
|
|
||
|
else:#saison
|
||
|
if aEntry[0]:
|
||
|
sThumb = aEntry[0]
|
||
|
|
||
|
else:
|
||
|
sUrl = aEntry[1]
|
||
|
sTitle = sMovieTitle + ' ' + aEntry[2]
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', sUrl)
|
||
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
||
|
oOutputParameterHandler.addParameter('sThumb', sThumb)
|
||
|
oGui.addEpisode(SITE_IDENTIFIER, 'showS_E', sTitle, '', sThumb, '', oOutputParameterHandler)
|
||
|
|
||
|
oGui.setEndOfDirectory()
|
||
|
|
||
|
|
||
|
def showLink():
|
||
|
oGui = cGui()
|
||
|
oParser = cParser()
|
||
|
oInputParameterHandler = cInputParameterHandler()
|
||
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
||
|
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
|
||
|
|
||
|
oRequestHandler = cRequestHandler(sUrl)
|
||
|
sHtmlContent = oRequestHandler.request()
|
||
|
|
||
|
sThumb = ''
|
||
|
try:
|
||
|
sPattern = '<img class=".+?" src="(.+?)"'
|
||
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
||
|
if aResult[0]:
|
||
|
sThumb = aResult[1][0]
|
||
|
except:
|
||
|
pass
|
||
|
|
||
|
sPattern = '</i> *Lien.+?</td>.+?alt="([^"]+)".+?(?:|center">([^<]+)</td>.+?)(?:|data-uid="([^"]+)") data-id="([^"]+)">'
|
||
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
||
|
|
||
|
if (aResult[0] == True):
|
||
|
for aEntry in aResult[1]:
|
||
|
sHost = aEntry[0].replace('www.', '')
|
||
|
sHost = re.sub('\..+', '', sHost).capitalize()
|
||
|
|
||
|
if aEntry[2] == '':
|
||
|
sUrl = URL_MAIN + 'll/captcha?hash=' + aEntry[3]
|
||
|
else:
|
||
|
sUrl = URL_MAIN + 'll/captcha?hash=' + aEntry[3]
|
||
|
|
||
|
sLang = aEntry[1].replace(' ', '')
|
||
|
sTitle = ('%s (%s) [COLOR coral]%s[/COLOR]') % (sMovieTitle, sLang, sHost)
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', sUrl)
|
||
|
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
|
||
|
oOutputParameterHandler.addParameter('sThumb', sThumb)
|
||
|
oGui.addLink(SITE_IDENTIFIER, 'showHosters', sTitle, sThumb, '', oOutputParameterHandler)
|
||
|
|
||
|
oGui.setEndOfDirectory()
|
||
|
|
||
|
|
||
|
def showHosters():
|
||
|
oGui = cGui()
|
||
|
oInputParameterHandler = cInputParameterHandler()
|
||
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
||
|
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
|
||
|
sThumb = oInputParameterHandler.getValue('sThumb')
|
||
|
|
||
|
oRequest = cRequestHandler(sUrl)
|
||
|
oRequest.addHeaderEntry('User-Agent', UA)
|
||
|
oRequest.addHeaderEntry('Referer', sUrl)
|
||
|
|
||
|
sHtmlContent = oRequest.request()
|
||
|
sHosterUrl = oRequest.getRealUrl()
|
||
|
|
||
|
if 'captcha' not in sHosterUrl :
|
||
|
oHoster = cHosterGui().checkHoster(sHosterUrl)
|
||
|
if (oHoster != False):
|
||
|
oHoster.setDisplayName(sMovieTitle)
|
||
|
oHoster.setFileName(sMovieTitle)
|
||
|
cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
|
||
|
else:
|
||
|
oParser = cParser()
|
||
|
sPattern = 'src="([^"]+)'
|
||
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
||
|
if (aResult[0] == True):
|
||
|
sHosterUrl = aResult[1][0]
|
||
|
oHoster = cHosterGui().checkHoster(sHosterUrl)
|
||
|
if (oHoster != False):
|
||
|
oHoster.setDisplayName(sMovieTitle)
|
||
|
oHoster.setFileName(sMovieTitle)
|
||
|
cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
|
||
|
|
||
|
oGui.setEndOfDirectory()
|