Перенос только законченных треков в data
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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,6 +245,11 @@ def move_track_to_data(user_id: int, scenario_id: str, speaker_id: int) -> None:
|
||||
shutil.move(str(src), str(dst))
|
||||
moved_count += 1
|
||||
|
||||
# Удаляем пустую папку 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})"
|
||||
|
||||
Reference in New Issue
Block a user