Merge pull request #990 from croneter/fix-escape
Correctly escape URLs for Direct Paths
This commit is contained in:
commit
a8ee68ca4c
3 changed files with 21 additions and 9 deletions
|
@ -332,13 +332,7 @@ class Media(object):
|
||||||
if path.startswith('\\\\'):
|
if path.startswith('\\\\'):
|
||||||
path = 'smb:' + path.replace('\\', '/')
|
path = 'smb:' + path.replace('\\', '/')
|
||||||
if app.SYNC.escape_path:
|
if app.SYNC.escape_path:
|
||||||
try:
|
path = utils.escape_path(path)
|
||||||
protocol, hostname, args = path.split(':', 2)
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
args = utils.quote(args)
|
|
||||||
path = '%s:%s:%s' % (protocol, hostname, args)
|
|
||||||
if (app.SYNC.path_verified and not force_check) or omit_check:
|
if (app.SYNC.path_verified and not force_check) or omit_check:
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,7 @@ class Service(object):
|
||||||
LOG.info("%s Version: %s", v.ADDON_NAME, v.ADDON_VERSION)
|
LOG.info("%s Version: %s", v.ADDON_NAME, v.ADDON_VERSION)
|
||||||
LOG.info("PKC Direct Paths: %s",
|
LOG.info("PKC Direct Paths: %s",
|
||||||
utils.settings('useDirectPaths') == '1')
|
utils.settings('useDirectPaths') == '1')
|
||||||
|
LOG.info("Escape paths: %s", utils.settings('escapePath') == 'true')
|
||||||
LOG.info("Synching Plex artwork to Kodi: %s",
|
LOG.info("Synching Plex artwork to Kodi: %s",
|
||||||
utils.settings('usePlexArtwork') == 'true')
|
utils.settings('usePlexArtwork') == 'true')
|
||||||
LOG.info("Number of sync threads: %s",
|
LOG.info("Number of sync threads: %s",
|
||||||
|
|
|
@ -54,6 +54,8 @@ REGEX_MUSICPATH = re.compile(r'''^\^(.+)\$$''')
|
||||||
# Grab Plex id from an URL-encoded string
|
# Grab Plex id from an URL-encoded string
|
||||||
REGEX_PLEX_ID_FROM_URL = re.compile(r'''metadata%2F(\d+)''')
|
REGEX_PLEX_ID_FROM_URL = re.compile(r'''metadata%2F(\d+)''')
|
||||||
|
|
||||||
|
SAFE_URL_CHARACTERS = "%/:=&?~#+!$,;'@()*[]".encode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
def garbageCollect():
|
def garbageCollect():
|
||||||
gc.collect(2)
|
gc.collect(2)
|
||||||
|
@ -373,6 +375,21 @@ def urlparse(url, scheme='', allow_fragments=True):
|
||||||
return _urlparse.urlparse(url, scheme, allow_fragments)
|
return _urlparse.urlparse(url, scheme, allow_fragments)
|
||||||
|
|
||||||
|
|
||||||
|
def escape_path(path):
|
||||||
|
"""
|
||||||
|
Uses urllib.quote to escape to escape path [unicode]. See here for the
|
||||||
|
reasoning whether a character is safe or not and whether or not it should
|
||||||
|
be escaped:
|
||||||
|
https://bugs.python.org/issue918368
|
||||||
|
Letters, digits, and the characters '_.-' are never quoted. Choosing the
|
||||||
|
"wrong" characters for a password for USERNAME:PASSWORD@host.com will get
|
||||||
|
you in trouble (e.g. '@')
|
||||||
|
Returns the escaped path as unicode
|
||||||
|
"""
|
||||||
|
return urllib.quote(path.encode('utf-8'),
|
||||||
|
safe=SAFE_URL_CHARACTERS).decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
def quote(s, safe='/'):
|
def quote(s, safe='/'):
|
||||||
"""
|
"""
|
||||||
unicode-safe way to use urllib.quote(). Pass in either str or unicode
|
unicode-safe way to use urllib.quote(). Pass in either str or unicode
|
||||||
|
@ -380,7 +397,7 @@ def quote(s, safe='/'):
|
||||||
"""
|
"""
|
||||||
if isinstance(s, unicode):
|
if isinstance(s, unicode):
|
||||||
s = s.encode('utf-8')
|
s = s.encode('utf-8')
|
||||||
s = urllib.quote(s, safe)
|
s = urllib.quote(s, safe.encode('utf-8'))
|
||||||
return s.decode('utf-8')
|
return s.decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
@ -391,7 +408,7 @@ def quote_plus(s, safe=''):
|
||||||
"""
|
"""
|
||||||
if isinstance(s, unicode):
|
if isinstance(s, unicode):
|
||||||
s = s.encode('utf-8')
|
s = s.encode('utf-8')
|
||||||
s = urllib.quote_plus(s, safe)
|
s = urllib.quote_plus(s, safe.encode('utf-8'))
|
||||||
return s.decode('utf-8')
|
return s.decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue