Files
Pac-cogs/videoarchiver/__init__.py

219 lines
5.5 KiB
Python

"""VideoArchiver cog for Red-DiscordBot"""
import sys
import asyncio
import logging
import importlib
from typing import Optional
from redbot.core.bot import Red
# Force reload of all modules
modules_to_reload = [
'.utils.exceptions',
'.utils',
'.processor',
'.processor.core',
'.processor.queue_processor',
'.queue',
'.queue.models',
'.queue.manager',
'.queue.cleaners',
'.queue.cleaners.guild_cleaner',
'.queue.cleaners.history_cleaner',
'.queue.cleaners.tracking_cleaner',
'.queue.monitoring',
'.queue.recovery_manager',
'.queue.state_manager',
'.ffmpeg',
'.ffmpeg.binary_manager',
'.ffmpeg.encoder_params',
'.ffmpeg.exceptions',
'.ffmpeg.ffmpeg_downloader',
'.ffmpeg.ffmpeg_manager',
'.ffmpeg.gpu_detector',
'.ffmpeg.process_manager',
'.ffmpeg.verification_manager',
'.ffmpeg.video_analyzer',
'.database',
'.database.connection_manager',
'.database.query_manager',
'.database.schema_manager',
'.database.video_archive_db',
'.config',
'.config.channel_manager',
'.config.exceptions',
'.config.role_manager',
'.config.settings_formatter',
'.config.validation_manager',
'.core',
'.core.base',
'.core.cleanup',
'.core.commands',
'.core.commands.archiver_commands',
'.core.commands.database_commands',
'.core.commands.settings_commands',
'.core.component_manager',
'.core.error_handler',
'.core.events',
'.core.guild',
'.core.initialization',
'.core.lifecycle',
'.core.response_handler',
'.core.settings'
]
# Remove modules to force fresh import
for module in modules_to_reload:
if module in sys.modules:
del sys.modules[module]
# Import and reload utils
from . import utils
importlib.reload(utils)
# Import and reload processor
from . import processor
importlib.reload(processor)
# Import and reload queue
from . import queue
importlib.reload(queue)
# Import and reload ffmpeg
from . import ffmpeg
importlib.reload(ffmpeg)
# Import and reload database
from . import database
importlib.reload(database)
# Import and reload config
from . import config
importlib.reload(config)
# Import and reload core
from . import core
importlib.reload(core)
from .core.base import VideoArchiver
from .core.initialization import initialize_cog, init_callback
from .core.cleanup import cleanup_resources
from .utils.exceptions import (
VideoArchiverError,
CommandError,
EventError,
CogError,
ErrorContext,
ErrorSeverity,
ProcessingError
)
from .database import VideoArchiveDB
from .ffmpeg import FFmpegManager
from .queue import EnhancedVideoQueueManager
from .processor import VideoProcessor
from .config_manager import ConfigManager
from .update_checker import UpdateChecker
# Additional imports from subdirectories
from .queue.cleaners import QueueCleaner
from .queue import QueueStateManager, QueueMetricsManager, QueueProcessor
from .ffmpeg import BinaryManager, EncoderParams, GPUDetector, ProcessManager
from .database import DatabaseConnectionManager, DatabaseQueryManager, DatabaseSchemaManager
from .processor import CleanupManager, MessageHandler, QueueProcessor
from .utils import CompressionManager, DirectoryManager, DownloadManager, FileOperations
logger = logging.getLogger("VideoArchiver")
# Track initialization task
_init_task: Optional[asyncio.Task] = None
# Version information
__version__ = "1.0.0"
__author__ = "VideoArchiver Team"
__description__ = "Video archiving cog for Red-DiscordBot"
async def setup(bot: Red) -> None:
"""Load VideoArchiver with proper initialization."""
try:
# Create cog instance
cog = VideoArchiver(bot)
# Start initialization in background
global _init_task
_init_task = asyncio.create_task(initialize_cog(cog))
_init_task.add_done_callback(lambda t: init_callback(cog, t))
# Add cog to bot
await bot.add_cog(cog)
logger.info("VideoArchiver cog loaded successfully")
except Exception as e:
logger.error(f"Failed to load VideoArchiver: {str(e)}")
if _init_task and not _init_task.done():
_init_task.cancel()
raise
async def teardown(bot: Red) -> None:
"""Clean up when unloading."""
try:
# Cancel initialization if still running
if _init_task and not _init_task.done():
_init_task.cancel()
# Remove cog and clean up resources
if "VideoArchiver" in bot.cogs:
cog = bot.get_cog("VideoArchiver")
if cog:
await cleanup_resources(cog)
await bot.remove_cog("VideoArchiver")
logger.info("VideoArchiver cog unloaded successfully")
except Exception as e:
logger.error(f"Error during teardown: {str(e)}")
raise
__all__ = [
# Core classes
"VideoArchiver",
"VideoArchiveDB",
"FFmpegManager",
"EnhancedVideoQueueManager",
"VideoProcessor",
"ConfigManager",
"UpdateChecker",
"QueueCleaner",
"QueueStateManager",
"QueueMetricsManager",
"QueueProcessor",
"BinaryManager",
"EncoderParams",
"GPUDetector",
"ProcessManager",
"DatabaseConnectionManager",
"DatabaseQueryManager",
"DatabaseSchemaManager",
"CleanupManager",
"MessageHandler",
"CompressionManager",
"DirectoryManager",
"DownloadManager",
"FileOperations",
# Base exceptions
"VideoArchiverError",
"CommandError",
"EventError",
"CogError",
"ErrorContext",
"ErrorSeverity",
"ProcessingError",
# Setup functions
"setup",
"teardown"
]