Unicode paths for users with special characters

This commit is contained in:
angelblue05 2015-06-05 01:05:40 -05:00
parent e37a55bc07
commit 23b9f000e7

View file

@ -1,155 +1,188 @@
# -- coding: utf-8 --
import os
import sys
import time
from datetime import datetime
import xbmcaddon import xbmcaddon
import xbmc import xbmc
import xbmcgui import xbmcgui
import os
import threading
import json
from datetime import datetime
import time
cwd = xbmcaddon.Addon(id='plugin.video.emby').getAddonInfo('path') addon_ = xbmcaddon.Addon(id='plugin.video.emby')
BASE_RESOURCE_PATH = xbmc.translatePath( os.path.join( cwd, 'resources', 'lib' ) ) addon_path = addon_.getAddonInfo('path').decode('utf-8')
sys.path.append(BASE_RESOURCE_PATH) base_resource_path = xbmc.translatePath(os.path.join(addon_path, 'resources', 'lib')).decode('utf-8')
sys.path.append(base_resource_path)
import KodiMonitor import KodiMonitor
import Utils as utils import Utils as utils
from LibrarySync import LibrarySync
from Player import Player
from DownloadUtils import DownloadUtils
from ConnectionManager import ConnectionManager
from ClientInformation import ClientInformation from ClientInformation import ClientInformation
from WebSocketClient import WebSocketThread from ConnectionManager import ConnectionManager
from UserClient import UserClient from UserClient import UserClient
from PlaybackUtils import PlaybackUtils from Player import Player
librarySync = LibrarySync() from WebSocketClient import WebSocketThread
from LibrarySync import LibrarySync
class Service(): class Service():
newWebSocketThread = None
newUserClient = None
clientInfo = ClientInformation()
KodiMonitor = KodiMonitor.Kodi_Monitor() KodiMonitor = KodiMonitor.Kodi_Monitor()
clientInfo = ClientInformation()
librarySync = LibrarySync()
addonName = clientInfo.getAddonName() addonName = clientInfo.getAddonName()
WINDOW = xbmcgui.Window(10000) WINDOW = xbmcgui.Window(10000)
newWebSocketThread = None
newUserClient = None
warn_auth = True warn_auth = True
welcome_msg = True
server_online = True server_online = True
def __init__(self, *args ): def __init__(self, *args):
addonName = self.addonName
addonName = self.addonName
WINDOW = self.WINDOW
# Initial logging
self.logMsg("Starting Monitor", 0) self.logMsg("Starting Monitor", 0)
self.logMsg("======== START %s ========" % addonName, 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)
self.logMsg("Platform: %s" % (self.clientInfo.getPlatform()), 0) self.logMsg("Platform: %s" % (self.clientInfo.getPlatform()), 0)
self.logMsg("KODI Version: %s" % xbmc.getInfoLabel('System.BuildVersion'), 0)
self.logMsg("%s Version: %s" % (addonName, self.clientInfo.getVersion()), 0)
self.logMsg("Log Level: %s" % UserClient().getLogLevel(), 1)
# Reset window props for profile switch
WINDOW.clearProperty('Server_online')
WINDOW.clearProperty('Server_status')
WINDOW.clearProperty('startup')
embyProperty = WINDOW.getProperty('Emby.nodes.total')
propNames = [
"index","path","title","content",
"inprogress.content","inprogress.title",
"inprogress.content","inprogress.path",
"nextepisodes.title","nextepisodes.content",
"nextepisodes.path","unwatched.title",
"unwatched.content","unwatched.path",
"recent.title","recent.content","recent.path",
"recentepisodes.title","recentepisodes.content",
"recentepisodes.path","inprogressepisodes.title",
"inprogressepisodes.content","inprogressepisodes.path"
]
#reset all window props on startup for user profile switches
self.WINDOW.clearProperty("startup")
embyProperty = self.WINDOW.getProperty("Emby.nodes.total")
propNames = ["index","path","title","content","inprogress.content","inprogress.title","inprogress.content","inprogress.path","nextepisodes.title","nextepisodes.content","nextepisodes.path","unwatched.title","unwatched.content","unwatched.path","recent.title","recent.content","recent.path","recentepisodes.title","recentepisodes.content","recentepisodes.path","inprogressepisodes.title","inprogressepisodes.content","inprogressepisodes.path"]
if embyProperty: if embyProperty:
totalNodes = int(embyProperty) totalNodes = int(embyProperty)
for i in range(totalNodes): for i in range(totalNodes):
for prop in propNames: for prop in propNames:
self.WINDOW.clearProperty("Emby.nodes.%s.%s" %(str(i),prop)) WINDOW.clearProperty('Emby.nodes.%s.%s' % (str(i), prop))
def logMsg(self, msg, lvl=1): def logMsg(self, msg, lvl=1):
className = self.__class__.__name__ className = self.__class__.__name__
utils.logMsg("%s %s" % (self.addonName, className), str(msg), int(lvl)) utils.logMsg("%s %s" % (self.addonName, className), msg, int(lvl))
def ServiceEntryPoint(self): def ServiceEntryPoint(self):
WINDOW = self.WINDOW WINDOW = self.WINDOW
WINDOW.setProperty("Server_online", "")
self.WINDOW.setProperty("Server_status", "")
WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
# Server auto-detect
ConnectionManager().checkServer() ConnectionManager().checkServer()
lastProgressUpdate = datetime.today()
startupComplete = False
# Initialize important threads
user = UserClient() user = UserClient()
player = Player() player = Player()
ws = WebSocketThread() ws = WebSocketThread()
lastFile = None # Sync and progress report
startupComplete = False
lastProgressUpdate = datetime.today()
while not self.KodiMonitor.abortRequested(): while not self.KodiMonitor.abortRequested():
#WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
if self.KodiMonitor.waitForAbort(1): # Before proceeding, need to make sure:
# Abort was requested while waiting. We should exit # 1. Server is online
break # 2. User is set
# 3. User has access to the server
if WINDOW.getProperty('Server_online') == "true": if WINDOW.getProperty('Server_online') == "true":
# Server is online
if (user.currUser != None) and (user.HasAccess == True):
self.warn_auth = True
# Correctly launch the websocket, if user manually launches the add-on # Emby server is online
# Verify if user is set and has access to the server
if (user.currUser != None) and user.HasAccess:
if self.welcome_msg:
# Reset authentication warnings
self.welcome_msg = False
self.warn_auth = True
xbmcgui.Dialog().notification("Emby server", "Welcome %s!" % user.currUser, sound=False)
# Start the Websocket Client
if (self.newWebSocketThread == None): if (self.newWebSocketThread == None):
self.newWebSocketThread = "Started" self.newWebSocketThread = "Started"
ws.start() ws.start()
# If an item is playing
if xbmc.Player().isPlaying(): if xbmc.Player().isPlaying():
#WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
try: try:
# Update and report progress
playTime = xbmc.Player().getTime() playTime = xbmc.Player().getTime()
totalTime = xbmc.Player().getTotalTime() totalTime = xbmc.Player().getTotalTime()
currentFile = xbmc.Player().getPlayingFile() currentFile = xbmc.Player().getPlayingFile()
if(player.played_information.get(currentFile) != None): # Update positionticks
if player.played_information.get(currentFile) != None:
player.played_information[currentFile]["currentPosition"] = playTime player.played_information[currentFile]["currentPosition"] = playTime
# send update
td = datetime.today() - lastProgressUpdate td = datetime.today() - lastProgressUpdate
secDiff = td.seconds secDiff = td.seconds
if(secDiff > 3):
# Report progress to Emby server
if (secDiff > 3):
try: try:
player.reportPlayback() player.reportPlayback()
except Exception, msg: except Exception as msg:
self.logMsg("Exception reporting progress: %s" % msg) self.logMsg("Exception reporting progress: %s" % msg)
pass pass
lastProgressUpdate = datetime.today() lastProgressUpdate = datetime.today()
elif WINDOW.getProperty('commandUpdate') == "true": elif WINDOW.getProperty('commandUpdate') == "true":
# Received a remote control command that
# requires updating immediately
try: try:
WINDOW.clearProperty('commandUpdate') WINDOW.clearProperty('commandUpdate')
player.reportPlayback() player.reportPlayback()
except: pass except: pass
lastProgressUpdate = datetime.today() lastProgressUpdate = datetime.today()
except Exception, e: except Exception as e:
self.logMsg("Exception in Playback Monitor Service: %s" % e) self.logMsg("Exception in Playback Monitor Service: %s" % e)
pass pass
else: else:
#full sync # Library sync
if (startupComplete == False): if not startupComplete:
self.logMsg("Doing_Db_Sync: syncDatabase (Started)") # Run full sync
libSync = librarySync.FullLibrarySync() self.logMsg("Doing_Db_Sync: syncDatabase (Started)", 1)
self.logMsg("Doing_Db_Sync: syncDatabase (Finished) " + str(libSync)) libSync = self.librarySync.FullLibrarySync()
#WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time()))) self.logMsg("Doing_Db_Sync: syncDatabase (Finished) %s" % libSync, 1)
if (libSync):
if libSync:
startupComplete = True startupComplete = True
else:
if self.KodiMonitor.waitForAbort(1):
# Abort was requested while waiting. We should exit
break
else: else:
if self.warn_auth: if (user.currUser == None) and self.warn_auth:
self.logMsg("Not authenticated yet.", 1) # Alert user is not authenticated and suppress future warning
self.warn_auth = False self.warn_auth = False
self.logMsg("Not authenticated yet.", 1)
# User access is restricted.
# Keep verifying until access is granted
# unless server goes offline or Kodi is shut down.
while user.HasAccess == False: while user.HasAccess == False:
# Verify access with an API call
#WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
user.hasAccess() user.hasAccess()
if WINDOW.getProperty('Server_online') != "true": if WINDOW.getProperty('Server_online') != "true":
@ -160,38 +193,41 @@ class Service():
# Abort was requested while waiting. We should exit # Abort was requested while waiting. We should exit
break break
else: else:
# Wait until server becomes online or shut down is requested # Wait until Emby server is online
# or Kodi is shut down.
while not self.KodiMonitor.abortRequested(): while not self.KodiMonitor.abortRequested():
#WINDOW.setProperty("Emby_Service_Timestamp", str(int(time.time())))
if user.getServer() == "": if user.getServer() == "":
# No server info set in add-on settings
pass pass
elif user.getPublicUsers() == False: elif user.getPublicUsers() == False:
# Server is not online, suppress future warning # Server is offline.
# Alert the user and suppress future warning
if self.server_online: if self.server_online:
WINDOW.setProperty("Server_online", "false")
self.logMsg("Server is offline.", 1) self.logMsg("Server is offline.", 1)
xbmcgui.Dialog().notification("Error connecting", "%s Server is unreachable." % self.addonName) WINDOW.setProperty('Server_online', "false")
xbmcgui.Dialog().notification("Error connecting", "%s Server is unreachable." % self.addonName, sound=False)
self.server_online = False self.server_online = False
else: else:
# Server is online # Server is online
if not self.server_online: if not self.server_online:
# Server was not online when Kodi started. # Server was offline when Kodi started.
# Wait for server to be fully established. # Wait for server to be fully established.
if self.KodiMonitor.waitForAbort(5): if self.KodiMonitor.waitForAbort(5):
# Abort was requested while waiting. # Abort was requested while waiting.
break break
# Alert the user that server is online.
xbmcgui.Dialog().notification("Connection successful", "%s Server is online." % self.addonName, time=2000, sound=False)
self.server_online = True self.server_online = True
self.logMsg("Server is online and ready.", 1) self.logMsg("Server is online and ready.", 1)
addonSettings = xbmcaddon.Addon(id='plugin.video.emby') WINDOW.setProperty('Server_online', "true")
if addonSettings.getSetting("supressConnectMsg")=="false":
xbmcgui.Dialog().notification("Connection successful", "%s Server is online." % self.addonName, time=2000)
WINDOW.setProperty("Server_online", "true")
# Server is online, proceed. # Start the User client
if (self.newUserClient == None): if self.newUserClient == None:
self.newUserClient = "Started" self.newUserClient = "Started"
user.start() user.start()
break break
@ -200,12 +236,14 @@ class Service():
# Abort was requested while waiting. # Abort was requested while waiting.
break break
#self.checkService() if self.KodiMonitor.waitForAbort(1):
# Abort was requested while waiting. We should exit
break
# If user reset library database. # If user reset library database.
if WINDOW.getProperty("SyncInstallRunDone") == "false": if WINDOW.getProperty('SyncInstallRunDone') == "false":
addon = xbmcaddon.Addon('plugin.video.emby') addon = xbmcaddon.Addon('plugin.video.emby')
addon.setSetting("SyncInstallRunDone", "false") addon.setSetting('SyncInstallRunDone', "false")
if (self.newWebSocketThread != None): if (self.newWebSocketThread != None):
ws.stopClient() ws.stopClient()
@ -215,35 +253,5 @@ class Service():
self.logMsg("======== STOP %s ========" % self.addonName, 0) self.logMsg("======== STOP %s ========" % self.addonName, 0)
# To be reviewed when moving the sync process to it's own thread
'''def checkService(self):
WINDOW = self.WINDOW
timeStamp = WINDOW.getProperty("Emby_Service_Timestamp")
loops = 0
while(timeStamp == ""):
timeStamp = WINDOW.getProperty("Emby_Service_Timestamp")
loops = loops + 1
if(loops == 5):
self.logMsg("Emby Service Not Running, no time stamp, exiting.", 0)
addon = xbmcaddon.Addon(id='plugin.video.emby')
language = addon.getLocalizedString
xbmcgui.Dialog().ok(language(30135), language(30136), language(30137))
sys.exit()
if self.KodiMonitor.waitForAbort(1):
# Abort was requested while waiting. We should exit
return
self.logMsg("Emby Service Timestamp: " + timeStamp, 2)
self.logMsg("Emby Current Timestamp: " + str(int(time.time())), 2)
if((int(timeStamp) + 30) < int(time.time())):
self.logMsg("Emby Service Not Running, time stamp to old, exiting.", 0)
addon = xbmcaddon.Addon(id='plugin.video.emby')
language = addon.getLocalizedString
xbmcgui.Dialog().ok(language(30135), language(30136), language(30137))
sys.exit()'''
#start the service #start the service
Service().ServiceEntryPoint() Service().ServiceEntryPoint()