PlexKodiConnect/resources/lib/playback_starter.py

75 lines
2.8 KiB
Python
Raw Normal View History

#!/usr/bin/env python
2017-01-03 00:07:24 +11:00
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, unicode_literals
2017-12-10 00:35:08 +11:00
from logging import getLogger
2017-01-03 00:07:24 +11:00
from threading import Thread
from urlparse import parse_qsl
2018-11-09 07:22:16 +11:00
from .kodi_db import KodiVideoDB
2018-06-22 03:24:37 +10:00
from . import playback
from . import context_entry
from . import json_rpc as js
from . import pickler
from . import state
2017-01-03 00:07:24 +11:00
###############################################################################
2018-06-22 03:24:37 +10:00
LOG = getLogger('PLEX.playback_starter')
2017-01-03 00:07:24 +11:00
###############################################################################
2018-04-16 00:34:45 +10:00
class PlaybackStarter(Thread):
2017-01-03 00:07:24 +11:00
"""
Processes new plays
"""
2018-04-16 00:34:45 +10:00
@staticmethod
def _triage(item):
try:
_, params = item.split('?', 1)
except ValueError:
# E.g. other add-ons scanning for Extras folder
LOG.debug('Detected 3rd party add-on call - ignoring')
2018-06-22 03:24:37 +10:00
pickler.pickle_me(pickler.Playback_Successful())
return
2017-01-03 00:07:24 +11:00
params = dict(parse_qsl(params))
mode = params.get('mode')
2018-04-16 02:13:48 +10:00
resolve = False if params.get('handle') == '-1' else True
LOG.debug('Received mode: %s, params: %s', mode, params)
2018-01-11 06:14:05 +11:00
if mode == 'play':
2018-01-29 03:21:28 +11:00
playback.playback_triage(plex_id=params.get('plex_id'),
plex_type=params.get('plex_type'),
2018-04-16 02:13:48 +10:00
path=params.get('path'),
resolve=resolve)
2018-01-11 06:14:05 +11:00
elif mode == 'plex_node':
2018-04-16 02:13:48 +10:00
playback.process_indirect(params['key'],
params['offset'],
resolve=resolve)
elif mode == 'navigation':
# e.g. when plugin://...tvshows is called for entire season
2018-11-09 07:22:16 +11:00
with KodiVideoDB() as kodidb:
show_id = kodidb.show_id_from_path(params.get('path'))
2018-04-16 02:13:48 +10:00
if show_id:
js.activate_window('videos',
'videodb://tvshows/titles/%s' % show_id)
else:
LOG.error('Could not find tv show id for %s', item)
if resolve:
2018-06-22 03:24:37 +10:00
pickler.pickle_me(pickler.Playback_Successful())
2018-01-11 06:14:05 +11:00
elif mode == 'context_menu':
2018-06-22 03:24:37 +10:00
context_entry.ContextMenu(kodi_id=params.get('kodi_id'),
kodi_type=params.get('kodi_type'))
2018-02-23 04:20:42 +11:00
2017-01-03 00:07:24 +11:00
def run(self):
queue = state.COMMAND_PIPELINE_QUEUE
2018-04-16 00:37:13 +10:00
LOG.info("----===## Starting PlaybackStarter ##===----")
2017-01-03 00:07:24 +11:00
while True:
item = queue.get()
if item is None:
# Need to shutdown - initiated by command_pipeline
2017-01-03 00:07:24 +11:00
break
else:
2018-04-16 00:34:45 +10:00
self._triage(item)
2017-01-03 00:07:24 +11:00
queue.task_done()
2018-04-16 00:37:13 +10:00
LOG.info("----===## PlaybackStarter stopped ##===----")