@@ -185,48 +185,101 @@ def get_without_empty_blocks(self, utterance_metadata):
185
185
186
186
return new_utterance
187
187
188
+ def _get_highest_id (self , utterance_metadata ):
189
+ highest_id = 1
190
+ for utterance in utterance_metadata :
191
+ id = utterance ["id" ]
192
+ if id > highest_id :
193
+ highest_id = id
194
+ return highest_id
195
+
196
+ def _create_new_utterance (self , update , new_id ):
197
+ mandatory_fields = [
198
+ "speaker_id" ,
199
+ "translated_text" ,
200
+ "assigned_voice" ,
201
+ "gender" ,
202
+ "start" ,
203
+ "end" ,
204
+ ]
205
+
206
+ new_utterance = {"id" : new_id }
207
+
208
+ for field in mandatory_fields :
209
+ value = update .get (field , None )
210
+ if not value :
211
+ logger ().warning (
212
+ f"Missing field '{ field } ' when adding new utterance with id '{ new_id } '"
213
+ )
214
+ return None
215
+
216
+ new_utterance [field ] = value
217
+
218
+ return new_utterance
219
+
220
+ def _update_utterance (self , update , utterance ):
221
+ updateable_fields = [
222
+ "speaker_id" ,
223
+ "translated_text" ,
224
+ "speed" ,
225
+ "assigned_voice" ,
226
+ "for_dubbing" ,
227
+ "gender" ,
228
+ "start" ,
229
+ "end" ,
230
+ ]
231
+ for field in updateable_fields :
232
+ value = update .get (field , None )
233
+ if not value :
234
+ continue
235
+
236
+ utterance [field ] = value
237
+ return utterance
238
+
188
239
def update_utterances (self , utterance_master , utterance_update ):
189
- id_to_update = {}
240
+ id_to_update_or_delete = {}
241
+ id_to_create = {}
190
242
utterance_new = []
191
243
192
244
for utterance in utterance_update :
193
245
id = utterance ["id" ]
194
- id_to_update [id ] = utterance
246
+ operation = utterance ["operation" ]
247
+ if operation == "create" :
248
+ if id == 0 :
249
+ new_id = self ._get_highest_id (utterance_master ) + 1
250
+ new_utterance = self ._create_new_utterance (utterance , new_id )
251
+ if new_utterance :
252
+ utterance_new .append (new_utterance )
253
+ else :
254
+ id_to_create [id ] = utterance
255
+ else :
256
+ id_to_update_or_delete [id ] = utterance
195
257
196
258
for utterance in utterance_master :
197
259
id = utterance ["id" ]
198
- update = id_to_update .get (id , None )
260
+
261
+ update = id_to_update_or_delete .get (id , None )
199
262
if not update :
200
263
utterance_new .append (utterance )
201
- continue
202
-
203
- operation = update .get ("operation" , None )
204
- if not operation :
205
- raise ValueError ("No operation field defined" )
264
+ else :
265
+ operation = update .get ("operation" , None )
266
+ if not operation :
267
+ raise ValueError ("No operation field defined" )
206
268
207
- if operation == "delete" :
208
- continue
209
-
210
- if operation != "update" :
211
- raise ValueError (f"Invalid operation { operation } " )
212
-
213
- updateable_fields = [
214
- "speaker_id" ,
215
- "translated_text" ,
216
- "speed" ,
217
- "assigned_voice" ,
218
- "for_dubbing" ,
219
- "gender" ,
220
- "start" ,
221
- "end" ,
222
- ]
223
- for field in updateable_fields :
224
- value = update .get (field , None )
225
- if not value :
269
+ if operation == "delete" :
226
270
continue
227
271
228
- utterance [field ] = value
272
+ if operation != "update" :
273
+ raise ValueError (f"Invalid operation { operation } " )
274
+
275
+ utterance = self ._update_utterance (update , utterance )
276
+ utterance_new .append (utterance )
229
277
230
- utterance_new .append (utterance )
278
+ create = id_to_create .get (id , None )
279
+ if create :
280
+ new_id = self ._get_highest_id (utterance_master ) + 1
281
+ new_utterance = self ._create_new_utterance (create , new_id )
282
+ if new_utterance :
283
+ utterance_new .append (new_utterance )
231
284
232
285
return utterance_new
0 commit comments