Skip to content

Commit f87a81f

Browse files
committed
perf: Attempt to parse XML strings without cleaning (which is expensive) before trying again with cleaning
1 parent a8d051f commit f87a81f

4 files changed

Lines changed: 15 additions & 6 deletions

File tree

plexapi/client.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,7 @@ def query(self, path, method=None, headers=None, timeout=None, **kwargs):
197197
raise NotFound(message)
198198
else:
199199
raise BadRequest(message)
200-
data = utils.cleanXMLString(response.text).encode('utf8')
201-
return ElementTree.fromstring(data) if data.strip() else None
200+
return utils.parseXMLString(response.text)
202201

203202
def sendCommand(self, command, proxy=None, **params):
204203
""" Convenience wrapper around :func:`~plexapi.client.PlexClient.query` to more easily

plexapi/myplex.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,7 @@ def query(self, url, method=None, headers=None, timeout=None, **kwargs):
250250
return response.json()
251251
elif 'text/plain' in response.headers.get('Content-Type', ''):
252252
return response.text.strip()
253-
data = utils.cleanXMLString(response.text).encode('utf8')
254-
return ElementTree.fromstring(data) if data.strip() else None
253+
return utils.parseXMLString(response.text)
255254

256255
def ping(self):
257256
""" Ping the Plex.tv API.

plexapi/server.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -768,8 +768,7 @@ def query(self, key, method=None, headers=None, params=None, timeout=None, **kwa
768768
raise NotFound(message)
769769
else:
770770
raise BadRequest(message)
771-
data = utils.cleanXMLString(response.text).encode('utf8')
772-
return ElementTree.fromstring(data) if data.strip() else None
771+
return utils.parseXMLString(response.text)
773772

774773
def search(self, query, mediatype=None, limit=None, sectionId=None):
775774
""" Returns a list of media items or filter categories from the resulting

plexapi/utils.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
from plexapi.exceptions import BadRequest, NotFound, Unauthorized
2525

26+
from xml.etree import ElementTree
27+
2628
try:
2729
from tqdm import tqdm
2830
except ImportError:
@@ -718,3 +720,13 @@ def sha1hash(guid):
718720

719721
def cleanXMLString(s):
720722
return _illegal_XML_re.sub('', s)
723+
724+
725+
def parseXMLString(s: str):
726+
""" Parse an XML string and return an ElementTree object. """
727+
if not s.strip():
728+
return None
729+
try: # Attempt to parse the string as-is without cleaning (which is expensive)
730+
return ElementTree.fromstring(s.encode('utf-8'))
731+
except ElementTree.ParseError: # If it fails, clean the string and try again
732+
return ElementTree.fromstring(cleanXMLString(s).encode('utf-8'))

0 commit comments

Comments
 (0)