astrXbian/.install/.kodi/addons/plugin.video.vstream/resources/lib/player.py

255 lines
9.4 KiB
Python

#-*- coding: utf-8 -*-
# https://github.com/Kodi-vStream/venom-xbmc-addons
#
from resources.lib.handler.inputParameterHandler import cInputParameterHandler
from resources.lib.handler.pluginHandler import cPluginHandler
from resources.lib.gui.gui import cGui
from resources.lib.comaddon import addon, dialog, xbmc, isKrypton, VSlog
import xbmcplugin
#pour les sous titres
#https://github.com/amet/service.subtitles.demo/blob/master/service.subtitles.demo/service.py
#player API
#http://mirrors.xbmc.org/docs/python-docs/stable/xbmc.html#Player
class cPlayer(xbmc.Player):
ADDON = addon()
def __init__(self, *args):
sPlayerType = self.__getPlayerType()
xbmc.Player.__init__(self,sPlayerType)
self.Subtitles_file = []
self.SubtitleActive = False
oInputParameterHandler = cInputParameterHandler()
#aParams = oInputParameterHandler.getAllParameter()
#xbmc.log(str(aParams))
self.sHosterIdentifier = oInputParameterHandler.getValue('sHosterIdentifier')
self.sTitle = oInputParameterHandler.getValue('sTitle')
#self.sSite = oInputParameterHandler.getValue('site')
self.sSite = oInputParameterHandler.getValue('siteUrl')
self.sThumbnail = xbmc.getInfoLabel('ListItem.Art(thumb)')
self.playBackEventReceived = False
self.playBackStoppedEventReceived = False
self.forcestop = False
VSlog('player initialized')
def clearPlayList(self):
oPlaylist = self.__getPlayList()
oPlaylist.clear()
def __getPlayList(self):
return xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
def addItemToPlaylist(self, oGuiElement):
oGui = cGui()
oListItem = oGui.createListItem(oGuiElement)
self.__addItemToPlaylist(oGuiElement, oListItem)
def __addItemToPlaylist(self, oGuiElement, oListItem):
oPlaylist = self.__getPlayList()
oPlaylist.add(oGuiElement.getMediaUrl(), oListItem )
def AddSubtitles(self, files):
if isinstance(files, basestring):
self.Subtitles_file.append(files)
else:
self.Subtitles_file = files
def run(self, oGuiElement, sTitle, sUrl):
self.totalTime = 0
self.currentTime = 0
sPluginHandle = cPluginHandler().getPluginHandle()
oGui = cGui()
item = oGui.createListItem(oGuiElement)
item.setPath(oGuiElement.getMediaUrl())
#meta = {'label': oGuiElement.getTitle(), 'title': oGuiElement.getTitle()}
#item = xbmcgui.ListItem(path=sUrl, iconImage='DefaultVideo.png', thumbnailImage=self.sThumbnail)
#item.setInfo(type='Video', infoLabels=meta)
#Sous titres
if (self.Subtitles_file):
try:
item.setSubtitles(self.Subtitles_file)
VSlog('Load SubTitle :' + str(self.Subtitles_file))
self.SubtitleActive = True
except:
VSlog("Can't load subtitle:" + str(self.Subtitles_file))
player_conf = self.ADDON.getSetting('playerPlay')
#Si lien dash, methode prioritaire
if sUrl.endswith('.mpd'):
if isKrypton() == True:
self.enable_addon('inputstream.adaptive')
item.setProperty('inputstreamaddon','inputstream.adaptive')
item.setProperty('inputstream.adaptive.manifest_type', 'mpd')
xbmcplugin.setResolvedUrl(sPluginHandle, True, listitem=item)
VSlog('Player use inputstream addon')
else:
dialog().VSerror('Nécessite kodi 17 minimum')
return
#1 er mode de lecture
elif (player_conf == '0'):
self.play(sUrl,item)
VSlog('Player use Play() method')
#2 eme mode non utilise
elif (player_conf == 'neverused'):
xbmc.executebuiltin('PlayMedia(' + sUrl + ')')
VSlog('Player use PlayMedia() method')
#3 eme mode (defaut)
else:
xbmcplugin.setResolvedUrl(sPluginHandle, True, item)
VSlog('Player use setResolvedUrl() method')
#Attend que le lecteur demarre, avec un max de 20s
if xbmc.getInfoLabel('system.buildversion')[0:2] >= '19':
for _ in range(20):
if self.playBackEventReceived:
break
xbmc.sleep(1000)
else:
for _ in xrange(20):
if self.playBackEventReceived:
break
xbmc.sleep(1000)
#active/desactive les sous titres suivant l'option choisie dans la config
if (self.SubtitleActive):
if (self.ADDON.getSetting('srt-view') == 'true'):
self.showSubtitles(True)
dialog().VSinfo('Sous-titres chargés', 'Sous-Titres', 5)
else:
self.showSubtitles(False)
dialog().VSinfo('Sous-titres chargés, vous pouvez les activer', 'Sous-Titres', 15)
while self.isPlaying() and not self.forcestop:
#while not xbmc.abortRequested:
try:
self.currentTime = self.getTime()
self.totalTime = self.getTotalTime()
#xbmc.log(str(self.currentTime))
except:
pass
#break
xbmc.sleep(1000)
if not self.playBackStoppedEventReceived:
self.onPlayBackStopped()
#Uniquement avec la lecture avec play()
if (player_conf == '0'):
r = xbmcplugin.addDirectoryItem(handle=sPluginHandle, url=sUrl, listitem=item, isFolder=False)
#xbmcplugin.endOfDirectory(sPluginHandle, True, False, False)
return r
VSlog('Closing player')
#fonction light servant par exmple pour visualiser les DL ou les chaines de TV
def startPlayer(self, window=False):
oPlayList = self.__getPlayList()
self.play(oPlayList, windowed=window)
def onPlayBackEnded(self):
self.onPlayBackStopped()
#Attention pas de stop, si on lance une seconde video sans fermer la premiere
def onPlayBackStopped(self):
VSlog('player stoped')
self.playBackStoppedEventReceived = True
#calcul le temp de lecture
pourcent = 0
if self.totalTime > 0:
pourcent = float('%.2f' % (self.currentTime / self.totalTime))
#Dans le cas ou ont a vu intégralement le contenu, percent = 0.0
#Mais on n'a tout de meme terminé donc le temps actuel est egal au temps total.
if (pourcent > 0.90) or (pourcent == 0.0 and self.currentTime == self.totalTime):
# Marqué VU dans la BDD Vstream
cGui().setWatched()
# Marqué VU dans les comptes perso
try:
tmdb_session = self.ADDON.getSetting('tmdb_session')
if tmdb_session:
self.__getWatchlist('tmdb')
bstoken = self.ADDON.getSetting('bstoken')
if bstoken:
self.__getWatchlist('trakt')
except:
pass
#xbmc.executebuiltin('Container.Refresh')
def onPlayBackStarted(self):
VSlog('player started')
#Si on recoit une nouvelle fois l'event, c'est que ca buggue, on stope tout
if self.playBackEventReceived:
self.forcestop = True
return
self.playBackEventReceived = True
def __getWatchlist(self, sAction):
if sAction == 'tmdb':
plugins = __import__('resources.sites.themoviedb_org', fromlist=['themoviedb_org'])
function = getattr(plugins, 'getWatchlist')
function()
elif sAction == 'trakt':
#plugins = __import__('resources.lib.trakt', fromlist=['cTrakt'])
plugins = __import__('resources.lib.trakt', fromlist=['trakt']).cTrakt()
function = getattr(plugins, 'setAsWatched')
function()
return
def __getPlayerType(self):
sPlayerType = self.ADDON.getSetting('playerType')
try:
if (sPlayerType == '0'):
VSlog('playertype from config: auto')
return xbmc.PLAYER_CORE_AUTO
if (sPlayerType == '1'):
VSlog('playertype from config: mplayer')
return xbmc.PLAYER_CORE_MPLAYER
if (sPlayerType == '2'):
VSlog('playertype from config: dvdplayer')
return xbmc.PLAYER_CORE_DVDPLAYER
except:
return False
def enable_addon(self,addon):
#import json
#sCheck = {'jsonrpc': '2.0','id': 1,'method': 'Addons.GetAddonDetails','params': {'addonid':'inputstream.adaptive','properties': ['enabled']}}
#response = xbmc.executeJSONRPC(json.dumps(sCheck))
#data = json.loads(response)
#if not 'error' in data.keys():
#if data['result']['addon']['enabled'] == False:
if xbmc.getCondVisibility('System.HasAddon(inputstream.adaptive)') == 0:
do_json = '{"jsonrpc":"2.0","id":1,"method":"Addons.SetAddonEnabled","params":{"addonid":"inputstream.adaptive","enabled":true}}'
query = xbmc.executeJSONRPC(do_json)
VSlog("Activation d'inputstream.adaptive")
else:
VSlog('inputstream.adaptive déjà activé')