88from deezy .enums .codec_format import CodecFormat
99from deezy .exceptions import (
1010 DependencyNotFoundError ,
11+ InvalidAtmosInputError ,
1112 InvalidExtensionError ,
1213 OutputFileNotFoundError ,
1314)
@@ -62,9 +63,7 @@ def encode(self):
6263
6364 # delay
6465 delay = self .get_delay (
65- audio_track_info ,
6666 self .payload .delay ,
67- self .payload .parse_elementary_delay ,
6867 file_input ,
6968 )
7069
@@ -84,27 +83,21 @@ def encode(self):
8483 # and will be ignored if not present. Keep existing generate_output_filename
8584 # as the fallback to avoid changing default behavior.
8685 if self .payload .output_template :
87- ignore_delay , delay_was_stripped = self .compute_template_delay_flags (
88- audio_track_info , delay , self .payload .parse_elementary_delay
89- )
9086 output = mi_parser .render_output_template (
9187 template = str (self .payload .output_template ),
9288 suffix = ".ec3" ,
9389 output_channels = str (self .payload .atmos_mode .get_str_channels ()),
90+ delay_was_stripped = delay .is_delay (),
91+ delay_relative_to_video = audio_track_info .delay_relative_to_video ,
9492 worker_id = self .payload .worker_id ,
95- ignore_delay = ignore_delay ,
96- delay_was_stripped = delay_was_stripped ,
9793 )
9894 if self .payload .output_preview :
9995 logger .info (f"Output preview: { output } " )
10096 return output
10197 else :
102- ignore_delay , delay_was_stripped = self .compute_template_delay_flags (
103- audio_track_info , delay , self .payload .parse_elementary_delay
104- )
10598 output = mi_parser .generate_output_filename (
106- ignore_delay ,
107- delay_was_stripped ,
99+ delay_was_stripped = delay . is_delay () ,
100+ delay_relative_to_video = audio_track_info . delay_relative_to_video ,
108101 suffix = ".ec3" ,
109102 output_channels = str (self .payload .atmos_mode .get_str_channels ()),
110103 worker_id = self .payload .worker_id ,
@@ -118,14 +111,7 @@ def encode(self):
118111 logger .debug (f"Output path { output } ." )
119112
120113 # temp dir: prefer a user-provided centralized temp base (per-input subfolder)
121- # so users can collect all temp files in one place. If not provided, use
122- # the adjacent per-input cache folder (<parent>/<stem>_deezy).
123- user_temp_base = getattr (self .payload , "temp_dir" , None )
124- if user_temp_base :
125- temp_dir = Path (user_temp_base ) / f"{ file_input .stem } _deezy"
126- temp_dir .mkdir (parents = True , exist_ok = True )
127- else :
128- temp_dir = self ._adjacent_temp_dir (file_input )
114+ temp_dir = self ._get_temp_dir (file_input , self .payload .temp_dir )
129115 logger .debug (f"Temp directory { temp_dir } ." )
130116
131117 # check disk space
@@ -141,56 +127,72 @@ def encode(self):
141127 # destination already exists and the user didn't request overwrite.
142128 self ._early_output_exists_check (output , self .payload .overwrite )
143129
144- # decode TrueHD to atmos mezz
145- if not self .payload .truehdd_path :
146- raise DependencyNotFoundError (
147- "Failed to locate truehdd, this is required for atmos work flows"
148- )
130+ # dee input path variable
131+ dee_input_path : Path | None = None
149132
150- # optionally stagger/jitter and limit concurrent TrueHD jobs
151- self ._maybe_jitter ()
152- self ._acquire_truehdd ()
153- try :
154- truehdd_signature = f"truehdd:{ self .payload .thd_warp_mode .to_truehdd_cmd ()} "
155- metadata_path = self ._metadata_path_for_output (temp_dir , output )
156- if getattr (
157- self .payload , "reuse_temp_files" , False
158- ) and self ._check_reuse_signature (
159- metadata_path ,
160- str (CodecFormat .ATMOS ),
161- truehdd_signature ,
162- "atmos_meta.atmos" ,
163- temp_dir ,
164- ):
165- logger .info ("Reusing extracted wav from temp folder" )
166- decoded_mezz_path = temp_dir / "atmos_meta.atmos"
167- else :
168- decoded_mezz_path = decode_truehd_to_atmos (
169- output_dir = temp_dir ,
170- file_input = self .payload .file_input ,
171- track_index = self .payload .track_index ,
172- ffmpeg_path = self .payload .ffmpeg_path ,
173- truehdd_path = self .payload .truehdd_path ,
174- bed_conform = self .payload .bed_conform ,
175- warp_mode = self .payload .thd_warp_mode ,
176- duration = audio_track_info .duration ,
177- step_info = {"current" : 1 , "total" : 3 , "name" : "truehdd" },
178- no_progress_bars = self .payload .no_progress_bars ,
133+ # check if we're processing truehd atmos
134+ if self .payload .truehdd_path and audio_track_info .thd_atmos :
135+ # optionally stagger/jitter and limit concurrent TrueHD jobs
136+ self ._maybe_jitter ()
137+ self ._acquire_truehdd ()
138+ try :
139+ truehdd_signature = (
140+ f"truehdd:{ self .payload .thd_warp_mode .to_truehdd_cmd ()} "
179141 )
180- if getattr (self .payload , "reuse_temp_files" , False ):
181- self ._write_signature_metadata (
182- metadata_path ,
183- str (CodecFormat .ATMOS ),
184- truehdd_signature ,
185- "atmos_meta.atmos" ,
186- file_input ,
142+ metadata_path = self ._metadata_path_for_output (temp_dir , output )
143+ if getattr (
144+ self .payload , "reuse_temp_files" , False
145+ ) and self ._check_reuse_signature (
146+ metadata_path ,
147+ str (CodecFormat .ATMOS ),
148+ truehdd_signature ,
149+ "atmos_meta.atmos" ,
150+ temp_dir ,
151+ ):
152+ dee_input_path = temp_dir / "atmos_meta.atmos"
153+ logger .info ("Reusing extracted wav from temp folder" )
154+ else :
155+ if self .payload .truehdd_path :
156+ raise DependencyNotFoundError (
157+ "Failed to locate truehdd, this is required for TrueHD Atmos work flows"
158+ )
159+ dee_input_path = decode_truehd_to_atmos (
160+ output_dir = temp_dir ,
161+ file_input = self .payload .file_input ,
162+ track_index = self .payload .track_index ,
163+ ffmpeg_path = self .payload .ffmpeg_path ,
164+ truehdd_path = self .payload .truehdd_path ,
165+ bed_conform = self .payload .bed_conform ,
166+ warp_mode = self .payload .thd_warp_mode ,
167+ duration = audio_track_info .duration ,
168+ step_info = {"current" : 1 , "total" : 3 , "name" : "truehdd" },
169+ no_progress_bars = self .payload .no_progress_bars ,
187170 )
188- finally :
189- self ._release_truehdd ()
171+ if getattr (self .payload , "reuse_temp_files" , False ):
172+ self ._write_signature_metadata (
173+ metadata_path ,
174+ str (CodecFormat .ATMOS ),
175+ truehdd_signature ,
176+ "atmos_meta.atmos" ,
177+ file_input ,
178+ )
179+ finally :
180+ self ._release_truehdd ()
181+
182+ # check if we're processing adm atmos wav file
183+ elif audio_track_info .adm_atmos_wav :
184+ dee_input_path = file_input
185+ logger .info ("Using ADM BWF input" )
186+
187+ # if it's anything raise an error
188+ else :
189+ raise InvalidAtmosInputError (
190+ "Cannot process input, not a valid Atmos format"
191+ )
190192
191193 # generate JSON
192194 json_generator = DeeJSONGenerator (
193- input_file_path = decoded_mezz_path ,
195+ input_file_path = dee_input_path ,
194196 output_file_path = output ,
195197 output_dir = temp_dir ,
196198 codec_format = CodecFormat .ATMOS ,
0 commit comments