From b1f1465037edace975cf50701dfa4467e9369703 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Sun, 8 Feb 2026 21:36:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B7=D0=B0=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2=20=D0=B2=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/handlers.py | 7 ++--- src/scenarios.py | 78 ++++++------------------------------------------ 2 files changed, 12 insertions(+), 73 deletions(-) diff --git a/src/handlers.py b/src/handlers.py index cd8c05e..4eec39e 100644 --- a/src/handlers.py +++ b/src/handlers.py @@ -474,11 +474,10 @@ async def handle_save_track( """Обработчик сохранения дорожки.""" query = update.callback_query from src.audio import format_duration - from src.scenarios import is_scenario_complete, move_scenario_to_data + from src.scenarios import move_track_to_data - # Переносим файлы только когда весь сценарий озвучен - if is_scenario_complete(session.scenario_id): - move_scenario_to_data(session.scenario_id) + # Переносим завершённую дорожку пользователя в data + move_track_to_data(user.id, session.scenario_id, session.speaker_id) # Получаем статистику пользователя stats = get_user_stats(user.id) diff --git a/src/scenarios.py b/src/scenarios.py index 9a2f34c..f71dd6b 100644 --- a/src/scenarios.py +++ b/src/scenarios.py @@ -227,71 +227,6 @@ def get_audio_filename(replica_index: int, speaker_id: int, user_id: int) -> str return f"r{replica_index:03d}_s{speaker_id:02d}_u{user_id:03d}.wav" -def is_scenario_complete(scenario_id: str) -> bool: - """Проверяет, озвучены ли все дорожки сценария (у каждой есть полная запись).""" - with get_connection() as conn: - # Все дорожки с количеством реплик - all_tracks = conn.execute( - """ - SELECT speaker_id, COUNT(*) as replica_count - FROM replicas - WHERE scenario_id = ? - GROUP BY speaker_id - """, - (scenario_id,), - ).fetchall() - - if not all_tracks: - return False - - for track in all_tracks: - speaker_id, replica_count = track[0], track[1] - # Есть ли хотя бы один пользователь, который полностью озвучил дорожку - complete_count = conn.execute( - """ - SELECT COUNT(*) FROM ( - SELECT r.user_id - FROM recordings r - JOIN replicas rep ON r.scenario_id = rep.scenario_id - AND r.replica_index = rep.replica_index - WHERE r.scenario_id = ? AND rep.speaker_id = ? - GROUP BY r.user_id - HAVING COUNT(*) = ? - ) - """, - (scenario_id, speaker_id, replica_count), - ).fetchone()[0] - - if complete_count == 0: - return False - - return True - - -def move_scenario_to_data(scenario_id: str) -> None: - """Переносит все файлы сценария из data_partial в data.""" - partial_dir = get_partial_dir(scenario_id) - data_dir = get_data_dir(scenario_id) - - if not partial_dir.exists(): - return - - data_dir.mkdir(parents=True, exist_ok=True) - - moved_count = 0 - for file in partial_dir.glob("*.wav"): - dst = data_dir / file.name - shutil.move(str(file), str(dst)) - moved_count += 1 - - # Удаляем пустую папку - if partial_dir.exists() and not any(partial_dir.iterdir()): - partial_dir.rmdir() - - if moved_count > 0: - logger.info(f"Сценарий {scenario_id} завершён: перенесено {moved_count} файлов") - - def move_track_to_data(user_id: int, scenario_id: str, speaker_id: int) -> None: """Переносит завершённую дорожку из data_partial в data.""" partial_dir = get_partial_dir(scenario_id) @@ -310,10 +245,15 @@ def move_track_to_data(user_id: int, scenario_id: str, speaker_id: int) -> None: shutil.move(str(src), str(dst)) moved_count += 1 - logger.info( - f"Перенесено {moved_count} файлов для дорожки " - f"{scenario_id}/{speaker_id} (user_id={user_id})" - ) + # Удаляем пустую папку partial + if partial_dir.exists() and not any(partial_dir.iterdir()): + partial_dir.rmdir() + + if moved_count > 0: + logger.info( + f"Перенесено {moved_count} файлов для дорожки " + f"{scenario_id}/{speaker_id} (user_id={user_id})" + ) def delete_partial_track(user_id: int, scenario_id: str, speaker_id: int) -> None: