PlexKodiConnect/resources/lib/context_entry.py
2018-05-04 19:03:27 +02:00

192 lines
6.8 KiB
Python

# -*- coding: utf-8 -*-
###############################################################################
from logging import getLogger
from xbmcaddon import Addon
import xbmc
import xbmcplugin
import xbmcgui
import plexdb_functions as plexdb
from utils import window, settings, dialog, language as lang
from dialogs import context
import PlexFunctions as PF
from PlexAPI import API
import playqueue as PQ
import variables as v
import state
###############################################################################
LOG = getLogger("PLEX." + __name__)
OPTIONS = {
'Refresh': lang(30410),
'Delete': lang(30409),
'Addon': lang(30408),
# 'AddFav': lang(30405),
# 'RemoveFav': lang(30406),
# 'RateSong': lang(30407),
'Transcode': lang(30412),
'PMS_Play': lang(30415), # Use PMS to start playback
'Extras': lang(30235)
}
###############################################################################
class ContextMenu(object):
"""
Class initiated if user opens "Plex options" on a PLEX item using the Kodi
context menu
"""
_selected_option = None
def __init__(self, kodi_id=None, kodi_type=None):
"""
Simply instantiate with ContextMenu() - no need to call any methods
"""
self.kodi_id = kodi_id
self.kodi_type = kodi_type
self.plex_id = self._get_plex_id(self.kodi_id, self.kodi_type)
if self.kodi_type:
self.plex_type = v.PLEX_TYPE_FROM_KODI_TYPE[self.kodi_type]
else:
self.plex_type = None
LOG.debug("Found plex_id: %s plex_type: %s",
self.plex_id, self.plex_type)
if not self.plex_id:
return
xml = PF.GetPlexMetadata(self.plex_id)
try:
xml[0].attrib
except (TypeError, IndexError, KeyError):
self.api = None
else:
self.api = API(xml[0])
if self._select_menu():
self._action_menu()
if self._selected_option in (OPTIONS['Delete'],
OPTIONS['Refresh']):
LOG.info("refreshing container")
xbmc.sleep(500)
xbmc.executebuiltin('Container.Refresh')
@staticmethod
def _get_plex_id(kodi_id, kodi_type):
plex_id = xbmc.getInfoLabel('ListItem.Property(plexid)') or None
if not plex_id and kodi_id and kodi_type:
with plexdb.Get_Plex_DB() as plexcursor:
item = plexcursor.getItem_byKodiId(kodi_id, kodi_type)
try:
plex_id = item[0]
except TypeError:
LOG.info('Could not get the Plex id for context menu')
return plex_id
def _select_menu(self):
"""
Display select dialog
"""
options = []
# if user uses direct paths, give option to initiate playback via PMS
if self.api and self.api.extras():
options.append(OPTIONS['Extras'])
if state.DIRECT_PATHS and self.kodi_type in v.KODI_VIDEOTYPES:
options.append(OPTIONS['PMS_Play'])
if self.kodi_type in v.KODI_VIDEOTYPES:
options.append(OPTIONS['Transcode'])
# userdata = self.api.userdata()
# if userdata['Favorite']:
# # Remove from emby favourites
# options.append(OPTIONS['RemoveFav'])
# else:
# # Add to emby favourites
# options.append(OPTIONS['AddFav'])
# if self.kodi_type == "song":
# # Set custom song rating
# options.append(OPTIONS['RateSong'])
# Refresh item
# options.append(OPTIONS['Refresh'])
# Delete item, only if the Plex Home main user is logged in
if (window('plex_restricteduser') != 'true' and
window('plex_allows_mediaDeletion') == 'true'):
options.append(OPTIONS['Delete'])
# Addon settings
options.append(OPTIONS['Addon'])
context_menu = context.ContextMenu(
"script-emby-context.xml",
Addon('plugin.video.plexkodiconnect').getAddonInfo('path'),
"default",
"1080i")
context_menu.set_options(options)
context_menu.doModal()
if context_menu.is_selected():
self._selected_option = context_menu.get_selected()
return self._selected_option
def _action_menu(self):
"""
Do whatever the user selected to do
"""
selected = self._selected_option
if selected == OPTIONS['Transcode']:
state.FORCE_TRANSCODE = True
self._PMS_play()
elif selected == OPTIONS['PMS_Play']:
self._PMS_play()
elif selected == OPTIONS['Extras']:
self._extras()
# elif selected == OPTIONS['Refresh']:
# self.emby.refreshItem(self.item_id)
# elif selected == OPTIONS['AddFav']:
# self.emby.updateUserRating(self.item_id, favourite=True)
# elif selected == OPTIONS['RemoveFav']:
# self.emby.updateUserRating(self.item_id, favourite=False)
# elif selected == OPTIONS['RateSong']:
# self._rate_song()
elif selected == OPTIONS['Addon']:
xbmc.executebuiltin(
'Addon.OpenSettings(plugin.video.plexkodiconnect)')
elif selected == OPTIONS['Delete']:
self._delete_item()
def _delete_item(self):
"""
Delete item on PMS
"""
delete = True
if settings('skipContextMenu') != "true":
if not dialog("yesno", heading="{plex}", line1=lang(33041)):
LOG.info("User skipped deletion for: %s", self.plex_id)
delete = False
if delete:
LOG.info("Deleting Plex item with id %s", self.plex_id)
if PF.delete_item_from_pms(self.plex_id) is False:
dialog("ok", heading="{plex}", line1=lang(30414))
def _PMS_play(self):
"""
For using direct paths: Initiates playback using the PMS
"""
playqueue = PQ.get_playqueue_from_type(
v.KODI_PLAYLIST_TYPE_FROM_KODI_TYPE[self.kodi_type])
playqueue.clear()
state.CONTEXT_MENU_PLAY = True
handle = ('plugin://%s/?plex_id=%s&plex_type=%s&mode=play'
% (v.ADDON_TYPE[self.plex_type],
self.plex_id,
self.plex_type))
xbmc.executebuiltin('RunPlugin(%s)' % handle)
def _extras(self):
"""
Displays a list of elements for all the extras of the Plex element
"""
handle = ('plugin://plugin.video.plexkodiconnect?mode=extras&plex_id=%s'
% self.plex_id)
if xbmcgui.getCurrentWindowId() == 10025:
# Video Window
xbmc.executebuiltin('Container.Update(\"%s\")' % handle)
else:
xbmc.executebuiltin('ActivateWindow(videos, \"%s\")' % handle)