Перенос только законченных треков в data
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user