@@ -1381,34 +1381,33 @@ def __init__(self,
13811381 str (e )))
13821382
13831383 try :
1384- # Open the file and create a stream
1385- file = open (path , 'rb' )
1386- self ._own_stream = Stream (file )
1384+ # Use context manager for automatic file cleanup
1385+ with open (path , 'rb' ) as file :
1386+ self ._own_stream = Stream (file )
13871387
1388- self ._reader = _lib .c2pa_reader_from_stream (
1389- mime_type_str ,
1390- self ._own_stream ._stream
1391- )
1392-
1393- if not self ._reader :
1394- self ._own_stream .close ()
1395- file .close ()
1396- error = _parse_operation_result_for_error (
1397- _lib .c2pa_error ())
1398- if error :
1399- raise C2paError (error )
1400- raise C2paError (
1401- Reader ._ERROR_MESSAGES ['reader_error' ].format (
1402- "Unknown error"
1403- )
1388+ self ._reader = _lib .c2pa_reader_from_stream (
1389+ mime_type_str ,
1390+ self ._own_stream ._stream
14041391 )
14051392
1406- # Store the file to close it later
1407- self ._backing_file = file
1393+ if not self ._reader :
1394+ self ._own_stream .close ()
1395+ error = _parse_operation_result_for_error (
1396+ _lib .c2pa_error ())
1397+ if error :
1398+ raise C2paError (error )
1399+ raise C2paError (
1400+ Reader ._ERROR_MESSAGES ['reader_error' ].format (
1401+ "Unknown error"
1402+ )
1403+ )
14081404
1409- self ._initialized = True
1405+ # Store the file to close it later
1406+ self ._backing_file = file
1407+ self ._initialized = True
14101408
14111409 except Exception as e :
1410+ # File automatically closed by context manager
14121411 if self ._own_stream :
14131412 self ._own_stream .close ()
14141413 if hasattr (self , '_backing_file' ) and self ._backing_file :
@@ -1427,50 +1426,50 @@ def __init__(self,
14271426 f"Reader does not support { format_or_path } " )
14281427
14291428 try :
1430- file = open (stream , 'rb' )
1431- self ._own_stream = Stream (file )
1432-
1433- format_str = str (format_or_path )
1434- format_bytes = format_str .encode ('utf-8' )
1435-
1436- if manifest_data is None :
1437- self ._reader = _lib .c2pa_reader_from_stream (
1438- format_bytes , self ._own_stream ._stream )
1439- else :
1440- if not isinstance (manifest_data , bytes ):
1441- raise TypeError (
1442- Reader ._ERROR_MESSAGES ['manifest_error' ])
1443- manifest_array = (
1444- ctypes .c_ubyte *
1445- len (manifest_data ))(
1446- *
1447- manifest_data )
1448- self ._reader = (
1449- _lib .c2pa_reader_from_manifest_data_and_stream (
1450- format_bytes ,
1451- self ._own_stream ._stream ,
1452- manifest_array ,
1453- len (manifest_data ),
1429+ # Use context manager for automatic file cleanup
1430+ with open (stream , 'rb' ) as file :
1431+ self ._own_stream = Stream (file )
1432+
1433+ format_str = str (format_or_path )
1434+ format_bytes = format_str .encode ('utf-8' )
1435+
1436+ if manifest_data is None :
1437+ self ._reader = _lib .c2pa_reader_from_stream (
1438+ format_bytes , self ._own_stream ._stream )
1439+ else :
1440+ if not isinstance (manifest_data , bytes ):
1441+ raise TypeError (
1442+ Reader ._ERROR_MESSAGES ['manifest_error' ])
1443+ manifest_array = (
1444+ ctypes .c_ubyte *
1445+ len (manifest_data ))(
1446+ *
1447+ manifest_data )
1448+ self ._reader = (
1449+ _lib .c2pa_reader_from_manifest_data_and_stream (
1450+ format_bytes ,
1451+ self ._own_stream ._stream ,
1452+ manifest_array ,
1453+ len (manifest_data ),
1454+ )
14541455 )
1455- )
14561456
1457- if not self ._reader :
1458- self ._own_stream .close ()
1459- file . close ()
1460- error = _parse_operation_result_for_error (
1461- _lib . c2pa_error ())
1462- if error :
1463- raise C2paError (error )
1464- raise C2paError (
1465- Reader . _ERROR_MESSAGES [ 'reader_error' ]. format (
1466- "Unknown error"
1457+ if not self ._reader :
1458+ self ._own_stream .close ()
1459+ error = _parse_operation_result_for_error (
1460+ _lib . c2pa_error ())
1461+ if error :
1462+ raise C2paError ( error )
1463+ raise C2paError (
1464+ Reader . _ERROR_MESSAGES [ 'reader_error' ]. format (
1465+ "Unknown error"
1466+ )
14671467 )
1468- )
1469-
1470- self ._backing_file = file
14711468
1472- self ._initialized = True
1469+ self ._backing_file = file
1470+ self ._initialized = True
14731471 except Exception as e :
1472+ # File automatically closed by context manager
14741473 if self ._own_stream :
14751474 self ._own_stream .close ()
14761475 if hasattr (self , '_backing_file' ) and self ._backing_file :
@@ -2745,7 +2744,11 @@ def ed25519_sign(data: bytes, private_key: str) -> bytes:
27452744 f"Invalid UTF-8 characters in private key: { str (e )} " )
27462745
27472746 # Perform the signing operation
2748- signature_ptr = _lib .c2pa_ed25519_sign (data_array , data_size , key_bytes )
2747+ signature_ptr = _lib .c2pa_ed25519_sign (
2748+ data_array ,
2749+ data_size ,
2750+ key_bytes
2751+ )
27492752
27502753 if not signature_ptr :
27512754 error = _parse_operation_result_for_error (_lib .c2pa_error ())
0 commit comments