Use Plex Companion for Playstate Reporting
- Should fix Unknown answer from PMS https://192.168.178.5:32400/:/timeline?SubtitleStreamIndex=&AudioStreamIndex=1&ratingKey=4338&state=playing&time=424000&duration=8286000000 with status code 400. Message: NOTICE: PlexKodiConnect DownloadUtils -> Bad Request - Merge fixes to player.py
This commit is contained in:
parent
b820953c52
commit
f22369a14a
4 changed files with 72 additions and 77 deletions
|
@ -22,17 +22,17 @@ class PlexCompanion(threading.Thread):
|
||||||
self.client = plexgdm.plexgdm()
|
self.client = plexgdm.plexgdm()
|
||||||
self.client.clientDetails(self.settings)
|
self.client.clientDetails(self.settings)
|
||||||
self.logMsg("Registration string is: %s "
|
self.logMsg("Registration string is: %s "
|
||||||
% self.client.getClientDetails(), 1)
|
% self.client.getClientDetails(), 2)
|
||||||
|
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
httpd = False
|
||||||
# Cache for quicker while loops
|
# Cache for quicker while loops
|
||||||
log = self.logMsg
|
log = self.logMsg
|
||||||
client = self.client
|
client = self.client
|
||||||
threadStopped = self.threadStopped
|
threadStopped = self.threadStopped
|
||||||
threadSuspended = self.threadSuspended
|
threadSuspended = self.threadSuspended
|
||||||
start_count = 0
|
|
||||||
|
|
||||||
# Start up instances
|
# Start up instances
|
||||||
requestMgr = httppersist.RequestMgr()
|
requestMgr = httppersist.RequestMgr()
|
||||||
|
@ -40,7 +40,10 @@ class PlexCompanion(threading.Thread):
|
||||||
subscriptionManager = subscribers.SubscriptionManager(
|
subscriptionManager = subscribers.SubscriptionManager(
|
||||||
jsonClass, requestMgr)
|
jsonClass, requestMgr)
|
||||||
|
|
||||||
|
if utils.settings('plexCompanion') == 'true':
|
||||||
|
self.logMsg('User activated Plex Companion', 0)
|
||||||
# Start up httpd
|
# Start up httpd
|
||||||
|
start_count = 0
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
httpd = listener.ThreadedHTTPServer(
|
httpd = listener.ThreadedHTTPServer(
|
||||||
|
@ -64,9 +67,8 @@ class PlexCompanion(threading.Thread):
|
||||||
break
|
break
|
||||||
|
|
||||||
start_count += 1
|
start_count += 1
|
||||||
|
else:
|
||||||
if not httpd:
|
self.logMsg('User deactivated Plex Companion', 0)
|
||||||
return
|
|
||||||
|
|
||||||
client.start_all()
|
client.start_all()
|
||||||
|
|
||||||
|
@ -80,7 +82,7 @@ class PlexCompanion(threading.Thread):
|
||||||
break
|
break
|
||||||
xbmc.sleep(1000)
|
xbmc.sleep(1000)
|
||||||
try:
|
try:
|
||||||
|
if httpd:
|
||||||
httpd.handle_request()
|
httpd.handle_request()
|
||||||
message_count += 1
|
message_count += 1
|
||||||
|
|
||||||
|
@ -99,11 +101,12 @@ class PlexCompanion(threading.Thread):
|
||||||
subscriptionManager.notify()
|
subscriptionManager.notify()
|
||||||
xbmc.sleep(50)
|
xbmc.sleep(50)
|
||||||
except:
|
except:
|
||||||
log("Error in loop, continuing anyway", 0)
|
log("Error in loop, continuing anyway. Traceback:", 1)
|
||||||
log(traceback.format_exc(), 1)
|
log(traceback.format_exc(), 1)
|
||||||
xbmc.sleep(50)
|
xbmc.sleep(50)
|
||||||
|
|
||||||
client.stop_all()
|
client.stop_all()
|
||||||
|
if httpd:
|
||||||
try:
|
try:
|
||||||
httpd.socket.shutdown(socket.SHUT_RDWR)
|
httpd.socket.shutdown(socket.SHUT_RDWR)
|
||||||
except:
|
except:
|
||||||
|
|
|
@ -36,14 +36,6 @@ class Player(xbmc.Player):
|
||||||
|
|
||||||
self.logMsg("Starting playback monitor.", 2)
|
self.logMsg("Starting playback monitor.", 2)
|
||||||
|
|
||||||
# Should we start notification or is this done by Plex Companion?
|
|
||||||
self.doNotify = False if (utils.settings('plexCompanion') == 'true') \
|
|
||||||
else True
|
|
||||||
if self.doNotify:
|
|
||||||
self.logMsg("PMS notifications not done by Plex Companion", 2)
|
|
||||||
else:
|
|
||||||
self.logMsg("PMS notifications done by Plex Companion", 2)
|
|
||||||
|
|
||||||
def GetPlayStats(self):
|
def GetPlayStats(self):
|
||||||
return self.playStats
|
return self.playStats
|
||||||
|
|
||||||
|
@ -74,7 +66,8 @@ class Player(xbmc.Player):
|
||||||
else:
|
else:
|
||||||
count += 1
|
count += 1
|
||||||
if not currentFile:
|
if not currentFile:
|
||||||
log('Error getting a currently playing file; abort reporting', -1)
|
self.logMsg('Error getting a currently playing file; abort '
|
||||||
|
'reporting', -1)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Save currentFile for cleanup later and for references
|
# Save currentFile for cleanup later and for references
|
||||||
|
@ -88,11 +81,12 @@ class Player(xbmc.Player):
|
||||||
itemId = window("emby_%s.itemid" % currentFile)
|
itemId = window("emby_%s.itemid" % currentFile)
|
||||||
# try 20 times or about 10 seconds
|
# try 20 times or about 10 seconds
|
||||||
if count == 20:
|
if count == 20:
|
||||||
log("Could not find itemId, cancelling playback report...", -1)
|
self.logMsg("Could not find itemId, cancelling playback "
|
||||||
|
"report!", -1)
|
||||||
return
|
return
|
||||||
count += 1
|
count += 1
|
||||||
|
|
||||||
log("ONPLAYBACK_STARTED: %s itemid: %s"
|
self.logMsg("ONPLAYBACK_STARTED: %s itemid: %s"
|
||||||
% (currentFile.decode('utf-8'), itemId), 0)
|
% (currentFile.decode('utf-8'), itemId), 0)
|
||||||
|
|
||||||
embyitem = "emby_%s" % currentFile
|
embyitem = "emby_%s" % currentFile
|
||||||
|
@ -102,16 +96,16 @@ class Player(xbmc.Player):
|
||||||
itemType = window("%s.type" % embyitem)
|
itemType = window("%s.type" % embyitem)
|
||||||
window('emby_skipWatched%s' % itemId, value="true")
|
window('emby_skipWatched%s' % itemId, value="true")
|
||||||
|
|
||||||
log("Playing itemtype is: %s" % itemType, 1)
|
self.logMsg("Playing itemtype is: %s" % itemType, 1)
|
||||||
|
|
||||||
customseek = window('emby_customPlaylist.seektime')
|
customseek = window('emby_customPlaylist.seektime')
|
||||||
if (window('emby_customPlaylist') == "true" and customseek):
|
if (window('emby_customPlaylist') == "true" and customseek):
|
||||||
# Start at, when using custom playlist (play to Kodi from webclient)
|
# Start at, when using custom playlist (play to Kodi from webclient)
|
||||||
log("Seeking to: %s" % customseek, 1)
|
self.logMsg("Seeking to: %s" % customseek, 1)
|
||||||
xbmcplayer.seekTime(int(customseek))
|
self.xbmcplayer.seekTime(int(customseek))
|
||||||
window('emby_customPlaylist.seektime', clear=True)
|
window('emby_customPlaylist.seektime', clear=True)
|
||||||
|
|
||||||
seekTime = xbmcplayer.getTime()
|
seekTime = self.xbmcplayer.getTime()
|
||||||
|
|
||||||
# Get playback volume
|
# Get playback volume
|
||||||
volume_query = {
|
volume_query = {
|
||||||
|
@ -191,7 +185,8 @@ class Player(xbmc.Player):
|
||||||
|
|
||||||
if mapping: # Set in playbackutils.py
|
if mapping: # Set in playbackutils.py
|
||||||
|
|
||||||
log("Mapping for external subtitles index: %s" % mapping, 2)
|
self.logMsg("Mapping for external subtitles index: %s"
|
||||||
|
% mapping, 2)
|
||||||
externalIndex = json.loads(mapping)
|
externalIndex = json.loads(mapping)
|
||||||
|
|
||||||
if externalIndex.get(str(indexSubs)):
|
if externalIndex.get(str(indexSubs)):
|
||||||
|
@ -257,8 +252,7 @@ class Player(xbmc.Player):
|
||||||
self.playStats[playMethod] = 1'''
|
self.playStats[playMethod] = 1'''
|
||||||
|
|
||||||
def reportPlayback(self):
|
def reportPlayback(self):
|
||||||
# Don't use if Plex Companion is enabled
|
# Done by Plex Companion
|
||||||
if not self.doNotify:
|
|
||||||
return
|
return
|
||||||
|
|
||||||
self.logMsg("reportPlayback Called", 2)
|
self.logMsg("reportPlayback Called", 2)
|
||||||
|
|
|
@ -33,7 +33,7 @@ from xbmc import sleep
|
||||||
|
|
||||||
import downloadutils
|
import downloadutils
|
||||||
from PlexFunctions import PMSHttpsEnabled
|
from PlexFunctions import PMSHttpsEnabled
|
||||||
from utils import window, logging
|
from utils import window, logging, settings
|
||||||
|
|
||||||
|
|
||||||
@logging
|
@logging
|
||||||
|
@ -60,7 +60,7 @@ class plexgdm:
|
||||||
self.client_registered = False
|
self.client_registered = False
|
||||||
self.download = downloadutils.DownloadUtils().downloadUrl
|
self.download = downloadutils.DownloadUtils().downloadUrl
|
||||||
|
|
||||||
def clientDetails(self, settings):
|
def clientDetails(self, options):
|
||||||
self.client_data = (
|
self.client_data = (
|
||||||
"Content-Type: plex/media-player\r\n"
|
"Content-Type: plex/media-player\r\n"
|
||||||
"Resource-Identifier: %s\r\n"
|
"Resource-Identifier: %s\r\n"
|
||||||
|
@ -74,13 +74,13 @@ class plexgdm:
|
||||||
"mirror,playqueues\r\n"
|
"mirror,playqueues\r\n"
|
||||||
"Device-Class: HTPC"
|
"Device-Class: HTPC"
|
||||||
) % (
|
) % (
|
||||||
settings['uuid'],
|
options['uuid'],
|
||||||
settings['client_name'],
|
options['client_name'],
|
||||||
settings['myport'],
|
options['myport'],
|
||||||
settings['addonName'],
|
options['addonName'],
|
||||||
settings['version']
|
options['version']
|
||||||
)
|
)
|
||||||
self.client_id = settings['uuid']
|
self.client_id = options['uuid']
|
||||||
|
|
||||||
def getClientDetails(self):
|
def getClientDetails(self):
|
||||||
if not self.client_data:
|
if not self.client_data:
|
||||||
|
@ -388,4 +388,5 @@ class plexgdm:
|
||||||
|
|
||||||
def start_all(self, daemon=False):
|
def start_all(self, daemon=False):
|
||||||
self.start_discovery(daemon)
|
self.start_discovery(daemon)
|
||||||
|
if settings('plexCompanion') == 'true':
|
||||||
self.start_registration(daemon)
|
self.start_registration(daemon)
|
||||||
|
|
|
@ -63,8 +63,6 @@ class Service():
|
||||||
window('emby_kodiProfile', value=xbmc.translatePath("special://profile"))
|
window('emby_kodiProfile', value=xbmc.translatePath("special://profile"))
|
||||||
window('emby_pluginpath', value=utils.settings('useDirectPaths'))
|
window('emby_pluginpath', value=utils.settings('useDirectPaths'))
|
||||||
|
|
||||||
self.runPlexCompanion = utils.settings('plexCompanion')
|
|
||||||
|
|
||||||
# Initial logging
|
# Initial logging
|
||||||
log("======== START %s ========" % self.addonName, 0)
|
log("======== START %s ========" % self.addonName, 0)
|
||||||
log("Platform: %s" % (self.clientInfo.getPlatform()), 0)
|
log("Platform: %s" % (self.clientInfo.getPlatform()), 0)
|
||||||
|
@ -206,8 +204,7 @@ class Service():
|
||||||
self.library_running = True
|
self.library_running = True
|
||||||
library.start()
|
library.start()
|
||||||
# Start the Plex Companion thread
|
# Start the Plex Companion thread
|
||||||
if not self.plexCompanion_running and \
|
if not self.plexCompanion_running:
|
||||||
self.runPlexCompanion == "true":
|
|
||||||
self.plexCompanion_running = True
|
self.plexCompanion_running = True
|
||||||
plexCompanion = PlexCompanion.PlexCompanion()
|
plexCompanion = PlexCompanion.PlexCompanion()
|
||||||
plexCompanion.start()
|
plexCompanion.start()
|
||||||
|
|
Loading…
Reference in a new issue