diff --git a/src/multilang_translator/translator_api/api.py b/src/multilang_translator/translator_api/api.py index e5433c9..ec0fcaa 100644 --- a/src/multilang_translator/translator_api/api.py +++ b/src/multilang_translator/translator_api/api.py @@ -74,6 +74,7 @@ active_group_id = None last_completed_group_id = None announcement_task = None caster = None +reset_task = None # Initialization flag initialized = False @@ -103,7 +104,7 @@ async def process_announcement(text: str, group: EndpointGroup): Process an announcement using the multilang_translator. This is based on the announcement_from_german_text function in main_local.py. """ - global active_group_id, last_completed_group_id, caster + global active_group_id, last_completed_group_id, caster, reset_task # Make sure the caster is initialized if not initialized: @@ -117,7 +118,7 @@ async def process_announcement(text: str, group: EndpointGroup): active_group_id = group.id # Update status to translating - group.progress.current_state = AnnouncementStates.TRANSLATING + group.progress.current_state = AnnouncementStates.TRANSLATING.value group.progress.progress = 0.2 # Translate the text for each language @@ -135,7 +136,7 @@ async def process_announcement(text: str, group: EndpointGroup): if big.language == base_lang: translated_text = text else: - group.progress.current_state = AnnouncementStates.TRANSLATING + group.progress.current_state = AnnouncementStates.TRANSLATING.value translated_text = llm_translator.translate_de_to_x( text, big.language, @@ -148,7 +149,7 @@ async def process_announcement(text: str, group: EndpointGroup): log.info(f'Translated text ({big.language}): {translated_text}') # Update status to generating voice - group.progress.current_state = AnnouncementStates.GENERATING_VOICE + group.progress.current_state = AnnouncementStates.GENERATING_VOICE.value group.progress.progress = 0.4 # This will use the voice_provider's text_to_speech.synthesize function @@ -165,23 +166,20 @@ async def process_announcement(text: str, group: EndpointGroup): caster.big_conf[i].audio_source = lc3_audio # Update status to routing - group.progress.current_state = AnnouncementStates.ROUTING + group.progress.current_state = AnnouncementStates.ROUTING.value group.progress.progress = 0.6 - await asyncio.sleep(0.5) # Small delay for routing + await asyncio.sleep(0.5) # Small delay for routing # TODO: actually needs to be implemented # Update status to active and start streaming - group.progress.current_state = AnnouncementStates.ACTIVE + group.progress.current_state = AnnouncementStates.ACTIVE.value group.progress.progress = 0.8 caster.start_streaming() # Wait for streaming to complete - if hasattr(caster, 'streamer') and hasattr(caster.streamer, 'task'): - await caster.streamer.task - else: - await asyncio.sleep(3) # Fallback wait if no task available - + await caster.streamer.task + # Update status to complete - group.progress.current_state = AnnouncementStates.COMPLETE + group.progress.current_state = AnnouncementStates.COMPLETE.value group.progress.progress = 1.0 last_completed_group_id = group.id @@ -191,16 +189,21 @@ async def process_announcement(text: str, group: EndpointGroup): # After a while, reset to idle state (in a separate task) async def reset_to_idle(): + log.info(f"Waiting 10 seconds before resetting group {group.id} to IDLE state") await asyncio.sleep(10) # Keep completed state visible for 10 seconds - if group.progress.current_state == AnnouncementStates.COMPLETE: - group.progress.current_state = AnnouncementStates.IDLE + log.info(f"Resetting group {group.id} to IDLE state") + # Use direct value lookup for the state comparison + if group.progress.current_state == AnnouncementStates.COMPLETE.value: + group.progress.current_state = AnnouncementStates.IDLE.value group.progress.progress = 0.0 + log.info(f"Group {group.id} state reset to IDLE") - asyncio.create_task(reset_to_idle()) + # Create and save the task so it won't be garbage collected + reset_task = asyncio.create_task(reset_to_idle()) except Exception as e: log.error(f"Error in processing announcement: {e}") - group.progress.current_state = AnnouncementStates.ERROR + group.progress.current_state = AnnouncementStates.ERROR.value group.progress.error = str(e) if active_group_id == group.id: active_group_id = None @@ -261,6 +264,8 @@ async def start_announcement(text: str, group_id: int): """Start a new announcement to the specified endpoint group.""" global announcement_task, active_group_id + log.info(f"Received announcement request - text: '{text}', group_id: {group_id}") + # Find the group group = None for g in endpoint_groups: @@ -292,6 +297,9 @@ async def start_announcement(text: str, group_id: int): @app.get("/announcements/status") async def get_announcement_status(): """Get the status of the current announcement.""" + global active_group_id, last_completed_group_id + log.debug(f"Status request - active_group_id: {active_group_id}, last_completed_group_id: {last_completed_group_id}") + # If an announcement is active, return its status if active_group_id is not None: group = None @@ -301,6 +309,7 @@ async def get_announcement_status(): break if group: + log.debug(f"Returning active status for group {group.id}: {group.progress.current_state}") return { "state": group.progress.current_state, "progress": group.progress.progress, @@ -325,7 +334,8 @@ async def get_announcement_status(): group = g break - if group and group.progress.current_state == AnnouncementStates.COMPLETE: + if group and group.progress.current_state == AnnouncementStates.COMPLETE.value: + log.debug(f"Returning completed status for group {group.id}") return { "state": group.progress.current_state, "progress": group.progress.progress, @@ -343,8 +353,9 @@ async def get_announcement_status(): } # Default: no active announcement + log.debug("Returning idle status (no active or completed announcements)") return { - "state": AnnouncementStates.IDLE, + "state": AnnouncementStates.IDLE.value, "progress": 0.0, "error": None, "details": {