From 8031c9799990d386360c1ee68335691da80a7862 Mon Sep 17 00:00:00 2001 From: sHa Date: Mon, 5 Jan 2026 14:54:03 +0000 Subject: [PATCH] Add singleton logging configuration for the renamer application This commit introduces a new module `logging_config.py` that implements a singleton pattern for logging configuration. The logger is initialized only once and can be configured based on an environment variable to log to a file or to the console. This centralizes logging setup and ensures consistent logging behavior throughout the application. --- dist/renamer-0.8.9-py3-none-any.whl | Bin 0 -> 127058 bytes pyproject.toml | 2 +- renamer/app.py | 15 +-- renamer/cache/core.py | 84 +++++++++++-- renamer/cache/decorators.py | 38 +++--- renamer/constants/__init__.py | 3 +- renamer/constants/media_constants.py | 10 ++ renamer/extractors/extractor.py | 15 +-- renamer/extractors/fileinfo_extractor.py | 17 ++- renamer/extractors/filename_extractor.py | 7 +- renamer/extractors/mediainfo_extractor.py | 121 +++++++++++++------ renamer/extractors/metadata_extractor.py | 7 +- renamer/extractors/tmdb_extractor.py | 7 +- renamer/formatters/special_info_formatter.py | 8 +- renamer/logging_config.py | 46 +++++++ renamer/services/conversion_service.py | 45 ++++++- renamer/settings.py | 23 +++- renamer/views/media_panel.py | 1 + renamer/views/media_panel_properties.py | 8 ++ uv.lock | 2 +- 20 files changed, 350 insertions(+), 109 deletions(-) create mode 100644 dist/renamer-0.8.9-py3-none-any.whl create mode 100644 renamer/logging_config.py diff --git a/dist/renamer-0.8.9-py3-none-any.whl b/dist/renamer-0.8.9-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..0cbfcd57abe92757b9b7a183e42df12ddc3a07cf GIT binary patch literal 127058 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%0Ajwno?7V+02YmQwxnPb1$j*pR7@0#r?wbP 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 GmGnOmoMEy6 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index e5a041a..4a93792 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "renamer" -version = "0.8.8" +version = "0.8.9" description = "Terminal-based media file renamer and metadata viewer" readme = "README.md" requires-python = ">=3.11" diff --git a/renamer/app.py b/renamer/app.py index 6d27bf6..cb52c90 100644 --- a/renamer/app.py +++ b/renamer/app.py @@ -9,8 +9,8 @@ from functools import partial import threading import time import logging -import os +from .logging_config import LoggerConfig # Initialize logging singleton from .constants import MEDIA_TYPES from .screens import OpenScreen, HelpScreen, RenameConfirmScreen, SettingsScreen, ConvertConfirmScreen from .extractors.extractor import MediaExtractor @@ -22,14 +22,6 @@ from .cache import Cache, CacheManager from .services.conversion_service import ConversionService -# Set up logging conditionally -if os.getenv('FORMATTER_LOG', '0') == '1': - logging.basicConfig(filename='formatter.log', level=logging.INFO, - format='%(asctime)s - %(levelname)s - %(message)s') -else: - logging.basicConfig(level=logging.INFO) # Enable logging for debugging - - class CacheCommandProvider(Provider): """Command provider for cache management operations.""" @@ -431,6 +423,11 @@ class RenamerApp(App): try: if node.data.is_file(): + # Invalidate cache for this file before re-extracting + cache = Cache() + invalidated = cache.invalidate_file(node.data) + logging.info(f"Refresh: invalidated {invalidated} cache entries for {node.data.name}") + self._start_loading_animation() threading.Thread( target=self._extract_and_show_details, args=(node.data,) diff --git a/renamer/cache/core.py b/renamer/cache/core.py index 9f2551a..0692001 100644 --- a/renamer/cache/core.py +++ b/renamer/cache/core.py @@ -12,14 +12,30 @@ logger = logging.getLogger(__name__) class Cache: - """Thread-safe file-based cache with TTL support.""" + """Thread-safe file-based cache with TTL support (Singleton).""" + + _instance: Optional['Cache'] = None + _lock_init = threading.Lock() + + def __new__(cls, cache_dir: Optional[Path] = None): + """Create or return singleton instance.""" + if cls._instance is None: + with cls._lock_init: + if cls._instance is None: + cls._instance = super().__new__(cls) + cls._instance._initialized = False + return cls._instance def __init__(self, cache_dir: Optional[Path] = None): - """Initialize cache with optional custom directory. + """Initialize cache with optional custom directory (only once). Args: cache_dir: Optional cache directory path. Defaults to ~/.cache/renamer/ """ + # Only initialize once + if self._initialized: + return + # Always use the default cache dir to avoid creating cache in scan dir if cache_dir is None: cache_dir = Path.home() / ".cache" / "renamer" @@ -27,6 +43,7 @@ class Cache: self.cache_dir.mkdir(parents=True, exist_ok=True) self._memory_cache: Dict[str, Dict[str, Any]] = {} # In-memory cache for faster access self._lock = threading.RLock() # Reentrant lock for thread safety + self._initialized = True def _sanitize_key_component(self, component: str) -> str: """Sanitize a key component to prevent filesystem escaping. @@ -85,14 +102,15 @@ class Cache: # Use .json extension for all cache files (simplifies logic) return cache_subdir / f"{key_hash}.json" - def get(self, key: str) -> Optional[Any]: + def get(self, key: str, default: Any = None) -> Any: """Get cached value if not expired (thread-safe). Args: key: Cache key + default: Value to return if key not found or expired Returns: - Cached value or None if not found/expired + Cached value or default if not found/expired """ with self._lock: # Check memory cache first @@ -108,7 +126,7 @@ class Cache: # Check file cache cache_file = self._get_cache_file(key) if not cache_file.exists(): - return None + return default try: with open(cache_file, 'r') as f: @@ -118,7 +136,7 @@ class Cache: # Expired, remove file cache_file.unlink(missing_ok=True) logger.debug(f"File cache expired for key: {key}, removed {cache_file}") - return None + return default # Store in memory cache for faster future access self._memory_cache[key] = data @@ -128,11 +146,11 @@ class Cache: # Corrupted JSON, remove file logger.warning(f"Corrupted cache file {cache_file}: {e}") cache_file.unlink(missing_ok=True) - return None + return default except IOError as e: # File read error logger.error(f"Failed to read cache file {cache_file}: {e}") - return None + return default def set(self, key: str, value: Any, ttl_seconds: int) -> None: """Set cached value with TTL (thread-safe). @@ -177,6 +195,56 @@ class Cache: cache_file.unlink(missing_ok=True) logger.debug(f"Invalidated cache for key: {key}") + def invalidate_file(self, file_path: Path) -> int: + """Invalidate all cache entries for a specific file path. + + This invalidates all extractor method caches for the given file by: + 1. Clearing matching keys from memory cache + 2. Removing matching keys from file cache + + Args: + file_path: File path to invalidate cache for + + Returns: + Number of cache entries invalidated + """ + with self._lock: + # Generate the path hash used in cache keys + path_hash = hashlib.md5(str(file_path).encode()).hexdigest()[:12] + prefix = f"extractor_{path_hash}_" + + invalidated_count = 0 + + # Remove from memory cache (easy - just check prefix) + keys_to_remove = [k for k in self._memory_cache.keys() if k.startswith(prefix)] + for key in keys_to_remove: + del self._memory_cache[key] + invalidated_count += 1 + logger.debug(f"Invalidated memory cache for key: {key}") + + # For file cache, we need to invalidate all known extractor methods + # List of all cached extractor methods + extractor_methods = [ + 'extract_title', 'extract_year', 'extract_source', 'extract_video_codec', + 'extract_audio_codec', 'extract_frame_class', 'extract_hdr', 'extract_order', + 'extract_special_info', 'extract_movie_db', 'extract_extension', + 'extract_video_tracks', 'extract_audio_tracks', 'extract_subtitle_tracks', + 'extract_interlaced', 'extract_size', 'extract_duration', 'extract_bitrate', + 'extract_created', 'extract_modified' + ] + + # Invalidate each possible cache key + for method in extractor_methods: + cache_key = f"extractor_{path_hash}_{method}" + cache_file = self._get_cache_file(cache_key) + if cache_file.exists(): + cache_file.unlink(missing_ok=True) + invalidated_count += 1 + logger.debug(f"Invalidated file cache for key: {cache_key}") + + logger.info(f"Invalidated {invalidated_count} cache entries for file: {file_path.name}") + return invalidated_count + def get_image(self, key: str) -> Optional[Path]: """Get cached image path if not expired (thread-safe). diff --git a/renamer/cache/decorators.py b/renamer/cache/decorators.py index 0bc67a0..2d893fb 100644 --- a/renamer/cache/decorators.py +++ b/renamer/cache/decorators.py @@ -19,6 +19,9 @@ from .strategies import ( logger = logging.getLogger(__name__) +# Sentinel object to distinguish "not in cache" from "cached value is None" +_CACHE_MISS = object() + def cached( strategy: Optional[CacheKeyStrategy] = None, @@ -78,10 +81,10 @@ def cached( logger.warning(f"Failed to generate cache key: {e}, executing uncached") return func(self, *args, **kwargs) - # Check cache - cached_value = cache.get(cache_key) - if cached_value is not None: - logger.debug(f"Cache hit for {func.__name__}: {cache_key}") + # Check cache (use sentinel to distinguish "not in cache" from "cached None") + cached_value = cache.get(cache_key, _CACHE_MISS) + if cached_value is not _CACHE_MISS: + logger.debug(f"Cache hit for {func.__name__}: {cache_key} (value={cached_value!r})") return cached_value # Execute function @@ -91,10 +94,9 @@ def cached( # Determine TTL actual_ttl = _determine_ttl(self, ttl) - # Cache result (only if not None) - if result is not None: - cache.set(cache_key, result, actual_ttl) - logger.debug(f"Cached {func.__name__}: {cache_key} (TTL: {actual_ttl}s)") + # Cache result (including None - None is valid data meaning "not found") + cache.set(cache_key, result, actual_ttl) + logger.debug(f"Cached {func.__name__}: {cache_key} (TTL: {actual_ttl}s, value={result!r})") return result @@ -129,8 +131,9 @@ def _generate_cache_key( if not file_path: raise ValueError(f"{instance.__class__.__name__} missing file_path attribute") - instance_id = str(id(instance)) - return strategy.generate_key(file_path, func.__name__, instance_id) + # Cache by file_path + method_name only (no instance_id) + # This allows cache hits across different extractor instances for the same file + return strategy.generate_key(file_path, func.__name__) elif isinstance(strategy, APIRequestStrategy): # API pattern: expects service name in args or uses function name @@ -246,10 +249,10 @@ def cached_api(service: str, ttl: Optional[int] = None): strategy = APIRequestStrategy() cache_key = strategy.generate_key(service, func.__name__, {'params': args_repr}) - # Check cache - cached_value = cache.get(cache_key) - if cached_value is not None: - logger.debug(f"API cache hit for {service}.{func.__name__}") + # Check cache (use sentinel to distinguish "not in cache" from "cached None") + cached_value = cache.get(cache_key, _CACHE_MISS) + if cached_value is not _CACHE_MISS: + logger.debug(f"API cache hit for {service}.{func.__name__} (value={cached_value!r})") return cached_value # Execute function @@ -267,10 +270,9 @@ def cached_api(service: str, ttl: Optional[int] = None): else: actual_ttl = 21600 # Default 6 hours - # Cache result (only if not None) - if result is not None: - cache.set(cache_key, result, actual_ttl) - logger.debug(f"API cached {service}.{func.__name__} (TTL: {actual_ttl}s)") + # Cache result (including None - None is valid data) + cache.set(cache_key, result, actual_ttl) + logger.debug(f"API cached {service}.{func.__name__} (TTL: {actual_ttl}s, value={result!r})") return result diff --git a/renamer/constants/__init__.py b/renamer/constants/__init__.py index 468af84..e06d8bd 100644 --- a/renamer/constants/__init__.py +++ b/renamer/constants/__init__.py @@ -12,7 +12,7 @@ This package contains constants split into logical modules: """ # Import from all constant modules -from .media_constants import MEDIA_TYPES +from .media_constants import MEDIA_TYPES, META_TYPE_TO_EXTENSIONS from .source_constants import SOURCE_DICT from .frame_constants import FRAME_CLASSES, NON_STANDARD_QUALITY_INDICATORS from .moviedb_constants import MOVIE_DB_DICT @@ -24,6 +24,7 @@ from .cyrillic_constants import CYRILLIC_TO_ENGLISH __all__ = [ # Media types 'MEDIA_TYPES', + 'META_TYPE_TO_EXTENSIONS', # Source types 'SOURCE_DICT', # Frame classes diff --git a/renamer/constants/media_constants.py b/renamer/constants/media_constants.py index 23cddd9..830ba05 100644 --- a/renamer/constants/media_constants.py +++ b/renamer/constants/media_constants.py @@ -54,3 +54,13 @@ MEDIA_TYPES = { "mime": "video/mpeg", }, } + +# Reverse mapping: meta_type -> list of extensions +# Built once at module load instead of rebuilding in every extractor instance +META_TYPE_TO_EXTENSIONS = {} +for ext, info in MEDIA_TYPES.items(): + meta_type = info.get('meta_type') + if meta_type: + if meta_type not in META_TYPE_TO_EXTENSIONS: + META_TYPE_TO_EXTENSIONS[meta_type] = [] + META_TYPE_TO_EXTENSIONS[meta_type].append(ext) diff --git a/renamer/extractors/extractor.py b/renamer/extractors/extractor.py index 4028587..3e371e9 100644 --- a/renamer/extractors/extractor.py +++ b/renamer/extractors/extractor.py @@ -45,14 +45,15 @@ class MediaExtractor: >>> tracks = extractor.get("video_tracks") """ - def __init__(self, file_path: Path): + def __init__(self, file_path: Path, use_cache: bool = True): self.file_path = file_path - - self.filename_extractor = FilenameExtractor(file_path) - self.metadata_extractor = MetadataExtractor(file_path) - self.mediainfo_extractor = MediaInfoExtractor(file_path) - self.fileinfo_extractor = FileInfoExtractor(file_path) - self.tmdb_extractor = TMDBExtractor(file_path) + + # Initialize all extractors - they use singleton Cache internally + self.filename_extractor = FilenameExtractor(file_path, use_cache) + self.metadata_extractor = MetadataExtractor(file_path, use_cache) + self.mediainfo_extractor = MediaInfoExtractor(file_path, use_cache) + self.fileinfo_extractor = FileInfoExtractor(file_path, use_cache) + self.tmdb_extractor = TMDBExtractor(file_path, use_cache) self.default_extractor = DefaultExtractor() # Extractor mapping diff --git a/renamer/extractors/fileinfo_extractor.py b/renamer/extractors/fileinfo_extractor.py index 106d48b..4faf801 100644 --- a/renamer/extractors/fileinfo_extractor.py +++ b/renamer/extractors/fileinfo_extractor.py @@ -6,15 +6,8 @@ file system metadata such as size, timestamps, paths, and extensions. from pathlib import Path import logging -import os -from ..cache import cached_method - -# Set up logging conditionally -if os.getenv('FORMATTER_LOG', '0') == '1': - logging.basicConfig(filename='formatter.log', level=logging.INFO, - format='%(asctime)s - %(levelname)s - %(message)s') -else: - logging.basicConfig(level=logging.CRITICAL) # Disable logging +from ..cache import cached_method, Cache +from ..logging_config import LoggerConfig # Initialize logging singleton class FileInfoExtractor: @@ -39,13 +32,17 @@ class FileInfoExtractor: >>> name = extractor.extract_file_name() # Returns "movie.mkv" """ - def __init__(self, file_path: Path): + def __init__(self, file_path: Path, use_cache: bool = True): """Initialize the FileInfoExtractor. Args: file_path: Path object pointing to the file to extract info from + use_cache: Whether to use caching (default: True) """ self._file_path = file_path + self.file_path = file_path # Expose for cache key generation + self.cache = Cache() if use_cache else None # Singleton cache for @cached_method decorator + self.settings = None # Will be set by Settings singleton if needed self._stat = file_path.stat() self._cache: dict[str, any] = {} # Internal cache for method results diff --git a/renamer/extractors/filename_extractor.py b/renamer/extractors/filename_extractor.py index 6cc33ac..c416ec6 100644 --- a/renamer/extractors/filename_extractor.py +++ b/renamer/extractors/filename_extractor.py @@ -8,7 +8,7 @@ from ..constants import ( is_valid_year, CYRILLIC_TO_ENGLISH ) -from ..cache import cached_method +from ..cache import cached_method, Cache from ..utils.pattern_utils import PatternExtractor import langcodes @@ -18,7 +18,7 @@ logger = logging.getLogger(__name__) class FilenameExtractor: """Class to extract information from filename""" - def __init__(self, file_path: Path | str): + def __init__(self, file_path: Path | str, use_cache: bool = True): if isinstance(file_path, str): self.file_path = Path(file_path) self.file_name = file_path @@ -26,6 +26,9 @@ class FilenameExtractor: self.file_path = file_path self.file_name = file_path.name + self.cache = Cache() if use_cache else None # Singleton cache for @cached_method decorator + self.settings = None # Will be set by Settings singleton if needed + # Initialize utility helper self._pattern_extractor = PatternExtractor() diff --git a/renamer/extractors/mediainfo_extractor.py b/renamer/extractors/mediainfo_extractor.py index 9acdd7d..d1d0a65 100644 --- a/renamer/extractors/mediainfo_extractor.py +++ b/renamer/extractors/mediainfo_extractor.py @@ -1,8 +1,8 @@ from pathlib import Path from pymediainfo import MediaInfo from collections import Counter -from ..constants import FRAME_CLASSES, MEDIA_TYPES -from ..cache import cached_method +from ..constants import FRAME_CLASSES, META_TYPE_TO_EXTENSIONS +from ..cache import cached_method, Cache import langcodes import logging @@ -12,40 +12,35 @@ logger = logging.getLogger(__name__) class MediaInfoExtractor: """Class to extract information from MediaInfo""" - def __init__(self, file_path: Path): + def __init__(self, file_path: Path, use_cache: bool = True): self.file_path = file_path + self.cache = Cache() if use_cache else None # Singleton cache for @cached_method decorator + self.settings = None # Will be set by Settings singleton if needed self._cache = {} # Internal cache for method results - try: - self.media_info = MediaInfo.parse(file_path) + + # Parse media info - set to None on failure + self.media_info = MediaInfo.parse(file_path) if file_path.exists() else None + + # Extract tracks + if self.media_info: self.video_tracks = [t for t in self.media_info.tracks if t.track_type == 'Video'] self.audio_tracks = [t for t in self.media_info.tracks if t.track_type == 'Audio'] self.sub_tracks = [t for t in self.media_info.tracks if t.track_type == 'Text'] - except Exception as e: - logger.warning(f"Failed to parse media info for {file_path}: {e}") - self.media_info = None + else: self.video_tracks = [] self.audio_tracks = [] self.sub_tracks = [] - # Build mapping from meta_type to extensions - self._format_to_extensions = {} - for ext, info in MEDIA_TYPES.items(): - meta_type = info.get('meta_type') - if meta_type: - if meta_type not in self._format_to_extensions: - self._format_to_extensions[meta_type] = [] - self._format_to_extensions[meta_type].append(ext) - def _get_frame_class_from_height(self, height: int) -> str | None: """Get frame class from video height, finding closest match if exact not found""" if not height: return None - + # First try exact match for frame_class, info in FRAME_CLASSES.items(): if height == info['nominal_height']: return frame_class - + # If no exact match, find closest closest = None min_diff = float('inf') @@ -54,7 +49,7 @@ class MediaInfoExtractor: if diff < min_diff: min_diff = diff closest = frame_class - + # Only return if difference is reasonable (within 50 pixels) if min_diff <= 50: return closest @@ -77,30 +72,37 @@ class MediaInfoExtractor: width = getattr(self.video_tracks[0], 'width', None) if not height or not width: return None - + # Check if interlaced - try multiple attributes # PyMediaInfo may use different attribute names depending on version scan_type_attr = getattr(self.video_tracks[0], 'scan_type', None) interlaced = getattr(self.video_tracks[0], 'interlaced', None) + logger.debug(f"[{self.file_path.name}] Frame class detection - Resolution: {width}x{height}") + logger.debug(f"[{self.file_path.name}] scan_type attribute: {scan_type_attr!r} (type: {type(scan_type_attr).__name__})") + logger.debug(f"[{self.file_path.name}] interlaced attribute: {interlaced!r} (type: {type(interlaced).__name__})") + # Determine scan type from available attributes # Check scan_type first (e.g., "Interlaced", "Progressive", "MBAFF") if scan_type_attr and isinstance(scan_type_attr, str): scan_type = 'i' if 'interlaced' in scan_type_attr.lower() else 'p' + logger.debug(f"[{self.file_path.name}] Using scan_type: {scan_type_attr!r} -> scan_type={scan_type!r}") # Then check interlaced flag (e.g., "Yes", "No") elif interlaced and isinstance(interlaced, str): scan_type = 'i' if interlaced.lower() in ['yes', 'true', '1'] else 'p' + logger.debug(f"[{self.file_path.name}] Using interlaced: {interlaced!r} -> scan_type={scan_type!r}") else: # Default to progressive if no information available scan_type = 'p' - + logger.debug(f"[{self.file_path.name}] No scan type info, defaulting to progressive") + # Calculate effective height for frame class determination aspect_ratio = 16 / 9 if height > width: effective_height = height / aspect_ratio else: effective_height = height - + # First, try to match width to typical widths # Use a larger tolerance (10 pixels) to handle cinema/ultrawide aspect ratios width_matches = [] @@ -109,18 +111,21 @@ class MediaInfoExtractor: if abs(width - tw) <= 10 and frame_class.endswith(scan_type): diff = abs(height - info['nominal_height']) width_matches.append((frame_class, diff)) - + if width_matches: # Choose the frame class with the smallest height difference width_matches.sort(key=lambda x: x[1]) - return width_matches[0][0] - + result = width_matches[0][0] + logger.debug(f"[{self.file_path.name}] Result (width match): {result!r}") + return result + # If no width match, fall back to height-based matching # First try exact match with standard frame classes frame_class = f"{int(round(effective_height))}{scan_type}" if frame_class in FRAME_CLASSES: + logger.debug(f"[{self.file_path.name}] Result (exact height match): {frame_class!r}") return frame_class - + # Find closest standard height match closest_class = None min_diff = float('inf') @@ -130,12 +135,14 @@ class MediaInfoExtractor: if diff < min_diff: min_diff = diff closest_class = fc - + # Return closest standard match if within reasonable distance (20 pixels) if closest_class and min_diff <= 20: + logger.debug(f"[{self.file_path.name}] Result (closest match, diff={min_diff}): {closest_class!r}") return closest_class - + # For non-standard resolutions, create a custom frame class + logger.debug(f"[{self.file_path.name}] Result (custom/non-standard): {frame_class!r}") return frame_class @cached_method() @@ -148,7 +155,7 @@ class MediaInfoExtractor: if width and height: return width, height return None - + @cached_method() def extract_aspect_ratio(self) -> str | None: """Extract video aspect ratio from media info""" @@ -186,7 +193,7 @@ class MediaInfoExtractor: # If conversion fails, use the original code logger.debug(f"Invalid language code '{lang_code}': {e}") langs.append(lang_code.lower()[:3]) - + lang_counts = Counter(langs) audio_langs = [f"{count}{lang}" if count > 1 else lang for lang, count in lang_counts.items()] return ','.join(audio_langs) @@ -265,8 +272,8 @@ class MediaInfoExtractor: if not general_track: return None format_ = getattr(general_track, 'format', None) - if format_ in self._format_to_extensions: - exts = self._format_to_extensions[format_] + if format_ in META_TYPE_TO_EXTENSIONS: + exts = META_TYPE_TO_EXTENSIONS[format_] if format_ == 'Matroska': if self.is_3d() and 'mk3d' in exts: return 'mk3d' @@ -282,4 +289,50 @@ class MediaInfoExtractor: if not self.is_3d(): return None stereoscopic = getattr(self.video_tracks[0], 'stereoscopic', None) - return stereoscopic if stereoscopic else None \ No newline at end of file + return stereoscopic if stereoscopic else None + + @cached_method() + def extract_interlaced(self) -> bool | None: + """Determine if the video is interlaced. + + Returns: + True: Video is interlaced + False: Video is progressive (explicitly set) + None: Information not available in MediaInfo + """ + if not self.video_tracks: + logger.debug(f"[{self.file_path.name}] Interlaced detection: No video tracks") + return None + + scan_type_attr = getattr(self.video_tracks[0], 'scan_type', None) + interlaced = getattr(self.video_tracks[0], 'interlaced', None) + + logger.debug(f"[{self.file_path.name}] Interlaced detection:") + logger.debug(f"[{self.file_path.name}] scan_type: {scan_type_attr!r} (type: {type(scan_type_attr).__name__})") + logger.debug(f"[{self.file_path.name}] interlaced: {interlaced!r} (type: {type(interlaced).__name__})") + + # Check scan_type attribute first (e.g., "Interlaced", "Progressive", "MBAFF") + if scan_type_attr and isinstance(scan_type_attr, str): + scan_lower = scan_type_attr.lower() + if 'interlaced' in scan_lower or 'mbaff' in scan_lower: + logger.debug(f"[{self.file_path.name}] Result: True (from scan_type={scan_type_attr!r})") + return True + elif 'progressive' in scan_lower: + logger.debug(f"[{self.file_path.name}] Result: False (from scan_type={scan_type_attr!r})") + return False + # If scan_type has some other value, fall through to check interlaced + logger.debug(f"[{self.file_path.name}] scan_type unrecognized, checking interlaced attribute") + + # Check interlaced attribute (e.g., "Yes", "No") + if interlaced and isinstance(interlaced, str): + interlaced_lower = interlaced.lower() + if interlaced_lower in ['yes', 'true', '1']: + logger.debug(f"[{self.file_path.name}] Result: True (from interlaced={interlaced!r})") + return True + elif interlaced_lower in ['no', 'false', '0']: + logger.debug(f"[{self.file_path.name}] Result: False (from interlaced={interlaced!r})") + return False + + # No information available + logger.debug(f"[{self.file_path.name}] Result: None (no information available)") + return None diff --git a/renamer/extractors/metadata_extractor.py b/renamer/extractors/metadata_extractor.py index dd0a00d..d604131 100644 --- a/renamer/extractors/metadata_extractor.py +++ b/renamer/extractors/metadata_extractor.py @@ -8,7 +8,7 @@ import mutagen import logging from pathlib import Path from ..constants import MEDIA_TYPES -from ..cache import cached_method +from ..cache import cached_method, Cache logger = logging.getLogger(__name__) @@ -32,13 +32,16 @@ class MetadataExtractor: >>> duration = extractor.extract_duration() """ - def __init__(self, file_path: Path): + def __init__(self, file_path: Path, use_cache: bool = True): """Initialize the MetadataExtractor. Args: file_path: Path object pointing to the media file + use_cache: Whether to use caching (default: True) """ self.file_path = file_path + self.cache = Cache() if use_cache else None # Singleton cache for @cached_method decorator + self.settings = None # Will be set by Settings singleton if needed self._cache: dict[str, any] = {} # Internal cache for method results try: self.info = mutagen.File(file_path) # type: ignore diff --git a/renamer/extractors/tmdb_extractor.py b/renamer/extractors/tmdb_extractor.py index c5a4e38..d31613f 100644 --- a/renamer/extractors/tmdb_extractor.py +++ b/renamer/extractors/tmdb_extractor.py @@ -13,10 +13,11 @@ from ..settings import Settings class TMDBExtractor: """Class to extract TMDB movie information""" - def __init__(self, file_path: Path): + def __init__(self, file_path: Path, use_cache: bool = True): self.file_path = file_path - self.cache = Cache() - self.ttl_seconds = Settings().get("cache_ttl_extractors", 21600) + self.cache = Cache() if use_cache else None # Singleton cache + self.settings = Settings() # Singleton settings + self.ttl_seconds = self.settings.get("cache_ttl_extractors", 21600) self._movie_db_info = None def _get_cached_data(self, cache_key: str) -> Optional[Dict[str, Any]]: diff --git a/renamer/formatters/special_info_formatter.py b/renamer/formatters/special_info_formatter.py index b1f2d4b..e726259 100644 --- a/renamer/formatters/special_info_formatter.py +++ b/renamer/formatters/special_info_formatter.py @@ -15,21 +15,15 @@ class SpecialInfoFormatter: """Format database info dictionary or tuple/list into a string""" import logging import os - if os.getenv("FORMATTER_LOG"): - logging.info(f"format_database_info called with: {database_info!r} (type: {type(database_info)})") if isinstance(database_info, dict) and 'name' in database_info and 'id' in database_info: db_name = database_info['name'] db_id = database_info['id'] result = f"{db_name}id-{db_id}" - if os.getenv("FORMATTER_LOG"): - logging.info(f"Formatted dict to: {result!r}") return result elif isinstance(database_info, (tuple, list)) and len(database_info) == 2: db_name, db_id = database_info result = f"{db_name}id-{db_id}" - if os.getenv("FORMATTER_LOG"): - logging.info(f"Formatted tuple/list to: {result!r}") return result if os.getenv("FORMATTER_LOG"): logging.info("Returning None") - return None \ No newline at end of file + return None diff --git a/renamer/logging_config.py b/renamer/logging_config.py new file mode 100644 index 0000000..b971cbe --- /dev/null +++ b/renamer/logging_config.py @@ -0,0 +1,46 @@ +"""Singleton logging configuration for the renamer application. + +This module provides centralized logging configuration that is initialized +once and used throughout the application. +""" + +import logging +import os +import threading + + +class LoggerConfig: + """Singleton logger configuration.""" + + _instance = None + _lock = threading.Lock() + _initialized = False + + def __new__(cls): + """Create or return singleton instance.""" + if cls._instance is None: + with cls._lock: + if cls._instance is None: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__(self): + """Initialize logging configuration (only once).""" + if LoggerConfig._initialized: + return + + # Check environment variable for formatter logging + if os.getenv('FORMATTER_LOG', '0') == '1': + logging.basicConfig( + filename='formatter.log', + level=logging.DEBUG, + format='%(asctime)s - %(levelname)s - %(message)s' + ) + else: + logging.basicConfig(level=logging.INFO) + + LoggerConfig._initialized = True + + +# Initialize logging on import +LoggerConfig() diff --git a/renamer/services/conversion_service.py b/renamer/services/conversion_service.py index e8df176..52046a6 100644 --- a/renamer/services/conversion_service.py +++ b/renamer/services/conversion_service.py @@ -11,6 +11,7 @@ This service manages the process of converting AVI/MPG/MPEG/WebM/MP4 files to MK import logging import subprocess import platform +import re from pathlib import Path from typing import Optional, List, Dict, Tuple @@ -216,6 +217,34 @@ class ConversionService: logger.debug(f"Found {len(subtitle_files)} subtitle files for {video_path.name}") return subtitle_files + def _expand_lang_counts(self, lang_str: str) -> List[str]: + """Expand language string with counts to individual languages. + + Handles formats like: + - "2ukr" -> ['ukr', 'ukr'] + - "ukr" -> ['ukr'] + - "3eng" -> ['eng', 'eng', 'eng'] + + Args: + lang_str: Language string possibly with numeric prefix + + Returns: + List of expanded language codes + + Example: + >>> service._expand_lang_counts("2ukr") + ['ukr', 'ukr'] + """ + # Match pattern: optional number + language code + match = re.match(r'^(\d+)?([a-z]{2,3})$', lang_str.lower()) + if match: + count = int(match.group(1)) if match.group(1) else 1 + lang = match.group(2) + return [lang] * count + else: + # No numeric prefix, return as-is + return [lang_str.lower()] + def map_audio_languages( self, extractor: MediaExtractor, @@ -227,6 +256,8 @@ class ConversionService: in order. If filename has fewer languages than tracks, remaining tracks get None. + Handles numeric prefixes like "2ukr,eng" -> ['ukr', 'ukr', 'eng'] + Args: extractor: MediaExtractor with filename data audio_track_count: Number of audio tracks in the file @@ -235,9 +266,10 @@ class ConversionService: List of language codes (or None) for each audio track Example: - >>> langs = service.map_audio_languages(extractor, 2) + >>> langs = service.map_audio_languages(extractor, 3) + >>> # For filename with [2ukr,eng] >>> print(langs) - ['ukr', 'eng'] + ['ukr', 'ukr', 'eng'] """ # Get audio_langs from filename extractor audio_langs_str = extractor.get('audio_langs', 'Filename') @@ -246,8 +278,13 @@ class ConversionService: logger.debug("No audio languages found in filename") return [None] * audio_track_count - # Split by comma and clean - langs = [lang.strip().lower() for lang in audio_langs_str.split(',')] + # Split by comma and expand numeric prefixes + lang_parts = [lang.strip() for lang in audio_langs_str.split(',')] + langs = [] + for part in lang_parts: + langs.extend(self._expand_lang_counts(part)) + + logger.debug(f"Expanded languages from '{audio_langs_str}' to: {langs}") # Map to tracks (pad with None if needed) result = [] diff --git a/renamer/settings.py b/renamer/settings.py index 1f8eab2..42899cb 100644 --- a/renamer/settings.py +++ b/renamer/settings.py @@ -1,11 +1,12 @@ import json import os +import threading from pathlib import Path -from typing import Dict, Any +from typing import Dict, Any, Optional class Settings: - """Manages application settings stored in a JSON file.""" + """Manages application settings stored in a JSON file (Singleton).""" DEFAULTS = { "mode": "technical", # "technical" or "catalog" @@ -17,12 +18,30 @@ class Settings: "cache_ttl_posters": 2592000, # 30 days in seconds } + _instance: Optional['Settings'] = None + _lock = threading.Lock() + + def __new__(cls, config_dir: Path | None = None): + """Create or return singleton instance.""" + if cls._instance is None: + with cls._lock: + if cls._instance is None: + cls._instance = super().__new__(cls) + cls._instance._initialized = False + return cls._instance + def __init__(self, config_dir: Path | None = None): + """Initialize settings (only once).""" + # Only initialize once + if self._initialized: + return + if config_dir is None: config_dir = Path.home() / ".config" / "renamer" self.config_dir = config_dir self.config_file = self.config_dir / "config.json" self._settings = self.DEFAULTS.copy() + self._initialized = True self.load() def load(self) -> None: diff --git a/renamer/views/media_panel.py b/renamer/views/media_panel.py index c5d25f4..3d1e47e 100644 --- a/renamer/views/media_panel.py +++ b/renamer/views/media_panel.py @@ -126,6 +126,7 @@ class MediaPanelView: self._props.title("Media Info Extraction"), self._props.mediainfo_duration, self._props.mediainfo_frame_class, + self._props.mediainfo_interlace, self._props.mediainfo_resolution, self._props.mediainfo_aspect_ratio, self._props.mediainfo_hdr, diff --git a/renamer/views/media_panel_properties.py b/renamer/views/media_panel_properties.py index ef81f9c..b3fc646 100644 --- a/renamer/views/media_panel_properties.py +++ b/renamer/views/media_panel_properties.py @@ -223,6 +223,14 @@ class MediaPanelProperties: """Get MediaInfo frame class formatted with label.""" return self._extractor.get("frame_class", "MediaInfo") + @property + @conditional_decorators.wrap("Interlaced: ") + @text_decorators.colour(name="grey") + @conditional_decorators.default("Not extracted") + def mediainfo_interlace(self) -> str: + """Get MediaInfo interlace formatted with label.""" + return self._extractor.get("interlaced", "MediaInfo") + @property @conditional_decorators.wrap("Resolution: ") @text_decorators.colour(name="grey") diff --git a/uv.lock b/uv.lock index 1fc889e..eb297de 100644 --- a/uv.lock +++ b/uv.lock @@ -462,7 +462,7 @@ wheels = [ [[package]] name = "renamer" -version = "0.8.8" +version = "0.8.9" source = { editable = "." } dependencies = [ { name = "langcodes" },