mirror of
https://github.com/jellyfin/jellyfin-kodi.git
synced 2024-12-26 02:36:10 +00:00
Merge pull request #938 from mcarlton00/client-side-native-mode
Reimplement native mode to function client side
This commit is contained in:
commit
36b0afb64a
6 changed files with 112 additions and 1 deletions
|
@ -4,3 +4,5 @@
|
||||||
be8333a80c2650c75444281a9b720da438b2b6d0
|
be8333a80c2650c75444281a9b720da438b2b6d0
|
||||||
# Change indentation of XML and JSON files
|
# Change indentation of XML and JSON files
|
||||||
7c0e986bd283c764cc16f0c756a03a04e4073ad0
|
7c0e986bd283c764cc16f0c756a03a04e4073ad0
|
||||||
|
# Tool: black
|
||||||
|
df4994bef23a1f7175d47ff4632084e153d6077f
|
||||||
|
|
|
@ -27,7 +27,12 @@ from ..helper import (
|
||||||
JSONRPC,
|
JSONRPC,
|
||||||
LazyLogger,
|
LazyLogger,
|
||||||
)
|
)
|
||||||
from ..helper.utils import JsonDebugPrinter, translate_path, kodi_version
|
from ..helper.utils import (
|
||||||
|
JsonDebugPrinter,
|
||||||
|
translate_path,
|
||||||
|
kodi_version,
|
||||||
|
path_replacements,
|
||||||
|
)
|
||||||
from ..jellyfin import Jellyfin
|
from ..jellyfin import Jellyfin
|
||||||
|
|
||||||
#################################################################################################
|
#################################################################################################
|
||||||
|
@ -167,6 +172,8 @@ class Events(object):
|
||||||
get_themes(api_client)
|
get_themes(api_client)
|
||||||
elif mode == "managelibs":
|
elif mode == "managelibs":
|
||||||
manage_libraries()
|
manage_libraries()
|
||||||
|
elif mode == "managepaths":
|
||||||
|
path_replacements()
|
||||||
elif mode == "backup":
|
elif mode == "backup":
|
||||||
backup()
|
backup()
|
||||||
elif mode == "restartservice":
|
elif mode == "restartservice":
|
||||||
|
@ -278,6 +285,9 @@ def listing():
|
||||||
)
|
)
|
||||||
|
|
||||||
directory(translate(33194), "plugin://plugin.video.jellyfin/?mode=managelibs", True)
|
directory(translate(33194), "plugin://plugin.video.jellyfin/?mode=managelibs", True)
|
||||||
|
directory(
|
||||||
|
translate(33203), "plugin://plugin.video.jellyfin/?mode=managepaths", True
|
||||||
|
)
|
||||||
directory(translate(33134), "plugin://plugin.video.jellyfin/?mode=addserver", False)
|
directory(translate(33134), "plugin://plugin.video.jellyfin/?mode=addserver", False)
|
||||||
directory(translate(33054), "plugin://plugin.video.jellyfin/?mode=adduser", False)
|
directory(translate(33054), "plugin://plugin.video.jellyfin/?mode=adduser", False)
|
||||||
directory(translate(5), "plugin://plugin.video.jellyfin/?mode=settings", False)
|
directory(translate(5), "plugin://plugin.video.jellyfin/?mode=settings", False)
|
||||||
|
|
|
@ -4,6 +4,8 @@ from __future__ import division, absolute_import, print_function, unicode_litera
|
||||||
##################################################################################################
|
##################################################################################################
|
||||||
|
|
||||||
from . import settings, LazyLogger
|
from . import settings, LazyLogger
|
||||||
|
from .utils import translate_path
|
||||||
|
import json
|
||||||
|
|
||||||
##################################################################################################
|
##################################################################################################
|
||||||
|
|
||||||
|
@ -20,6 +22,16 @@ class API(object):
|
||||||
self.item = item
|
self.item = item
|
||||||
self.server = server
|
self.server = server
|
||||||
|
|
||||||
|
addon_data = translate_path(
|
||||||
|
"special://profile/addon_data/plugin.video.jellyfin/data.json"
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
with open(addon_data, "rb") as infile:
|
||||||
|
data = json.load(infile)
|
||||||
|
self.path_data = data["Servers"][0].get("paths", {})
|
||||||
|
except Exception as e:
|
||||||
|
LOG.warning("Addon appears to not be configured yet: {}".format(e))
|
||||||
|
|
||||||
def get_playcount(self, played, playcount):
|
def get_playcount(self, played, playcount):
|
||||||
"""Convert Jellyfin played/playcount into
|
"""Convert Jellyfin played/playcount into
|
||||||
the Kodi equivalent. The playcount is tied to the watch status.
|
the Kodi equivalent. The playcount is tied to the watch status.
|
||||||
|
@ -229,6 +241,11 @@ class API(object):
|
||||||
protocol = path.split("://")[0]
|
protocol = path.split("://")[0]
|
||||||
path = path.replace(protocol, protocol.lower())
|
path = path.replace(protocol, protocol.lower())
|
||||||
|
|
||||||
|
# Loop through configured path replacements searching for a match
|
||||||
|
for local_path in self.path_data.keys():
|
||||||
|
if local_path in path:
|
||||||
|
path = path.replace(local_path, self.path_data[local_path])
|
||||||
|
|
||||||
return path
|
return path
|
||||||
|
|
||||||
def get_user_artwork(self, user_id):
|
def get_user_artwork(self, user_id):
|
||||||
|
|
|
@ -482,10 +482,52 @@ def set_addon_mode():
|
||||||
|
|
||||||
if value:
|
if value:
|
||||||
dialog("ok", "{jellyfin}", translate(33145))
|
dialog("ok", "{jellyfin}", translate(33145))
|
||||||
|
path_replacements()
|
||||||
|
|
||||||
LOG.info("Add-on playback: %s", settings("useDirectPaths") == "0")
|
LOG.info("Add-on playback: %s", settings("useDirectPaths") == "0")
|
||||||
|
|
||||||
|
|
||||||
|
def path_replacements():
|
||||||
|
# UI to display and manage path replacements for native mode
|
||||||
|
from ..database import get_credentials, save_credentials
|
||||||
|
|
||||||
|
# Retrieve existing stored paths
|
||||||
|
credentials = get_credentials()
|
||||||
|
if credentials["Servers"]:
|
||||||
|
paths = credentials["Servers"][0].get("paths", {})
|
||||||
|
else:
|
||||||
|
paths = {}
|
||||||
|
selected_path = 1
|
||||||
|
|
||||||
|
# 0 is Finish, -1 is Cancel
|
||||||
|
while selected_path not in [0, -1]:
|
||||||
|
replace_paths = [f"{x} : {paths[x]}" for x in paths.keys()]
|
||||||
|
# Insert a "Finish" entry first, and an "Add" entry second
|
||||||
|
replace_paths.insert(0, translate(33204))
|
||||||
|
replace_paths.insert(1, translate(33205))
|
||||||
|
selected_path = dialog("select", translate(33203), replace_paths)
|
||||||
|
if selected_path == 1:
|
||||||
|
# Add a new path replacement
|
||||||
|
remote_path = dialog("input", translate(33206))
|
||||||
|
local_path = dialog("input", translate(33207))
|
||||||
|
if remote_path and local_path:
|
||||||
|
paths[remote_path] = local_path
|
||||||
|
elif selected_path > 1:
|
||||||
|
# Edit an existing path replacement
|
||||||
|
edit_remote_path = list(paths.keys())[selected_path - 2]
|
||||||
|
edit_local_path = paths[edit_remote_path]
|
||||||
|
# Deleting the existing path
|
||||||
|
del paths[edit_remote_path]
|
||||||
|
# Prepopulate the text box with the existing value
|
||||||
|
remote_path = dialog("input", translate(33206), defaultt=edit_remote_path)
|
||||||
|
local_path = dialog("input", translate(33207), defaultt=edit_local_path)
|
||||||
|
if remote_path and local_path:
|
||||||
|
paths[remote_path] = local_path
|
||||||
|
|
||||||
|
credentials["Servers"][0]["paths"] = paths
|
||||||
|
save_credentials(credentials)
|
||||||
|
|
||||||
|
|
||||||
class JsonDebugPrinter(object):
|
class JsonDebugPrinter(object):
|
||||||
"""Helper class to defer converting data to JSON until it is needed.
|
"""Helper class to defer converting data to JSON until it is needed.
|
||||||
See: https://github.com/jellyfin/jellyfin-kodi/pull/193
|
See: https://github.com/jellyfin/jellyfin-kodi/pull/193
|
||||||
|
|
|
@ -996,3 +996,23 @@ msgstr "Max artwork resolution"
|
||||||
msgctxt "#33202"
|
msgctxt "#33202"
|
||||||
msgid "Transcode H265/HEVC RExt"
|
msgid "Transcode H265/HEVC RExt"
|
||||||
msgstr "Transcode H265/HEVC RExt"
|
msgstr "Transcode H265/HEVC RExt"
|
||||||
|
|
||||||
|
msgctxt "#33203"
|
||||||
|
msgid "Manage path replacements"
|
||||||
|
msgstr "Manage path replacements"
|
||||||
|
|
||||||
|
msgctxt "#33204"
|
||||||
|
msgid "Finish"
|
||||||
|
msgstr "Finish"
|
||||||
|
|
||||||
|
msgctxt "#33205"
|
||||||
|
msgid "New Path Replacement"
|
||||||
|
msgstr "New Path Replacement"
|
||||||
|
|
||||||
|
msgctxt "#33206"
|
||||||
|
msgid "Remote Path"
|
||||||
|
msgstr "Remote Path"
|
||||||
|
|
||||||
|
msgctxt "#33207"
|
||||||
|
msgid "Local Path"
|
||||||
|
msgstr "Local Path"
|
||||||
|
|
|
@ -1004,3 +1004,23 @@ msgstr "Max stream bitrate"
|
||||||
msgctxt "#33202"
|
msgctxt "#33202"
|
||||||
msgid "Transcode H265/HEVC RExt"
|
msgid "Transcode H265/HEVC RExt"
|
||||||
msgstr "Transcode H265/HEVC RExt"
|
msgstr "Transcode H265/HEVC RExt"
|
||||||
|
|
||||||
|
msgctxt "#33203"
|
||||||
|
msgid "Manage path replacements"
|
||||||
|
msgstr "Manage path replacements"
|
||||||
|
|
||||||
|
msgctxt "#33204"
|
||||||
|
msgid "Finish"
|
||||||
|
msgstr "Finish"
|
||||||
|
|
||||||
|
msgctxt "#33205"
|
||||||
|
msgid "New Path Replacement"
|
||||||
|
msgstr "New Path Replacement"
|
||||||
|
|
||||||
|
msgctxt "#33206"
|
||||||
|
msgid "Remote Path"
|
||||||
|
msgstr "Remote Path"
|
||||||
|
|
||||||
|
msgctxt "#33207"
|
||||||
|
msgid "Local Path"
|
||||||
|
msgstr "Local Path"
|
||||||
|
|
Loading…
Reference in a new issue