script.module.iptvlib/lib/skinutils/includes.py

91 lines
2.5 KiB
Python

"""
Created on 09/08/2011
@author: mikel
"""
import os
import xml.etree.ElementTree as ET
import xbmc
from . import SkinUtilsError, check_skin_writability, case_file_exists, DocumentCache, get_logger
class IncludeXmlError(SkinUtilsError):
pass
class IncludeManager:
__installed_names = None
__doc_cache = None
def _list_skin_include_files(self):
include_list = []
skin_path = xbmc.translatePath("special://skin/")
# Go into each dir. Could be 720, 1080...
for dir_item in os.listdir(skin_path):
dir_path = os.path.join(skin_path, dir_item)
if os.path.isdir(dir_path):
file = os.path.join(dir_path, "includes.xml")
if case_file_exists(file):
include_list.append(file)
file = os.path.join(dir_path, "Includes.xml")
if case_file_exists(file):
include_list.append(file)
return include_list
def __init__(self):
self.__installed_names = []
self.__doc_cache = DocumentCache()
# Check if the environment is sane
check_skin_writability()
# Initialize the doc cache with found files
for file in self._list_skin_include_files():
self.__doc_cache.add(file)
def is_name_installed(self, name):
return name in self.__installed_names
def add_include(self, name, node):
for file in self.__doc_cache.list_files():
doc = self.__doc_cache.read(file)
doc.getroot().append(node)
self.__installed_names.append(name)
def install_file(self, file, commit=True, clear=True):
get_logger().info('install include: %s' % file)
tree = ET.parse(file)
# Handle all includes
for item in tree.getroot().findall("include"):
name = item.get("name")
if name is None:
get_logger().warning('Only named includes are supported.')
elif self.is_name_installed(name):
get_logger().warning('Include name "%s" already installed' % name)
else:
self.add_include(name, item)
# If a save was requested
if commit:
self.__doc_cache.write_all()
# If we where requested to clear the cached docs
if clear:
self.__doc_cache.clear_all()
def remove_installed_names(self):
self.__doc_cache.rollback_all()
def cleanup(self):
self.remove_installed_names()
def __del__(self):
self.cleanup()