"""VideoArchiver cog for Red-DiscordBot""" import sys import asyncio import logging import importlib from typing import Optional from redbot.core.bot import Red # type: ignore # Force reload of all modules modules_to_reload = [ ".utils.exceptions", ".utils", ".processor", ".processor.core", ".processor.queue_processor", ".queue", ".queue.types", # Added types module ".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] try: # Try relative imports first from . import utils from . import processor from . import queue from . import ffmpeg from . import database from . import config from . import 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, ) except ImportError: # Fall back to absolute imports if relative imports fail from videoarchiver import utils from videoarchiver import processor from videoarchiver import queue from videoarchiver import ffmpeg from videoarchiver import database from videoarchiver import config from videoarchiver import core from videoarchiver.core.base import VideoArchiver from videoarchiver.core.initialization import initialize_cog, init_callback from videoarchiver.core.cleanup import cleanup_resources from videoarchiver.utils.exceptions import ( VideoArchiverError, CommandError, EventError, CogError, ErrorContext, ErrorSeverity, ProcessingError, ) # Reload all modules importlib.reload(utils) importlib.reload(processor) importlib.reload(queue) importlib.reload(ffmpeg) importlib.reload(database) importlib.reload(config) importlib.reload(core) # Import all submodules from .database import * from .ffmpeg import * from .queue import * from .processor import * from .config_manager import * from .update_checker import * from .queue.cleaners import * from .database import * from .utils import * from .core import * from .config import * 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", ]