This commit is contained in:
angelblue05 2016-09-07 02:14:02 -05:00
parent b65d6baad0
commit e941674e74
4 changed files with 235 additions and 221 deletions

View File

@ -368,7 +368,7 @@ class Player(xbmc.Player):
# Report progress via websocketclient
postdata = json.dumps(postdata)
log.debug("Report: %s" % postdata)
self.ws.sendProgressUpdate(postdata)
self.ws.send_progress_update(postdata)
def onPlayBackPaused(self):

View File

@ -55,7 +55,7 @@ def dialog(type_, **kwargs):
d = xbmcgui.Dialog()
if "icon" in kwargs:
kwargs['icon'] = kwargs['icon'].replace("{default}",
kwargs['icon'] = kwargs['icon'].replace("{emby}",
"special://home/addons/plugin.video.emby/icon.png")
types = {

View File

@ -8,14 +8,13 @@ import threading
import websocket
import xbmc
import xbmcgui
import clientinfo
import downloadutils
import librarysync
import playlist
import userclient
from utils import window, settings, language as lang, JSONRPC
from utils import window, settings, dialog, language as lang, JSONRPC
##################################################################################################
@ -28,8 +27,8 @@ class WebSocket_Client(threading.Thread):
_shared_state = {}
client = None
stopWebsocket = False
_client = None
_stop_websocket = False
def __init__(self):
@ -37,71 +36,112 @@ class WebSocket_Client(threading.Thread):
self.__dict__ = self._shared_state
self.monitor = xbmc.Monitor()
self.doUtils = downloadutils.DownloadUtils()
self.clientInfo = clientinfo.ClientInfo()
self.deviceId = self.clientInfo.get_device_id()
self.librarySync = librarysync.LibrarySync()
self.doutils = downloadutils.DownloadUtils()
self.client_info = clientinfo.ClientInfo()
self.device_id = self.client_info.get_device_id()
self.library_sync = librarysync.LibrarySync()
threading.Thread.__init__(self)
def sendProgressUpdate(self, data):
def send_progress_update(self, data):
log.debug("sendProgressUpdate")
try:
messageData = {
message = {
'MessageType': "ReportPlaybackProgress",
'Data': data
}
messageString = json.dumps(messageData)
self.client.send(messageString)
log.debug("Message data: %s" % messageString)
message_str = json.dumps(message)
self._client.send(message_str)
log.debug("Message data: %s", message_str)
except Exception as e:
log.exception(e)
except Exception as error:
log.exception(error)
def on_message(self, ws, message):
result = json.loads(message)
messageType = result['MessageType']
message_type = result['MessageType']
data = result['Data']
dialog = xbmcgui.Dialog()
if messageType not in ('SessionEnded'):
if message_type not in ('SessionEnded'):
# Mute certain events
log.info("Message: %s" % message)
if messageType == "Play":
if message_type == "Play":
# A remote control play command has been sent from the server.
itemIds = data['ItemIds']
self._play_(data)
elif message_type == "Playstate":
# A remote control update playstate command has been sent from the server.
self._playstate_(data)
elif message_type == "UserDataChanged":
# A user changed their personal rating for an item, or their playstate was updated
userdata_list = data['UserDataList']
self.library_sync.triage_items("userdata", userdata_list)
elif message_type == "LibraryChanged":
librarySync = self.library_sync
processlist = {
'added': data['ItemsAdded'],
'update': data['ItemsUpdated'],
'remove': data['ItemsRemoved']
}
for action in processlist:
librarySync.triage_items(action, processlist[action])
elif message_type == "GeneralCommand":
self._general_commands(data)
elif message_type == "ServerRestarting":
self._server_restarting()
elif message_type == "UserConfigurationUpdated":
# Update user data set in userclient
userclient.UserClient().get_user(data)
self.library_sync.refresh_views = True
elif message_type == "ServerShuttingDown":
# Server went offline
window('emby_online', value="false")
@classmethod
def _play_(cls, data):
item_ids = data['ItemIds']
command = data['PlayCommand']
pl = playlist.Playlist()
playlist_ = playlist.Playlist()
if command == "PlayNow":
dialog.notification(
heading=lang(29999),
message="%s %s" % (len(itemIds), lang(33004)),
icon="special://home/addons/plugin.video.emby/icon.png",
sound=False)
startat = data.get('StartPositionTicks', 0)
pl.playAll(itemIds, startat)
playlist_.playAll(item_ids, startat)
dialog(type_="notification",
heading=lang(29999),
message="%s %s" % (len(item_ids), lang(33004)),
icon="{emby}",
sound=False)
elif command == "PlayNext":
dialog.notification(
newplaylist = playlist_.modifyPlaylist(item_ids)
dialog(type_="notification",
heading=lang(29999),
message="%s %s" % (len(itemIds), lang(33005)),
icon="special://home/addons/plugin.video.emby/icon.png",
message="%s %s" % (len(item_ids), lang(33005)),
icon="{emby}",
sound=False)
newplaylist = pl.modifyPlaylist(itemIds)
player = xbmc.Player()
if not player.isPlaying():
# Only start the playlist if nothing is playing
player.play(newplaylist)
elif messageType == "Playstate":
# A remote control update playstate command has been sent from the server.
@classmethod
def _playstate_(cls, data):
command = data['Command']
player = xbmc.Player()
@ -119,31 +159,15 @@ class WebSocket_Client(threading.Thread):
seekto = data['SeekPositionTicks']
seektime = seekto / 10000000.0
action(seektime)
log.info("Seek to %s." % seektime)
log.info("Seek to %s", seektime)
else:
action()
log.info("Command: %s completed." % command)
log.info("Command: %s completed", command)
window('emby_command', value="true")
elif messageType == "UserDataChanged":
# A user changed their personal rating for an item, or their playstate was updated
userdata_list = data['UserDataList']
self.librarySync.triage_items("userdata", userdata_list)
elif messageType == "LibraryChanged":
librarySync = self.librarySync
processlist = {
'added': data['ItemsAdded'],
'update': data['ItemsUpdated'],
'remove': data['ItemsRemoved']
}
for action in processlist:
librarySync.triage_items(action, processlist[action])
elif messageType == "GeneralCommand":
@classmethod
def _general_commands(cls, data):
command = data['Name']
arguments = data['Arguments']
@ -192,10 +216,10 @@ class WebSocket_Client(threading.Thread):
header = arguments['Header']
text = arguments['Text']
dialog.notification(
dialog(type_="notification",
heading=header,
message=text,
icon="special://home/addons/plugin.video.emby/icon.png",
icon="{emby}",
time=4000)
elif command == "SendString":
@ -242,64 +266,55 @@ class WebSocket_Client(threading.Thread):
if action:
xbmc.executebuiltin(action)
elif messageType == "ServerRestarting":
@classmethod
def _server_restarting(cls):
if settings('supressRestartMsg') == "true":
dialog.notification(
dialog(type_="notification",
heading=lang(29999),
message=lang(33006),
icon="special://home/addons/plugin.video.emby/icon.png")
elif messageType == "UserConfigurationUpdated":
# Update user data set in userclient
userclient.UserClient().get_user(data)
self.librarySync.refresh_views = True
elif messageType == "ServerShuttingDown":
# Server went offline
window('emby_online', value="false")
icon="{emby}")
def on_close(self, ws):
log.debug("Closed.")
log.debug("closed")
def on_open(self, ws):
self.doUtils.postCapabilities(self.deviceId)
self.doutils.postCapabilities(self.device_id)
def on_error(self, ws, error):
if "10061" in str(error):
# Server is offline
pass
else:
log.debug("Error: %s" % error)
log.debug("Error: %s", error)
def run(self):
loglevel = int(window('emby_logLevel'))
# websocket.enableTrace(True)
userId = window('emby_currUser')
server = window('emby_server%s' % userId)
token = window('emby_accessToken%s' % userId)
user_id = window('emby_currUser')
server = window('emby_server%s' % user_id)
token = window('emby_accessToken%s' % user_id)
# Get the appropriate prefix for the websocket
if "https" in server:
server = server.replace('https', "wss")
else:
server = server.replace('http', "ws")
websocket_url = "%s?api_key=%s&deviceId=%s" % (server, token, self.deviceId)
log.info("websocket url: %s" % websocket_url)
websocket_url = "%s?api_key=%s&deviceId=%s" % (server, token, self.device_id)
log.info("websocket url: %s", websocket_url)
self.client = websocket.WebSocketApp(websocket_url,
self._client = websocket.WebSocketApp(websocket_url,
on_message=self.on_message,
on_error=self.on_error,
on_close=self.on_close)
self.client.on_open = self.on_open
self._client.on_open = self.on_open
log.warn("----===## Starting WebSocketClient ##===----")
while not self.monitor.abortRequested():
self.client.run_forever(ping_interval=10)
if self.stopWebsocket:
self._client.run_forever(ping_interval=10)
if self._stop_websocket:
break
if self.monitor.waitForAbort(5):
@ -308,8 +323,8 @@ class WebSocket_Client(threading.Thread):
log.warn("##===---- WebSocketClient Stopped ----===##")
def stopClient(self):
def stop_client(self):
self.stopWebsocket = True
self.client.close()
log.info("Stopping thread.")
self._stop_websocket = True
self._client.close()
log.info("Stopping thread")

View File

@ -10,7 +10,6 @@ from datetime import datetime
import xbmc
import xbmcaddon
import xbmcgui
#################################################################################################
@ -55,22 +54,22 @@ class Service(object):
def __init__(self):
self.clientInfo = clientinfo.ClientInfo()
self.addonName = self.clientInfo.get_addon_name()
logLevel = settings('logLevel')
self.client_info = clientinfo.ClientInfo()
self.addon_name = self.client_info.get_addon_name()
log_level = settings('logLevel')
self.monitor = xbmc.Monitor()
window('emby_logLevel', value=str(logLevel))
window('emby_logLevel', value=str(log_level))
window('emby_kodiProfile', value=xbmc.translatePath('special://profile'))
# Initial logging
log.warn("======== START %s ========", self.addonName)
log.warn("======== START %s ========", self.addon_name)
log.warn("Python Version: %s", sys.version)
log.warn("Platform: %s", self.clientInfo.get_platform())
log.warn("Platform: %s", self.client_info.get_platform())
log.warn("KODI Version: %s", xbmc.getInfoLabel('System.BuildVersion'))
log.warn("%s Version: %s", self.addonName, self.clientInfo.get_version())
log.warn("%s Version: %s", self.addon_name, self.client_info.get_version())
log.warn("Using plugin paths: %s", settings('useDirectPaths') == "0")
log.warn("Log Level: %s", logLevel)
log.warn("Log Level: %s", log_level)
# Reset window props for profile switch
properties = [
@ -173,7 +172,7 @@ class Service(object):
message=("%s %s%s!"
% (lang(33000), user.get_username().decode('utf-8'),
add.decode('utf-8'))),
icon="{default}",
icon="{emby}",
time=2000,
sound=False)
@ -227,8 +226,8 @@ class Service(object):
if settings('offlineMsg') == "true":
dialog(type_="notification",
heading=lang(33001),
message="%s %s" % (self.addonName, lang(33002)),
icon="{default}",
message="%s %s" % (self.addon_name, lang(33002)),
icon="{emby}",
sound=False)
self.server_online = False
@ -236,7 +235,7 @@ class Service(object):
elif window('emby_online') == "sleep":
# device going to sleep
if self.websocket_running:
ws.stopClient()
ws.stop_client()
ws = wsc.WebSocket_Client()
self.websocket_running = False
@ -257,7 +256,7 @@ class Service(object):
dialog(type_="notification",
heading=lang(29999),
message=lang(33003),
icon="{default}",
icon="{emby}",
time=2000,
sound=False)
@ -289,9 +288,9 @@ class Service(object):
library.stopThread()
if self.websocket_running:
ws.stopClient()
ws.stop_client()
log.warn("======== STOP %s ========", self.addonName)
log.warn("======== STOP %s ========", self.addon_name)
# Delay option
DELAY = int(settings('startupDelay'))