# -*- 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 true 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)