forked from axiom-team/astrXbian
271 lines
9.8 KiB
Python
271 lines
9.8 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# vStream https://github.com/Kodi-vStream/venom-xbmc-addons
|
||
|
# Arias800
|
||
|
import re
|
||
|
import string
|
||
|
import json
|
||
|
import resources.sites.freebox
|
||
|
|
||
|
|
||
|
from resources.lib.comaddon import addon
|
||
|
from resources.lib.epg import cePg
|
||
|
from resources.lib.gui.gui import cGui
|
||
|
from resources.lib.gui.guiElement import cGuiElement
|
||
|
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, Quote
|
||
|
|
||
|
from datetime import datetime, timedelta
|
||
|
|
||
|
SITE_IDENTIFIER = 'channelstream'
|
||
|
SITE_NAME = 'Channel Stream'
|
||
|
SITE_DESC = 'iptv'
|
||
|
|
||
|
URL_MAIN = 'https://channelstream.me'
|
||
|
|
||
|
TV_FRENCH = (URL_MAIN + "/chaine-tv.php", 'showMovies')
|
||
|
|
||
|
UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'
|
||
|
|
||
|
|
||
|
def load():
|
||
|
oGui = cGui()
|
||
|
|
||
|
liste = []
|
||
|
liste.append(['Généralistes', 'Chaîne de télévision généraliste', 'tv.png'])
|
||
|
liste.append(['Cinéma', 'Chaîne consacrée aux Film', 'films.png'])
|
||
|
liste.append(['Sport', 'Chaîne Sportive', 'sport.png'])
|
||
|
liste.append(['Science et Nature', 'Chaîne axés sur les sciences', 'buzz.png'])
|
||
|
|
||
|
|
||
|
for sTitle, sFiltre, sIcon in liste:
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', TV_FRENCH[0])
|
||
|
oOutputParameterHandler.addParameter('sFiltre', sFiltre)
|
||
|
oGui.addDir(SITE_IDENTIFIER, TV_FRENCH[1], sTitle, sIcon, oOutputParameterHandler)
|
||
|
|
||
|
oGui.setEndOfDirectory()
|
||
|
|
||
|
|
||
|
def showMovies():
|
||
|
oGui = cGui()
|
||
|
oParser = cParser()
|
||
|
|
||
|
oInputParameterHandler = cInputParameterHandler()
|
||
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
||
|
sFiltre = oInputParameterHandler.getValue('sFiltre')
|
||
|
|
||
|
oRequestHandler = cRequestHandler(sUrl)
|
||
|
sHtmlContent = oRequestHandler.request()
|
||
|
sHtmlContent = oParser.abParse(sHtmlContent, sFiltre, '<!-- Type Chaîne -->')
|
||
|
sPattern = 'location.href = \'\.(.+?)\'.+?src=\'(.+?)\'.+?<div align="center">(.+?)</div>'
|
||
|
|
||
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
||
|
|
||
|
EPG = cePg().get_epg('', 'direct')
|
||
|
|
||
|
if (aResult[0] == True):
|
||
|
for aEntry in aResult[1]:
|
||
|
if not "+18" in str(aEntry[2]):
|
||
|
sTitle = aEntry[2]
|
||
|
|
||
|
if 'Canal + Série' in sTitle:
|
||
|
sTitle = 'Canal + Séries'
|
||
|
|
||
|
sUrl2 = URL_MAIN + aEntry[0]
|
||
|
sThumb = URL_MAIN + '/' + aEntry[1]
|
||
|
|
||
|
sDesc = getEPG(EPG, sTitle)
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
|
||
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
||
|
oOutputParameterHandler.addParameter('sThumb', sThumb)
|
||
|
|
||
|
oGui.addMisc(SITE_IDENTIFIER, 'showHoster', sTitle, sThumb, sThumb, sDesc, oOutputParameterHandler)
|
||
|
|
||
|
oGui.setEndOfDirectory()
|
||
|
|
||
|
|
||
|
def showHoster():
|
||
|
oGui = cGui()
|
||
|
oParser = cParser()
|
||
|
|
||
|
oInputParameterHandler = cInputParameterHandler()
|
||
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
||
|
sTitle = oInputParameterHandler.getValue('sMovieTitle')
|
||
|
sThumb = oInputParameterHandler.getValue('sThumb')
|
||
|
|
||
|
oRequestHandler = cRequestHandler(sUrl)
|
||
|
sHtmlContent = oRequestHandler.request()
|
||
|
|
||
|
info = cePg().getChannelEpg(sTitle)
|
||
|
sDesc = info['plot']
|
||
|
|
||
|
sMovieTitle = info['title']
|
||
|
if not sMovieTitle:
|
||
|
sMovieTitle = sTitle
|
||
|
|
||
|
sMeta = 0
|
||
|
sCat = info['media_type']
|
||
|
if sCat:
|
||
|
if 'Film' in sCat : sMeta = 1
|
||
|
if 'Série' in sCat : sMeta = 2
|
||
|
sYear = info['year']
|
||
|
coverUrl = info['cover_url']
|
||
|
if coverUrl :
|
||
|
sThumb = coverUrl
|
||
|
|
||
|
# Double Iframe a passer.
|
||
|
sPattern = '<iframe.+?src="([^"]+)"'
|
||
|
iframeURL = oParser.parse(sHtmlContent, sPattern)[1][0]
|
||
|
|
||
|
oRequestHandler = cRequestHandler(iframeURL)
|
||
|
sHtmlContent = oRequestHandler.request()
|
||
|
|
||
|
sPattern = '<iframe.+?src="([^"]+)"'
|
||
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
||
|
|
||
|
if not aResult[1]: # Pas de flux
|
||
|
oGui.setEndOfDirectory()
|
||
|
return
|
||
|
|
||
|
iframeURL1 = aResult[1][0]
|
||
|
sHosterUrl = iframeURL1
|
||
|
|
||
|
oOutputParameterHandler = cOutputParameterHandler()
|
||
|
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
|
||
|
oOutputParameterHandler.addParameter('sThumbnail', sThumb)
|
||
|
oOutputParameterHandler.addParameter('sYear', sYear)
|
||
|
oOutputParameterHandler.addParameter('sDesc', sDesc)
|
||
|
|
||
|
oGuiElement = cGuiElement()
|
||
|
oGuiElement.setTitle(sMovieTitle)
|
||
|
oGuiElement.setDescription(sDesc)
|
||
|
oGuiElement.setFileName(sMovieTitle)
|
||
|
oGuiElement.setSiteName(resources.sites.freebox.SITE_IDENTIFIER)
|
||
|
oGuiElement.setFunction('play__')
|
||
|
oGuiElement.setIcon('tv.png')
|
||
|
oGuiElement.setMeta(sMeta)
|
||
|
oGuiElement.setThumbnail(sThumb)
|
||
|
oGuiElement.setDirectTvFanart()
|
||
|
oGuiElement.setCat(sMeta)
|
||
|
|
||
|
# oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, resources.sites.freebox.SITE_IDENTIFIER, SITE_IDENTIFIER, 'direct_epg', 'Guide tv Direct')
|
||
|
# oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, resources.sites.freebox.SITE_IDENTIFIER, SITE_IDENTIFIER, 'soir_epg', 'Guide tv Soir')
|
||
|
if addon().getSetting('enregistrement_activer') == 'true':
|
||
|
oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, resources.sites.freebox.SITE_IDENTIFIER, SITE_IDENTIFIER, 'enregistrement', 'Enregistrement')
|
||
|
|
||
|
# Menu pour les films
|
||
|
if sMeta == 1 :
|
||
|
oGui.createContexMenuinfo(oGuiElement, oOutputParameterHandler)
|
||
|
oGui.createContexMenuba(oGuiElement, oOutputParameterHandler)
|
||
|
oGui.createContexMenuSimil(oGuiElement, oOutputParameterHandler)
|
||
|
oGui.createContexMenuWatch(oGuiElement, oOutputParameterHandler)
|
||
|
|
||
|
if 'dailymotion' in sHosterUrl:
|
||
|
oOutputParameterHandler.addParameter('sHosterIdentifier', 'dailymotion')
|
||
|
oOutputParameterHandler.addParameter('sMediaUrl', sHosterUrl)
|
||
|
oOutputParameterHandler.addParameter('siteUrl', sHosterUrl)
|
||
|
oOutputParameterHandler.addParameter('sFileName', sMovieTitle)
|
||
|
oGuiElement.setFunction('play')
|
||
|
oGuiElement.setSiteName('cHosterGui')
|
||
|
oGui.addHost(oGuiElement, oOutputParameterHandler)
|
||
|
cGui.CONTENT = 'movies'
|
||
|
oGui.setEndOfDirectory()
|
||
|
return
|
||
|
|
||
|
|
||
|
oRequestHandler = cRequestHandler(iframeURL1)
|
||
|
oRequestHandler.addHeaderEntry('User-Agent', UA)
|
||
|
oRequestHandler.addHeaderEntry('Referer', iframeURL)
|
||
|
sHtmlContent2 = oRequestHandler.request()
|
||
|
|
||
|
sPattern2 = 'var\s+cid[^\'"]+[\'"]{1}([0-9]+)'
|
||
|
aResult = re.findall(sPattern2, sHtmlContent2)
|
||
|
|
||
|
if aResult:
|
||
|
str2 = aResult[0]
|
||
|
datetoken = int(getTimer()) * 1000
|
||
|
|
||
|
jsonUrl = 'https://telerium.live/streams/'+str2+'/'+str(datetoken)+'.json'
|
||
|
tokens = getRealTokenJson(jsonUrl,iframeURL1)
|
||
|
m3url = tokens['url']
|
||
|
nxturl = 'https://telerium.live' + tokens['tokenurl']
|
||
|
|
||
|
realtoken = getRealTokenJson(nxturl, iframeURL1)[10][::-1]
|
||
|
|
||
|
try:
|
||
|
m3url = m3url.decode("utf-8")
|
||
|
except:
|
||
|
pass
|
||
|
|
||
|
sHosterUrl = 'https:' + m3url + realtoken
|
||
|
sHosterUrl += '|User-Agent=' + UA + '&Referer=' + Quote(iframeURL1) + '&Sec-Fetch-Mode=cors&Origin=https://telerium.tv'
|
||
|
|
||
|
|
||
|
oOutputParameterHandler.addParameter('siteUrl', sHosterUrl)
|
||
|
oGui.addFolder(oGuiElement, oOutputParameterHandler)
|
||
|
|
||
|
cGui.CONTENT = 'movies'
|
||
|
oGui.setEndOfDirectory()
|
||
|
|
||
|
def getRealTokenJson(link, referer):
|
||
|
cookies = {'elVolumen': '100',
|
||
|
'__ga':'100'}
|
||
|
|
||
|
headers = {'Host': 'telerium.tv',
|
||
|
'User-Agent': UA,
|
||
|
'Accept': 'application/json, text/javascript, */*; q=0.01',
|
||
|
'Accept-Language': 'pl,en-US;q=0.7,en;q=0.3',
|
||
|
'X-Requested-With': 'XMLHttpRequest',
|
||
|
'Referer': referer}
|
||
|
|
||
|
oRequestHandler = cRequestHandler(link)
|
||
|
#oRequestHandler.addHeaderEntry('Host', 'telerium.tv')
|
||
|
oRequestHandler.addHeaderEntry('User-Agent', UA)
|
||
|
#oRequestHandler.addHeaderEntry('Accept', 'application/json, text/javascript, */*; q=0.01')
|
||
|
oRequestHandler.addHeaderEntry('Accept-Language', 'pl,en-US;q=0.7,en;q=0.3')
|
||
|
oRequestHandler.addHeaderEntry('X-Requested-With', 'XMLHttpRequest')
|
||
|
oRequestHandler.addHeaderEntry('Referer', referer)
|
||
|
oRequestHandler.addCookieEntry('elVolumen', '100')
|
||
|
oRequestHandler.addCookieEntry('__ga','100')
|
||
|
realResp = oRequestHandler.request()
|
||
|
return json.loads(realResp)
|
||
|
|
||
|
def getTimer():
|
||
|
datenow = datetime.utcnow().replace(second=0, microsecond=0)
|
||
|
datenow = datenow + timedelta(days=1)
|
||
|
epoch = datetime(1970, 1, 1)
|
||
|
|
||
|
return (datenow - epoch).total_seconds() // 1
|
||
|
|
||
|
def getEPG(EPG, sTitle):
|
||
|
|
||
|
oParser = cParser()
|
||
|
|
||
|
sTitle = sTitle.replace('+', 'plus')
|
||
|
|
||
|
try:
|
||
|
sTitle = cUtil().CleanName(sTitle)
|
||
|
except:
|
||
|
pass
|
||
|
|
||
|
sTitle = re.sub('[^%s]' % (string.ascii_lowercase + string.digits), '', sTitle.lower())
|
||
|
|
||
|
sPattern = '(.+?)\/>(.+?)<'
|
||
|
aResult = oParser.parse(EPG, sPattern)
|
||
|
if (aResult[0] == True):
|
||
|
for aEntry in aResult[1]:
|
||
|
sChannel = aEntry[0]
|
||
|
|
||
|
sChannel = re.sub('[^%s]' % (string.ascii_lowercase + string.digits), '', sChannel.lower())
|
||
|
if sChannel == sTitle:
|
||
|
sDesc = aEntry[1].replace('[COLOR khaki]', '\r\n\t[COLOR khaki]')
|
||
|
sDesc = sDesc.replace('[/COLOR]', '[/COLOR]\r\n')
|
||
|
return sDesc
|
||
|
|
||
|
return ''
|