2017-05-07 01:04:09 +10:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from logging import getLogger
|
|
|
|
from re import compile as re_compile
|
|
|
|
import xml.etree.ElementTree as etree
|
|
|
|
|
|
|
|
from utils import advancedsettings_xml, indent, tryEncode
|
|
|
|
from PlexFunctions import get_plex_sections
|
|
|
|
from PlexAPI import API
|
|
|
|
import variables as v
|
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
log = getLogger("PLEX."+__name__)
|
|
|
|
|
|
|
|
REGEX_MUSICPATH = re_compile(r'''^\^(.+)\$$''')
|
|
|
|
###############################################################################
|
|
|
|
|
|
|
|
|
|
|
|
def get_current_music_folders():
|
|
|
|
"""
|
|
|
|
Returns a list of encoded strings as paths to the currently "blacklisted"
|
|
|
|
excludefromscan music folders in the advancedsettings.xml
|
|
|
|
"""
|
|
|
|
paths = []
|
|
|
|
root, _ = advancedsettings_xml(['audio', 'excludefromscan'])
|
|
|
|
if root is None:
|
|
|
|
return paths
|
|
|
|
|
|
|
|
for element in root:
|
|
|
|
try:
|
|
|
|
path = REGEX_MUSICPATH.findall(element.text)[0]
|
|
|
|
except IndexError:
|
|
|
|
log.error('Could not parse %s of xml element %s'
|
|
|
|
% (element.text, element.tag))
|
|
|
|
continue
|
|
|
|
else:
|
|
|
|
paths.append(path)
|
|
|
|
return paths
|
|
|
|
|
|
|
|
|
|
|
|
def set_excludefromscan_music_folders():
|
|
|
|
"""
|
|
|
|
Gets a complete list of paths for music libraries from the PMS. Sets them
|
|
|
|
to be excluded in the advancedsettings.xml from being scanned by Kodi.
|
|
|
|
Existing keys will be replaced
|
|
|
|
|
|
|
|
Returns False if no new Plex libraries needed to be exluded, True otherwise
|
|
|
|
"""
|
|
|
|
changed = False
|
|
|
|
write_xml = False
|
|
|
|
xml = get_plex_sections()
|
|
|
|
try:
|
|
|
|
xml[0].attrib
|
|
|
|
except (TypeError, IndexError, AttributeError):
|
|
|
|
log.error('Could not get Plex sections')
|
|
|
|
return
|
|
|
|
# Build paths
|
|
|
|
paths = []
|
|
|
|
api = API(item=None)
|
|
|
|
for library in xml:
|
|
|
|
if library.attrib['type'] != v.PLEX_TYPE_ARTIST:
|
|
|
|
# Only look at music libraries
|
|
|
|
continue
|
|
|
|
for location in library:
|
|
|
|
if location.tag == 'Location':
|
|
|
|
path = api.validatePlayurl(location.attrib['path'],
|
|
|
|
typus=v.PLEX_TYPE_ARTIST,
|
2017-05-07 01:22:29 +10:00
|
|
|
omitCheck=True)
|
2017-05-07 01:04:09 +10:00
|
|
|
path = tryEncode(path)
|
|
|
|
paths.append(__turn_to_regex(path))
|
|
|
|
# Get existing advancedsettings
|
|
|
|
root, tree = advancedsettings_xml(['audio', 'excludefromscan'],
|
|
|
|
force_create=True)
|
|
|
|
|
|
|
|
for path in paths:
|
|
|
|
for element in root:
|
|
|
|
if element.text == path:
|
|
|
|
# Path already excluded
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
changed = True
|
|
|
|
write_xml = True
|
|
|
|
log.info('New Plex music library detected: %s' % path)
|
|
|
|
element = etree.Element(tag='regexp')
|
|
|
|
element.text = path
|
|
|
|
root.append(element)
|
|
|
|
|
|
|
|
# Delete obsolete entries (unlike above, we don't change 'changed' to not
|
|
|
|
# enforce a restart)
|
|
|
|
for element in root:
|
|
|
|
for path in paths:
|
|
|
|
if element.text == path:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
log.info('Deleting Plex music library from advancedsettings: %s'
|
|
|
|
% element.text)
|
|
|
|
root.remove(element)
|
|
|
|
write_xml = True
|
|
|
|
|
|
|
|
if write_xml is True:
|
|
|
|
indent(tree.getroot())
|
|
|
|
tree.write('%sadvancedsettings.xml' % v.KODI_PROFILE)
|
|
|
|
return changed
|
|
|
|
|
|
|
|
|
|
|
|
def __turn_to_regex(path):
|
|
|
|
"""
|
|
|
|
Turns a path into regex expression to be fed to Kodi's advancedsettings.xml
|
|
|
|
"""
|
|
|
|
# Make sure we have a slash or backslash at the end of the path
|
|
|
|
if '/' in path:
|
|
|
|
if not path.endswith('/'):
|
|
|
|
path = '%s/' % path
|
|
|
|
else:
|
|
|
|
if not path.endswith('\\'):
|
|
|
|
path = '%s\\' % path
|
|
|
|
# Need to escape backslashes
|
|
|
|
path = path.replace('\\', '\\\\')
|
|
|
|
# Beginning of path only needs to be similar
|
|
|
|
return '^%s' % path
|