Skip to content

Commit e8348df

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

File tree

4 files changed

+15
-6
lines changed

4 files changed

+15
-6
lines changed

Diff for: plexapi/client.py

+1-2
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

Diff for: plexapi/myplex.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,7 @@ def query(self, url, method=None, headers=None, timeout=None, **kwargs):
259259
return response.json()
260260
elif 'text/plain' in response.headers.get('Content-Type', ''):
261261
return response.text.strip()
262-
data = utils.cleanXMLString(response.text).encode('utf8')
263-
return ElementTree.fromstring(data) if data.strip() else None
262+
return utils.parseXMLString(response.text)
264263

265264
def ping(self):
266265
""" Ping the Plex.tv API.

Diff for: plexapi/server.py

+1-2
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

Diff for: plexapi/utils.py

+12
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
from threading import Event, Thread
1919
from urllib.parse import quote
2020

21+
from xml.etree import ElementTree
22+
2123
import requests
2224
from requests.status_codes import _codes as codes
2325

@@ -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)