This commit is contained in:
croneter 2019-05-04 13:14:34 +02:00
parent 1218cde0a2
commit 6bd98fcefd
5 changed files with 102 additions and 34 deletions

View file

@ -42,6 +42,7 @@ class Main():
if mode == 'playstrm':
while not utils.window('plex.playlist.play'):
xbmc.sleep(50)
LOG.error('waiting')
if utils.window('plex.playlist.aborted'):
LOG.info("playback aborted")
break
@ -51,7 +52,6 @@ class Main():
False,
xbmcgui.ListItem())
utils.window('plex.playlist.play', clear=True)
utils.window('plex.playlist.ready', clear=True)
utils.window('plex.playlist.aborted', clear=True)
elif mode == 'play':

View file

@ -195,10 +195,13 @@ class KodiMonitor(xbmc.Monitor):
if data['position'] == 0:
if data['playlistid'] == 0:
app.PLAYSTATE.audioplaylist = True
LOG.error('app.PLAYSTATE.audioplaylist set to True')
else:
app.PLAYSTATE.audioplaylist = False
LOG.error('app.PLAYSTATE.audioplaylist set to False')
self.playlistid = data['playlistid']
if utils.window('plex.playlist.start') and data['position'] == int(utils.window('plex.playlist.start')) + 1:
LOG.debug('plex.playlist.start: %s', utils.window('plex.playlist.start'))
if utils.window('plex.playlist.start') and data['position'] == int(utils.window('plex.playlist.start')):
LOG.info('Playlist ready')
utils.window('plex.playlist.ready', value='true')
utils.window('plex.playlist.start', clear=True)
@ -226,7 +229,6 @@ class KodiMonitor(xbmc.Monitor):
if self.playlistid == data['playlistid']:
LOG.debug('Resetting autoplay')
app.PLAYSTATE.autoplay = False
return
# playqueue = PQ.PLAYQUEUES[data['playlistid']]
# if not playqueue.is_pkc_clear():
# playqueue.pkc_edit = True

View file

