"""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 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", # Base exceptions "VideoArchiverError", "CommandError", "EventError", "CogError", "ErrorContext", "ErrorSeverity", "ProcessingError", # Setup functions "setup", "teardown" ]