Skip to content

Commit d83d568

Browse files
committed
Add operation when updating
1 parent 1e0a128 commit d83d568

File tree

2 files changed

+148
-33
lines changed

2 files changed

+148
-33
lines changed

open_dubbing/utterance.py

+82-29
Original file line numberDiff line numberDiff line change
@@ -185,48 +185,101 @@ def get_without_empty_blocks(self, utterance_metadata):
185185

186186
return new_utterance
187187

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+
188239
def update_utterances(self, utterance_master, utterance_update):
189-
id_to_update = {}
240+
id_to_update_or_delete = {}
241+
id_to_create = {}
190242
utterance_new = []
191243

192244
for utterance in utterance_update:
193245
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
195257

196258
for utterance in utterance_master:
197259
id = utterance["id"]
198-
update = id_to_update.get(id, None)
260+
261+
update = id_to_update_or_delete.get(id, None)
199262
if not update:
200263
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")
206268

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":
226270
continue
227271

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)
229277

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)
231284

232285
return utterance_new

tests/utterance_test.py

+66-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
class TestUterrance:
2424

2525
def testrun_save_utterance(self):
26-
2726
with tempfile.TemporaryDirectory() as temp_dir:
2827
directory = temp_dir
2928

@@ -65,7 +64,6 @@ def testrun_save_utterance(self):
6564
}
6665

6766
def test_hash_utterances(self):
68-
6967
utterances = [
7068
{
7169
"start": 1.26,
@@ -145,7 +143,6 @@ def test_get_without_empty_blocks(self):
145143
assert "Hola" == modified[0]["text"]
146144

147145
def test_add_unique_ids(self):
148-
149146
utterances = [
150147
{
151148
"start": 1.26,
@@ -201,8 +198,73 @@ def _get_master_utterances(self):
201198
},
202199
]
203200

204-
def test_update_utterances_operation_delete(self):
201+
def test_update_utterances_operation_create(self):
202+
master = self._get_master_utterances()
203+
utterance = Utterance(
204+
target_language="cat",
205+
output_directory=None,
206+
)
207+
create_utterances = [
208+
{
209+
"id": 1,
210+
"operation": "create",
211+
"translated_text": "Bon dia",
212+
"speaker_id": "SPEAKER_01",
213+
"gender": "Male",
214+
"assigned_voice": "ca-ES-EnricNeural",
215+
"start": 4,
216+
"end": 5,
217+
}
218+
]
219+
new_utterances = utterance.update_utterances(master, create_utterances)
220+
assert len(new_utterances) == 3
221+
assert [u["id"] for u in new_utterances] == [1, 3, 2]
222+
assert new_utterances[1]["translated_text"] == "Bon dia"
205223

224+
def test_update_utterances_operation_create_first(self):
225+
master = self._get_master_utterances()
226+
utterance = Utterance(
227+
target_language="cat",
228+
output_directory=None,
229+
)
230+
create_utterances = [
231+
{
232+
"id": 0,
233+
"operation": "create",
234+
"translated_text": "Bon dia",
235+
"speaker_id": "SPEAKER_01",
236+
"gender": "Male",
237+
"assigned_voice": "ca-ES-EnricNeural",
238+
"start": 4,
239+
"end": 5,
240+
}
241+
]
242+
new_utterances = utterance.update_utterances(master, create_utterances)
243+
assert len(new_utterances) == 3
244+
assert [u["id"] for u in new_utterances] == [3, 1, 2]
245+
assert new_utterances[0]["translated_text"] == "Bon dia"
246+
247+
def test_update_utterances_operation_create_ignore_missing_fields(self):
248+
master = self._get_master_utterances()
249+
utterance = Utterance(
250+
target_language="cat",
251+
output_directory=None,
252+
)
253+
create_utterances = [
254+
{
255+
"id": 0,
256+
"operation": "create",
257+
"gender": "Male",
258+
"assigned_voice": "ca-ES-EnricNeural",
259+
"start": 4,
260+
"end": 5,
261+
}
262+
]
263+
new_utterances = utterance.update_utterances(master, create_utterances)
264+
assert len(new_utterances) == 2
265+
assert [u["id"] for u in new_utterances] == [1, 2]
266+
267+
def test_update_utterances_operation_delete(self):
206268
master = self._get_master_utterances()
207269
utterance = Utterance(
208270
target_language="cat",

0 commit comments

Comments
 (0)