@ -148,15 +148,10 @@ class PlayQueue(object):
"""
LOG.error('Current Kodi playlist: %s',
js.playlist_get_items(self.playlistid))
if position is not None:
self.index = position
else:
# Do NOT use kodi_pl.getposition() as that appears to be buggy
self.index = max(js.get_position(self.playlistid), 0)
LOG.debug('Initializing with plex_id %s, plex_type %s, position %s, '
'synched %s, force_transcode %s, index %s', plex_id,
plex_type, position, synched, force_transcode, self.index)
LOG.error('Actual start: %s', js.get_position(self.playlistid))
self.index = position
if self.kodi_pl.size() != len(self.items):
# The original item that Kodi put into the playlist, e.g.
# {

View file

@ -497,6 +497,8 @@ class Service(object):
continue
if self.webservice is not None and not self.webservice.is_alive():
# TODO: Emby completely restarts Emby for Kodi at this point
# Check if this is really necessary
LOG.info('Restarting webservice')
self.webservice.abort()
self.webservice = webservice.WebService()

View file

@ -13,6 +13,7 @@ import Queue
import xbmc
import xbmcvfs
from .plex_db import PlexDB
from . import backgroundthread, utils, variables as v, app, playqueue as PQ
from . import playlist_func as PL, json_rpc as js
@ -138,15 +139,23 @@ class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
try:
path = self.path[1:].decode('utf-8')
except IndexError:
path = ''
params = {}
if '?' in path:
path = path.split('?', 1)[1]
params = dict(utils.parse_qsl(path))
if params.get('transcode'):
params['transcode'] = params['transcode'].lower() == 'true'
if params.get('server') and params['server'].lower() == 'none':
params['server'] = None
if 'plex_type' not in params:
LOG.debug('Need to look-up plex_type')
with PlexDB(lock=False) as plexdb:
db_item = plexdb.item_by_id(params['plex_id'])
if db_item:
params['plex_type'] = db_item['plex_type']
else:
LOG.debug('No plex_type found, using Kodi player id')
players = js.get_players()
params['plex_type'] = v.PLEX_TYPE_CLIP if 'video' in players \
else v.PLEX_TYPE_SONG
return params
@ -223,7 +232,7 @@ class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
self.server.pending.append(params['plex_id'])
self.server.queue.put(params)
if not len(self.server.threads):
queue = QueuePlay(self.server)
queue = QueuePlay(self.server, params['plex_type'])
queue.start()
self.server.threads.append(queue)
@ -268,21 +277,40 @@ class QueuePlay(backgroundthread.KillableThread):
players with this method.
'''
def __init__(self, server):
def __init__(self, server, plex_type):
self.server = server
self.plex_type = plex_type
self.plex_id = None
self.plex_type = None
self.kodi_id = None
self.kodi_type = None
self.synched = None
self.force_transcode = None
super(QueuePlay, self).__init__()
def __unicode__(self):
return ("{{"
"'plex_id': {self.plex_id}, "
"'plex_type': '{self.plex_type}', "
"'kodi_id': {self.kodi_id}, "
"'kodi_type': '{self.kodi_type}', "
"'synched: '{self.synched}', "
"'force_transcode: '{self.force_transcode}', "
"}}").format(self=self)
def __str__(self):
return unicode(self).encode('utf-8')
__repr__ = __str__
def load_params(self, params):
self.plex_id = utils.cast(int, params['plex_id'])
self.plex_type = params.get('plex_type')
self.kodi_id = utils.cast(int, params.get('kodi_id'))
self.kodi_type = params.get('kodi_type')
# Some cleanup
if params.get('transcode'):
self.force_transcode = params['transcode'].lower() == 'true'
if params.get('server') and params['server'].lower() == 'none':
self.server = None
if params.get('synched') and params['synched'].lower() == 'false':
self.synched = False
else:
@ -293,31 +321,64 @@ class QueuePlay(backgroundthread.KillableThread):
self.force_transcode = False
def run(self):
"""
We cannot use js.get_players() to reliably get the active player
Use Kodimonitor's OnNotification and OnAdd
"""
LOG.debug('##===---- Starting QueuePlay ----===##')
if app.PLAYSTATE.audioplaylist:
LOG.debug('Audio playlist detected')
playqueue = PQ.get_playqueue_from_type(v.KODI_TYPE_AUDIO)
else:
LOG.debug('Video playlist detected')
playqueue = PQ.get_playqueue_from_type(v.KODI_TYPE_VIDEO)
abort = False
play_folder = False
i = 0
while app.PLAYSTATE.audioplaylist is None:
# Needed particulary for widget-playback
# We need to wait until kodimonitor notification OnAdd is triggered
# in order to detect the playlist type (video vs. audio) and thus
# e.g. determine whether playback has been init. from widgets
xbmc.sleep(50)
i += 1
if i > 100:
raise Exception('Kodi OnAdd not received - cancelling')
if app.PLAYSTATE.audioplaylist and self.plex_type in v.PLEX_VIDEOTYPES:
# Video launched from a widget - which starts a Kodi AUDIO playlist
# We will empty everything and start with a fresh VIDEO playlist
LOG.debug('Widget video playback detected; relaunching')
video_widget_playback = True
playqueue = PQ.get_playqueue_from_type(v.KODI_TYPE_AUDIO)
playqueue.clear()
playqueue = PQ.get_playqueue_from_type(v.KODI_TYPE_VIDEO)
playqueue.clear()
utils.window('plex.playlist.ready', value='true')
else:
video_widget_playback = False
if self.plex_type in v.PLEX_VIDEOTYPES:
LOG.debug('Video playback detected')
playqueue = PQ.get_playqueue_from_type(v.KODI_TYPE_VIDEO)
else:
LOG.debug('Audio playback detected')
playqueue = PQ.get_playqueue_from_type(v.KODI_TYPE_AUDIO)
# Position to start playback from (!!)
# Do NOT use kodi_pl.getposition() as that appears to be buggy
start_position = max(js.get_position(playqueue.playlistid), 0)
try:
start_position = max(js.get_position(playqueue.playlistid), 0)
except KeyError:
# Widgets: Since we've emptied the entire playlist, we won't get a
# position
start_position = 0
# Position to add next element to queue - we're doing this at the end
# of our playqueue
# of our current playqueue
position = playqueue.kodi_pl.size()
LOG.debug('start %s, position %s for current playqueue: %s',
LOG.debug('start_position %s, position %s for current playqueue: %s',
start_position, position, playqueue)
# Make sure we got at least 2 items in the queue - ugly
# TODO: find a better solution
xbmc.sleep(200)
while True:
try:
try:
params = self.server.queue.get(timeout=0.1)
params = self.server.queue.get(block=False)
except Queue.Empty:
LOG.debug('Wrapping up')
if xbmc.getCondVisibility('VideoPlayer.Content(livetv)'):
# avoid issues with ongoing Live TV playback
xbmc.Player().stop()
count = 50
while not utils.window('plex.playlist.ready'):
xbmc.sleep(50)
@ -329,11 +390,18 @@ class QueuePlay(backgroundthread.KillableThread):
LOG.info('Start playing folder')
xbmc.executebuiltin('Dialog.Close(busydialognocancel)')
playqueue.start_playback(start_position)
else:
# TODO - do we need to do anything here?
# Originally, 1st failable item should have been removed
elif video_widget_playback:
LOG.info('Start widget video playback')
utils.window('plex.playlist.play', value='true')
# playqueue.kodi_remove_item(start_position)
xbmc.sleep(2000)
LOG.info('Current PKC queue: %s', playqueue)
LOG.info('current Kodi queue: %s', js.playlist_get_items(playqueue.playlistid))
playqueue.start_playback()
else:
LOG.info('Start normal playback')
# Release default.py
utils.window('plex.playlist.play', value='true')
LOG.debug('Done wrapping up')
break
self.load_params(params)
if play_folder:
@ -349,7 +417,8 @@ class QueuePlay(backgroundthread.KillableThread):
if self.server.pending.count(params['plex_id']) != len(self.server.pending):
LOG.debug('Folder playback detected')
play_folder = True
utils.window('plex.playlist.start', str(start_position))
# Set to start_position + 1 because first item will fail
utils.window('plex.playlist.start', str(start_position + 1))
playqueue.init(self.plex_id,
plex_type=self.plex_type,
position=position,