jellyfin-kodi/jellyfin_kodi/entrypoint/context.py

189 lines
5.9 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import division, absolute_import, print_function, unicode_literals
#################################################################################################
import json
import sys
import xbmc
import xbmcaddon
from .. import database
from ..dialogs import context
from ..helper import translate, settings, dialog, LazyLogger
from ..helper.utils import translate_path
from ..jellyfin import Jellyfin
#################################################################################################
LOG = LazyLogger(__name__)
XML_PATH = (
xbmcaddon.Addon("plugin.video.jellyfin").getAddonInfo("path"),
"default",
"1080i",
)
OPTIONS = {
"Refresh": translate(30410),
"Delete": translate(30409),
"Addon": translate(30408),
"AddFav": translate(30405),
"RemoveFav": translate(30406),
"Transcode": translate(30412),
}
#################################################################################################
class Context(object):
_selected_option = None
def __init__(self, transcode=False, delete=False):
try:
self.kodi_id = sys.listitem.getVideoInfoTag().getDbId() or None
self.media = self.get_media_type()
self.server_id = sys.listitem.getProperty("jellyfinserver") or None
self.api_client = Jellyfin(self.server_id).get_client().jellyfin
item_id = sys.listitem.getProperty("jellyfinid")
except AttributeError:
self.server_id = None
if xbmc.getInfoLabel("ListItem.Property(jellyfinid)"):
item_id = xbmc.getInfoLabel("ListItem.Property(jellyfinid)")
else:
self.kodi_id = xbmc.getInfoLabel("ListItem.DBID")
self.media = xbmc.getInfoLabel("ListItem.DBTYPE")
item_id = None
addon_data = translate_path(
"special://profile/addon_data/plugin.video.jellyfin/data.json"
)
with open(addon_data, "rb") as infile:
data = json.load(infile)
try:
server_data = data["Servers"][0]
self.api_client.config.data["auth.server"] = server_data.get("address")
self.api_client.config.data["auth.server-name"] = server_data.get("Name")
self.api_client.config.data["auth.user_id"] = server_data.get("UserId")
self.api_client.config.data["auth.token"] = server_data.get("AccessToken")
except Exception as e:
LOG.warning("Addon appears to not be configured yet: {}".format(e))
if self.server_id or item_id:
self.item = self.api_client.get_item(item_id)
else:
self.item = self.get_item_id()
if self.item:
if transcode:
self.transcode()
elif delete:
self.delete_item()
elif self.select_menu():
self.action_menu()
if self._selected_option in (
OPTIONS["Delete"],
OPTIONS["AddFav"],
OPTIONS["RemoveFav"],
):
xbmc.sleep(500)
xbmc.executebuiltin("Container.Refresh")
def get_media_type(self):
"""Get media type based on sys.listitem. If unfilled, base on visible window."""
media = sys.listitem.getVideoInfoTag().getMediaType()
if not media:
if xbmc.getCondVisibility("Container.Content(albums)"):
media = "album"
elif xbmc.getCondVisibility("Container.Content(artists)"):
media = "artist"
elif xbmc.getCondVisibility("Container.Content(songs)"):
media = "song"
elif xbmc.getCondVisibility("Container.Content(pictures)"):
media = "picture"
else:
LOG.info("media is unknown")
return media
def get_item_id(self):
"""Get synced item from jellyfindb."""
item = database.get_item(self.kodi_id, self.media)
if not item:
return
return {
"Id": item[0],
"UserData": json.loads(item[4]) if item[4] else {},
"Type": item[3],
}
def select_menu(self):
"""Display the select dialog.
Favorites, Refresh, Delete (opt), Settings.
"""
options = []
if self.item["Type"] != "Season":
if self.item["UserData"].get("IsFavorite"):
options.append(OPTIONS["RemoveFav"])
else:
options.append(OPTIONS["AddFav"])
options.append(OPTIONS["Refresh"])
if settings("enableContextDelete.bool"):
options.append(OPTIONS["Delete"])
options.append(OPTIONS["Addon"])
context_menu = context.ContextMenu("script-jellyfin-context.xml", *XML_PATH)
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):
selected = self._selected_option
if selected == OPTIONS["Refresh"]:
self.api_client.refresh_item(self.item["Id"])
elif selected == OPTIONS["AddFav"]:
self.api_client.favorite(self.item["Id"], True)
elif selected == OPTIONS["RemoveFav"]:
self.api_client.favorite(self.item["Id"], False)
elif selected == OPTIONS["Addon"]:
xbmc.executebuiltin("Addon.OpenSettings(plugin.video.jellyfin)")
elif selected == OPTIONS["Delete"]:
self.delete_item()
def delete_item(self):
if settings("skipContextMenu.bool") or dialog(
"yesno", "{jellyfin}", translate(33015)
):
self.api_client.delete_item(self.item["Id"])
def transcode(self):
filename = xbmc.getInfoLabel("ListItem.Filenameandpath")
filename += "&transcode=true"
xbmc.executebuiltin("PlayMedia(%s)" % filename)