Implement audio record management features in AsyncBotDB and AudioRepository
- Added methods to delete audio moderation records and retrieve all audio records in async_db.py. - Enhanced AudioRepository with functionality to delete audio records by file name and retrieve all audio message records. - Improved logging for audio record operations to enhance monitoring and debugging capabilities. - Updated related handlers to ensure proper integration of new audio management features.
This commit is contained in:
103
scripts/voice_cleanup.py
Normal file
103
scripts/voice_cleanup.py
Normal file
@@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Скрипт для диагностики и очистки проблем с голосовыми файлами
|
||||
"""
|
||||
import asyncio
|
||||
import sys
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# Добавляем корневую директорию проекта в путь
|
||||
project_root = Path(__file__).parent.parent
|
||||
sys.path.insert(0, str(project_root))
|
||||
|
||||
from database.async_db import AsyncBotDB
|
||||
from helper_bot.handlers.voice.cleanup_utils import VoiceFileCleanupUtils
|
||||
from logs.custom_logger import logger
|
||||
|
||||
|
||||
async def main():
|
||||
"""Основная функция скрипта"""
|
||||
try:
|
||||
# Инициализация базы данных
|
||||
db_path = "database/tg-bot-database.db"
|
||||
if not os.path.exists(db_path):
|
||||
logger.error(f"База данных не найдена: {db_path}")
|
||||
return
|
||||
|
||||
bot_db = AsyncBotDB(db_path)
|
||||
cleanup_utils = VoiceFileCleanupUtils(bot_db)
|
||||
|
||||
print("=== Диагностика голосовых файлов ===")
|
||||
|
||||
# Запускаем полную диагностику
|
||||
diagnostic_result = await cleanup_utils.run_full_diagnostic()
|
||||
|
||||
print(f"\n📊 Статистика диска:")
|
||||
if "error" in diagnostic_result["disk_stats"]:
|
||||
print(f" ❌ Ошибка: {diagnostic_result['disk_stats']['error']}")
|
||||
else:
|
||||
stats = diagnostic_result["disk_stats"]
|
||||
print(f" 📁 Директория: {stats['directory']}")
|
||||
print(f" 📄 Всего файлов: {stats['total_files']}")
|
||||
print(f" 💾 Размер: {stats['total_size_mb']} MB")
|
||||
|
||||
print(f"\n🗄️ База данных:")
|
||||
print(f" 📝 Записей в БД: {diagnostic_result['db_records_count']}")
|
||||
print(f" 🔍 Записей без файлов: {diagnostic_result['orphaned_db_records_count']}")
|
||||
print(f" 📁 Файлов без записей: {diagnostic_result['orphaned_files_count']}")
|
||||
|
||||
print(f"\n📋 Статус: {diagnostic_result['status']}")
|
||||
|
||||
if diagnostic_result['status'] == 'issues_found':
|
||||
print("\n⚠️ Найдены проблемы!")
|
||||
|
||||
if diagnostic_result['orphaned_db_records_count'] > 0:
|
||||
print(f"\n🗑️ Записи в БД без файлов (первые 10):")
|
||||
for file_name, user_id in diagnostic_result['orphaned_db_records']:
|
||||
print(f" - {file_name} (user_id: {user_id})")
|
||||
|
||||
if diagnostic_result['orphaned_files_count'] > 0:
|
||||
print(f"\n📁 Файлы без записей в БД (первые 10):")
|
||||
for file_path in diagnostic_result['orphaned_files']:
|
||||
print(f" - {file_path}")
|
||||
|
||||
# Предлагаем очистку
|
||||
print("\n🧹 Хотите выполнить очистку?")
|
||||
print("1. Удалить записи в БД без файлов")
|
||||
print("2. Удалить файлы без записей в БД")
|
||||
print("3. Выполнить полную очистку")
|
||||
print("4. Выход")
|
||||
|
||||
choice = input("\nВыберите действие (1-4): ").strip()
|
||||
|
||||
if choice == "1":
|
||||
print("\n🗑️ Удаление записей в БД без файлов...")
|
||||
deleted = await cleanup_utils.cleanup_orphaned_db_records(dry_run=False)
|
||||
print(f"✅ Удалено {deleted} записей")
|
||||
|
||||
elif choice == "2":
|
||||
print("\n📁 Удаление файлов без записей в БД...")
|
||||
deleted = await cleanup_utils.cleanup_orphaned_files(dry_run=False)
|
||||
print(f"✅ Удалено {deleted} файлов")
|
||||
|
||||
elif choice == "3":
|
||||
print("\n🧹 Полная очистка...")
|
||||
db_deleted = await cleanup_utils.cleanup_orphaned_db_records(dry_run=False)
|
||||
files_deleted = await cleanup_utils.cleanup_orphaned_files(dry_run=False)
|
||||
print(f"✅ Удалено {db_deleted} записей в БД и {files_deleted} файлов")
|
||||
|
||||
elif choice == "4":
|
||||
print("👋 Выход...")
|
||||
else:
|
||||
print("❌ Неверный выбор")
|
||||
else:
|
||||
print("\n✅ Проблем не найдено!")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка в скрипте: {e}")
|
||||
print(f"❌ Ошибка: {e}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user