jellyfin-kodi/jellyfin_kodi/helper/xmls.py

136 lines
4.3 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import division, absolute_import, print_function, unicode_literals
#################################################################################################
import os
import xml.etree.ElementTree as etree
from kodi_six import xbmc, xbmcvfs
from .utils import translate_path
from . import translate, dialog, settings, LazyLogger
#################################################################################################
LOG = LazyLogger(__name__)
#################################################################################################
def tvtunes_nfo(path, urls):
''' Create tvtunes.nfo
'''
try:
xml = etree.parse(path).getroot()
except Exception:
xml = etree.Element('tvtunes')
for elem in xml.getiterator('tvtunes'):
for file in list(elem):
elem.remove(file)
for url in urls:
etree.SubElement(xml, 'file').text = url
tree = etree.ElementTree(xml)
tree.write(path)
def advanced_settings():
''' Track the existence of <cleanonupdate>true</cleanonupdate>
It is incompatible with plugin paths.
'''
if settings('useDirectPaths') != "0":
return
path = translate_path("special://profile/")
file = os.path.join(path, 'advancedsettings.xml')
try:
xml = etree.parse(file).getroot()
except Exception:
return
video = xml.find('videolibrary')
if video is not None:
cleanonupdate = video.find('cleanonupdate')
if cleanonupdate is not None and cleanonupdate.text == "true":
LOG.warning("cleanonupdate disabled")
video.remove(cleanonupdate)
tree = etree.ElementTree(xml)
tree.write(file)
dialog("ok", "{jellyfin}", translate(33097))
xbmc.executebuiltin('RestartApp')
return True
def verify_kodi_defaults():
''' Make sure we have the kodi default folder in place.
'''
source_base_path = translate_path("special://xbmc/system/library/video")
dest_base_path = translate_path("special://profile/library/video")
if not os.path.exists(source_base_path):
LOG.error("XMLs source path `%s` not found.", source_base_path)
return
# Make sure the files exist in the local profile.
for source_path, dirs, files in os.walk(source_base_path):
relative_path = os.path.relpath(source_path, source_base_path)
dest_path = os.path.join(dest_base_path, relative_path)
if not os.path.exists(dest_path):
os.mkdir(os.path.normpath(dest_path))
for file_name in files:
dest_file = os.path.join(dest_path, file_name)
copy = False
if not os.path.exists(dest_file):
copy = True
elif os.path.splitext(file_name)[1].lower() == '.xml':
try:
etree.parse(dest_file)
except etree.ParseError:
LOG.warning("Unable to parse `{}`, recovering from default.".format(dest_file))
copy = True
if copy:
source_file = os.path.join(source_path, file_name)
LOG.debug("Copying `{}` -> `{}`".format(source_file, dest_file))
xbmcvfs.copy(source_file, dest_file)
# This code seems to enforce a fixed ordering.
# Is it really desirable to force this on users?
# The default (system wide) order is [10, 20, 30] in Kodi 19.
for index, node in enumerate(['movies', 'tvshows', 'musicvideos']):
file_name = os.path.join(dest_base_path, node, "index.xml")
if xbmcvfs.exists(file_name):
try:
with xbmcvfs.File(file_name) as f:
b = f.read()
tree = etree.ElementTree(etree.fromstring(b))
except etree.ParseError:
LOG.error("Unable to parse `{}`".format(file_name))
LOG.exception("We ensured the file was OK above, something is wrong!")
tree = None
if tree is not None:
tree.getroot().set('order', str(17 + index))
with xbmcvfs.File(file_name, 'w') as f:
f.write(etree.tostring(tree.getroot()))
playlist_path = translate_path("special://profile/playlists/video")
if not xbmcvfs.exists(playlist_path):
xbmcvfs.mkdirs(playlist_path)