Fix PKC not exiting correctly due to a call to xbmc.getCondVisibility

This commit is contained in:
croneter 2019-02-22 07:51:27 +01:00
parent fa9ca95e2e
commit a9ff70fac7
2 changed files with 42 additions and 19 deletions

View file

@ -7,7 +7,9 @@ from __future__ import absolute_import, division, unicode_literals
from logging import getLogger
from json import loads
import copy
import xbmc
import xbmcgui
from .plex_db import PlexDB
from . import kodi_db
@ -16,11 +18,11 @@ from . import utils, timing, plex_functions as PF, playback
from . import json_rpc as js, playqueue as PQ, playlist_func as PL
from . import backgroundthread, app, variables as v
###############################################################################
LOG = getLogger('PLEX.kodimonitor')
###############################################################################
# "Start from beginning", "Play from beginning"
STRINGS = (utils.try_encode(utils.lang(12021)),
utils.try_encode(utils.lang(12023)))
class KodiMonitor(xbmc.Monitor):
@ -530,3 +532,36 @@ def _clean_file_table():
LOG.debug('Database was locked, unable to clean file table')
else:
LOG.debug('Done cleaning up Kodi file table')
class ContextMonitor(backgroundthread.KillableThread):
"""
Detect the resume dialog for widgets. Could also be used to detect
external players (see Emby implementation)
Let's not register this thread because it won't quit due to
xbmc.getCondVisibility
It should still exit at some point due to xbmc.abortRequested
"""
def run(self):
LOG.info("----===## Starting ContextMonitor ##===----")
# app.APP.register_thread(self)
try:
self._run()
finally:
# app.APP.deregister_thread(self)
LOG.info("##===---- ContextMonitor Stopped ----===##")
def _run(self):
while not self.isCanceled():
# The following function will block if called while PKC should
# exit!
if xbmc.getCondVisibility('Window.IsVisible(DialogContextMenu.xml)'):
if xbmc.getInfoLabel('Control.GetLabel(1002)') in STRINGS:
# Remember that the item IS indeed resumable
control = int(xbmcgui.Window(10106).getFocusId())
app.PLAYSTATE.resume_playback = True if control == 1001 else False
else:
# Different context menu is displayed
app.PLAYSTATE.resume_playback = False
app.APP.monitor.waitForAbort(0.1)

View file

@ -4,7 +4,6 @@ from __future__ import absolute_import, division, unicode_literals
import logging
import sys
import xbmc
import xbmcgui
from . import utils, clientinfo, timing
from . import initialsetup
@ -30,10 +29,6 @@ WINDOW_PROPERTIES = (
"pms_token", "plex_token", "plex_authenticated", "plex_restricteduser",
"plex_allows_mediaDeletion", "plexkodiconnect.command", "plex_result")
# "Start from beginning", "Play from beginning"
STRINGS = (utils.try_encode(utils.lang(12021)),
utils.try_encode(utils.lang(12023)))
class Service(object):
ws = None
@ -105,6 +100,7 @@ class Service(object):
self.setup = None
self.alexa = None
self.playqueue = None
self.context_monitor = None
# Flags for other threads
self.connection_check_running = False
self.auth_running = False
@ -402,6 +398,9 @@ class Service(object):
# Some plumbing
app.init()
app.APP.monitor = kodimonitor.KodiMonitor()
self.context_monitor = kodimonitor.ContextMonitor()
# Start immediately to catch user input even before auth
self.context_monitor.start()
app.APP.player = xbmc.Player()
# Initialize the PKC playqueues
PQ.init_playqueues()
@ -467,17 +466,6 @@ class Service(object):
app.APP.monitor.waitForAbort(0.1)
continue
# Detect the resume dialog for widgets. Could also be used to detect
# external players (see Emby implementation)
if xbmc.getCondVisibility('Window.IsVisible(DialogContextMenu.xml)'):
if xbmc.getInfoLabel('Control.GetLabel(1002)') in STRINGS:
# Remember that the item IS indeed resumable
control = int(xbmcgui.Window(10106).getFocusId())
app.PLAYSTATE.resume_playback = True if control == 1001 else False
else:
# Different context menu is displayed
app.PLAYSTATE.resume_playback = False
# Before proceeding, need to make sure:
# 1. Server is online
# 2. User is set