255 lines
9.2 KiB
Python
255 lines
9.2 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é')
|