2016-10-23 02:15:10 +11:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
###############################################################################
|
2018-02-03 22:45:48 +11:00
|
|
|
from logging import getLogger
|
2016-10-23 02:15:10 +11:00
|
|
|
|
2018-02-03 22:45:48 +11:00
|
|
|
from xbmcaddon import Addon
|
2018-05-05 03:03:27 +10:00
|
|
|
import xbmc
|
|
|
|
import xbmcplugin
|
|
|
|
import xbmcgui
|
2016-10-23 02:15:10 +11:00
|
|
|
|
2017-01-05 06:57:16 +11:00
|
|
|
import plexdb_functions as plexdb
|
2018-02-03 22:45:48 +11:00
|
|
|
from utils import window, settings, dialog, language as lang
|
2016-10-23 02:15:10 +11:00
|
|
|
from dialogs import context
|
2018-05-05 03:03:27 +10:00
|
|
|
import PlexFunctions as PF
|
|
|
|
from PlexAPI import API
|
2018-02-05 03:36:18 +11:00
|
|
|
import playqueue as PQ
|
2017-01-25 02:04:42 +11:00
|
|
|
import variables as v
|
2018-02-03 22:45:48 +11:00
|
|
|
import state
|
2016-10-23 02:15:10 +11:00
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
|
2018-02-03 22:45:48 +11:00
|
|
|
LOG = getLogger("PLEX." + __name__)
|
2016-10-23 02:15:10 +11:00
|
|
|
|
|
|
|
OPTIONS = {
|
|
|
|
'Refresh': lang(30410),
|
|
|
|
'Delete': lang(30409),
|
|
|
|
'Addon': lang(30408),
|
|
|
|
# 'AddFav': lang(30405),
|
|
|
|
# 'RemoveFav': lang(30406),
|
|
|
|
# 'RateSong': lang(30407),
|
2016-11-06 22:15:41 +11:00
|
|
|
'Transcode': lang(30412),
|
2018-05-05 03:03:27 +10:00
|
|
|
'PMS_Play': lang(30415), # Use PMS to start playback
|
|
|
|
'Extras': lang(30235)
|
2016-10-23 02:15:10 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
|
|
|
|
|
|
|
|
class ContextMenu(object):
|
2018-02-03 22:45:48 +11:00
|
|
|
"""
|
|
|
|
Class initiated if user opens "Plex options" on a PLEX item using the Kodi
|
|
|
|
context menu
|
|
|
|
"""
|
2016-10-23 02:15:10 +11:00
|
|
|
_selected_option = None
|
|
|
|
|
2018-02-16 05:47:01 +11:00
|
|
|
def __init__(self, kodi_id=None, kodi_type=None):
|
2018-02-03 22:45:48 +11:00
|
|
|
"""
|
|
|
|
Simply instantiate with ContextMenu() - no need to call any methods
|
|
|
|
"""
|
2018-02-16 05:47:01 +11:00
|
|
|
self.kodi_id = kodi_id
|
|
|
|
self.kodi_type = kodi_type
|
2018-02-03 22:45:48 +11:00
|
|
|
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:
|
2016-10-23 02:15:10 +11:00
|
|
|
return
|
2018-05-05 03:03:27 +10:00
|
|
|
xml = PF.GetPlexMetadata(self.plex_id)
|
|
|
|
try:
|
|
|
|
xml[0].attrib
|
|
|
|
except (TypeError, IndexError, KeyError):
|
|
|
|
self.api = None
|
|
|
|
else:
|
|
|
|
self.api = API(xml[0])
|
2016-10-23 02:15:10 +11:00
|
|
|
if self._select_menu():
|
|
|
|
self._action_menu()
|
|
|
|
if self._selected_option in (OPTIONS['Delete'],
|
|
|
|
OPTIONS['Refresh']):
|
2018-02-01 23:55:40 +11:00
|
|
|
LOG.info("refreshing container")
|
2018-05-05 03:03:27 +10:00
|
|
|
xbmc.sleep(500)
|
|
|
|
xbmc.executebuiltin('Container.Refresh')
|
2018-02-03 22:45:48 +11:00
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def _get_plex_id(kodi_id, kodi_type):
|
2018-05-05 03:03:27 +10:00
|
|
|
plex_id = xbmc.getInfoLabel('ListItem.Property(plexid)') or None
|
2018-02-03 22:45:48 +11:00
|
|
|
if not plex_id and kodi_id and kodi_type:
|
2017-01-05 06:57:16 +11:00
|
|
|
with plexdb.Get_Plex_DB() as plexcursor:
|
2018-02-03 22:45:48 +11:00
|
|
|
item = plexcursor.getItem_byKodiId(kodi_id, kodi_type)
|
2016-10-23 02:15:10 +11:00
|
|
|
try:
|
2018-02-03 22:45:48 +11:00
|
|
|
plex_id = item[0]
|
2016-10-23 02:15:10 +11:00
|
|
|
except TypeError:
|
2018-02-03 22:45:48 +11:00
|
|
|
LOG.info('Could not get the Plex id for context menu')
|
|
|
|
return plex_id
|
2016-10-23 02:15:10 +11:00
|
|
|
|
|
|
|
def _select_menu(self):
|
2018-02-03 22:45:48 +11:00
|
|
|
"""
|
|
|
|
Display select dialog
|
|
|
|
"""
|
2016-10-23 02:15:10 +11:00
|
|
|
options = []
|
2016-11-06 22:15:41 +11:00
|
|
|
# if user uses direct paths, give option to initiate playback via PMS
|
2018-05-05 03:03:27 +10:00
|
|
|
if self.api and self.api.extras():
|
|
|
|
options.append(OPTIONS['Extras'])
|
2018-02-03 22:45:48 +11:00
|
|
|
if state.DIRECT_PATHS and self.kodi_type in v.KODI_VIDEOTYPES:
|
2016-11-06 22:15:41 +11:00
|
|
|
options.append(OPTIONS['PMS_Play'])
|
2018-02-03 22:45:48 +11:00
|
|
|
if self.kodi_type in v.KODI_VIDEOTYPES:
|
2016-11-07 01:37:22 +11:00
|
|
|
options.append(OPTIONS['Transcode'])
|
2018-02-12 00:42:49 +11:00
|
|
|
# userdata = self.api.userdata()
|
2016-10-23 02:15:10 +11:00
|
|
|
# if userdata['Favorite']:
|
|
|
|
# # Remove from emby favourites
|
|
|
|
# options.append(OPTIONS['RemoveFav'])
|
|
|
|
# else:
|
|
|
|
# # Add to emby favourites
|
|
|
|
# options.append(OPTIONS['AddFav'])
|
2018-02-03 22:45:48 +11:00
|
|
|
# if self.kodi_type == "song":
|
2016-10-23 02:15:10 +11:00
|
|
|
# # Set custom song rating
|
|
|
|
# options.append(OPTIONS['RateSong'])
|
|
|
|
# Refresh item
|
2016-10-27 06:11:19 +11:00
|
|
|
# options.append(OPTIONS['Refresh'])
|
2016-10-23 02:15:10 +11:00
|
|
|
# Delete item, only if the Plex Home main user is logged in
|
2016-10-24 04:38:21 +11:00
|
|
|
if (window('plex_restricteduser') != 'true' and
|
|
|
|
window('plex_allows_mediaDeletion') == 'true'):
|
2016-10-23 02:15:10 +11:00
|
|
|
options.append(OPTIONS['Delete'])
|
|
|
|
# Addon settings
|
|
|
|
options.append(OPTIONS['Addon'])
|
2016-11-06 22:15:41 +11:00
|
|
|
context_menu = context.ContextMenu(
|
|
|
|
"script-emby-context.xml",
|
2018-02-03 22:45:48 +11:00
|
|
|
Addon('plugin.video.plexkodiconnect').getAddonInfo('path'),
|
|
|
|
"default",
|
|
|
|
"1080i")
|
2016-10-23 02:15:10 +11:00
|
|
|
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):
|
2018-02-03 22:45:48 +11:00
|
|
|
"""
|
|
|
|
Do whatever the user selected to do
|
|
|
|
"""
|
2016-10-23 02:15:10 +11:00
|
|
|
selected = self._selected_option
|
|
|
|
if selected == OPTIONS['Transcode']:
|
2018-02-03 22:45:48 +11:00
|
|
|
state.FORCE_TRANSCODE = True
|
2016-11-07 01:37:22 +11:00
|
|
|
self._PMS_play()
|
2016-11-06 22:15:41 +11:00
|
|
|
elif selected == OPTIONS['PMS_Play']:
|
|
|
|
self._PMS_play()
|
2018-05-05 03:03:27 +10:00
|
|
|
elif selected == OPTIONS['Extras']:
|
|
|
|
self._extras()
|
2017-01-05 06:57:16 +11:00
|
|
|
# elif selected == OPTIONS['Refresh']:
|
|
|
|
# self.emby.refreshItem(self.item_id)
|
2016-10-23 02:15:10 +11:00
|
|
|
# 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']:
|
2018-05-05 03:03:27 +10:00
|
|
|
xbmc.executebuiltin(
|
|
|
|
'Addon.OpenSettings(plugin.video.plexkodiconnect)')
|
2016-10-23 02:15:10 +11:00
|
|
|
elif selected == OPTIONS['Delete']:
|
|
|
|
self._delete_item()
|
|
|
|
|
|
|
|
def _delete_item(self):
|
2018-02-03 22:45:48 +11:00
|
|
|
"""
|
|
|
|
Delete item on PMS
|
|
|
|
"""
|
2016-10-23 02:15:10 +11:00
|
|
|
delete = True
|
|
|
|
if settings('skipContextMenu') != "true":
|
2018-02-03 22:45:48 +11:00
|
|
|
if not dialog("yesno", heading="{plex}", line1=lang(33041)):
|
|
|
|
LOG.info("User skipped deletion for: %s", self.plex_id)
|
2016-10-23 02:15:10 +11:00
|
|
|
delete = False
|
|
|
|
if delete:
|
2018-02-03 22:45:48 +11:00
|
|
|
LOG.info("Deleting Plex item with id %s", self.plex_id)
|
2018-05-05 03:03:27 +10:00
|
|
|
if PF.delete_item_from_pms(self.plex_id) is False:
|
2017-01-25 02:04:42 +11:00
|
|
|
dialog("ok", heading="{plex}", line1=lang(30414))
|
2016-11-06 22:15:41 +11:00
|
|
|
|
|
|
|
def _PMS_play(self):
|
|
|
|
"""
|
|
|
|
For using direct paths: Initiates playback using the PMS
|
|
|
|
"""
|
2018-02-05 03:36:18 +11:00
|
|
|
playqueue = PQ.get_playqueue_from_type(
|
|
|
|
v.KODI_PLAYLIST_TYPE_FROM_KODI_TYPE[self.kodi_type])
|
|
|
|
playqueue.clear()
|
2018-02-03 22:45:48 +11:00
|
|
|
state.CONTEXT_MENU_PLAY = True
|
2018-03-07 18:40:18 +11:00
|
|
|
handle = ('plugin://%s/?plex_id=%s&plex_type=%s&mode=play'
|
|
|
|
% (v.ADDON_TYPE[self.plex_type],
|
|
|
|
self.plex_id,
|
|
|
|
self.plex_type))
|
2018-05-05 03:03:27 +10:00
|
|
|
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)
|