parent
b4a44c9d7d
commit
861736d8d3
2 changed files with 68 additions and 60 deletions
|
@ -35,7 +35,7 @@ class PlexCompanion(Thread):
|
||||||
# Start GDM for server/client discovery
|
# Start GDM for server/client discovery
|
||||||
self.client = plexgdm.plexgdm()
|
self.client = plexgdm.plexgdm()
|
||||||
self.client.clientDetails(self.settings)
|
self.client.clientDetails(self.settings)
|
||||||
log.debug("Registration string is: %s "
|
log.debug("Registration string is:\n%s"
|
||||||
% self.client.getClientDetails())
|
% self.client.getClientDetails())
|
||||||
# kodi player instance
|
# kodi player instance
|
||||||
self.player = player.Player()
|
self.player = player.Player()
|
||||||
|
@ -188,6 +188,7 @@ class PlexCompanion(Thread):
|
||||||
log.debug("Client is no longer registered. "
|
log.debug("Client is no longer registered. "
|
||||||
"Plex Companion still running on port %s"
|
"Plex Companion still running on port %s"
|
||||||
% self.settings['myport'])
|
% self.settings['myport'])
|
||||||
|
client.register_as_client()
|
||||||
# Get and set servers
|
# Get and set servers
|
||||||
if message_count % 30 == 0:
|
if message_count % 30 == 0:
|
||||||
subscriptionManager.serverlist = client.getServerList()
|
subscriptionManager.serverlist = client.getServerList()
|
||||||
|
|
|
@ -57,23 +57,22 @@ class plexgdm:
|
||||||
self._discovery_is_running = False
|
self._discovery_is_running = False
|
||||||
self._registration_is_running = False
|
self._registration_is_running = False
|
||||||
|
|
||||||
self.discovery_complete = False
|
|
||||||
self.client_registered = False
|
self.client_registered = False
|
||||||
self.download = downloadutils.DownloadUtils().downloadUrl
|
self.download = downloadutils.DownloadUtils().downloadUrl
|
||||||
|
|
||||||
def clientDetails(self, options):
|
def clientDetails(self, options):
|
||||||
self.client_data = (
|
self.client_data = (
|
||||||
"Content-Type: plex/media-player\r\n"
|
"Content-Type: plex/media-player\n"
|
||||||
"Resource-Identifier: %s\r\n"
|
"Resource-Identifier: %s\n"
|
||||||
"Name: %s\r\n"
|
"Name: %s\n"
|
||||||
"Port: %s\r\n"
|
"Port: %s\n"
|
||||||
"Product: %s\r\n"
|
"Product: %s\n"
|
||||||
"Version: %s\r\n"
|
"Version: %s\n"
|
||||||
"Protocol: plex\r\n"
|
"Protocol: plex\n"
|
||||||
"Protocol-Version: 1\r\n"
|
"Protocol-Version: 1\n"
|
||||||
"Protocol-Capabilities: timeline,playback,navigation,"
|
"Protocol-Capabilities: timeline,playback,navigation,"
|
||||||
"playqueues\r\n"
|
"playqueues\n"
|
||||||
"Device-Class: HTPC"
|
"Device-Class: HTPC\n"
|
||||||
) % (
|
) % (
|
||||||
options['uuid'],
|
options['uuid'],
|
||||||
options['client_name'],
|
options['client_name'],
|
||||||
|
@ -86,10 +85,25 @@ class plexgdm:
|
||||||
def getClientDetails(self):
|
def getClientDetails(self):
|
||||||
return self.client_data
|
return self.client_data
|
||||||
|
|
||||||
|
def register_as_client(self):
|
||||||
|
"""
|
||||||
|
Registers PKC's Plex Companion to the PMS
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
log.debug("Sending registration data: HELLO %s\n%s"
|
||||||
|
% (self.client_header, self.client_data))
|
||||||
|
self.update_sock.sendto("HELLO %s\n%s"
|
||||||
|
% (self.client_header, self.client_data),
|
||||||
|
self.client_register_group)
|
||||||
|
log.debug('(Re-)registering PKC Plex Companion successful')
|
||||||
|
except:
|
||||||
|
log.error("Unable to send registration message")
|
||||||
|
|
||||||
def client_update(self):
|
def client_update(self):
|
||||||
update_sock = socket.socket(socket.AF_INET,
|
self.update_sock = socket.socket(socket.AF_INET,
|
||||||
socket.SOCK_DGRAM,
|
socket.SOCK_DGRAM,
|
||||||
socket.IPPROTO_UDP)
|
socket.IPPROTO_UDP)
|
||||||
|
update_sock = self.update_sock
|
||||||
|
|
||||||
# Set socket reuse, may not work on all OSs.
|
# Set socket reuse, may not work on all OSs.
|
||||||
try:
|
try:
|
||||||
|
@ -129,16 +143,9 @@ class plexgdm:
|
||||||
self._multicast_address) +
|
self._multicast_address) +
|
||||||
socket.inet_aton('0.0.0.0'))
|
socket.inet_aton('0.0.0.0'))
|
||||||
update_sock.setblocking(0)
|
update_sock.setblocking(0)
|
||||||
log.debug("Sending registration data: HELLO %s\r\n%s"
|
|
||||||
% (self.client_header, self.client_data))
|
|
||||||
|
|
||||||
# Send initial client registration
|
# Send initial client registration
|
||||||
try:
|
self.register_as_client()
|
||||||
update_sock.sendto("HELLO %s\r\n%s"
|
|
||||||
% (self.client_header, self.client_data),
|
|
||||||
self.client_register_group)
|
|
||||||
except:
|
|
||||||
log.error("Unable to send registration message")
|
|
||||||
|
|
||||||
# Now, listen format client discovery reguests and respond.
|
# Now, listen format client discovery reguests and respond.
|
||||||
while self._registration_is_running:
|
while self._registration_is_running:
|
||||||
|
@ -153,7 +160,7 @@ class plexgdm:
|
||||||
log.debug("Detected client discovery request from %s. "
|
log.debug("Detected client discovery request from %s. "
|
||||||
" Replying" % str(addr))
|
" Replying" % str(addr))
|
||||||
try:
|
try:
|
||||||
update_sock.sendto("HTTP/1.0 200 OK\r\n%s"
|
update_sock.sendto("HTTP/1.0 200 OK\n%s"
|
||||||
% self.client_data,
|
% self.client_data,
|
||||||
addr)
|
addr)
|
||||||
except:
|
except:
|
||||||
|
@ -165,10 +172,10 @@ class plexgdm:
|
||||||
log.info("Client Update loop stopped")
|
log.info("Client Update loop stopped")
|
||||||
# When we are finished, then send a final goodbye message to
|
# When we are finished, then send a final goodbye message to
|
||||||
# deregister cleanly.
|
# deregister cleanly.
|
||||||
log.debug("Sending registration data: BYE %s\r\n%s"
|
log.debug("Sending registration data: BYE %s\n%s"
|
||||||
% (self.client_header, self.client_data))
|
% (self.client_header, self.client_data))
|
||||||
try:
|
try:
|
||||||
update_sock.sendto("BYE %s\r\n%s"
|
update_sock.sendto("BYE %s\n%s"
|
||||||
% (self.client_header, self.client_data),
|
% (self.client_header, self.client_data),
|
||||||
self.client_register_group)
|
self.client_register_group)
|
||||||
except:
|
except:
|
||||||
|
@ -176,12 +183,12 @@ class plexgdm:
|
||||||
self.client_registered = False
|
self.client_registered = False
|
||||||
|
|
||||||
def check_client_registration(self):
|
def check_client_registration(self):
|
||||||
|
if not self.client_registered:
|
||||||
if self.client_registered and self.discovery_complete:
|
log.debug('Client has not been marked as registered')
|
||||||
|
return False
|
||||||
if not self.server_list:
|
if not self.server_list:
|
||||||
log.info("Server list is empty. Unable to check")
|
log.info("Server list is empty. Unable to check")
|
||||||
return False
|
return False
|
||||||
try:
|
|
||||||
for server in self.server_list:
|
for server in self.server_list:
|
||||||
if server['uuid'] == window('plex_machineIdentifier'):
|
if server['uuid'] == window('plex_machineIdentifier'):
|
||||||
media_server = server['server']
|
media_server = server['server']
|
||||||
|
@ -194,23 +201,23 @@ class plexgdm:
|
||||||
|
|
||||||
log.debug("Checking server [%s] on port [%s]"
|
log.debug("Checking server [%s] on port [%s]"
|
||||||
% (media_server, media_port))
|
% (media_server, media_port))
|
||||||
client_result = self.download(
|
xml = self.download(
|
||||||
'%s://%s:%s/clients' % (scheme, media_server, media_port))
|
'%s://%s:%s/clients' % (scheme, media_server, media_port))
|
||||||
|
try:
|
||||||
|
xml[0].attrib
|
||||||
|
except (TypeError, IndexError, AttributeError):
|
||||||
|
log.error('Could not download clients for %s' % media_server)
|
||||||
|
return False
|
||||||
registered = False
|
registered = False
|
||||||
for client in client_result:
|
for client in xml:
|
||||||
if (client.attrib.get('machineIdentifier') ==
|
if (client.attrib.get('machineIdentifier') ==
|
||||||
self.client_id):
|
self.client_id):
|
||||||
registered = True
|
registered = True
|
||||||
if registered:
|
if registered:
|
||||||
log.debug("Client registration successful. "
|
|
||||||
"Client data is: %s" % client_result)
|
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
log.info("Client registration not found. "
|
log.info("Client registration not found. "
|
||||||
"Client data is: %s" % client_result)
|
"Client data is: %s" % xml)
|
||||||
except:
|
|
||||||
log.error("Unable to check status")
|
|
||||||
pass
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def getServerList(self):
|
def getServerList(self):
|
||||||
|
|
Loading…
Reference in a new issue