jellyfin-kodi/service.py

155 lines
5.6 KiB
Python

import xbmcaddon
import xbmc
import xbmcgui
import os
import threading
import json
from datetime import datetime
cwd = xbmcaddon.Addon(id='plugin.video.emby').getAddonInfo('path')
BASE_RESOURCE_PATH = xbmc.translatePath( os.path.join( cwd, 'resources', 'lib' ) )
sys.path.append(BASE_RESOURCE_PATH)
import KodiMonitor
import Utils as utils
from LibrarySync import LibrarySync
from Player import Player
from ConnectionManager import ConnectionManager
from ClientInformation import ClientInformation
from WebSocketClient import WebSocketThread
from UserClient import UserClient
class Service():
newWebSocketThread = None
newUserClient = None
librarySync = LibrarySync()
clientInfo = ClientInformation()
addonName = clientInfo.getAddonName()
className = None
def __init__(self, *args ):
self.KodiMonitor = KodiMonitor.Kodi_Monitor()
addonName = self.addonName
self.className = self.__class__.__name__
self.logMsg("Starting Monitor", 0)
self.logMsg("======== START %s ========" % addonName, 0)
self.logMsg("KODI Version: %s" % xbmc.getInfoLabel("System.BuildVersion"), 0)
self.logMsg("%s Version: %s" % (addonName, self.clientInfo.getVersion()), 0)
pass
def logMsg(self, msg, lvl=1):
utils.logMsg("%s %s" % (self.addonName, self.className), str(msg), int(lvl))
def ServiceEntryPoint(self):
ConnectionManager().checkServer()
lastProgressUpdate = datetime.today()
startupComplete = False
#interval_FullSync = 600
#interval_IncrementalSync = 300
#cur_seconds_fullsync = interval_FullSync
#cur_seconds_incrsync = interval_IncrementalSync
user = UserClient()
player = Player()
ws = WebSocketThread()
lastFile = None
xbmcplayer = xbmc.Player()
while not self.KodiMonitor.abortRequested():
if self.KodiMonitor.waitForAbort(1):
# Abort was requested while waiting. We should exit
break
if xbmcplayer.isPlaying():
try:
playTime = xbmcplayer.getTime()
totalTime = xbmcplayer.getTotalTime()
currentFile = xbmcplayer.getPlayingFile()
if(player.played_information.get(currentFile) != None):
player.played_information[currentFile]["currentPosition"] = playTime
# send update
td = datetime.today() - lastProgressUpdate
secDiff = td.seconds
if(secDiff > 10):
try:
player.reportPlayback()
except Exception, msg:
self.logMsg("Exception reporting progress: %s" % msg, 0)
pass
lastProgressUpdate = datetime.today()
# only try autoplay when there's 20 seconds or less remaining and only once!
if (totalTime - playTime <= 20 and (lastFile==None or lastFile!=currentFile)):
lastFile = currentFile
player.autoPlayPlayback()
except Exception, e:
self.logMsg("Exception in Playback Monitor Service: %s" % e, 0)
pass
else:
if (self.newUserClient == None):
self.newUserClient = "Started"
user.start()
# background worker for database sync
if (user.currUser != None):
# Correctly launch the websocket, if user manually launches the add-on
if (self.newWebSocketThread == None):
self.newWebSocketThread = "Started"
ws.start()
#full sync
if(startupComplete == False):
librarySync = self.librarySync
self.logMsg("Doing_Db_Sync: syncDatabase (Started)", 1)
libSync = librarySync.syncDatabase()
self.logMsg("Doing_Db_Sync: syncDatabase (Finished) %s" % libSync, 1)
countSync = librarySync.updatePlayCounts()
self.logMsg("Doing_Db_Sync: updatePlayCounts (Finished) %s" % countSync, 1)
# Force refresh newly set thumbnails
xbmc.executebuiltin("UpdateLibrary(video)")
if(libSync and countSync):
startupComplete = True
else:
if self.KodiMonitor.waitForAbort(10):
# Abort was requested while waiting. We should exit
break
else:
self.logMsg("Not authenticated yet", 2)
self.logMsg("Stopping Service", 0)
# If user reset library database
WINDOW = xbmcgui.Window(10000)
addon = xbmcaddon.Addon('plugin.video.emby')
if WINDOW.getProperty("SyncInstallRunDone") == "false":
# Reset the initial sync
addon.setSetting("SyncInstallRunDone", "false")
if (self.newWebSocketThread != None):
ws.stopClient()
if (self.newUserClient != None):
user.stopClient()
#start the service
Service().ServiceEntryPoint()