Revert "Adjusted the rest to use the new method"
This reverts commit 0c91c0b28b
.
This commit is contained in:
parent
0c91c0b28b
commit
f8632a97d8
6 changed files with 282 additions and 154 deletions
|
@ -1,54 +1,70 @@
|
|||
#######################################################################
|
||||
# CLIENTINFORMATION: centralized client data
|
||||
# -------------------------------
|
||||
# addonId, addonName, addon version, clientId, platform
|
||||
#######################################################################
|
||||
# USER: centralized Userdata
|
||||
# -------------------------------
|
||||
# username, userId, token, server, http prefix, LogLevel
|
||||
#######################################################################
|
||||
|
||||
import xbmc
|
||||
import xbmcaddon
|
||||
import xbmcgui
|
||||
|
||||
import os
|
||||
from uuid import uuid4 as uuid4
|
||||
from Lock import Lock
|
||||
|
||||
import Utils as utils
|
||||
|
||||
|
||||
class ClientInformation():
|
||||
|
||||
|
||||
def __init__(self):
|
||||
addonId = self.getAddonId()
|
||||
self.addon = xbmcaddon.Addon(id=addonId)
|
||||
self.WINDOW = xbmcgui.Window( 10000 )
|
||||
|
||||
self.className = self.__class__.__name__
|
||||
self.addonName = self.getAddonName()
|
||||
level = User().getLogLevel()
|
||||
self.logLevel = 0
|
||||
|
||||
def logMsg(self, msg, lvl=1):
|
||||
if (level != None and level != ""):
|
||||
self.logLevel = int(level)
|
||||
|
||||
utils.logMsg("%s %s" % (self.addonName, self.className), str(msg), int(lvl))
|
||||
if (self.logLevel == 2):
|
||||
self.LogCalls = True
|
||||
|
||||
def logMsg(self, msg, level = 1):
|
||||
|
||||
addonName = self.getAddonName()
|
||||
className = self.__class__.__name__
|
||||
|
||||
if (self.logLevel >= level):
|
||||
try:
|
||||
xbmc.log("%s %s -> %s" % (addonName, className, str(msg)))
|
||||
except UnicodeEncodeError:
|
||||
try:
|
||||
xbmc.log("%s %s -> %s" % (addonName, className, str(msg)))
|
||||
except: pass
|
||||
|
||||
def getAddonId(self):
|
||||
# To use when declaring xbmcaddon.Addon(id=addonId)
|
||||
return "plugin.video.emby"
|
||||
addonId = "plugin.video.emby"
|
||||
return addonId
|
||||
|
||||
def getAddonName(self):
|
||||
# Useful for logging
|
||||
return self.addon.getAddonInfo('name').upper()
|
||||
addonName = self.addon.getAddonInfo('name').upper()
|
||||
return addonName
|
||||
|
||||
def getVersion(self):
|
||||
|
||||
return self.addon.getAddonInfo('version')
|
||||
|
||||
def getDeviceName(self):
|
||||
|
||||
deviceName = self.addon.getSetting('deviceName')
|
||||
deviceName = deviceName.replace("\"", "_")
|
||||
deviceName = deviceName.replace("/", "_")
|
||||
|
||||
return deviceName
|
||||
version = self.addon.getAddonInfo('version')
|
||||
return version
|
||||
|
||||
def getMachineId(self):
|
||||
|
||||
WINDOW = xbmcgui.Window(10000)
|
||||
WINDOW = self.WINDOW
|
||||
|
||||
clientId = WINDOW.getProperty("client_id")
|
||||
if (clientId != None and clientId != ""):
|
||||
if(clientId != None and clientId != ""):
|
||||
return clientId
|
||||
|
||||
# we need to load and or generate a client machine id
|
||||
|
@ -62,21 +78,21 @@ class ClientInformation():
|
|||
lock = Lock(machine_guid_lock_path)
|
||||
locked = lock.acquire()
|
||||
|
||||
if (locked == True):
|
||||
if(locked == True):
|
||||
|
||||
fd = os.open(machine_guid_path, os.O_CREAT|os.O_RDWR)
|
||||
clientId = os.read(fd, 256)
|
||||
|
||||
if (len(clientId) == 0):
|
||||
if(len(clientId) == 0):
|
||||
uuid = uuid4()
|
||||
clientId = str("%012X" % uuid)
|
||||
self.logMsg("ClientId saved to FILE: %s" % clientId, 2)
|
||||
self.logMsg("ClientId saved to FILE : %s" % clientId,1)
|
||||
os.write(fd, clientId)
|
||||
os.fsync(fd)
|
||||
|
||||
os.close(fd)
|
||||
|
||||
self.logMsg("ClientId saved to WINDOW: %s" % clientId, 1)
|
||||
self.logMsg("ClientId saved to WINDOW : %s" % clientId,1)
|
||||
WINDOW.setProperty("client_id", clientId)
|
||||
|
||||
finally:
|
||||
|
@ -100,3 +116,94 @@ class ClientInformation():
|
|||
return "Linux/Android"
|
||||
|
||||
return "Unknown"
|
||||
|
||||
|
||||
class User(ClientInformation):
|
||||
|
||||
def __init__(self):
|
||||
addonId = self.getAddonId()
|
||||
self.addon = xbmcaddon.Addon(id=addonId)
|
||||
self.WINDOW = xbmcgui.Window( 10000 )
|
||||
|
||||
level = self.getLogLevel()
|
||||
self.logLevel = 0
|
||||
|
||||
if (level != None and level != ""):
|
||||
self.logLevel = int(level)
|
||||
|
||||
if (self.logLevel == 2):
|
||||
self.LogCalls = True
|
||||
|
||||
def logMsg(self, msg, level = 1):
|
||||
|
||||
addonName = self.getAddonName()
|
||||
className = self.__class__.__name__
|
||||
|
||||
if (self.logLevel >= level):
|
||||
try:
|
||||
xbmc.log("%s %s -> %s" % (addonName, className, str(msg)))
|
||||
except UnicodeEncodeError:
|
||||
try:
|
||||
xbmc.log("%s %s -> %s" % (addonName, className, str(msg)))
|
||||
except: pass
|
||||
|
||||
def getUsername(self):
|
||||
|
||||
username = self.addon.getSetting('username')
|
||||
return username
|
||||
|
||||
def getUserId(self):
|
||||
|
||||
username = self.getUsername()
|
||||
w_userId = self.WINDOW.getProperty('userId%s' % username)
|
||||
s_userId = self.addon.getSetting('userId%s' % username)
|
||||
|
||||
# Verify if userId is saved to Window
|
||||
if (w_userId != ""):
|
||||
self.logMsg("Returning saved (WINDOW) UserId for user: %s UserId: %s" % (username, w_userId),2)
|
||||
return w_userId
|
||||
# Verify if userId is saved in settings
|
||||
elif (s_userId != ""):
|
||||
self.logMsg("Returning saved (SETTINGS) UserId for user: %s UserId: %s" % (username, s_userId),2)
|
||||
self.WINDOW.setProperty('userId%s' % username, s_userId)
|
||||
return s_userId
|
||||
else:
|
||||
return ""
|
||||
|
||||
def getToken(self):
|
||||
|
||||
username = self.getUsername()
|
||||
w_token = self.WINDOW.getProperty('AccessToken%s' % username)
|
||||
s_token = self.addon.getSetting('AccessToken%s' % username)
|
||||
|
||||
# Verify if token is saved to Window
|
||||
if (w_token != ""):
|
||||
self.logMsg("Returning saved (WINDOW) AccessToken for user: %s Token: %s" % (username, w_token),2)
|
||||
return w_token
|
||||
# Verify if token is saved in settings
|
||||
elif (s_token != ""):
|
||||
self.logMsg("Returning saved (SETTINGS) AccessToken for user: %s Token: %s" % (username, s_token),2)
|
||||
self.WINDOW.setProperty('AccessToken%s' % username, s_token)
|
||||
return s_token
|
||||
else:
|
||||
self.logMsg("User is not authenticated.")
|
||||
return ""
|
||||
|
||||
def getServer(self):
|
||||
|
||||
host = self.addon.getSetting('ipaddress')
|
||||
port = self.addon.getSetting('port')
|
||||
return host + ":" + port
|
||||
|
||||
def getHTTPprefix(self):
|
||||
# For https support
|
||||
prefix = self.addon.getSetting('prefix')
|
||||
if prefix:
|
||||
return "https://"
|
||||
else:
|
||||
return "http://"
|
||||
|
||||
def getLogLevel(self):
|
||||
|
||||
level = self.addon.getSetting('logLevel')
|
||||
return level
|
||||
|
|
|
@ -13,7 +13,6 @@ import socket
|
|||
import threading
|
||||
from datetime import datetime
|
||||
|
||||
import Utils as utils
|
||||
from DownloadUtils import DownloadUtils
|
||||
from UserClient import UserClient
|
||||
from ClientInformation import ClientInformation
|
||||
|
@ -22,32 +21,48 @@ from ClientInformation import ClientInformation
|
|||
class ConnectionManager():
|
||||
|
||||
clientInfo = ClientInformation()
|
||||
uc = UserClient()
|
||||
userClient = UserClient()
|
||||
doUtils = DownloadUtils()
|
||||
|
||||
addonName = clientInfo.getAddonName()
|
||||
addonId = clientInfo.getAddonId()
|
||||
addon = xbmcaddon.Addon(id=addonId)
|
||||
WINDOW = xbmcgui.Window(10000)
|
||||
|
||||
logLevel = 0
|
||||
addon = None
|
||||
WINDOW = xbmcgui.Window(10000)
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.className = self.__class__.__name__
|
||||
self.__language__ = self.addon.getLocalizedString
|
||||
clientInfo = self.clientInfo
|
||||
|
||||
def logMsg(self, msg, lvl=1):
|
||||
self.addonId = clientInfo.getAddonId()
|
||||
self.addonName = clientInfo.getAddonName()
|
||||
self.addon = xbmcaddon.Addon(id=self.addonId)
|
||||
self.__language__ = self.addon.getLocalizedString
|
||||
|
||||
utils.logMsg("%s %s" % (self.addonName, self.className), msg, int(lvl))
|
||||
def logMsg(self, msg, level=1):
|
||||
|
||||
addonName = self.addonName
|
||||
className = self.__class__.__name__
|
||||
s_logLevel = self.userClient.getLogLevel()
|
||||
|
||||
# Attempt to change logLevel live
|
||||
if (self.logLevel != s_logLevel):
|
||||
self.logLevel = s_logLevel
|
||||
|
||||
if (self.logLevel >= level):
|
||||
try:
|
||||
xbmc.log("%s %s -> %s" % (addonName, className, str(msg)))
|
||||
except UnicodeEncodeError:
|
||||
try:
|
||||
xbmc.log("%s %s -> %s" % (addonName, className, str(msg.encode('utf-8'))))
|
||||
except:
|
||||
pass
|
||||
|
||||
def checkServer(self):
|
||||
|
||||
self.WINDOW.setProperty("Server_Checked", "True")
|
||||
self.logMsg("Connection Manager Called", 2)
|
||||
self.logMsg("Connection Manager Called")
|
||||
|
||||
addon = self.addon
|
||||
server = self.uc.getServer()
|
||||
server = self.userClient.getServer()
|
||||
|
||||
if (server != ""):
|
||||
self.logMsg("Server already set", 2)
|
||||
|
@ -63,7 +78,7 @@ class ConnectionManager():
|
|||
prefix,ip,port = serverInfo.split(":")
|
||||
setServer = xbmcgui.Dialog().yesno(self.__language__(30167), "Proceed with the following server?", self.__language__(30169) + serverInfo)
|
||||
|
||||
if (setServer == 1):
|
||||
if setServer == 1:
|
||||
self.logMsg("Server selected. Saving information.", 1)
|
||||
addon.setSetting("ipaddress", ip.replace("/", ""))
|
||||
addon.setSetting("port", port)
|
||||
|
@ -78,40 +93,39 @@ class ConnectionManager():
|
|||
# Get List of public users
|
||||
self.logMsg("Getting user list", 1)
|
||||
server = ip.replace("/", "") + ":" + port
|
||||
url = "%s/mediabrowser/Users/Public?format=json" % serverInfo
|
||||
|
||||
try:
|
||||
result = self.doUtils.downloadUrl(url, authenticate=False)
|
||||
jsonData = self.doUtils.downloadUrl(serverInfo + "/mediabrowser/Users/Public?format=json", authenticate=False)
|
||||
except Exception, msg:
|
||||
error = "Unable to connect to %s: %s" % (server, msg)
|
||||
self.logMsg(error, 1)
|
||||
error = "Get User unable to connect to " + server + " : " + str(msg)
|
||||
xbmc.log (error)
|
||||
return ""
|
||||
|
||||
if (result == ""):
|
||||
if (jsonData == False):
|
||||
return
|
||||
|
||||
self.logMsg("jsonData: %s" % result, 2)
|
||||
self.logMsg("jsonData : " + str(jsonData), level=2)
|
||||
result = json.loads(jsonData)
|
||||
|
||||
names = []
|
||||
userList = []
|
||||
for user in result:
|
||||
name = user[u'Name']
|
||||
name = user.get("Name")
|
||||
userList.append(name)
|
||||
|
||||
if(user[u'HasPassword'] == True):
|
||||
if(user.get("HasPassword") == True):
|
||||
name = name + " (Secure)"
|
||||
names.append(name)
|
||||
|
||||
self.logMsg("User List: %s" % names, 1)
|
||||
self.logMsg("User List: %s" % userList, 2)
|
||||
self.logMsg("User List: " + str(names))
|
||||
self.logMsg("User List: " + str(userList))
|
||||
return_value = xbmcgui.Dialog().select(self.__language__(30200), names)
|
||||
|
||||
if (return_value > -1):
|
||||
if(return_value > -1):
|
||||
selected_user = userList[return_value]
|
||||
self.logMsg("Selected User: %s" % selected_user, 1)
|
||||
self.logMsg("elected User: %s" % selected_user)
|
||||
self.addon.setSetting("username", selected_user)
|
||||
else:
|
||||
self.logMsg("No user selected.", 1)
|
||||
xbmc.log("No user selected.")
|
||||
xbmc.executebuiltin('Addon.OpenSettings(%s)' % self.addonId)
|
||||
return
|
||||
|
||||
|
@ -139,8 +153,8 @@ class ConnectionManager():
|
|||
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
|
||||
sock.setsockopt(socket.IPPROTO_IP, socket.SO_REUSEADDR, 1)
|
||||
|
||||
self.logMsg("MutliGroup : %s" % str(MULTI_GROUP), 2);
|
||||
self.logMsg("Sending UDP Data: %s" % MESSAGE, 2);
|
||||
self.logMsg("MutliGroup : %s" % str(MULTI_GROUP));
|
||||
self.logMsg("Sending UDP Data: %s" % MESSAGE);
|
||||
sock.sendto(MESSAGE, MULTI_GROUP)
|
||||
|
||||
try:
|
||||
|
|
|
@ -182,11 +182,11 @@ class ReadEmbyDB():
|
|||
|
||||
def getCollections(self, type):
|
||||
#Build a list of the user views
|
||||
doUtils = DownloadUtils()
|
||||
downloadUtils = DownloadUtils()
|
||||
|
||||
try:
|
||||
url = "{server}/mediabrowser/Users/{UserId}/Items/Root?format=json"
|
||||
result = doUtils.downloadUrl(url)
|
||||
result = downloadUtils.downloadUrl(url)
|
||||
except Exception, msg:
|
||||
error = "Can't connect: %s" % msg
|
||||
xbmc.log(error)
|
||||
|
@ -198,7 +198,7 @@ class ReadEmbyDB():
|
|||
parentid = result[u'Id']
|
||||
|
||||
url = "{server}/mediabrowser/Users/{UserId}/items?ParentId=%s&Sortby=SortName&format=json" % parentid
|
||||
result = doUtils.downloadUrl(url)
|
||||
result = downloadUtils.downloadUrl(url)
|
||||
collections=[]
|
||||
|
||||
if (result == ""):
|
||||
|
@ -209,11 +209,9 @@ class ReadEmbyDB():
|
|||
for item in result:
|
||||
if (item[u'RecursiveItemCount'] != 0):
|
||||
Name = item[u'Name']
|
||||
if u'CollectionType' not in item:
|
||||
itemtype = item[u'CollectionType']
|
||||
if itemtype == None or itemtype == "":
|
||||
itemtype = "movies" # User may not have declared the type
|
||||
else:
|
||||
itemtype = item[u'CollectionType']
|
||||
|
||||
if itemtype == type and Name != "Collections":
|
||||
collections.append({'title': Name,
|
||||
'type' : itemtype,
|
||||
|
@ -249,9 +247,9 @@ class ReadEmbyDB():
|
|||
if type == None:
|
||||
type = "None" # User may not have declared the type
|
||||
if type == type:
|
||||
collections.append( {'title' : Name,
|
||||
'type' : type,
|
||||
'id' : view[u'Id']})
|
||||
collections.append({'title': Name,
|
||||
'type' : type,
|
||||
'id' : view[u'Id']})
|
||||
return collections
|
||||
|
||||
def getBoxSets(self):
|
||||
|
|
|
@ -19,22 +19,18 @@ from DownloadUtils import DownloadUtils
|
|||
|
||||
class UserClient(threading.Thread):
|
||||
|
||||
# Borg - multiple instances, shared state
|
||||
_shared_state = {}
|
||||
|
||||
clientInfo = ClientInformation()
|
||||
doUtils = DownloadUtils()
|
||||
KodiMonitor = KodiMonitor.Kodi_Monitor()
|
||||
|
||||
addonName = clientInfo.getAddonName()
|
||||
addonId = clientInfo.getAddonId()
|
||||
addon = xbmcaddon.Addon(id=addonId)
|
||||
WINDOW = xbmcgui.Window(10000)
|
||||
className = None
|
||||
|
||||
stopClient = False
|
||||
logLevel = 0
|
||||
addon = None
|
||||
auth = True
|
||||
retry = 0
|
||||
WINDOW = xbmcgui.Window(10000)
|
||||
|
||||
currUser = None
|
||||
currUserId = None
|
||||
|
@ -44,7 +40,10 @@ class UserClient(threading.Thread):
|
|||
|
||||
def __init__(self, *args):
|
||||
|
||||
self.__dict__ = self._shared_state
|
||||
self.KodiMonitor = KodiMonitor.Kodi_Monitor()
|
||||
|
||||
self.addonId = self.clientInfo.getAddonId()
|
||||
self.addon = xbmcaddon.Addon(id=self.addonId)
|
||||
self.className = self.__class__.__name__
|
||||
|
||||
threading.Thread.__init__(self, *args)
|
||||
|
@ -137,19 +136,18 @@ class UserClient(threading.Thread):
|
|||
|
||||
# Get public Users
|
||||
url = "%s/mediabrowser/Users/Public?format=json" % server
|
||||
result = self.doUtils.downloadUrl(url, authenticate=False)
|
||||
jsonData = self.doUtils.downloadUrl(url, authenticate=False)
|
||||
|
||||
users = []
|
||||
|
||||
if (result != ""):
|
||||
users = result
|
||||
if (jsonData != ""):
|
||||
users = json.loads(jsonData)
|
||||
|
||||
return users
|
||||
|
||||
def loadCurrUser(self):
|
||||
|
||||
WINDOW = self.WINDOW
|
||||
doUtils = self.doUtils
|
||||
username = self.getUsername()
|
||||
|
||||
# Only to be used if token exists
|
||||
|
@ -164,14 +162,6 @@ class UserClient(threading.Thread):
|
|||
WINDOW.setProperty("server_%s" % username, self.getServer(prefix=False))
|
||||
WINDOW.setProperty("userId%s" % username, self.currUserId)
|
||||
|
||||
# Set DownloadUtils values
|
||||
doUtils.setUsername(username)
|
||||
doUtils.setUserId(self.currUserId)
|
||||
doUtils.setServer(self.currServer)
|
||||
doUtils.setToken(self.currToken)
|
||||
# Start DownloadUtils session
|
||||
doUtils.startSession()
|
||||
|
||||
self.currUser = username
|
||||
|
||||
def authenticate(self):
|
||||
|
@ -205,15 +195,11 @@ class UserClient(threading.Thread):
|
|||
users = self.getPublicUsers()
|
||||
password = ""
|
||||
|
||||
'''if users == "":
|
||||
self.WINDOW.setProperty("Server_status", "Stop")
|
||||
return'''
|
||||
# Find user in list
|
||||
for user in users:
|
||||
name = user[u'Name']
|
||||
name = user.get("Name")
|
||||
userHasPassword = False
|
||||
|
||||
if (unicode(username, 'utf-8') in name):
|
||||
if (username == name):
|
||||
# Verify if user has a password
|
||||
if (user.get("HasPassword") == True):
|
||||
userHasPassword = True
|
||||
|
@ -221,7 +207,7 @@ class UserClient(threading.Thread):
|
|||
if (userHasPassword):
|
||||
password = xbmcgui.Dialog().input("Enter password for user: %s" % username, option=xbmcgui.ALPHANUM_HIDE_INPUT)
|
||||
# If password dialog is cancelled
|
||||
if (password == ""):
|
||||
if password == "":
|
||||
self.logMsg("No password entered.", 0)
|
||||
self.WINDOW.setProperty("Server_status", "Stop")
|
||||
self.auth = False
|
||||
|
@ -236,21 +222,22 @@ class UserClient(threading.Thread):
|
|||
|
||||
# Authenticate username and password
|
||||
url = "%s/mediabrowser/Users/AuthenticateByName?format=json" % server
|
||||
data = {'username': username, 'password': sha1}
|
||||
self.logMsg(data, 2)
|
||||
messageData = "username=%s&password=%s" % (username, sha1)
|
||||
|
||||
result = self.doUtils.downloadUrl(url, postBody=data, type="POST", authenticate=False)
|
||||
resp = self.doUtils.downloadUrl(url, postBody=messageData, type="POST", authenticate=False)
|
||||
|
||||
result = None
|
||||
accessToken = None
|
||||
try:
|
||||
self.logMsg("Auth_Reponse: %s" % result, 1)
|
||||
accessToken = result[u'AccessToken']
|
||||
self.logMsg("Auth_Reponse: %s" % resp, 1)
|
||||
result = json.loads(resp)
|
||||
accessToken = result.get("AccessToken")
|
||||
except:
|
||||
pass
|
||||
|
||||
if (result != None and accessToken != None):
|
||||
self.currUser = username
|
||||
userId = result[u'User'][u'Id']
|
||||
userId = result.get("User").get("Id")
|
||||
addon.setSetting("accessToken%s" % username, accessToken)
|
||||
addon.setSetting("userId%s" % username, userId)
|
||||
self.logMsg("User Authenticated: %s" % accessToken)
|
||||
|
@ -262,7 +249,7 @@ class UserClient(threading.Thread):
|
|||
self.logMsg("User authentication failed.")
|
||||
addon.setSetting("accessToken%s" % username, "")
|
||||
addon.setSetting("userId%s" % username, "")
|
||||
xbmcgui.Dialog().ok("Error connecting", "Invalid username or password.")
|
||||
xbmcgui.Dialog().ok("Error Connecting", "Wrong password.")
|
||||
|
||||
# Give two attempts at entering password
|
||||
self.retry += 1
|
||||
|
@ -275,7 +262,7 @@ class UserClient(threading.Thread):
|
|||
|
||||
def resetClient(self):
|
||||
|
||||
if (self.currToken != None):
|
||||
if self.currToken != None:
|
||||
# In case of 401, removed saved token
|
||||
self.addon.setSetting("accessToken%s" % self.currUser, "")
|
||||
self.WINDOW.setProperty("accessToken%s" % self.currUser, "")
|
||||
|
|
|
@ -236,7 +236,7 @@ class WebSocketThread(threading.Thread):
|
|||
LibrarySync().TvShowsSync(connection, cursor, fullsync = False, installFirstRun = False, itemList = itemsToUpdate)
|
||||
cursor.close()
|
||||
|
||||
def user_data_update(self, userData):
|
||||
def user_data_update(self, userDataList):
|
||||
|
||||
for userData in userDataList:
|
||||
self.logMsg("Message : Doing UserDataChanged : UserData : " + str(userData), 0)
|
||||
|
@ -268,11 +268,11 @@ class WebSocketThread(threading.Thread):
|
|||
messageString = json.dumps(messageData)
|
||||
self.logMsg("Opened : " + str(messageString))
|
||||
ws.send(messageString)
|
||||
'''
|
||||
|
||||
# Set Capabilities
|
||||
xbmc.log("postcapabilities_called")
|
||||
downloadUtils = DownloadUtils()
|
||||
downloadUtils.startSession()'''
|
||||
downloadUtils.postcapabilities()
|
||||
|
||||
|
||||
def getWebSocketPort(self, host, port):
|
||||
|
|
|
@ -33,10 +33,14 @@ class WriteKodiDB():
|
|||
|
||||
if(mb3Id != None):
|
||||
addon = xbmcaddon.Addon(id='plugin.video.emby')
|
||||
WINDOW = xbmcgui.Window(10000)
|
||||
username = WINDOW.getProperty('currUser')
|
||||
userid = WINDOW.getProperty('userId%s' % username)
|
||||
server = WINDOW.getProperty('server%s' % username)
|
||||
|
||||
downloadUtils = DownloadUtils()
|
||||
|
||||
watchedurl = "{server}/mediabrowser/Users/{UserId}/PlayedItems/%s" % mb3Id
|
||||
watchedurl = "%s/mediabrowser/Users/%s/PlayedItems/%s" % (server, userid, mb3Id)
|
||||
utils.logMsg("Emby","watchedurl -->" + watchedurl)
|
||||
if playcount != 0:
|
||||
downloadUtils.downloadUrl(watchedurl, postBody="", type="POST")
|
||||
|
@ -47,6 +51,7 @@ class WriteKodiDB():
|
|||
addon = xbmcaddon.Addon(id='plugin.video.emby')
|
||||
WINDOW = xbmcgui.Window(10000)
|
||||
username = WINDOW.getProperty('currUser')
|
||||
userid = WINDOW.getProperty('userId%s' % username)
|
||||
server = WINDOW.getProperty('server%s' % username)
|
||||
|
||||
downloadUtils = DownloadUtils()
|
||||
|
@ -108,12 +113,12 @@ class WriteKodiDB():
|
|||
#trailer link
|
||||
trailerUrl = None
|
||||
if MBitem.get("LocalTrailerCount") != None and MBitem.get("LocalTrailerCount") > 0:
|
||||
itemTrailerUrl = "{server}/mediabrowser/Users/{UserId}/Items/%s/LocalTrailers?format=json" % MBitem.get("Id")
|
||||
jsonData = downloadUtils.downloadUrl(itemTrailerUrl)
|
||||
if (jsonData != ""):
|
||||
trailerItem = jsonData
|
||||
if trailerItem[0][u'LocationType'] == "FileSystem":
|
||||
trailerUrl = PlayUtils().getPlayUrl(server, trailerItem[0][u'Id'], trailerItem[0])
|
||||
itemTrailerUrl = "%s/mediabrowser/Users/%s/Items/%s/LocalTrailers?format=json" % (server, userid, MBitem.get("Id"))
|
||||
jsonData = downloadUtils.downloadUrl(itemTrailerUrl, suppress=False, popup=0 )
|
||||
if(jsonData != ""):
|
||||
trailerItem = json.loads(jsonData)
|
||||
if trailerItem[0].get("LocationType") == "FileSystem":
|
||||
trailerUrl = PlayUtils().getPlayUrl(server, trailerItem[0].get("Id"), trailerItem[0])
|
||||
trailerUrl = utils.convertEncoding(trailerUrl)
|
||||
self.getPropertyParam_Batched(KodiItem, "trailer", trailerUrl, params)
|
||||
|
||||
|
@ -412,7 +417,6 @@ class WriteKodiDB():
|
|||
|
||||
#update artwork
|
||||
changes = False
|
||||
|
||||
artwork = {}
|
||||
artwork["thumb"] = API().getArtwork(MBitem, "Primary")
|
||||
|
||||
|
@ -672,11 +676,11 @@ class WriteKodiDB():
|
|||
trailerUrl = None
|
||||
if MBitem.get("LocalTrailerCount") != None and MBitem.get("LocalTrailerCount") > 0:
|
||||
itemTrailerUrl = "%s/mediabrowser/Users/%s/Items/%s/LocalTrailers?format=json" % (server, userid, MBitem.get("Id"))
|
||||
jsonData = downloadUtils.downloadUrl(itemTrailerUrl)
|
||||
jsonData = downloadUtils.downloadUrl(itemTrailerUrl, suppress=False, popup=0 )
|
||||
if(jsonData != ""):
|
||||
trailerItem = jsonData
|
||||
if trailerItem[0][u'LocationType'] == "FileSystem":
|
||||
trailerUrl = PlayUtils().getPlayUrl(server, trailerItem[0][u'Id'], trailerItem[0])
|
||||
trailerItem = json.loads(jsonData)
|
||||
if trailerItem[0].get("LocationType") == "FileSystem":
|
||||
trailerUrl = PlayUtils().getPlayUrl(server, trailerItem[0].get("Id"), trailerItem[0])
|
||||
trailerUrl = utils.convertEncoding(trailerUrl)
|
||||
|
||||
#create the movie
|
||||
|
@ -687,13 +691,18 @@ class WriteKodiDB():
|
|||
|
||||
cursor.execute(pathsql, (movieid, fileid, title, plot, shortplot, rating, year, MBitem["Id"], sorttitle, runtime, title, trailerUrl))
|
||||
|
||||
actionPerformed = False
|
||||
|
||||
try:
|
||||
connection.commit()
|
||||
utils.logMsg("Emby","Added movie to Kodi Library",MBitem["Id"] + " - " + MBitem["Name"])
|
||||
actionPerformed = True
|
||||
except:
|
||||
utils.logMsg("Emby","Error adding movie to Kodi Library",MBitem["Id"] + " - " + MBitem["Name"])
|
||||
actionPerformed = False
|
||||
|
||||
return actionPerformed
|
||||
|
||||
def addMusicVideoToKodiLibrary( self, MBitem, connection, cursor ):
|
||||
|
||||
#adds a musicvideo to Kodi by directly inserting it to connectionthe DB while there is no addMusicVideo available on the json API
|
||||
|
@ -763,25 +772,55 @@ class WriteKodiDB():
|
|||
pathsql="insert into musicvideo(idMVideo, idFile, c00, c04, c08, c23) values(?, ?, ?, ?, ?, ?)"
|
||||
cursor.execute(pathsql, (musicvideoid, fileid, title, runtime, plot, MBitem["Id"]))
|
||||
|
||||
actionPerformed = False
|
||||
|
||||
try:
|
||||
connection.commit()
|
||||
utils.logMsg("Emby","Added musicvideo to Kodi Library",MBitem["Id"] + " - " + MBitem["Name"])
|
||||
actionPerformed = True
|
||||
except:
|
||||
utils.logMsg("Emby","Error adding musicvideo to Kodi Library",MBitem["Id"] + " - " + MBitem["Name"])
|
||||
actionPerformed = False
|
||||
|
||||
return actionPerformed
|
||||
|
||||
def addEpisodeToKodiLibrary(self, MBitem, connection, cursor):
|
||||
|
||||
#adds a Episode to Kodi by directly inserting it to the DB while there is no addEpisode available on the json API
|
||||
#TODO: PR at Kodi team for a addEpisode endpoint on their API
|
||||
|
||||
# check season
|
||||
season = 0
|
||||
if MBitem.get("ParentIndexNumber") != None:
|
||||
season = int(MBitem.get("ParentIndexNumber"))
|
||||
else:
|
||||
utils.logMsg("Emby","Error adding episode to Kodi Library, no ParentIndexNumber - ID: " + MBitem["Id"] + " - " + MBitem["Name"])
|
||||
return False
|
||||
|
||||
# first check the episode is not already in the DB using the Emby ID which is stored in c20
|
||||
cursor.execute("SELECT idEpisode FROM episode WHERE c20 = ?",(MBitem["Id"],))
|
||||
result = cursor.fetchone()
|
||||
if result != None:
|
||||
utils.logMsg("Emby", "Episode already exists in DB : " + MBitem["Id"] + " - " + MBitem["Name"], 2)
|
||||
return
|
||||
return False
|
||||
|
||||
# get the showid
|
||||
cursor.execute("SELECT idShow as showid FROM tvshow WHERE c12 = ?",(MBitem["SeriesId"],))
|
||||
result = cursor.fetchone()
|
||||
showid = -1
|
||||
if(result == None):
|
||||
utils.logMsg("Emby","Error adding episode to Kodi Library, couldn't find show - ID: " + MBitem["Id"] + " - " + MBitem["Name"])
|
||||
return False
|
||||
else:
|
||||
showid = result[0]
|
||||
|
||||
# check season
|
||||
cursor.execute("SELECT idSeason FROM seasons WHERE idShow = ? and season = ?",(showid, season))
|
||||
result = cursor.fetchone()
|
||||
if(result == None):
|
||||
utils.logMsg("Emby","Error adding episode to Kodi Library, season does not exist - ShowId: " + str(showid) + " SeasonNo: " + str(season) + " EmbyId: " + MBitem["Id"] + " Name: " + MBitem["Name"])
|
||||
return False
|
||||
|
||||
# do add
|
||||
addon = xbmcaddon.Addon(id='plugin.video.emby')
|
||||
port = addon.getSetting('port')
|
||||
host = addon.getSetting('ipaddress')
|
||||
|
@ -840,32 +879,6 @@ class WriteKodiDB():
|
|||
sql="INSERT OR REPLACE into files(idFile, idPath, strFilename, playCount, lastPlayed, dateAdded) values(?, ?, ?, ?, ?, ?)"
|
||||
cursor.execute(sql, (fileid,pathid,filename,playcount,lastplayed,dateadded))
|
||||
|
||||
#get the showid
|
||||
cursor.execute("SELECT idShow as showid FROM tvshow WHERE c12 = ?",(MBitem["SeriesId"],))
|
||||
result = cursor.fetchone()
|
||||
showid = -1
|
||||
if(result == None):
|
||||
utils.logMsg("Emby","Error adding episode to Kodi Library, couldn't find show - ID: " + MBitem["Id"] + " - " + MBitem["Name"])
|
||||
actionPerformed = False
|
||||
return False
|
||||
else:
|
||||
showid = result[0]
|
||||
|
||||
# check season
|
||||
season = 0
|
||||
if MBitem.get("ParentIndexNumber") != None:
|
||||
season = int(MBitem.get("ParentIndexNumber"))
|
||||
else:
|
||||
utils.logMsg("Emby","Error adding episode to Kodi Library, no ParentIndexNumber - ID: " + MBitem["Id"] + " - " + MBitem["Name"])
|
||||
return False
|
||||
|
||||
cursor.execute("SELECT idSeason FROM seasons WHERE idShow = ? and season = ?",(showid, season))
|
||||
result = cursor.fetchone()
|
||||
if(result == None):
|
||||
utils.logMsg("Emby","Error adding episode to Kodi Library, season does not exist - ShowId: " + str(showid) + " SeasonNo: " + str(season) + " EmbyId: " + MBitem["Id"] + " Name: " + MBitem["Name"])
|
||||
actionPerformed = False
|
||||
return False
|
||||
|
||||
# build info
|
||||
episode = 0
|
||||
if MBitem.get("IndexNumber") != None:
|
||||
|
@ -888,12 +901,16 @@ class WriteKodiDB():
|
|||
pathsql = "INSERT into episode(idEpisode, idFile, c00, c01, c03, c05, c09, c20, c12, c13, c14, idShow, c15, c16) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
||||
cursor.execute(pathsql, (episodeid, fileid, title, plot, rating, premieredate, runtime, MBitem["Id"], season, episode, title, showid, "-1", "-1"))
|
||||
|
||||
actionPerformed = False
|
||||
|
||||
try:
|
||||
connection.commit()
|
||||
utils.logMsg("Emby","Added episode to Kodi Library - ID: " + MBitem["Id"] + " - " + MBitem["Name"])
|
||||
actionPerformed = True
|
||||
except:
|
||||
utils.logMsg("Emby","Error adding episode to Kodi Library - ID: " + MBitem["Id"] + " - " + MBitem["Name"])
|
||||
actionPerformed = False
|
||||
|
||||
return actionPerformed
|
||||
|
||||
def deleteMovieFromKodiLibrary(self, id ):
|
||||
kodiItem = ReadKodiDB().getKodiMovie(id)
|
||||
|
@ -965,6 +982,7 @@ class WriteKodiDB():
|
|||
elif "/" in path:
|
||||
toplevelpathstr = path.rsplit("/",2)[1]
|
||||
toplevelpath = path.replace(toplevelpathstr + "/","")
|
||||
|
||||
cursor.execute("SELECT idPath as tlpathid FROM path WHERE strPath = ?",(toplevelpath,))
|
||||
result = cursor.fetchone()
|
||||
if result == None:
|
||||
|
@ -992,12 +1010,16 @@ class WriteKodiDB():
|
|||
pathsql="insert into tvshowlinkpath(idShow,idPath) values(?, ?)"
|
||||
cursor.execute(pathsql, (showid,pathid))
|
||||
|
||||
actionPerformed = False
|
||||
|
||||
try:
|
||||
connection.commit()
|
||||
utils.logMsg("Emby","Added TV Show to Kodi Library: " + MBitem["Id"] + " - " + MBitem["Name"])
|
||||
actionPerformed = True
|
||||
except:
|
||||
utils.logMsg("Emby","Error adding tvshow to Kodi Library: " + MBitem["Id"] + " - " + MBitem["Name"])
|
||||
actionPerformed = False
|
||||
|
||||
return actionPerformed
|
||||
|
||||
def deleteTVShowFromKodiLibrary(self, id):
|
||||
xbmc.sleep(sleepVal)
|
||||
|
|
Loading…
Reference in a new issue