Converted all 'from videoarchiver.' imports to relative imports

This commit is contained in:
pacnpal
2024-11-17 16:05:12 +00:00
parent c830be2841
commit 62c97f0b01
69 changed files with 417 additions and 359 deletions

View File

@@ -39,10 +39,10 @@ importlib.reload(videoarchiver.processor)
import videoarchiver.queue
importlib.reload(videoarchiver.queue)
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 (
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,
@@ -51,12 +51,12 @@ from videoarchiver.utils.exceptions import (
ErrorSeverity,
ProcessingError
)
from videoarchiver.database import VideoArchiveDB
from videoarchiver.ffmpeg import FFmpegManager
from videoarchiver.queue import EnhancedVideoQueueManager
from videoarchiver.processor import VideoProcessor
from videoarchiver.config_manager import ConfigManager
from videoarchiver.update_checker import UpdateChecker
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")

View File

@@ -1,4 +1,4 @@
"""Re-export commands from core.base"""
from videoarchiver.core.base import VideoArchiver
from .core.base import VideoArchiver
__all__ = ['VideoArchiver']

View File

@@ -1,6 +1,6 @@
"""Configuration management module"""
from videoarchiver.config.exceptions import (
from .exceptions import (
ConfigurationError,
ValidationError,
PermissionError,
@@ -10,10 +10,10 @@ from videoarchiver.config.exceptions import (
SchemaError,
DiscordAPIError,
)
from videoarchiver.config.channel_manager import ChannelManager
from videoarchiver.config.role_manager import RoleManager
from videoarchiver.config.settings_formatter import SettingsFormatter
from videoarchiver.config.validation_manager import ValidationManager
from .channel_manager import ChannelManager
from .role_manager import RoleManager
from .settings_formatter import SettingsFormatter
from .validation_manager import ValidationManager
__all__ = [
'ConfigurationError',

View File

@@ -4,7 +4,7 @@ import logging
from typing import Dict, List, Optional, Tuple
import discord
from videoarchiver.config.exceptions import (
from .exceptions import (
ConfigurationError as ConfigError,
DiscordAPIError,
)

View File

@@ -4,7 +4,7 @@ import logging
from typing import Dict, List, Set, Tuple, Optional, Any
import discord
from videoarchiver.config.exceptions import ConfigurationError as ConfigError
from .exceptions import ConfigurationError as ConfigError
logger = logging.getLogger("RoleManager")

View File

@@ -5,7 +5,7 @@ from typing import Dict, Any, List
from datetime import datetime
import discord
from videoarchiver.config.exceptions import ConfigurationError as ConfigError
from .config.exceptions import ConfigurationError as ConfigError
logger = logging.getLogger("SettingsFormatter")

View File

@@ -2,7 +2,7 @@
import logging
from typing import Any, Dict, List, Union
from videoarchiver.config.exceptions import ConfigurationError as ConfigError
from .exceptions import ConfigurationError as ConfigError
logger = logging.getLogger("ConfigValidation")

View File

@@ -6,11 +6,11 @@ from typing import Dict, Any, Optional, List, Union
import discord
from redbot.core import Config
from videoarchiver.config.validation_manager import ValidationManager
from videoarchiver.config.settings_formatter import SettingsFormatter
from videoarchiver.config.channel_manager import ChannelManager
from videoarchiver.config.role_manager import RoleManager
from videoarchiver.utils.exceptions import ConfigurationError as ConfigError
from .config.validation_manager import ValidationManager
from .config.settings_formatter import SettingsFormatter
from .config.channel_manager import ChannelManager
from .config.role_manager import RoleManager
from .utils.exceptions import ConfigurationError as ConfigError
logger = logging.getLogger("VideoArchiver")

View File

@@ -1,5 +1,5 @@
"""Core module for VideoArchiver cog"""
from videoarchiver.core.base import VideoArchiver
from .core.base import VideoArchiver
__all__ = ["VideoArchiver"]

View File

@@ -12,22 +12,22 @@ import discord
from redbot.core.bot import Red
from redbot.core.commands import GroupCog, Context
from videoarchiver.core.settings import Settings
from videoarchiver.core.lifecycle import LifecycleManager, LifecycleState
from videoarchiver.core.component_manager import ComponentManager, ComponentState
from videoarchiver.core.error_handler import error_manager, handle_command_error
from videoarchiver.core.response_handler import response_manager
from videoarchiver.core.commands.archiver_commands import setup_archiver_commands
from videoarchiver.core.commands.database_commands import setup_database_commands
from videoarchiver.core.commands.settings_commands import setup_settings_commands
from videoarchiver.core.events import setup_events, EventManager
from .settings import Settings
from .lifecycle import LifecycleManager, LifecycleState
from .component_manager import ComponentManager, ComponentState
from .error_handler import error_manager, handle_command_error
from .response_handler import response_manager
from .commands.archiver_commands import setup_archiver_commands
from .commands.database_commands import setup_database_commands
from .commands.settings_commands import setup_settings_commands
from .events import setup_events, EventManager
from videoarchiver.processor.core import Processor
from videoarchiver.queue.manager import QueueManager
from videoarchiver.ffmpeg.ffmpeg_manager import FFmpegManager
from videoarchiver.database.video_archive_db import VideoArchiveDB
from videoarchiver.config_manager import ConfigManager
from videoarchiver.utils.exceptions import (
from .processor.core import Processor
from .queue.manager import QueueManager
from .ffmpeg.ffmpeg_manager import FFmpegManager
from .database.video_archive_db import VideoArchiveDB
from .config_manager import ConfigManager
from .utils.exceptions import (
CogError,
ErrorContext,
ErrorSeverity

View File

@@ -8,15 +8,15 @@ from enum import Enum, auto
from pathlib import Path
from typing import TYPE_CHECKING, Dict, Any, Optional, TypedDict, ClassVar
from videoarchiver.utils.file_ops import cleanup_downloads
from videoarchiver.utils.exceptions import (
from .utils.file_ops import cleanup_downloads
from .utils.exceptions import (
CleanupError,
ErrorContext,
ErrorSeverity
)
if TYPE_CHECKING:
from videoarchiver.core.base import VideoArchiver
from .base import VideoArchiver
logger = logging.getLogger("VideoArchiver")

View File

@@ -6,7 +6,7 @@
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from videoarchiver.core.base import VideoArchiver
from .base import VideoArchiver
def setup_commands(cog: "VideoArchiver") -> None:
"""Command setup is now handled in the VideoArchiver class"""

View File

@@ -1,8 +1,8 @@
"""Command handlers for VideoArchiver"""
from videoarchiver.core.commands.archiver_commands import setup_archiver_commands
from videoarchiver.core.commands.database_commands import setup_database_commands
from videoarchiver.core.commands.settings_commands import setup_settings_commands
from .core.commands.archiver_commands import setup_archiver_commands
from .core.commands.database_commands import setup_database_commands
from .core.commands.settings_commands import setup_settings_commands
__all__ = [
'setup_archiver_commands',

View File

@@ -9,8 +9,8 @@ from discord import app_commands
from redbot.core import commands
from redbot.core.commands import Context, hybrid_group, guild_only, admin_or_permissions
from videoarchiver.core.response_handler import handle_response, ResponseType
from videoarchiver.utils.exceptions import (
from .core.response_handler import handle_response, ResponseType
from .utils.exceptions import (
CommandError,
ErrorContext,
ErrorSeverity

View File

@@ -10,14 +10,14 @@ from discord import app_commands
from redbot.core import commands
from redbot.core.commands import Context, hybrid_group, guild_only, admin_or_permissions
from videoarchiver.core.response_handler import handle_response, ResponseType
from videoarchiver.utils.exceptions import (
from .core.response_handler import handle_response, ResponseType
from .utils.exceptions import (
CommandError,
ErrorContext,
ErrorSeverity,
DatabaseError
)
from videoarchiver.database.video_archive_db import VideoArchiveDB
from .database.video_archive_db import VideoArchiveDB
logger = logging.getLogger("VideoArchiver")

View File

@@ -9,9 +9,9 @@ from discord import app_commands
from redbot.core import commands
from redbot.core.commands import Context, hybrid_group, guild_only, admin_or_permissions
from videoarchiver.core.settings import VideoFormat, VideoQuality
from videoarchiver.core.response_handler import handle_response, ResponseType
from videoarchiver.utils.exceptions import (
from .core.settings import VideoFormat, VideoQuality
from .core.response_handler import handle_response, ResponseType
from .utils.exceptions import (
CommandError,
ErrorContext,
ErrorSeverity

View File

@@ -2,27 +2,36 @@
import logging
import asyncio
from typing import Dict, Any, Optional, Set, List, TypedDict, ClassVar, Type, Union, Protocol
from typing import (
Dict,
Any,
Optional,
Set,
List,
TypedDict,
ClassVar,
Type,
Union,
Protocol,
)
from enum import Enum, auto
from datetime import datetime
from pathlib import Path
import importlib
from videoarchiver.utils.exceptions import (
ComponentError,
ErrorContext,
ErrorSeverity
)
from videoarchiver.utils.path_manager import ensure_directory
from videoarchiver.config_manager import ConfigManager
from videoarchiver.processor.core import Processor
from videoarchiver.queue.manager import EnhancedVideoQueueManager
from videoarchiver.ffmpeg.ffmpeg_manager import FFmpegManager
from .utils.exceptions import ComponentError, ErrorContext, ErrorSeverity
from .utils.path_manager import ensure_directory
from .config_manager import ConfigManager
from .processor.core import Processor
from .queue.manager import EnhancedVideoQueueManager
from .ffmpeg.ffmpeg_manager import FFmpegManager
logger = logging.getLogger("VideoArchiver")
class ComponentState(Enum):
"""Possible states of a component"""
UNREGISTERED = auto()
REGISTERED = auto()
INITIALIZING = auto()
@@ -30,16 +39,20 @@ class ComponentState(Enum):
ERROR = auto()
SHUTDOWN = auto()
class ComponentHistory(TypedDict):
"""Type definition for component history entry"""
component: str
state: str
timestamp: str
error: Optional[str]
duration: float
class ComponentStatus(TypedDict):
"""Type definition for component status"""
state: str
registration_time: Optional[str]
initialization_time: Optional[str]
@@ -48,8 +61,10 @@ class ComponentStatus(TypedDict):
error: Optional[str]
health: bool
class Initializable(Protocol):
"""Protocol for initializable components"""
async def initialize(self) -> None:
"""Initialize the component"""
...
@@ -58,6 +73,7 @@ class Initializable(Protocol):
"""Shutdown the component"""
...
class Component:
"""Base class for managed components"""
@@ -98,6 +114,7 @@ class Component:
"""Check if component is healthy"""
return self.state == ComponentState.READY and not self.error
class ComponentTracker:
"""Tracks component states and relationships"""
@@ -108,10 +125,7 @@ class ComponentTracker:
self.history: List[ComponentHistory] = []
def update_state(
self,
name: str,
state: ComponentState,
error: Optional[str] = None
self, name: str, state: ComponentState, error: Optional[str] = None
) -> None:
"""Update component state"""
self.states[name] = state
@@ -124,24 +138,24 @@ class ComponentTracker:
last_time = datetime.fromisoformat(last_entry["timestamp"])
duration = (now - last_time).total_seconds()
self.history.append(ComponentHistory(
self.history.append(
ComponentHistory(
component=name,
state=state.name,
timestamp=now.isoformat(),
error=error,
duration=duration
))
duration=duration,
)
)
# Cleanup old history
if len(self.history) > self.MAX_HISTORY:
self.history = self.history[-self.MAX_HISTORY:]
self.history = self.history[-self.MAX_HISTORY :]
def get_component_history(self, name: str) -> List[ComponentHistory]:
"""Get state history for a component"""
return [
entry for entry in self.history
if entry["component"] == name
]
return [entry for entry in self.history if entry["component"] == name]
class DependencyManager:
"""Manages component dependencies"""
@@ -169,8 +183,8 @@ class DependencyManager:
"DependencyManager",
"add_dependency",
{"component": component, "dependency": dependency},
ErrorSeverity.HIGH
)
ErrorSeverity.HIGH,
),
)
if component not in self.dependencies:
@@ -192,8 +206,7 @@ class DependencyManager:
return False
visited.add(start)
return any(
has_path(dep, end)
for dep in self.dependencies.get(start, set())
has_path(dep, end) for dep in self.dependencies.get(start, set())
)
return has_path(dependency, component)
@@ -223,8 +236,7 @@ class DependencyManager:
def visit(component: str) -> None:
if component in temp_visited:
cycle = " -> ".join(
name for name in self.dependencies
if name in temp_visited
name for name in self.dependencies if name in temp_visited
)
raise ComponentError(
f"Dependency cycle detected: {cycle}",
@@ -232,8 +244,8 @@ class DependencyManager:
"DependencyManager",
"get_initialization_order",
{"cycle": cycle},
ErrorSeverity.HIGH
)
ErrorSeverity.HIGH,
),
)
if component in visited:
return
@@ -256,12 +268,13 @@ class DependencyManager:
"DependencyManager",
"get_initialization_order",
None,
ErrorSeverity.HIGH
)
ErrorSeverity.HIGH,
),
)
return order
class ComponentManager:
"""Manages VideoArchiver components"""
@@ -269,7 +282,7 @@ class ComponentManager:
"config_manager": (ConfigManager, set()),
"processor": (Processor, {"config_manager"}),
"queue_manager": (EnhancedVideoQueueManager, {"config_manager"}),
"ffmpeg_mgr": (FFmpegManager, set())
"ffmpeg_mgr": (FFmpegManager, set()),
}
def __init__(self, cog: Any) -> None:
@@ -282,7 +295,7 @@ class ComponentManager:
self,
name: str,
component: Union[Component, Any],
dependencies: Optional[Set[str]] = None
dependencies: Optional[Set[str]] = None,
) -> None:
"""
Register a component with dependencies.
@@ -314,8 +327,8 @@ class ComponentManager:
"ComponentManager",
"register",
{"component": name, "dependency": dep},
ErrorSeverity.HIGH
)
ErrorSeverity.HIGH,
),
)
self.dependency_manager.add_dependency(name, dep)
@@ -335,8 +348,8 @@ class ComponentManager:
"ComponentManager",
"register",
{"component": name},
ErrorSeverity.HIGH
)
ErrorSeverity.HIGH,
),
)
async def initialize_components(self) -> None:
@@ -374,8 +387,8 @@ class ComponentManager:
"ComponentManager",
"initialize_components",
{"component": name},
ErrorSeverity.HIGH
)
ErrorSeverity.HIGH,
),
)
except Exception as e:
@@ -387,8 +400,8 @@ class ComponentManager:
"ComponentManager",
"initialize_components",
None,
ErrorSeverity.HIGH
)
ErrorSeverity.HIGH,
),
)
async def _initialize_core_components(self) -> None:
@@ -421,8 +434,8 @@ class ComponentManager:
"ComponentManager",
"_initialize_core_components",
None,
ErrorSeverity.HIGH
)
ErrorSeverity.HIGH,
),
)
async def _initialize_paths(self) -> None:
@@ -450,11 +463,8 @@ class ComponentManager:
raise ComponentError(
error,
context=ErrorContext(
"ComponentManager",
"_initialize_paths",
None,
ErrorSeverity.HIGH
)
"ComponentManager", "_initialize_paths", None, ErrorSeverity.HIGH
),
)
def get(self, name: str) -> Optional[Component]:
@@ -469,7 +479,9 @@ class ComponentManager:
ComponentError: If shutdown fails
"""
try:
shutdown_order = reversed(self.dependency_manager.get_initialization_order())
shutdown_order = reversed(
self.dependency_manager.get_initialization_order()
)
for name in shutdown_order:
if name not in self._components:
@@ -489,8 +501,8 @@ class ComponentManager:
"ComponentManager",
"shutdown_components",
{"component": name},
ErrorSeverity.HIGH
)
ErrorSeverity.HIGH,
),
)
except Exception as e:
@@ -499,11 +511,8 @@ class ComponentManager:
raise ComponentError(
error,
context=ErrorContext(
"ComponentManager",
"shutdown_components",
None,
ErrorSeverity.HIGH
)
"ComponentManager", "shutdown_components", None, ErrorSeverity.HIGH
),
)
def clear(self) -> None:
@@ -521,12 +530,20 @@ class ComponentManager:
return {
name: ComponentStatus(
state=self.tracker.states.get(name, ComponentState.UNREGISTERED).name,
registration_time=component.registration_time.isoformat() if component.registration_time else None,
initialization_time=component.initialization_time.isoformat() if component.initialization_time else None,
registration_time=(
component.registration_time.isoformat()
if component.registration_time
else None
),
initialization_time=(
component.initialization_time.isoformat()
if component.initialization_time
else None
),
dependencies=self.dependency_manager.get_dependencies(name),
dependents=self.dependency_manager.get_dependents(name),
error=component.error,
health=component.is_healthy()
health=component.is_healthy(),
)
for name, component in self._components.items()
}

