194 lines
6.1 KiB
Python
194 lines
6.1 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
import logging
|
||
|
from urlparse import urlparse
|
||
|
from re import compile as re_compile
|
||
|
|
||
|
from utils import JSONRPC
|
||
|
import plexdb_functions as plexdb
|
||
|
from variables import ALEXA_TO_COMPANION
|
||
|
|
||
|
###############################################################################
|
||
|
|
||
|
log = logging.getLogger("PLEX."+__name__)
|
||
|
|
||
|
REGEX_PLAYQUEUES = re_compile(r'''/playQueues/(\d+)$''')
|
||
|
|
||
|
###############################################################################
|
||
|
|
||
|
|
||
|
def getPlayers():
|
||
|
info = JSONRPC("Player.GetActivePlayers").execute()['result'] or []
|
||
|
log.debug('players: %s' % JSONRPC("Player.GetActivePlayers").execute())
|
||
|
ret = {}
|
||
|
for player in info:
|
||
|
player['playerid'] = int(player['playerid'])
|
||
|
ret[player['type']] = player
|
||
|
return ret
|
||
|
|
||
|
|
||
|
def getPlayerIds():
|
||
|
ret = []
|
||
|
for player in getPlayers().values():
|
||
|
ret.append(player['playerid'])
|
||
|
return ret
|
||
|
|
||
|
|
||
|
def getPlaylistId(typus):
|
||
|
"""
|
||
|
typus: one of the Kodi types, e.g. audio or video
|
||
|
|
||
|
Returns None if nothing was found
|
||
|
"""
|
||
|
for playlist in getPlaylists():
|
||
|
if playlist.get('type') == typus:
|
||
|
return playlist.get('playlistid')
|
||
|
|
||
|
|
||
|
def getPlaylists():
|
||
|
"""
|
||
|
Returns a list, e.g.
|
||
|
[
|
||
|
{u'playlistid': 0, u'type': u'audio'},
|
||
|
{u'playlistid': 1, u'type': u'video'},
|
||
|
{u'playlistid': 2, u'type': u'picture'}
|
||
|
]
|
||
|
"""
|
||
|
return JSONRPC('Playlist.GetPlaylists').execute()
|
||
|
|
||
|
|
||
|
def millisToTime(t):
|
||
|
millis = int(t)
|
||
|
seconds = millis / 1000
|
||
|
minutes = seconds / 60
|
||
|
hours = minutes / 60
|
||
|
seconds = seconds % 60
|
||
|
minutes = minutes % 60
|
||
|
millis = millis % 1000
|
||
|
return {'hours': hours,
|
||
|
'minutes': minutes,
|
||
|
'seconds': seconds,
|
||
|
'milliseconds': millis}
|
||
|
|
||
|
|
||
|
def skipTo(self, plexId, typus):
|
||
|
# playlistId = self.getPlaylistId(tryDecode(xbmc_type(typus)))
|
||
|
# playerId = self.
|
||
|
with plexdb.Get_Plex_DB() as plex_db:
|
||
|
plexdb_item = plex_db.getItem_byId(plexId)
|
||
|
try:
|
||
|
dbid = plexdb_item[0]
|
||
|
mediatype = plexdb_item[4]
|
||
|
except TypeError:
|
||
|
log.info('Couldnt find item %s in Kodi db' % plexId)
|
||
|
return
|
||
|
log.debug('plexid: %s, kodi id: %s, type: %s'
|
||
|
% (plexId, dbid, mediatype))
|
||
|
|
||
|
|
||
|
def convert_alexa_to_companion(dictionary):
|
||
|
for key in dictionary:
|
||
|
if key in ALEXA_TO_COMPANION:
|
||
|
dictionary[ALEXA_TO_COMPANION[key]] = dictionary[key]
|
||
|
del dictionary[key]
|
||
|
|
||
|
|
||
|
def process_command(request_path, params, queue=None):
|
||
|
"""
|
||
|
queue: Queue() of PlexCompanion.py
|
||
|
"""
|
||
|
if params.get('deviceName') == 'Alexa':
|
||
|
convert_alexa_to_companion(params)
|
||
|
log.debug('Received request_path: %s, params: %s' % (request_path, params))
|
||
|
if "/playMedia" in request_path:
|
||
|
try:
|
||
|
containerKey = urlparse(params.get('containerKey')).path
|
||
|
except:
|
||
|
containerKey = ''
|
||
|
try:
|
||
|
playQueueID = REGEX_PLAYQUEUES.findall(containerKey)[0]
|
||
|
except IndexError:
|
||
|
playQueueID = ''
|
||
|
# We need to tell service.py
|
||
|
queue.put({
|
||
|
'action': 'playlist',
|
||
|
'data': params
|
||
|
})
|
||
|
return {
|
||
|
'lastkey': params['key'],
|
||
|
'containerKey': containerKey,
|
||
|
'playQueueID': playQueueID,
|
||
|
}
|
||
|
|
||
|
elif request_path == "player/playback/setParameters":
|
||
|
if 'volume' in params:
|
||
|
volume = int(params['volume'])
|
||
|
log.debug("Adjusting the volume to %s" % volume)
|
||
|
JSONRPC('Application.SetVolume').execute({"volume": volume})
|
||
|
|
||
|
elif request_path == "player/playback/play":
|
||
|
for playerid in getPlayerIds():
|
||
|
JSONRPC("Player.PlayPause").execute({"playerid": playerid,
|
||
|
"play": True})
|
||
|
|
||
|
elif request_path == "player/playback/pause":
|
||
|
for playerid in getPlayerIds():
|
||
|
JSONRPC("Player.PlayPause").execute({"playerid": playerid,
|
||
|
"play": False})
|
||
|
|
||
|
elif request_path == "player/playback/stop":
|
||
|
for playerid in getPlayerIds():
|
||
|
JSONRPC("Player.Stop").execute({"playerid": playerid})
|
||
|
|
||
|
elif request_path == "player/playback/seekTo":
|
||
|
for playerid in getPlayerIds():
|
||
|
JSONRPC("Player.Seek").execute(
|
||
|
{"playerid": playerid,
|
||
|
"value": millisToTime(params.get('offset', 0))})
|
||
|
|
||
|
elif request_path == "player/playback/stepForward":
|
||
|
for playerid in getPlayerIds():
|
||
|
JSONRPC("Player.Seek").execute({"playerid": playerid,
|
||
|
"value": "smallforward"})
|
||
|
|
||
|
elif request_path == "player/playback/stepBack":
|
||
|
for playerid in getPlayerIds():
|
||
|
JSONRPC("Player.Seek").execute({"playerid": playerid,
|
||
|
"value": "smallbackward"})
|
||
|
|
||
|
elif request_path == "player/playback/skipNext":
|
||
|
for playerid in getPlayerIds():
|
||
|
JSONRPC("Player.GoTo").execute({"playerid": playerid,
|
||
|
"to": "next"})
|
||
|
|
||
|
elif request_path == "player/playback/skipPrevious":
|
||
|
for playerid in getPlayerIds():
|
||
|
JSONRPC("Player.GoTo").execute({"playerid": playerid,
|
||
|
"to": "previous"})
|
||
|
|
||
|
elif request_path == "player/playback/skipTo":
|
||
|
skipTo(params.get('key').rsplit('/', 1)[1], params.get('type'))
|
||
|
|
||
|
elif request_path == "player/navigation/moveUp":
|
||
|
JSONRPC("Input.Up").execute()
|
||
|
|
||
|
elif request_path == "player/navigation/moveDown":
|
||
|
JSONRPC("Input.Down").execute()
|
||
|
|
||
|
elif request_path == "player/navigation/moveLeft":
|
||
|
JSONRPC("Input.Left").execute()
|
||
|
|
||
|
elif request_path == "player/navigation/moveRight":
|
||
|
JSONRPC("Input.Right").execute()
|
||
|
|
||
|
elif request_path == "player/navigation/select":
|
||
|
JSONRPC("Input.Select").execute()
|
||
|
|
||
|
elif request_path == "player/navigation/home":
|
||
|
JSONRPC("Input.Home").execute()
|
||
|
|
||
|
elif request_path == "player/navigation/back":
|
||
|
JSONRPC("Input.Back").execute()
|
||
|
|
||
|
else:
|
||
|
log.error('Unknown request path: %s' % request_path)
|