Skip to content

Commit

Permalink
Merge pull request #7274 from radarhere/jpeg_xmp
Browse files Browse the repository at this point in the history
  • Loading branch information
hugovk committed Oct 6, 2023
2 parents 7b17f9b + a3fd009 commit 8280fba
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 6 deletions.
Binary file added Tests/images/xmp_no_prefix.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Tests/images/xmp_padded.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 26 additions & 1 deletion Tests/test_file_jpeg.py
Original file line number Diff line number Diff line change
Expand Up @@ -882,7 +882,10 @@ def read(n=-1):
def test_getxmp(self):
with Image.open("Tests/images/xmp_test.jpg") as im:
if ElementTree is None:
with pytest.warns(UserWarning):
with pytest.warns(
UserWarning,
match="XMP data cannot be read without defusedxml dependency",
):
assert im.getxmp() == {}
else:
xmp = im.getxmp()
Expand All @@ -905,6 +908,28 @@ def test_getxmp(self):
with Image.open("Tests/images/hopper.jpg") as im:
assert im.getxmp() == {}

def test_getxmp_no_prefix(self):
with Image.open("Tests/images/xmp_no_prefix.jpg") as im:
if ElementTree is None:
with pytest.warns(
UserWarning,
match="XMP data cannot be read without defusedxml dependency",
):
assert im.getxmp() == {}
else:
assert im.getxmp() == {"xmpmeta": {"key": "value"}}

def test_getxmp_padded(self):
with Image.open("Tests/images/xmp_padded.jpg") as im:
if ElementTree is None:
with pytest.warns(
UserWarning,
match="XMP data cannot be read without defusedxml dependency",
):
assert im.getxmp() == {}
else:
assert im.getxmp() == {"xmpmeta": None}

@pytest.mark.timeout(timeout=1)
def test_eof(self):
# Even though this decoder never says that it is finished
Expand Down
5 changes: 4 additions & 1 deletion Tests/test_file_png.py
Original file line number Diff line number Diff line change
Expand Up @@ -665,7 +665,10 @@ def test_plte_length(self, tmp_path):
def test_getxmp(self):
with Image.open("Tests/images/color_snakes.png") as im:
if ElementTree is None:
with pytest.warns(UserWarning):
with pytest.warns(
UserWarning,
match="XMP data cannot be read without defusedxml dependency",
):
assert im.getxmp() == {}
else:
xmp = im.getxmp()
Expand Down
5 changes: 4 additions & 1 deletion Tests/test_file_tiff.py
Original file line number Diff line number Diff line change
Expand Up @@ -734,7 +734,10 @@ def test_discard_icc_profile(self, tmp_path):
def test_getxmp(self):
with Image.open("Tests/images/lab.tif") as im:
if ElementTree is None:
with pytest.warns(UserWarning):
with pytest.warns(
UserWarning,
match="XMP data cannot be read without defusedxml dependency",
):
assert im.getxmp() == {}
else:
xmp = im.getxmp()
Expand Down
5 changes: 4 additions & 1 deletion Tests/test_file_webp_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,10 @@ def test_getxmp():

with Image.open("Tests/images/flower2.webp") as im:
if ElementTree is None:
with pytest.warns(UserWarning):
with pytest.warns(
UserWarning,
match="XMP data cannot be read without defusedxml dependency",
):
assert im.getxmp() == {}
else:
assert (
Expand Down
2 changes: 1 addition & 1 deletion src/PIL/Image.py
Original file line number Diff line number Diff line change
Expand Up @@ -1385,7 +1385,7 @@ def getextrema(self):

def _getxmp(self, xmp_tags):
def get_name(tag):
return tag.split("}")[1]
return re.sub("^{[^}]+}", "", tag)

def get_value(element):
value = {get_name(k): v for k, v in element.attrib.items()}
Expand Down
2 changes: 1 addition & 1 deletion src/PIL/JpegImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,7 @@ def getxmp(self):

for segment, content in self.applist:
if segment == "APP1":
marker, xmp_tags = content.rsplit(b"\x00", 1)
marker, xmp_tags = content.split(b"\x00")[:2]
if marker == b"http://ns.adobe.com/xap/1.0/":
return self._getxmp(xmp_tags)
return {}
Expand Down

0 comments on commit 8280fba

Please sign in to comment.