View File

@@ -14,7 +14,7 @@ from redbot.core.commands import (
CommandError
)
from videoarchiver.utils.exceptions import (
from .utils.exceptions import (
VideoArchiverError,
ErrorSeverity,
ErrorContext,
@@ -33,7 +33,7 @@ from videoarchiver.utils.exceptions import (
ResourceExhaustedError,
ConfigurationError
)
from videoarchiver.core.response_handler import response_manager
from .core.response_handler import response_manager
logger = logging.getLogger("VideoArchiver")

View File

@@ -9,15 +9,15 @@ from typing import TYPE_CHECKING, Dict, Any, Optional, TypedDict, ClassVar, List
import discord
from videoarchiver.processor.constants import REACTIONS
from videoarchiver.processor.reactions import handle_archived_reaction
from videoarchiver.core.guild import initialize_guild_components, cleanup_guild_components
from videoarchiver.core.error_handler import error_manager
from videoarchiver.core.response_handler import response_manager
from videoarchiver.utils.exceptions import EventError, ErrorContext, ErrorSeverity
from .processor.constants import REACTIONS
from .processor.reactions import handle_archived_reaction
from .core.guild import initialize_guild_components, cleanup_guild_components
from .core.error_handler import error_manager
from .core.response_handler import response_manager
from .utils.exceptions import EventError, ErrorContext, ErrorSeverity
if TYPE_CHECKING:
from videoarchiver.core.base import VideoArchiver
from .core.base import VideoArchiver
logger = logging.getLogger("VideoArchiver")

View File

@@ -4,13 +4,13 @@ import logging
from pathlib import Path
from typing import TYPE_CHECKING, Dict, Any, Optional
from videoarchiver.utils.download_core import DownloadCore
from videoarchiver.utils.message_manager import MessageManager
from videoarchiver.utils.file_ops import cleanup_downloads
from videoarchiver.utils.exceptions import VideoArchiverError as ProcessingError
from .utils.download_core import DownloadCore
from .utils.message_manager import MessageManager
from .utils.file_ops import cleanup_downloads
from .utils.exceptions import VideoArchiverError as ProcessingError
if TYPE_CHECKING:
from videoarchiver.core.base import VideoArchiver
from .core.base import VideoArchiver
logger = logging.getLogger("VideoArchiver")

View File

@@ -4,15 +4,15 @@ from typing import TYPE_CHECKING, Optional, Dict, Any
import asyncio
import logging
from videoarchiver.utils.exceptions import (
from .utils.exceptions import (
ComponentError,
ErrorContext,
ErrorSeverity
)
from videoarchiver.core.lifecycle import LifecycleState
from .core.lifecycle import LifecycleState
if TYPE_CHECKING:
from videoarchiver.core.base import VideoArchiver
from .core.base import VideoArchiver
logger = logging.getLogger("VideoArchiver")

View File

@@ -7,8 +7,8 @@ from typing import Optional, Dict, Any, Set, List, Callable, TypedDict, ClassVar
from enum import Enum, auto
from datetime import datetime
from videoarchiver.core.cleanup import cleanup_resources, force_cleanup_resources
from videoarchiver.utils.exceptions import (
from .core.cleanup import cleanup_resources, force_cleanup_resources
from .utils.exceptions import (
VideoArchiverError,
ErrorContext,
ErrorSeverity,

View File

@@ -7,7 +7,7 @@ from datetime import datetime
import discord
from redbot.core.commands import Context
from videoarchiver.utils.exceptions import ErrorSeverity
from .utils.exceptions import ErrorSeverity
logger = logging.getLogger("VideoArchiver")

View File

@@ -4,7 +4,7 @@ from typing import Dict, Any, List, Optional, Union, TypedDict, ClassVar
from dataclasses import dataclass, field
from enum import Enum, auto
from videoarchiver.utils.exceptions import (
from .utils.exceptions import (
ConfigurationError,
ErrorContext,
ErrorSeverity

View File

@@ -1,9 +1,9 @@
"""Database management package for video archiving"""
from videoarchiver.database.connection_manager import DatabaseConnectionManager
from videoarchiver.database.query_manager import DatabaseQueryManager
from videoarchiver.database.schema_manager import DatabaseSchemaManager
from videoarchiver.database.video_archive_db import VideoArchiveDB
from .connection_manager import DatabaseConnectionManager
from .query_manager import DatabaseQueryManager
from .schema_manager import DatabaseSchemaManager
from .video_archive_db import VideoArchiveDB
__all__ = [
'DatabaseConnectionManager',

View File

@@ -10,7 +10,7 @@ import threading
from queue import Queue, Empty
from datetime import datetime
from videoarchiver.utils.exceptions import (
from ..utils.exceptions import (
DatabaseError,
ErrorContext,
ErrorSeverity

View File

@@ -7,7 +7,7 @@ from typing import List, Dict, Any, Optional, TypedDict, ClassVar, Union
from enum import Enum, auto
from datetime import datetime
from videoarchiver.utils.exceptions import DatabaseError, ErrorContext, ErrorSeverity
from ..utils.exceptions import DatabaseError, ErrorContext, ErrorSeverity
logger = logging.getLogger("DBSchemaManager")

View File

@@ -4,9 +4,9 @@ import logging
from pathlib import Path
from typing import Optional, Dict, Any, List
from videoarchiver.database.schema_manager import DatabaseSchemaManager
from videoarchiver.database.query_manager import DatabaseQueryManager
from videoarchiver.database.connection_manager import DatabaseConnectionManager
from .schema_manager import DatabaseSchemaManager
from .query_manager import DatabaseQueryManager
from .connection_manager import DatabaseConnectionManager
logger = logging.getLogger("VideoArchiverDB")

View File

@@ -1,6 +1,6 @@
"""Base exceptions for VideoArchiver"""
from videoarchiver.utils.exceptions import (
from .utils.exceptions import (
VideoArchiverError,
ConfigurationError,
VideoVerificationError,
@@ -23,24 +23,24 @@ from videoarchiver.utils.exceptions import (
# Re-export all exceptions
__all__ = [
'VideoArchiverError',
'ConfigurationError',
'VideoVerificationError',
'QueueError',
'FileCleanupError',
'ResourceExhaustedError',
'ProcessingError',
'CleanupError',
'FileOperationError',
'VideoDownloadError',
'VideoProcessingError',
'VideoUploadError',
'VideoCleanupError',
'PermissionError',
'NetworkError',
'ResourceError',
'ComponentError',
'DiscordAPIError',
"VideoArchiverError",
"ConfigurationError",
"VideoVerificationError",
"QueueError",
"FileCleanupError",
"ResourceExhaustedError",
"ProcessingError",
"CleanupError",
"FileOperationError",
"VideoDownloadError",
"VideoProcessingError",
"VideoUploadError",
"VideoCleanupError",
"PermissionError",
"NetworkError",
"ResourceError",
"ComponentError",
"DiscordAPIError",
]
# Alias exceptions for backward compatibility

View File

@@ -18,12 +18,12 @@ logging.basicConfig(
logger = logging.getLogger("VideoArchiver")
# Import components after logging is configured
from videoarchiver.ffmpeg.ffmpeg_manager import FFmpegManager
from videoarchiver.ffmpeg.video_analyzer import VideoAnalyzer
from videoarchiver.ffmpeg.gpu_detector import GPUDetector
from videoarchiver.ffmpeg.encoder_params import EncoderParams
from videoarchiver.ffmpeg.ffmpeg_downloader import FFmpegDownloader
from videoarchiver.ffmpeg.exceptions import (
from .ffmpeg_manager import FFmpegManager
from .video_analyzer import VideoAnalyzer
from .gpu_detector import GPUDetector
from .encoder_params import EncoderParams
from .ffmpeg_downloader import FFmpegDownloader
from .exceptions import (
FFmpegError,
DownloadError,
VerificationError,

View File

@@ -5,15 +5,15 @@ import os
from pathlib import Path
from typing import Dict, Optional
from videoarchiver.ffmpeg.exceptions import (
from .exceptions import (
FFmpegError,
DownloadError,
VerificationError,
PermissionError,
FFmpegNotFoundError
)
from videoarchiver.ffmpeg.ffmpeg_downloader import FFmpegDownloader
from videoarchiver.ffmpeg.verification_manager import VerificationManager
from .ffmpeg_downloader import FFmpegDownloader
from .verification_manager import VerificationManager
logger = logging.getLogger("FFmpegBinaryManager")

View File

@@ -3,7 +3,7 @@
import os
import logging
from typing import Dict, Any
from videoarchiver.ffmpeg.exceptions import CompressionError, QualityError, BitrateError
from .exceptions import CompressionError, QualityError, BitrateError
logger = logging.getLogger("VideoArchiver")

View File

@@ -16,7 +16,7 @@ from typing import Optional, Dict, List
import time
import lzma
from videoarchiver.ffmpeg.exceptions import DownloadError
from .exceptions import DownloadError
logger = logging.getLogger("VideoArchiver")

View File

@@ -6,17 +6,17 @@ import multiprocessing
from pathlib import Path
from typing import Dict, Any, Optional
from videoarchiver.ffmpeg.exceptions import (
from .exceptions import (
FFmpegError,
AnalysisError,
FFmpegNotFoundError
)
from videoarchiver.ffmpeg.gpu_detector import GPUDetector
from videoarchiver.ffmpeg.video_analyzer import VideoAnalyzer
from videoarchiver.ffmpeg.encoder_params import EncoderParams
from videoarchiver.ffmpeg.process_manager import ProcessManager
from videoarchiver.ffmpeg.verification_manager import VerificationManager
from videoarchiver.ffmpeg.binary_manager import BinaryManager
from .gpu_detector import GPUDetector
from .video_analyzer import VideoAnalyzer
from .encoder_params import EncoderParams
from .process_manager import ProcessManager
from .verification_manager import VerificationManager
from .binary_manager import BinaryManager
logger = logging.getLogger("VideoArchiver")

View File

@@ -6,7 +6,7 @@ import subprocess
from pathlib import Path
from typing import Dict, List, Optional
from videoarchiver.ffmpeg.exceptions import (
from .exceptions import (
TimeoutError,
VerificationError,
EncodingError,

View File

@@ -1,6 +1,6 @@
"""Re-export video processing components from processor module"""
from videoarchiver.processor import (
from .processor import (
VideoProcessor,
REACTIONS,
MessageHandler,

View File

@@ -3,8 +3,8 @@
from typing import Dict, Any, Optional, Union, List, Tuple
import discord
from videoarchiver.processor.core import VideoProcessor
from videoarchiver.processor.constants import (
from .processor.core import VideoProcessor
from .processor.constants import (
REACTIONS,
ReactionType,
ReactionEmojis,
@@ -12,7 +12,7 @@ from videoarchiver.processor.constants import (
get_reaction,
get_progress_emoji
)
from videoarchiver.processor.url_extractor import (
from .processor.url_extractor import (
URLExtractor,
URLMetadata,
URLPattern,
@@ -21,7 +21,7 @@ from videoarchiver.processor.url_extractor import (
URLValidator,
URLMetadataExtractor
)
from videoarchiver.processor.message_validator import (
from .processor.message_validator import (
MessageValidator,
ValidationContext,
ValidationRule,
@@ -32,15 +32,15 @@ from videoarchiver.processor.message_validator import (
ValidationCacheEntry,
ValidationError
)
from videoarchiver.processor.message_handler import MessageHandler
from videoarchiver.processor.queue_handler import QueueHandler
from videoarchiver.processor.reactions import (
from .processor.message_handler import MessageHandler
from .processor.queue_handler import QueueHandler
from .processor.reactions import (
handle_archived_reaction,
update_queue_position_reaction,
update_progress_reaction,
update_download_progress_reaction
)
from videoarchiver.utils import progress_tracker
from .utils import progress_tracker
# Export public classes and constants
__all__ = [

View File

@@ -18,9 +18,9 @@ from typing import (
)
from datetime import datetime, timedelta
from videoarchiver.processor.queue_handler import QueueHandler
from videoarchiver.ffmpeg.ffmpeg_manager import FFmpegManager
from videoarchiver.utils.exceptions import CleanupError
from .processor.queue_handler import QueueHandler
from .ffmpeg.ffmpeg_manager import FFmpegManager
from .utils.exceptions import CleanupError
logger = logging.getLogger("VideoArchiver")

View File

@@ -8,17 +8,17 @@ from datetime import datetime, timedelta
import discord
from discord.ext import commands
from videoarchiver.processor.message_handler import MessageHandler
from videoarchiver.processor.queue_handler import QueueHandler
from videoarchiver.utils import progress_tracker
from videoarchiver.processor.status_display import StatusDisplay
from videoarchiver.processor.cleanup_manager import CleanupManager, CleanupStrategy
from videoarchiver.processor.constants import REACTIONS
from videoarchiver.queue.manager import EnhancedVideoQueueManager
from videoarchiver.ffmpeg.ffmpeg_manager import FFmpegManager
from videoarchiver.database.video_archive_db import VideoArchiveDB
from videoarchiver.config_manager import ConfigManager
from videoarchiver.utils.exceptions import ProcessorError
from .processor.message_handler import MessageHandler
from .processor.queue_handler import QueueHandler
from .utils import progress_tracker
from .processor.status_display import StatusDisplay
from .processor.cleanup_manager import CleanupManager, CleanupStrategy
from .processor.constants import REACTIONS
from .queue.manager import EnhancedVideoQueueManager
from .ffmpeg.ffmpeg_manager import FFmpegManager
from .database.video_archive_db import VideoArchiveDB
from .config_manager import ConfigManager
from .utils.exceptions import ProcessorError
logger = logging.getLogger("VideoArchiver")

View File

@@ -8,13 +8,13 @@ from datetime import datetime, timedelta
import discord
from discord.ext import commands
from videoarchiver.processor.url_extractor import URLExtractor, URLMetadata
from videoarchiver.processor.message_validator import MessageValidator, ValidationError
from videoarchiver.processor.queue_processor import QueueProcessor, QueuePriority
from videoarchiver.processor.constants import REACTIONS
from videoarchiver.queue.manager import EnhancedVideoQueueManager
from videoarchiver.config_manager import ConfigManager
from videoarchiver.utils.exceptions import MessageHandlerError
from .processor.url_extractor import URLExtractor, URLMetadata
from .processor.message_validator import MessageValidator, ValidationError
from .processor.queue_processor import QueueProcessor, QueuePriority
from .processor.constants import REACTIONS
from .queue.manager import EnhancedVideoQueueManager
from .config_manager import ConfigManager
from .utils.exceptions import MessageHandlerError
logger = logging.getLogger("VideoArchiver")

View File

@@ -7,7 +7,7 @@ from typing import Dict, Optional, Tuple, List, Any, Callable, Set, TypedDict, C
from datetime import datetime
import discord
from videoarchiver.utils.exceptions import ValidationError
from .utils.exceptions import ValidationError
logger = logging.getLogger("VideoArchiver")

View File

@@ -8,14 +8,14 @@ from typing import Optional, Dict, Any, List, Tuple, Set, TypedDict, ClassVar, C
from datetime import datetime
import discord
from videoarchiver.utils import progress_tracker
from videoarchiver.database.video_archive_db import VideoArchiveDB
from videoarchiver.utils.download_manager import DownloadManager
from videoarchiver.utils.message_manager import MessageManager
from videoarchiver.utils.exceptions import QueueHandlerError
from videoarchiver.queue.models import QueueItem
from videoarchiver.config_manager import ConfigManager
from videoarchiver.processor.constants import REACTIONS
from .utils import progress_tracker
from .database.video_archive_db import VideoArchiveDB
from .utils.download_manager import DownloadManager
from .utils.message_manager import MessageManager
from .utils.exceptions import QueueHandlerError
from .queue.models import QueueItem
from .config_manager import ConfigManager
from .processor.constants import REACTIONS
logger = logging.getLogger("VideoArchiver")

View File

@@ -7,11 +7,11 @@ from typing import List, Optional, Dict, Any, Set, Union, TypedDict, ClassVar
from datetime import datetime
import discord
from videoarchiver.queue.models import QueueItem
from videoarchiver.queue.manager import EnhancedVideoQueueManager
from videoarchiver.processor.constants import REACTIONS
from videoarchiver.processor.url_extractor import URLMetadata
from videoarchiver.utils.exceptions import QueueProcessingError
from .queue.models import QueueItem
from .queue.manager import EnhancedVideoQueueManager
from .processor.constants import REACTIONS
from .processor.url_extractor import URLMetadata
from .utils.exceptions import QueueProcessingError
logger = logging.getLogger("VideoArchiver")

View File

@@ -7,8 +7,8 @@ from typing import List, Optional
import discord
from urllib.parse import urlparse
from videoarchiver.processor.constants import REACTIONS, ReactionType, get_reaction, get_progress_emoji
from videoarchiver.database.video_archive_db import VideoArchiveDB
from .processor.constants import REACTIONS, ReactionType, get_reaction, get_progress_emoji
from .database.video_archive_db import VideoArchiveDB
logger = logging.getLogger("VideoArchiver")

View File

@@ -7,7 +7,7 @@ from datetime import datetime
from typing import Dict, Any, List, Optional, Callable, TypeVar, Union, TypedDict, ClassVar, Tuple
import discord
from videoarchiver.utils.exceptions import DisplayError
from .utils.exceptions import DisplayError
logger = logging.getLogger("VideoArchiver")

View File

@@ -1,10 +1,10 @@
"""Queue management package for video processing"""
from videoarchiver.queue.models import QueueItem, QueueMetrics
from videoarchiver.queue.manager import EnhancedVideoQueueManager
from videoarchiver.queue.persistence import QueuePersistenceManager, QueueError
from videoarchiver.queue.monitoring import QueueMonitor, MonitoringError
from videoarchiver.queue.cleanup import QueueCleaner, CleanupError
from .models import QueueItem, QueueMetrics
from .manager import EnhancedVideoQueueManager
from .persistence import QueuePersistenceManager, QueueError
from .monitoring import QueueMonitor, MonitoringError
from .cleanup import QueueCleaner, CleanupError
__all__ = [
'QueueItem',

View File

@@ -1,8 +1,8 @@
"""Queue cleaning functionality"""
from videoarchiver.queue.cleaners.guild_cleaner import GuildCleaner
from videoarchiver.queue.cleaners.history_cleaner import HistoryCleaner
from videoarchiver.queue.cleaners.tracking_cleaner import TrackingCleaner
from .guild_cleaner import GuildCleaner
from .history_cleaner import HistoryCleaner
from .tracking_cleaner import TrackingCleaner
__all__ = [
'GuildCleaner',

View File

@@ -7,7 +7,7 @@ from dataclasses import dataclass, field
from typing import Dict, List, Set, Tuple, Any, Optional
from datetime import datetime
from videoarchiver.queue.models import QueueItem
from ..models import QueueItem
logger = logging.getLogger("GuildCleaner")

View File

@@ -6,7 +6,7 @@ from dataclasses import dataclass, field
from typing import Dict, Optional, List, Any, Set
from datetime import datetime, timedelta
from videoarchiver.queue.models import QueueItem
from ..models import QueueItem
logger = logging.getLogger("HistoryCleaner")

View File

@@ -7,7 +7,7 @@ from dataclasses import dataclass, field
from typing import Dict, List, Set, Tuple, Any, Optional
from datetime import datetime
from videoarchiver.queue.models import QueueItem
from ..models import QueueItem
logger = logging.getLogger("TrackingCleaner")

View File

@@ -7,16 +7,16 @@ from dataclasses import dataclass, field
from typing import Dict, List, Set, Optional, Any, Tuple
from datetime import datetime, timedelta
from videoarchiver.queue.models import QueueItem, QueueMetrics
from videoarchiver.queue.cleaners.history_cleaner import (
from .models import QueueItem, QueueMetrics
from .cleaners.history_cleaner import (
HistoryCleaner,
CleanupStrategy as HistoryStrategy
)
from videoarchiver.queue.cleaners.guild_cleaner import (
from .cleaners.guild_cleaner import (
GuildCleaner,
GuildCleanupStrategy
)
from videoarchiver.queue.cleaners.tracking_cleaner import (
from .cleaners.tracking_cleaner import (
TrackingCleaner,
TrackingCleanupStrategy
)

View File

@@ -7,13 +7,13 @@ from dataclasses import dataclass, field
from typing import Optional, Tuple, Dict, Any, List, Set, Callable
from datetime import datetime, timedelta
from videoarchiver.queue.state_manager import QueueStateManager
from videoarchiver.queue.processor import QueueProcessor
from videoarchiver.queue.metrics_manager import QueueMetricsManager
from videoarchiver.queue.persistence import QueuePersistenceManager
from videoarchiver.queue.monitoring import QueueMonitor, MonitoringLevel
from videoarchiver.queue.cleanup import QueueCleaner
from videoarchiver.queue.models import QueueItem, QueueError, CleanupError
from .state_manager import QueueStateManager
from .processor import QueueProcessor
from .metrics_manager import QueueMetricsManager
from .persistence import QueuePersistenceManager
from .monitoring import QueueMonitor, MonitoringLevel
from .cleanup import QueueCleaner
from .models import QueueItem, QueueError, CleanupError
logger = logging.getLogger("QueueManager")

View File

@@ -8,8 +8,8 @@ from dataclasses import dataclass, field
from typing import Optional, Dict, Any, List, Set
from datetime import datetime, timedelta
from videoarchiver.queue.health_checker import HealthChecker, HealthStatus, HealthCategory
from videoarchiver.queue.recovery_manager import RecoveryManager, RecoveryStrategy
from .health_checker import HealthChecker, HealthStatus, HealthCategory
from .recovery_manager import RecoveryManager, RecoveryStrategy
logger = logging.getLogger("QueueMonitoring")

View File

@@ -8,7 +8,8 @@ import fcntl
import asyncio
from datetime import datetime, timedelta
from typing import Dict, Any, Optional
from videoarchiver.queue.models import QueueItem, QueueMetrics
from .models import QueueItem, QueueMetrics
# Configure logging
logging.basicConfig(
@@ -16,6 +17,7 @@ logging.basicConfig(
)
logger = logging.getLogger("QueuePersistence")
class QueuePersistenceManager:
"""Manages persistence of queue state to disk"""
@@ -25,7 +27,7 @@ class QueuePersistenceManager:
max_retries: int = 3,
retry_delay: int = 1,
backup_interval: int = 3600, # 1 hour
max_backups: int = 24 # Keep last 24 backups
max_backups: int = 24, # Keep last 24 backups
):
"""Initialize the persistence manager
@@ -50,7 +52,7 @@ class QueuePersistenceManager:
processing: Dict[str, QueueItem],
completed: Dict[str, QueueItem],
failed: Dict[str, QueueItem],
metrics: QueueMetrics
metrics: QueueMetrics,
) -> None:
"""Persist queue state to disk with improved error handling
@@ -87,14 +89,14 @@ class QueuePersistenceManager:
"compression_failures": metrics.compression_failures,
"hardware_accel_failures": metrics.hardware_accel_failures,
},
"timestamp": datetime.utcnow().isoformat()
"timestamp": datetime.utcnow().isoformat(),
}
# Ensure directory exists
os.makedirs(os.path.dirname(self.persistence_path), exist_ok=True)
# Acquire file lock
lock_fd = open(self._lock_file, 'w')
lock_fd = open(self._lock_file, "w")
fcntl.flock(lock_fd.fileno(), fcntl.LOCK_EX)
# Write with retries
@@ -120,7 +122,9 @@ class QueuePersistenceManager:
except Exception as e:
if attempt == self.max_retries - 1:
raise
logger.warning(f"Retry {attempt + 1}/{self.max_retries} failed: {e}")
logger.warning(
f"Retry {attempt + 1}/{self.max_retries} failed: {e}"
)
await asyncio.sleep(self.retry_delay)
except Exception as e:
@@ -140,18 +144,25 @@ class QueuePersistenceManager:
# Create backup
timestamp = datetime.utcnow().strftime("%Y%m%d_%H%M%S")
backup_path = f"{self.persistence_path}.bak.{timestamp}"
with open(self.persistence_path, "rb") as src, open(backup_path, "wb") as dst:
with open(self.persistence_path, "rb") as src, open(
backup_path, "wb"
) as dst:
dst.write(src.read())
dst.flush()
os.fsync(dst.fileno())
# Clean old backups
backup_files = sorted([
f for f in os.listdir(os.path.dirname(self.persistence_path))
backup_files = sorted(
[
f
for f in os.listdir(os.path.dirname(self.persistence_path))
if f.startswith(os.path.basename(self.persistence_path) + ".bak.")
])
]
)
while len(backup_files) > self.max_backups:
old_backup = os.path.join(os.path.dirname(self.persistence_path), backup_files.pop(0))
old_backup = os.path.join(
os.path.dirname(self.persistence_path), backup_files.pop(0)
)
try:
os.remove(old_backup)
except Exception as e:
@@ -175,7 +186,7 @@ class QueuePersistenceManager:
lock_fd = None
try:
# Acquire file lock
lock_fd = open(self._lock_file, 'w')
lock_fd = open(self._lock_file, "w")
fcntl.flock(lock_fd.fileno(), fcntl.LOCK_EX)
# Try loading main file
@@ -188,18 +199,28 @@ class QueuePersistenceManager:
break
except Exception as e:
last_error = e
logger.warning(f"Retry {attempt + 1}/{self.max_retries} failed: {e}")
logger.warning(
f"Retry {attempt + 1}/{self.max_retries} failed: {e}"
)
time.sleep(self.retry_delay)
# If main file failed, try loading latest backup
if state is None:
backup_files = sorted([
f for f in os.listdir(os.path.dirname(self.persistence_path))
if f.startswith(os.path.basename(self.persistence_path) + ".bak.")
], reverse=True)
backup_files = sorted(
[
f
for f in os.listdir(os.path.dirname(self.persistence_path))
if f.startswith(
os.path.basename(self.persistence_path) + ".bak."
)
],
reverse=True,
)
if backup_files:
latest_backup = os.path.join(os.path.dirname(self.persistence_path), backup_files[0])
latest_backup = os.path.join(
os.path.dirname(self.persistence_path), backup_files[0]
)
try:
with open(latest_backup, "r") as f:
state = json.load(f)
@@ -207,7 +228,9 @@ class QueuePersistenceManager:
except Exception as e:
logger.error(f"Failed to load backup: {e}")
if last_error:
raise QueueError(f"Failed to load queue state: {last_error}")
raise QueueError(
f"Failed to load queue state: {last_error}"
)
raise
if state is None:
@@ -218,22 +241,34 @@ class QueuePersistenceManager:
try:
if isinstance(item_data, dict):
# Ensure datetime fields are properly formatted
for field in ['added_at', 'last_retry', 'last_error_time']:
for field in ["added_at", "last_retry", "last_error_time"]:
if field in item_data and item_data[field]:
if isinstance(item_data[field], str):
try:
item_data[field] = datetime.fromisoformat(item_data[field])
item_data[field] = datetime.fromisoformat(
item_data[field]
)
except ValueError:
item_data[field] = datetime.utcnow() if field == 'added_at' else None
item_data[field] = (
datetime.utcnow()
if field == "added_at"
else None
)
elif not isinstance(item_data[field], datetime):
item_data[field] = datetime.utcnow() if field == 'added_at' else None
item_data[field] = (
datetime.utcnow()
if field == "added_at"
else None
)
# Ensure processing_time is a float
if 'processing_time' in item_data:
if "processing_time" in item_data:
try:
item_data['processing_time'] = float(item_data['processing_time'])
item_data["processing_time"] = float(
item_data["processing_time"]
)
except (ValueError, TypeError):
item_data['processing_time'] = 0.0
item_data["processing_time"] = 0.0
return QueueItem(**item_data)
return None
@@ -283,15 +318,21 @@ class QueuePersistenceManager:
backup_path = f"{self.persistence_path}.corrupted.{int(time.time())}"
try:
os.rename(self.persistence_path, backup_path)
logger.info(f"Created backup of corrupted state file: {backup_path}")
logger.info(
f"Created backup of corrupted state file: {backup_path}"
)
except Exception as be:
logger.error(f"Failed to create backup of corrupted state file: {str(be)}")
logger.error(
f"Failed to create backup of corrupted state file: {str(be)}"
)
raise QueueError(f"Failed to load queue state: {str(e)}")
finally:
if lock_fd:
fcntl.flock(lock_fd.fileno(), fcntl.LOCK_UN)
lock_fd.close()
class QueueError(Exception):
"""Base exception for queue-related errors"""
pass

View File

@@ -8,9 +8,9 @@ from dataclasses import dataclass
from typing import Callable, Optional, Tuple, List, Set, Dict, Any
from datetime import datetime, timedelta
from videoarchiver.queue.models import QueueItem
from videoarchiver.queue.state_manager import QueueStateManager, ItemState
from videoarchiver.queue.monitoring import QueueMonitor
from .models import QueueItem
from .state_manager import QueueStateManager, ItemState
from .monitoring import QueueMonitor
logger = logging.getLogger("QueueProcessor")

View File

@@ -7,7 +7,7 @@ from dataclasses import dataclass, field
from typing import List, Tuple, Dict, Optional, Any, Set
from datetime import datetime, timedelta
from videoarchiver.queue.models import QueueItem
from .models import QueueItem
logger = logging.getLogger("QueueRecoveryManager")

View File

@@ -7,7 +7,7 @@ from dataclasses import dataclass
from typing import Dict, Set, List, Optional, Any
from datetime import datetime
from videoarchiver.queue.models import QueueItem, QueueMetrics
from .models import QueueItem, QueueMetrics
logger = logging.getLogger("QueueStateManager")

View File

@@ -15,7 +15,7 @@ import tempfile
import os
import shutil
from videoarchiver.exceptions import UpdateError
from .exceptions import UpdateError
logger = logging.getLogger('VideoArchiver')

View File

@@ -2,27 +2,27 @@
from typing import Dict, Optional, Any, Union, List
from videoarchiver.utils.file_ops import (
from .utils.file_ops import (
cleanup_downloads,
ensure_directory,
get_file_size,
is_valid_path,
safe_delete
)
from videoarchiver.utils.file_deletion import FileDeleter
from videoarchiver.utils.directory_manager import DirectoryManager
from videoarchiver.utils.permission_manager import PermissionManager
from videoarchiver.utils.download_manager import DownloadManager
from videoarchiver.utils.compression_manager import CompressionManager
from videoarchiver.utils.progress_tracker import (
from .utils.file_deletion import FileDeleter
from .utils.directory_manager import DirectoryManager
from .utils.permission_manager import PermissionManager
from .utils.download_manager import DownloadManager
from .utils.compression_manager import CompressionManager
from .utils.progress_tracker import (
ProgressTracker,
ProgressStatus,
DownloadProgress,
CompressionProgress,
CompressionParams
)
from videoarchiver.utils.path_manager import PathManager
from videoarchiver.utils.exceptions import (
from .utils.path_manager import PathManager
from .utils.exceptions import (
# Base exception
VideoArchiverError,
ErrorSeverity,

View File

@@ -7,11 +7,11 @@ import subprocess
from datetime import datetime
from typing import Dict, Optional, Callable, Set, Tuple
from videoarchiver.ffmpeg.ffmpeg_manager import FFmpegManager
from videoarchiver.ffmpeg.exceptions import CompressionError
from videoarchiver.utils.exceptions import VideoVerificationError
from videoarchiver.utils.file_operations import FileOperations
from videoarchiver.utils.progress_handler import ProgressHandler
from .ffmpeg.ffmpeg_manager import FFmpegManager
from .ffmpeg.exceptions import CompressionError
from .utils.exceptions import VideoVerificationError
from .utils.file_operations import FileOperations
from .utils.progress_handler import ProgressHandler
logger = logging.getLogger("VideoArchiver")

View File

@@ -7,11 +7,11 @@ import subprocess
from datetime import datetime
from typing import Dict, Any, Optional, Callable, List, Set, Tuple
from videoarchiver.processor import _compression_progress
from videoarchiver.utils.compression_handler import CompressionHandler
from videoarchiver.utils.progress_handler import ProgressHandler
from videoarchiver.utils.file_operations import FileOperations
from videoarchiver.utils.exceptions import CompressionError, VideoVerificationError
from .processor import _compression_progress
from .utils.compression_handler import CompressionHandler
from .utils.progress_handler import ProgressHandler
from .utils.file_operations import FileOperations
from .utils.exceptions import CompressionError, VideoVerificationError
logger = logging.getLogger("VideoArchiver")

View File

@@ -6,8 +6,8 @@ import asyncio
from pathlib import Path
from typing import List, Optional, Tuple
from videoarchiver.utils.exceptions import FileCleanupError
from videoarchiver.utils.file_deletion import SecureFileDeleter
from .utils.exceptions import FileCleanupError
from .utils.file_deletion import SecureFileDeleter
logger = logging.getLogger("DirectoryManager")

View File

@@ -7,12 +7,12 @@ import yt_dlp
from typing import Dict, Optional, Callable, Tuple
from pathlib import Path
from videoarchiver.utils.url_validator import check_url_support
from videoarchiver.utils.progress_handler import ProgressHandler, CancellableYTDLLogger
from videoarchiver.utils.file_operations import FileOperations
from videoarchiver.utils.compression_handler import CompressionHandler
from videoarchiver.utils.process_manager import ProcessManager
from videoarchiver.ffmpeg.ffmpeg_manager import FFmpegManager
from .utils.url_validator import check_url_support
from .utils.progress_handler import ProgressHandler, CancellableYTDLLogger
from .utils.file_operations import FileOperations
from .utils.compression_handler import CompressionHandler
from .utils.process_manager import ProcessManager
from .ffmpeg.ffmpeg_manager import FFmpegManager
logger = logging.getLogger("VideoArchiver")

View File

@@ -9,9 +9,9 @@ from concurrent.futures import ThreadPoolExecutor
from typing import Dict, List, Optional, Tuple, Callable, Any
from pathlib import Path
from videoarchiver.utils.verification_manager import VideoVerificationManager
from videoarchiver.utils.compression_manager import CompressionManager
from videoarchiver.utils import progress_tracker
from .utils.verification_manager import VideoVerificationManager
from .utils.compression_manager import CompressionManager
from .utils import progress_tracker
logger = logging.getLogger("DownloadManager")

View File

@@ -7,7 +7,7 @@ import logging
from pathlib import Path
from typing import Optional
from videoarchiver.utils.exceptions import FileCleanupError
from .utils.exceptions import FileCleanupError
logger = logging.getLogger("FileDeleter")

View File

@@ -9,8 +9,8 @@ import subprocess
from typing import Tuple
from pathlib import Path
from videoarchiver.utils.exceptions import VideoVerificationError
from videoarchiver.utils.file_deletion import secure_delete_file
from .utils.exceptions import VideoVerificationError
from .utils.file_deletion import secure_delete_file
logger = logging.getLogger("VideoArchiver")

View File

@@ -4,10 +4,10 @@ import logging
from pathlib import Path
from typing import List, Tuple, Optional
from videoarchiver.utils.exceptions import FileCleanupError
from videoarchiver.utils.file_deletion import SecureFileDeleter
from videoarchiver.utils.directory_manager import DirectoryManager
from videoarchiver.utils.permission_manager import PermissionManager
from .utils.exceptions import FileCleanupError
from .utils.file_deletion import SecureFileDeleter
from .utils.directory_manager import DirectoryManager
from .utils.permission_manager import PermissionManager
logger = logging.getLogger("VideoArchiver")

View File

@@ -10,8 +10,8 @@ import time
from typing import Generator, List, Optional
from pathlib import Path
from videoarchiver.utils.exceptions import FileCleanupError
from videoarchiver.utils.permission_manager import PermissionManager
from .utils.exceptions import FileCleanupError
from .utils.permission_manager import PermissionManager
logger = logging.getLogger("PathManager")

View File

@@ -6,7 +6,7 @@ import logging
from pathlib import Path
from typing import Optional, Union, List
from videoarchiver.utils.exceptions import FileCleanupError
from .utils.exceptions import FileCleanupError
logger = logging.getLogger("PermissionManager")