Support new Companion command "refreshPlayQueue"

This commit is contained in:
tomkat83 2017-05-31 13:44:04 +02:00
parent 17ab161369
commit 3fdb583851
3 changed files with 66 additions and 0 deletions

View file

@ -12,6 +12,7 @@ from plexbmchelper import listener, plexgdm, subscribers, functions, \
httppersist, plexsettings httppersist, plexsettings
from PlexFunctions import ParseContainerKey, GetPlexMetadata from PlexFunctions import ParseContainerKey, GetPlexMetadata
from PlexAPI import API from PlexAPI import API
from playlist_func import get_pms_playqueue, get_plextype_from_xml
import player import player
import variables as v import variables as v
import state import state
@ -149,6 +150,26 @@ class PlexCompanion(Thread):
offset=data.get('offset')) offset=data.get('offset'))
playqueue.plex_transient_token = token playqueue.plex_transient_token = token
elif task['action'] == 'refreshPlayQueue':
# example data: {'playQueueID': '8475', 'commandID': '11'}
xml = get_pms_playqueue(data['playQueueID'])
if xml is None:
return
if len(xml) == 0:
log.debug('Empty playqueue received - clearing playqueue')
plex_type = get_plextype_from_xml(xml)
if plex_type is None:
return
playqueue = self.mgr.playqueue.get_playqueue_from_type(
v.KODI_PLAYLIST_TYPE_FROM_PLEX_TYPE[plex_type])
playqueue.clear()
return
playqueue = self.mgr.playqueue.get_playqueue_from_type(
v.KODI_PLAYLIST_TYPE_FROM_PLEX_TYPE[xml[0].attrib['type']])
self.mgr.playqueue.update_playqueue_from_PMS(
playqueue,
data['playQueueID'])
def run(self): def run(self):
# Ensure that sockets will be closed no matter what # Ensure that sockets will be closed no matter what
try: try:

View file

@ -110,6 +110,12 @@ def process_command(request_path, params, queue=None):
'data': params 'data': params
}) })
elif request_path == 'player/playback/refreshPlayQueue':
queue.put({
'action': 'refreshPlayQueue',
'data': params
})
elif request_path == "player/playback/setParameters": elif request_path == "player/playback/setParameters":
if 'volume' in params: if 'volume' in params:
volume = int(params['volume']) volume = int(params['volume'])

View file

@ -1,16 +1,19 @@
import logging import logging
from urllib import quote from urllib import quote
from urlparse import parse_qsl, urlsplit from urlparse import parse_qsl, urlsplit
from re import compile as re_compile
import plexdb_functions as plexdb import plexdb_functions as plexdb
from downloadutils import DownloadUtils as DU from downloadutils import DownloadUtils as DU
from utils import JSONRPC, tryEncode, escape_html from utils import JSONRPC, tryEncode, escape_html
from PlexAPI import API from PlexAPI import API
from PlexFunctions import GetPlexMetadata
############################################################################### ###############################################################################
log = logging.getLogger("PLEX."+__name__) log = logging.getLogger("PLEX."+__name__)
REGEX = re_compile(r'''metadata%2F(\d+)''')
############################################################################### ###############################################################################
# kodi_item dict: # kodi_item dict:
@ -566,3 +569,39 @@ def remove_from_Kodi_playlist(playlist, pos):
del playlist.items[pos] del playlist.items[pos]
except IndexError: except IndexError:
log.error('Cannot delete position %s for %s' % (pos, playlist)) log.error('Cannot delete position %s for %s' % (pos, playlist))
def get_pms_playqueue(playqueue_id):
"""
Returns the Plex playqueue as an etree XML or None if unsuccessful
"""
xml = DU().downloadUrl(
"{server}/playQueues/%s" % playqueue_id,
headerOptions={'Accept': 'application/xml'})
try:
xml.attrib
except AttributeError:
log.error('Could not download Plex playqueue %s' % playqueue_id)
xml = None
return xml
def get_plextype_from_xml(xml):
"""
Needed if PMS returns an empty playqueue. Will get the Plex type from the
empty playlist playQueueSourceURI. Feed with (empty) etree xml
returns None if unsuccessful
"""
try:
plex_id = REGEX.findall(xml.attrib['playQueueSourceURI'])[0]
except IndexError:
log.error('Could not get plex_id from xml: %s' % xml.attrib)
return
new_xml = GetPlexMetadata(plex_id)
try:
new_xml[0].attrib
except (TypeError, IndexError, AttributeError):
log.error('Could not get plex metadata for plex id %s' % plex_id)
return
return new_xml[0].attrib.get('type')