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

555 lines
20 KiB
Python

# -*- coding: utf-8 -*-
# vStream https://github.com/Kodi-vStream/venom-xbmc-addons
# source 26 https://dpstream.ch/ creation 18/10/2020
# update 22/11/2020
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
SITE_IDENTIFIER = 'dpstream'
SITE_NAME = 'Dpstream'
SITE_DESC = 'Series et Films en VF ou VOSTFR '
URL_MAIN = 'https://dpstream.ch/'
MOVIE_NEWS = (URL_MAIN + 'film-en-streaming', 'showMovies')
MOVIE_GENRES = (True, 'showGenres')
MOVIE_VIEWS = (URL_MAIN + 'film-box-office', 'showMovies')
SERIE_NEWS = (URL_MAIN + 'series-en-streming', 'showMovies')
key_search_movies = '#searchsomemovies'
key_search_series = '#searchsomeseries'
URL_SEARCH = ('', 'showMovies')
URL_SEARCH_MOVIES = (URL_SEARCH[0] + key_search_movies, 'showMovies')
URL_SEARCH_SERIES = (URL_SEARCH[0] + key_search_series, 'showMovies')
# recherche utilisé quand on n'utilise pas le globale
MY_SEARCH_MOVIES = ( key_search_movies , 'MyshowSearchMovie')
MY_SEARCH_SERIES = ( key_search_series, 'MyshowSearchSerie')
FUNCTION_SEARCH = 'showMovies'
# Menu GLOBALE HOME
MOVIE_MOVIE = (True, 'showMoviesSource')
SERIE_SERIES = (True, 'showTvshowSource')
def load():
oGui = cGui()
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche Films & Series', 'search.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MY_SEARCH_MOVIES[0] )
oGui.addDir(SITE_IDENTIFIER, MY_SEARCH_MOVIES[1], '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_VIEWS[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_VIEWS[1], 'Films (les plus vus)', 'views.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', MY_SEARCH_SERIES[0] )
oGui.addDir(SITE_IDENTIFIER, MY_SEARCH_SERIES[1], 'Recherche Series ', 'search.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SERIE_NEWS[0])
oGui.addDir(SITE_IDENTIFIER, SERIE_NEWS[1], 'Series (Derniers ajouts)', 'news.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def showMoviesSource():
oGui = cGui()
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MY_SEARCH_MOVIES[0] )
oGui.addDir(SITE_IDENTIFIER, MY_SEARCH_MOVIES[1], '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_VIEWS[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_VIEWS[1], 'Films (les plus vus)', 'views.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MOVIE_GENRES[0])
oGui.addDir(SITE_IDENTIFIER, MOVIE_GENRES[1], 'Films (Genres)', 'genres.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def showTvshowSource():
oGui = cGui()
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', MY_SEARCH_SERIES[0] )
oGui.addDir(SITE_IDENTIFIER, MY_SEARCH_SERIES[1], 'Recherche Series ', 'search.png', oOutputParameterHandler)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', SERIE_NEWS[0])
oGui.addDir(SITE_IDENTIFIER, SERIE_NEWS[1], 'Series (Derniers ajouts)', 'news.png', oOutputParameterHandler)
oGui.setEndOfDirectory()
def MyshowSearchSerie():
oGui = cGui()
sSearchText = oGui.showKeyBoard()
if (sSearchText != False):
sUrl = MY_SEARCH_SERIES[0] + sSearchText
showMovies(sUrl)
oGui.setEndOfDirectory()
return
def MyshowSearchMovie():
oGui = cGui()
sSearchText = oGui.showKeyBoard()
if (sSearchText != False):
sUrl = MY_SEARCH_MOVIES[0] + sSearchText
showMovies(sUrl)
oGui.setEndOfDirectory()
return
def showSearch():
oGui = cGui()
sSearchText = oGui.showKeyBoard()
if (sSearchText != False):
sUrl = sSearchText
showMovies(sUrl)
oGui.setEndOfDirectory()
return
def showGenres():
oGui = cGui()
liste = []
# recherche science-fiction-fantastique
listegenre = ['action ', 'action-adventure ', 'animation', 'aventure'
, 'comedie', 'crime', 'documentaire', 'drame ', 'familial'
, 'fantastique', 'guerre' , 'histoire', 'horreur', 'kids ', 'musique'
, 'mystere ', 'news', 'reality', 'romance' , 'science-fiction'
, 'soap' , 'science-fiction-fantastique'
, 'talk', 'telefilm', 'thriller' , 'politics', 'western']
url1g = URL_MAIN + 'categories/'
for igenre in listegenre:
liste.append([igenre.capitalize(), url1g + igenre])
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()
bSearchMovie = False
bSearchSerie = False
if sSearch:
sSearch = sSearch.replace(' ', '+').replace('%20', '+')
if key_search_movies in sSearch:
sSearch = sSearch.replace( key_search_movies , '')
bSearchMovie = True
if key_search_series in sSearch:
sSearch = sSearch.replace( key_search_series , '')
bSearchSerie = True
bvalid, stoken, scookie = GetTokens()
if bvalid:
pdata = '_token=' + stoken + '&search=' + sSearch
sUrl = URL_MAIN + 'search'
oRequestHandler = cRequestHandler(sUrl )
oRequestHandler.setRequestType(1)
oRequestHandler.addHeaderEntry('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:70.0) Gecko/20100101 Firefox/70.0')
oRequestHandler.addHeaderEntry('Referer', URL_MAIN)
oRequestHandler.addHeaderEntry('Cookie', scookie)
oRequestHandler.addParametersLine(pdata)
sHtmlContent = oRequestHandler.request()
else:
oGui.addText(SITE_IDENTIFIER)
return
else:
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl')
oRequestHandler = cRequestHandler(sUrl)
sHtmlContent = oRequestHandler.request()
# ref thumb title year
sPattern = 'class="item mb-4">.+?ref="([^"]*).+?src=([^\s]*).+?alt="([^"]*).+?muted">([^<]*).*?type">([^<]*)'
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
sDesc = ''
sUrl2 = aEntry[0]
sThumb = aEntry[1]
sTitle = aEntry[2]
sYear = aEntry[3]
Stype = aEntry[4].lower()
if bSearchMovie:
if Stype == 'serie':
continue
if bSearchSerie:
if Stype == 'film':
continue
sDisplayTitle = sTitle + '(' + sYear +')'
if 'http' not in sUrl2: # search
sUrl2 = URL_MAIN[:-1] + sUrl2
if sSearch and not bSearchMovie and not bSearchSerie:
sDisplayTitle = sDisplayTitle + ' [' + aEntry[4] + ']'
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oOutputParameterHandler.addParameter('sYear', sYear)
if sSearch:
oGui.addLink(SITE_IDENTIFIER, 'showSelectType', sDisplayTitle, sThumb, sDesc, oOutputParameterHandler)
elif SERIE_NEWS[0] not in sUrl:
oGui.addMovie(SITE_IDENTIFIER, 'showLink', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
else:
oGui.addTV(SITE_IDENTIFIER, 'showSaisons', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
progress_.VSclose(progress_)
if not sSearch:
bNextPage,urlNextpage,pagination = __checkForNextPage(sHtmlContent)
if (bNextPage != False):
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', urlNextpage)
oGui.addNext(SITE_IDENTIFIER, 'showMovies', '[COLOR teal] ' + pagination + ' >>>[/COLOR]', oOutputParameterHandler)
oGui.setEndOfDirectory()
def __checkForNextPage(sHtmlContent):
oParser = cParser()
urlNextpage = ''
snumberNext = ''
pagination = ''
sPattern = '<.li><li class="page-item"><a class="page-link.*?href="([^"]+)">(?!\d).+?footer'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == True):
urlNextpage = aResult[1][0]
try:
snumberNext = re.search('page.([0-9]+)', urlNextpage).group(1)
except:
pass
if snumberNext:
pagination = 'Page ' + str(snumberNext)
if urlNextpage:
return True, urlNextpage, pagination
return False, 'none', 'none'
def showSelectType():
oGui = cGui()
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl')
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
sThumb = oInputParameterHandler.getValue('sThumb')
sDesc = oInputParameterHandler.getValue('sDesc')
sYear = oInputParameterHandler.getValue('sYear')
oRequest = cRequestHandler(sUrl)
sHtmlContent = oRequest.request()
sDesc = ''
oParser = cParser()
sPattern = 'mb-3 d-block">([^<]+)'
aResult = oParser.parse(sHtmlContent, sPattern)
sDesc = 'no description'
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oOutputParameterHandler.addParameter('sYear', sYear)
sDisplayTitle = sMovieTitle + '(' + str(sYear) +')'
# (a modifier car ce n'est plus la ces )
# dans le cas d'une recherche on ne sait pas si c'est un film ou une serie
#class="description">.*?<br>([^<]+)
if (aResult[0] == True):
sDesc = ('[I][COLOR grey]%s[/COLOR][/I] %s') % ('Synopsis :', aResult[1][0])
if '<meta name=description content="serie' in sHtmlContent :
oGui.addTV(SITE_IDENTIFIER, 'showSaisons', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
else:#VideoObject.+?"description":"([^"]+)
oGui.addMovie(SITE_IDENTIFIER, 'showLink', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
oGui.setEndOfDirectory()
def showSaisons():
oGui = cGui()
oParser = cParser()
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl')
sThumb = oInputParameterHandler.getValue('sThumb')
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
sYear = oInputParameterHandler.getValue('sYear')
sDesc = oInputParameterHandler.getValue('sDesc')
oRequestHandler = cRequestHandler(sUrl)
sHtmlContent = oRequestHandler.request()
sPattern = 'mb-3 d-block">([^<]+)'
aResult = oParser.parse(sHtmlContent, sPattern)
sDesc = 'no description'
if (aResult[0] == True):
sDesc = ('[I][COLOR grey]%s[/COLOR][/I] %s') % ('Synopsis :', aResult[1][0])
sPattern = 'class="seasonbar.+?href="([^"]+).+?arrow-right.+?>(\d+)'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == False):
oGui.addText(SITE_IDENTIFIER)
if (aResult[0] == True):
for aEntry in reversed(aResult[1]):
sUrl2 = aEntry[0]
saison = aEntry[1]
sTitle = ("%s %s") % (sMovieTitle, ' Saison ' + saison)
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sYear', sYear)
oGui.addEpisode(SITE_IDENTIFIER, 'ShowEpisodes', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
oGui.setEndOfDirectory()
def ShowEpisodes():
oGui = cGui()
oParser = cParser()
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl')
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
sThumb = oInputParameterHandler.getValue('sThumb')
sDesc = oInputParameterHandler.getValue('sDesc')
sYear = oInputParameterHandler.getValue('sYear')
oRequestHandler = cRequestHandler(sUrl)
sHtmlContent = oRequestHandler.request()
isaison = ''
sPattern = 'saison.(.+?)'
aResult = oParser.parse(sUrl , sPattern)
if (aResult[0] == True):
isaison = ' Saison ' + aResult[1][0]
sPattern = 'class="seasonbar".+?href="([^"]+).+?rrow-right"><.span>([^<]+)'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == False):
oGui.addText(SITE_IDENTIFIER)
if (aResult[0] == True):
for aEntry in aResult[1]:
sUrl2 = aEntry[0]
nepisode = aEntry[1]
sTitle = sMovieTitle + isaison + ' episode' + nepisode
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sYear', sYear)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oGui.addEpisode(SITE_IDENTIFIER, 'showLink', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
oGui.setEndOfDirectory()
def showLink():
oGui = cGui()
oParser = cParser()
oInputParameterHandler = cInputParameterHandler()
sUrl = oInputParameterHandler.getValue('siteUrl')
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
sThumb = oInputParameterHandler.getValue('sThumb')
sDesc = oInputParameterHandler.getValue('sDesc')
sYear = oInputParameterHandler.getValue('sYear')
oRequest = cRequestHandler(sUrl)
sHtmlContent = oRequest.request()
# dans le cas d'une erreur si serie (pas de controle année et genre)
if '<meta name=description content="serie' in sHtmlContent and 'episode' not in sUrl:
sDisplayTitle = sMovieTitle + '(' + str(sYear) +')'
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl)
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
oOutputParameterHandler.addParameter('sThumb', sThumb)
oOutputParameterHandler.addParameter('sDesc', sDesc)
oOutputParameterHandler.addParameter('sYear', sYear)
oGui.addTV(SITE_IDENTIFIER, 'showSaisons', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
oGui.setEndOfDirectory()
return
sPattern = 'mb-3 d-block">([^<]+)'
aResult = oParser.parse(sHtmlContent, sPattern)
sDesc = 'no description'
if (aResult[0] == True):
sDesc = ('[I][COLOR grey]%s[/COLOR][/I] %s') % ('Synopsis :', aResult[1][0])
sPattern = 'data-url="([^"]+).+?class="p-.+?alt="([^"]+).+?alt="([^"]+)' #p-1 movie p-2 serie
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == False):
oGui.addText(SITE_IDENTIFIER)
if (aResult[0] == True):
for aEntry in aResult[1]:
skey = aEntry[0]
sHost = aEntry[1]
vSlang = aEntry[2].upper()
sUrl2 = URL_MAIN + 'll/captcha?hash=' + skey
sTitle = sMovieTitle
if sYear:
sTitle = sTitle + '(' + sYear + ')'
sTitle = ('%s %s [COLOR coral]%s[/COLOR]') % (sTitle,'[' + vSlang + ']', sHost )
oOutputParameterHandler = cOutputParameterHandler()
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
oOutputParameterHandler.addParameter('referer', 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')
oRequestHandler = cRequestHandler(sUrl)
sHtmlContent = oRequestHandler.request()
sPattern = '<iframe.*?src=([^\s]+)'
aResult = re.findall(sPattern, sHtmlContent)
if aResult:
sHosterUrl = aResult[0]
oHoster = cHosterGui().checkHoster(sHosterUrl)
if (oHoster != False):
oHoster.setDisplayName(sMovieTitle)
oHoster.setFileName(sMovieTitle)
cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
oGui.setEndOfDirectory()
def GetTokens():
oParser = cParser()
oRequestHandler = cRequestHandler(URL_MAIN )
sHtmlContent = oRequestHandler.request()
sHeader = oRequestHandler.getResponseHeader()
cook = ''
token = ''
XSRF_TOKEN = ''
site_session = ''
sHeader = oRequestHandler.getResponseHeader()
sPattern ='name=_token.+?value="([^"]+).+?<div class="typeahead'
aResult = oParser.parse(sHtmlContent, sPattern)
if (aResult[0] == False):
return False, 'none', 'none'
if (aResult[0] == True):
token = aResult[1][0]
sPattern = 'XSRF-TOKEN=([^;]+).+?dpstream_session=([^;]+)'
aResult = oParser.parse(sHeader, sPattern)
if (aResult[0] == False):
return False, 'none', 'none'
if (aResult[0] == True):
XSRF_TOKEN = aResult[1][0][0]
site_session = aResult[1][0][1]
cook = 'XSRF-TOKEN=' + XSRF_TOKEN + '; dpstream_session=' + site_session + ';'
return True, token, cook
def cleanDesc(sdesc):
list_comment = [
'Voir film '
, 'en streaming'
, 'Voir Serie '
]
for s in list_comment:
sdesc = sdesc.replace(s, '')
return sdesc