@@ -90,10 +90,18 @@ class ImageProcessor:
90
90
EXIF_UNKNOWN = "unknown"
91
91
EXIF_TAGS = [ExifTag .CREATE_DATE .value , ExifTag .MAKE .value , ExifTag .MODEL .value ]
92
92
93
- def __init__ (self , logger : logging .Logger , op_dir : str ):
93
+ def __init__ (
94
+ self ,
95
+ logger : logging .Logger ,
96
+ op_dir : str ,
97
+ dng_compression : str = "lossless" ,
98
+ dng_preview : bool = False ,
99
+ ):
94
100
"""Initialize ImageProcessor."""
95
101
self ._logger = logger or logging .getLogger (__name__ )
96
102
self ._op_dir = op_dir
103
+ self ._dng_compression = dng_compression
104
+ self ._dng_preview = dng_preview
97
105
self ._current_dir = None
98
106
self ._supported_raw_image_ext_list = list (
99
107
set ([ext for exts in self .SUPPORTED_RAW_IMAGE_EXT .values () for ext in exts ])
@@ -196,11 +204,15 @@ async def patched_get_compat_path(path):
196
204
# Also patch the convert_file method to add proper error handling
197
205
from pydngconverter import main as pydng_main
198
206
207
+ # Capture our compression settings for the patch
208
+ dng_compression = self ._dng_compression
209
+ dng_preview = self ._dng_preview
210
+
199
211
async def patched_convert_file (self , * , destination : str = None , job = None , log = None ):
200
212
"""Enhanced convert_file with better error handling and logging."""
201
213
from pydngconverter import compat
202
214
203
- log = log or self . _logger
215
+ log = log or logging . getLogger ( __name__ )
204
216
log .debug ("starting conversion: %s" , job .source .name )
205
217
source_path = await compat .get_compat_path (job .source )
206
218
log .debug ("determined source path: %s" , source_path )
@@ -219,10 +231,12 @@ async def patched_convert_file(self, *, destination: str = None, job=None, log=N
219
231
output_file = Path (destination ) / f"{ Path (source_path ).stem } .dng"
220
232
dng_args = [
221
233
"convert" ,
222
- "--compression " ,
223
- "lossless" ,
234
+ "-c " ,
235
+ dng_compression , # Use captured compression setting
224
236
"--dng-preview" ,
225
- "true" ,
237
+ "true" if dng_preview else "false" ,
238
+ "--embed-raw" ,
239
+ "false" , # CRITICAL: Don't embed original RAW to prevent double size
226
240
str (source_path ),
227
241
str (output_file ),
228
242
]
@@ -232,7 +246,7 @@ async def patched_convert_file(self, *, destination: str = None, job=None, log=N
232
246
233
247
# Log the full command being executed
234
248
full_command = f"{ self .bin_exec } { ' ' .join (dng_args )} "
235
- log .debug (
249
+ log .info (
236
250
"Executing %s command: %s" ,
237
251
"DNGLab" if is_dnglab else "Adobe DNG Converter" ,
238
252
full_command ,
@@ -244,7 +258,9 @@ async def patched_convert_file(self, *, destination: str = None, job=None, log=N
244
258
log .debug ("Destination directory exists: %s" , Path (destination ).exists ())
245
259
log .debug ("Current working directory: %s" , Path .cwd ())
246
260
247
- log .debug ("converting: %s => %s" , job .source .name , job .destination_filename )
261
+ log .info (
262
+ "Starting conversion: %s => %s" , job .source .name , job .destination_filename
263
+ )
248
264
249
265
try :
250
266
proc = await asyncio .create_subprocess_exec (
@@ -254,6 +270,7 @@ async def patched_convert_file(self, *, destination: str = None, job=None, log=N
254
270
stderr = asyncio .subprocess .PIPE ,
255
271
)
256
272
stdout , stderr = await proc .communicate ()
273
+ log .info ("DNGLab process completed with return code: %d" , proc .returncode )
257
274
258
275
# Check return code and log any errors
259
276
if proc .returncode != 0 :
@@ -737,12 +754,21 @@ async def _handle_raw_conversion(self, value: dict[str, list[dict[str, Any]]]) -
737
754
738
755
739
756
@function_trace
740
- async def run_pipeline (logger : logging .Logger , image_dir : str ) -> None :
757
+ async def run_pipeline (
758
+ logger : logging .Logger ,
759
+ image_dir : str ,
760
+ dng_compression : str = "lossless" ,
761
+ dng_preview : bool = False ,
762
+ ) -> None :
741
763
"""Main entry point for reactive image processing pipeline.
742
764
743
765
Args:
744
766
logger: Logger instance
745
767
image_dir: Directory containing images to process
768
+ dng_compression: DNG compression method ('lossless' or 'uncompressed')
769
+ dng_preview: Whether to embed JPEG preview in DNG files
746
770
"""
747
- processor = ImageProcessor (logger = logger , op_dir = image_dir )
771
+ processor = ImageProcessor (
772
+ logger = logger , op_dir = image_dir , dng_compression = dng_compression , dng_preview = dng_preview
773
+ )
748
774
await processor .process_images_reactive ()
0 commit comments