Перенос только законченных треков в data

This commit is contained in:
2026-02-08 21:36:59 +03:00
parent e51deb7f10
commit b1f1465037
2 changed files with 12 additions and 73 deletions

View File

@@ -474,11 +474,10 @@ async def handle_save_track(
"""Обработчик сохранения дорожки.""" """Обработчик сохранения дорожки."""
query = update.callback_query query = update.callback_query
from src.audio import format_duration 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
# Переносим файлы только когда весь сценарий озвучен # Переносим завершённую дорожку пользователя в data
if is_scenario_complete(session.scenario_id): move_track_to_data(user.id, session.scenario_id, session.speaker_id)
move_scenario_to_data(session.scenario_id)
# Получаем статистику пользователя # Получаем статистику пользователя
stats = get_user_stats(user.id) stats = get_user_stats(user.id)

View File

@@ -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" 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: def move_track_to_data(user_id: int, scenario_id: str, speaker_id: int) -> None:
"""Переносит завершённую дорожку из data_partial в data.""" """Переносит завершённую дорожку из data_partial в data."""
partial_dir = get_partial_dir(scenario_id) 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)) shutil.move(str(src), str(dst))
moved_count += 1 moved_count += 1
logger.info( # Удаляем пустую папку partial
f"Перенесено {moved_count} файлов для дорожки " if partial_dir.exists() and not any(partial_dir.iterdir()):
f"{scenario_id}/{speaker_id} (user_id={user_id})" 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: def delete_partial_track(user_id: int, scenario_id: str, speaker_id: int) -> None: