"""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", ]