181 lines
6.8 KiB
Python
181 lines
6.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
|
|
Copyright (C) 2014-2016 bromix (plugin.video.youtube)
|
|
Copyright (C) 2016-2018 plugin.video.youtube
|
|
|
|
SPDX-License-Identifier: GPL-2.0-only
|
|
See LICENSES/GPL-2.0-only for more information.
|
|
"""
|
|
|
|
import xbmcgui
|
|
import xbmcplugin
|
|
|
|
from ..abstract_provider_runner import AbstractProviderRunner
|
|
from ...exceptions import KodionException
|
|
from ...items import *
|
|
from ... import AbstractProvider
|
|
from . import info_labels
|
|
from . import xbmc_items
|
|
|
|
|
|
class XbmcRunner(AbstractProviderRunner):
|
|
def __init__(self):
|
|
AbstractProviderRunner.__init__(self)
|
|
self.handle = None
|
|
self.settings = None
|
|
|
|
def run(self, provider, context=None):
|
|
|
|
self.handle = context.get_handle()
|
|
|
|
try:
|
|
results = provider.navigate(context)
|
|
except KodionException as ex:
|
|
if provider.handle_exception(context, ex):
|
|
context.log_error(ex.__str__())
|
|
xbmcgui.Dialog().ok("Exception in ContentProvider", ex.__str__())
|
|
xbmcplugin.endOfDirectory(self.handle, succeeded=False)
|
|
return
|
|
|
|
self.settings = context.get_settings()
|
|
|
|
result = results[0]
|
|
options = {}
|
|
options.update(results[1])
|
|
|
|
if isinstance(result, bool) and not result:
|
|
xbmcplugin.endOfDirectory(self.handle, succeeded=False)
|
|
elif isinstance(result, VideoItem) or isinstance(result, AudioItem) or isinstance(result, UriItem):
|
|
self._set_resolved_url(context, result)
|
|
elif isinstance(result, DirectoryItem):
|
|
self._add_directory(context, result)
|
|
elif isinstance(result, list):
|
|
item_count = len(result)
|
|
for item in result:
|
|
if isinstance(item, DirectoryItem):
|
|
self._add_directory(context, item, item_count)
|
|
elif isinstance(item, VideoItem):
|
|
self._add_video(context, item, item_count)
|
|
elif isinstance(item, AudioItem):
|
|
self._add_audio(context, item, item_count)
|
|
elif isinstance(item, ImageItem):
|
|
self._add_image(context, item, item_count)
|
|
|
|
xbmcplugin.endOfDirectory(
|
|
self.handle, succeeded=True,
|
|
updateListing=options.get(AbstractProvider.RESULT_UPDATE_LISTING, False),
|
|
cacheToDisc=options.get(AbstractProvider.RESULT_CACHE_TO_DISC, True))
|
|
else:
|
|
# handle exception
|
|
pass
|
|
|
|
def _set_resolved_url(self, context, base_item, succeeded=True):
|
|
item = xbmc_items.to_playback_item(context, base_item)
|
|
item.setPath(base_item.get_uri())
|
|
xbmcplugin.setResolvedUrl(self.handle, succeeded=succeeded, listitem=item)
|
|
|
|
"""
|
|
# just to be sure :)
|
|
if not isLiveStream:
|
|
tries = 100
|
|
while tries>0:
|
|
xbmc.sleep(50)
|
|
if xbmc.Player().isPlaying() and xbmc.getCondVisibility("Player.Paused"):
|
|
xbmc.Player().pause()
|
|
break
|
|
tries-=1
|
|
"""
|
|
|
|
def _add_directory(self, context, directory_item, item_count=0):
|
|
major_version = context.get_system_version().get_version()[0]
|
|
|
|
art = {'icon': 'DefaultFolder.png',
|
|
'thumb': directory_item.get_image()}
|
|
|
|
if major_version > 17:
|
|
item = xbmcgui.ListItem(label=directory_item.get_name(), offscreen=True)
|
|
else:
|
|
item = xbmcgui.ListItem(label=directory_item.get_name())
|
|
|
|
# only set fanart is enabled
|
|
if directory_item.get_fanart() and self.settings.show_fanart():
|
|
art['fanart'] = directory_item.get_fanart()
|
|
|
|
if major_version <= 15:
|
|
item.setArt(art)
|
|
item.setIconImage(art['icon'])
|
|
else:
|
|
item.setArt(art)
|
|
|
|
if directory_item.get_context_menu() is not None:
|
|
item.addContextMenuItems(directory_item.get_context_menu(),
|
|
replaceItems=directory_item.replace_context_menu())
|
|
|
|
item.setInfo(type='video', infoLabels=info_labels.create_from_item(directory_item))
|
|
item.setPath(directory_item.get_uri())
|
|
|
|
is_folder = True
|
|
if directory_item.is_action():
|
|
is_folder = False
|
|
item.setProperty('isPlayable', 'false')
|
|
|
|
if directory_item.next_page:
|
|
item.setProperty('specialSort', 'bottom')
|
|
|
|
if directory_item.get_channel_subscription_id(): # make channel_subscription_id property available for keymapping
|
|
item.setProperty('channel_subscription_id', directory_item.get_channel_subscription_id())
|
|
|
|
xbmcplugin.addDirectoryItem(handle=self.handle,
|
|
url=directory_item.get_uri(),
|
|
listitem=item,
|
|
isFolder=is_folder,
|
|
totalItems=item_count)
|
|
|
|
def _add_video(self, context, video_item, item_count=0):
|
|
item = xbmc_items.to_video_item(context, video_item)
|
|
item.setPath(video_item.get_uri())
|
|
xbmcplugin.addDirectoryItem(handle=self.handle,
|
|
url=video_item.get_uri(),
|
|
listitem=item,
|
|
totalItems=item_count)
|
|
|
|
def _add_image(self, context, image_item, item_count):
|
|
major_version = context.get_system_version().get_version()[0]
|
|
|
|
art = {'icon': 'DefaultPicture.png',
|
|
'thumb': image_item.get_image()}
|
|
|
|
if major_version > 17:
|
|
item = xbmcgui.ListItem(label=image_item.get_name(), offscreen=True)
|
|
else:
|
|
item = xbmcgui.ListItem(label=image_item.get_name())
|
|
|
|
if image_item.get_fanart() and self.settings.show_fanart():
|
|
art['fanart'] = image_item.get_fanart()
|
|
|
|
if major_version <= 15:
|
|
item.setArt(art)
|
|
item.setIconImage(art['icon'])
|
|
else:
|
|
item.setArt(art)
|
|
|
|
if image_item.get_context_menu() is not None:
|
|
item.addContextMenuItems(image_item.get_context_menu(), replaceItems=image_item.replace_context_menu())
|
|
|
|
item.setInfo(type='picture', infoLabels=info_labels.create_from_item(image_item))
|
|
|
|
item.setPath(image_item.get_uri())
|
|
xbmcplugin.addDirectoryItem(handle=self.handle,
|
|
url=image_item.get_uri(),
|
|
listitem=item,
|
|
totalItems=item_count)
|
|
|
|
def _add_audio(self, context, audio_item, item_count):
|
|
item = xbmc_items.to_audio_item(context, audio_item)
|
|
item.setPath(audio_item.get_uri())
|
|
xbmcplugin.addDirectoryItem(handle=self.handle,
|
|
url=audio_item.get_uri(),
|
|
listitem=item,
|
|
totalItems=item_count)
|