Files
Pac-cogs/videoarchiver/__init__.py
2024-11-18 01:01:12 +00:00

229 lines
5.9 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 # 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",
]