def verify_kodi_defaults(): ''' Make sure we have the kodi default folder in place. ''' node_path = xbmc.translatePath("special://profile/library/video").decode( 'utf-8') if not xbmcvfs.exists(node_path): try: shutil.copytree( src=xbmc.translatePath( "special://xbmc/system/library/video").decode('utf-8'), dst=xbmc.translatePath( "special://profile/library/video").decode('utf-8')) except Exception as error: xbmcvfs.mkdir(node_path) for index, node in enumerate(['movies', 'tvshows', 'musicvideos']): file = os.path.join(node_path, node, "index.xml") if xbmcvfs.exists(file): xml = etree.parse(file).getroot() xml.set('order', str(17 + index)) indent(xml) write_xml(etree.tostring(xml, 'UTF-8'), file) playlist_path = xbmc.translatePath( "special://profile/playlists/video").decode('utf-8') if not xbmcvfs.exists(playlist_path): xbmcvfs.mkdirs(playlist_path)
def add_node(self, index, file, view, node, name): try: xml = etree.parse(file).getroot() except Exception: xml = self.node_root('filter', index) etree.SubElement(xml, 'label') etree.SubElement(xml, 'match') etree.SubElement(xml, 'content') label = xml.find('label') label.text = str(name) if type(name) == int else name content = xml.find('content') content.text = view['Media'] match = xml.find('match') match.text = "all" for rule in xml.findall('.//value'): if rule.text == view['Tag']: break else: rule = etree.SubElement(xml, 'rule', { 'field': "tag", 'operator': "is" }) etree.SubElement(rule, 'value').text = view['Tag'] getattr(self, 'node_' + node)(xml) # get node function based on node type indent(xml) write_xml(etree.tostring(xml, 'UTF-8'), file)
def add_playlist(self, path, view, mixed=False): ''' Create or update the xps file. ''' file = os.path.join(path, "jellyfin%s%s.xsp" % (view['Media'], view['Id'])) try: xml = etree.parse(file).getroot() except Exception: xml = etree.Element('smartplaylist', {'type': view['Media']}) etree.SubElement(xml, 'name') etree.SubElement(xml, 'match') name = xml.find('name') name.text = view['Name'] if not mixed else "%s (%s)" % (view['Name'], view['Media']) match = xml.find('match') match.text = "all" for rule in xml.findall('.//value'): if rule.text == view['Tag']: break else: rule = etree.SubElement(xml, 'rule', { 'field': "tag", 'operator': "is" }) etree.SubElement(rule, 'value').text = view['Tag'] indent(xml) write_xml(etree.tostring(xml, 'UTF-8'), file)
def add_dynamic_node(self, index, file, view, node, name, path): try: xml = etree.parse(file).getroot() except Exception: xml = self.node_root('folder', index) etree.SubElement(xml, 'label') etree.SubElement(xml, 'content') label = xml.find('label') label.text = name getattr(self, 'node_' + node)(xml, path) indent(xml) write_xml(etree.tostring(xml, 'UTF-8'), file)
def add_single_node(self, path, index, item_type, view): file = os.path.join(path, "jellyfin_%s.xml" % view['Tag'].replace(" ", "")) try: xml = etree.parse(file).getroot() except Exception: LOG.warning("Unable to parse file '%s'", file) xml = self.node_root( 'folder' if item_type == 'favorites' and view['Media'] == 'episodes' else 'filter', index) etree.SubElement(xml, 'label') etree.SubElement(xml, 'match') etree.SubElement(xml, 'content') label = xml.find('label') label.text = view['Name'] content = xml.find('content') content.text = view['Media'] match = xml.find('match') match.text = "all" if view['Media'] != 'episodes': for rule in xml.findall('.//value'): if rule.text == view['Tag']: break else: rule = etree.SubElement(xml, 'rule', { 'field': "tag", 'operator': "is" }) etree.SubElement(rule, 'value').text = view['Tag'] if item_type == 'favorites' and view['Media'] == 'episodes': path = self.window_browse(view, 'FavEpisodes') self.node_favepisodes(xml, path) else: self.node_all(xml) indent(xml) write_xml(etree.tostring(xml, 'UTF-8'), file)
def node_index(self, folder, view, mixed=False): file = os.path.join(folder, "index.xml") index = self.sync['SortedViews'].index(view['Id']) try: xml = etree.parse(file).getroot() xml.set('order', str(index)) except Exception: xml = self.node_root('main', index) etree.SubElement(xml, 'label') label = xml.find('label') label.text = view['Name'] if not mixed else "%s (%s)" % ( view['Name'], _(view['Media'])) indent(xml) write_xml(etree.tostring(xml, 'UTF-8'), file)