From dac4b3160f3d5770f63831fc0ce65a23b0c22dce Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Thu, 28 Aug 2025 16:33:03 -0700 Subject: [PATCH 1/5] fix: DNG handling --- src/c2pa/c2pa.py | 36 ++++++++++++++++++++++++++++++++---- tests/fixtures/C.dng | Bin 0 -> 166246 bytes tests/test_unit_tests.py | 20 +++++++++++++++++--- 3 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 tests/fixtures/C.dng diff --git a/src/c2pa/c2pa.py b/src/c2pa/c2pa.py index aeb1427c..dca2c2be 100644 --- a/src/c2pa/c2pa.py +++ b/src/c2pa/c2pa.py @@ -1231,8 +1231,22 @@ def __init__(self, # If we don't get a stream as param: # Create a stream from the file path in format_or_path path = str(format_or_path) - mime_type = mimetypes.guess_type( - path)[0] + + # Extract file extension: + # path_obj.suffix returns the extension including + # the dot (e.g., ".jpg", ".png"). + # If no extension exists, suffix returns empty string, + # so file_extension will be "" + path_obj = Path(path) + file_extension = path_obj.suffix.lower() if path_obj.suffix else "" + + if file_extension == ".dng": + # mimetypes guesses the wrong type for dng, + # so we bypass it and set the correct type + mime_type = "image/dng" + else: + mime_type = mimetypes.guess_type( + path)[0] if not mime_type: raise C2paError.NotSupported( @@ -2279,8 +2293,22 @@ def sign_file(self, Raises: C2paError: If there was an error during signing """ - # Get the MIME type from the file extension - mime_type = mimetypes.guess_type(str(source_path))[0] + # Extract file extension: + # path_obj.suffix returns the extension + # including the dot (e.g., ".jpg", ".png") + # If no extension exists, suffix returns empty string, + # so file_extension will be "" + file_extension = "" + path_obj = Path(source_path) + file_extension = path_obj.suffix.lower() if path_obj.suffix else "" + + if file_extension == ".dng": + # mimetypes guesses the wrong type for dng, + # so we bypass it and set the correct type + mime_type = "image/dng" + else: + mime_type = mimetypes.guess_type(str(source_path))[0] + if not mime_type: raise C2paError.NotSupported( f"Could not determine MIME type for file: {source_path}") diff --git a/tests/fixtures/C.dng b/tests/fixtures/C.dng new file mode 100644 index 0000000000000000000000000000000000000000..361a7a0ff694e0c35f82e3df0cf956a7d73c3b03 GIT binary patch literal 166246 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%0D8n44n^`WqA2N5% zXA`9(k5l76K6D!!gFG5{r$+U68HVF*KV0a!_Q z(04Q4W=GAoFPZLfTZ2=Xw#$%BM~bBG=f~`6n>+jjjU}{!hTKiEdfh)wp4Io!$Spln`NDa2^x^cyHw3|P z(I1Z5BDXxkV6)y57t>Jt+pYwi$C_%n1T;4B4=Q+N!(dXd1@LOApWk$XExo4;%2?~2 zVDl0y?*yX(dQmUEAB-BL*_O)sfp=$ZSjva$ z%+5dt=zVAekbi$EAF68>$OFj`4f21~ljH}d%kNK%2l=btpSI}{sh;y7pXU*YACh%5 ec;6ZiI9><&SC)7lfwWEw4J=3z=nK-&_WuC)1yUdY literal 0 HcmV?d00001 diff --git a/tests/test_unit_tests.py b/tests/test_unit_tests.py index 7540d35f..22993938 100644 --- a/tests/test_unit_tests.py +++ b/tests/test_unit_tests.py @@ -126,9 +126,6 @@ def test_reader_streams_with_nested(self): def test_reader_close_cleanup(self): with open(self.testPath, "rb") as file: reader = Reader("image/jpeg", file) - # Store references to internal objects - reader_ref = reader._reader - stream_ref = reader._own_stream # Close the reader reader.close() # Verify all resources are cleaned up @@ -144,6 +141,23 @@ def test_resource_to_stream_on_closed_reader(self): with self.assertRaises(Error): reader.resource_to_stream("", io.BytesIO(bytearray())) + def test_read_dng_from_stream(self): + test_path = os.path.join(self.data_dir, "C.dng") + with open(test_path, "rb") as file: + file_content = file.read() + + with Reader("dng", io.BytesIO(file_content)) as reader: + # Just run and verify there is no crash + json.loads(reader.json()) + + def test_read_dng_file_from_path(self): + test_path = os.path.join(self.data_dir, "C.dng") + + # Create reader with the file content + with Reader(test_path) as reader: + # Just run and verify there is no crash + json.loads(reader.json()) + def test_read_all_files(self): """Test reading C2PA metadata from all files in the fixtures/files-for-reading-tests directory""" reading_dir = os.path.join(self.data_dir, "files-for-reading-tests") From 3788d17521c4b22e41b4731f3d07c1c5d0749b83 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Thu, 28 Aug 2025 16:40:46 -0700 Subject: [PATCH 2/5] fix: Clarify docs --- src/c2pa/c2pa.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/c2pa/c2pa.py b/src/c2pa/c2pa.py index dca2c2be..16b9edff 100644 --- a/src/c2pa/c2pa.py +++ b/src/c2pa/c2pa.py @@ -1214,7 +1214,9 @@ def __init__(self, """Create a new Reader. Args: - format_or_path: The format or path to read from + format_or_path: The format or path to read from. For paths, we + will attempt to guess the mimetype of the source file + based on the extension. stream: Optional stream to read from (Python stream-like object) manifest_data: Optional manifest data in bytes @@ -2283,7 +2285,9 @@ def sign_file(self, """Sign a file and write the signed data to an output file. Args: - source_path: Path to the source file + source_path: Path to the source file. We will attempt + to guess the mimetype of the source file based on + the extension. dest_path: Path to write the signed file to signer: The signer to use From 3a5858b8df6940a139c16abf56e8d92603e5aa07 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Thu, 28 Aug 2025 16:42:56 -0700 Subject: [PATCH 3/5] fix: Clarify docs 2 --- src/c2pa/c2pa.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/c2pa/c2pa.py b/src/c2pa/c2pa.py index 16b9edff..7f17a6ad 100644 --- a/src/c2pa/c2pa.py +++ b/src/c2pa/c2pa.py @@ -1214,9 +1214,11 @@ def __init__(self, """Create a new Reader. Args: - format_or_path: The format or path to read from. For paths, we - will attempt to guess the mimetype of the source file - based on the extension. + format_or_path: The format or path to read from. + The stream API (params format and an open stream) is + the recommended way to use the Reader. For paths, we + will attempt to guess the mimetype of the source + file based on the extension. stream: Optional stream to read from (Python stream-like object) manifest_data: Optional manifest data in bytes From d814e84e2da021810f268e5e07d8cd9e56bb7404 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Thu, 28 Aug 2025 16:51:41 -0700 Subject: [PATCH 4/5] fix: Refactor --- src/c2pa/c2pa.py | 66 +++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/src/c2pa/c2pa.py b/src/c2pa/c2pa.py index 7f17a6ad..87396b12 100644 --- a/src/c2pa/c2pa.py +++ b/src/c2pa/c2pa.py @@ -654,6 +654,33 @@ def load_settings(settings: str, format: str = "json") -> None: return result +def _get_mime_type_from_path(path: Union[str, Path]) -> str: + """Attempt to guess the MIME type from a file path (with extension). + + Args: + path: File path as string or Path object + + Returns: + MIME type string + + Raises: + C2paError.NotSupported: If MIME type cannot be determined + """ + path_obj = Path(path) + file_extension = path_obj.suffix.lower() if path_obj.suffix else "" + + if file_extension == ".dng": + # mimetypes guesses the wrong type for dng, + # so we bypass it and set the correct type + return "image/dng" + else: + mime_type = mimetypes.guess_type(str(path))[0] + if not mime_type: + raise C2paError.NotSupported( + f"Could not determine MIME type for file: {path}") + return mime_type + + def read_ingredient_file( path: Union[str, Path], data_dir: Union[str, Path]) -> str: """Read a file as C2PA ingredient. @@ -1236,25 +1263,7 @@ def __init__(self, # Create a stream from the file path in format_or_path path = str(format_or_path) - # Extract file extension: - # path_obj.suffix returns the extension including - # the dot (e.g., ".jpg", ".png"). - # If no extension exists, suffix returns empty string, - # so file_extension will be "" - path_obj = Path(path) - file_extension = path_obj.suffix.lower() if path_obj.suffix else "" - - if file_extension == ".dng": - # mimetypes guesses the wrong type for dng, - # so we bypass it and set the correct type - mime_type = "image/dng" - else: - mime_type = mimetypes.guess_type( - path)[0] - - if not mime_type: - raise C2paError.NotSupported( - f"Could not determine MIME type for file: {path}") + mime_type = _get_mime_type_from_path(path) if mime_type not in Reader.get_supported_mime_types(): raise C2paError.NotSupported( @@ -2299,25 +2308,8 @@ def sign_file(self, Raises: C2paError: If there was an error during signing """ - # Extract file extension: - # path_obj.suffix returns the extension - # including the dot (e.g., ".jpg", ".png") - # If no extension exists, suffix returns empty string, - # so file_extension will be "" - file_extension = "" - path_obj = Path(source_path) - file_extension = path_obj.suffix.lower() if path_obj.suffix else "" - - if file_extension == ".dng": - # mimetypes guesses the wrong type for dng, - # so we bypass it and set the correct type - mime_type = "image/dng" - else: - mime_type = mimetypes.guess_type(str(source_path))[0] - if not mime_type: - raise C2paError.NotSupported( - f"Could not determine MIME type for file: {source_path}") + mime_type = _get_mime_type_from_path(source_path) try: # Open source file and destination file, then use the sign method From 8a0474e6b6635353e05a16650c617adaf06ec5d4 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Thu, 28 Aug 2025 16:55:23 -0700 Subject: [PATCH 5/5] fix: Bump version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 57d4368a..00965e12 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "c2pa-python" -version = "0.16.0" +version = "0.17.0" requires-python = ">=3.10" description = "Python bindings for the C2PA Content Authenticity Initiative (CAI) library" readme = { file = "README.md", content-type = "text/markdown" }