Source code for transparentmeta.use_case.write.writer_selector

# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (c) 2025 Transparent Audio
# Author: Valerio Velardo - valerio@transparentaudio.ai

"""
This module defines a registry of available metadata writers (e.g., for MP3 and
WAV) and provides the `WriterSelector` class to dispatch the correct writer
instance based on the file extension of an audio file. It serves as an
abstraction layer to decouple audio format-specific logic from higher-level
orchestration.
"""

import logging
from types import MappingProxyType
from typing import Mapping

from transparentmeta.use_case.write.metadata_writer import MetadataWriter
from transparentmeta.use_case.write.mp3_metadata_writer import (
    MP3MetadataWriter,
)
from transparentmeta.use_case.write.wav_metadata_writer import (
    WAVMetadataWriter,
)

mp3_metadata_writer = MP3MetadataWriter()
wav_metadata_writer = WAVMetadataWriter()

MetadataWriterRegistry = Mapping[str, MetadataWriter]
metadata_writer_registry = MappingProxyType(
    {
        "mp3": mp3_metadata_writer,
        "wav": wav_metadata_writer,
        "wave": wav_metadata_writer,
    }
)

logger = logging.getLogger(__name__)


[docs] class WriterSelector: """Selects the appropriate MetadataWriter based on the audio file extension. This class acts as a lightweight strategy resolver for mapping file extensions (such as 'mp3', 'wav', or 'wave') to their corresponding metadata writer instances. It abstracts away the logic of format-specific handling, promoting modularity and extensibility. Attributes: metadata_writers (MetadataWriterRegistry): A mapping of file extensions to metadata writer instances. """
[docs] def __init__( self, metadata_writers: MetadataWriterRegistry = metadata_writer_registry, ): """Initializes the WriterSelector with a registry of available metadata writers. Args: metadata_writers (MetadataWriterRegistry): An immutable dictionary mapping file extensions to their corresponding metadata writer implementations. """ self.metadata_writers = metadata_writers
[docs] def get_writer(self, file_format: str) -> MetadataWriter: """Selects the appropriate metadata writer based on the file extension. Args: file_format (str): The file extension of the audio file (e.g., 'mp3', 'wav'). Returns: metadata_writer (MetadataWriter): The corresponding metadata writer for the file extension. """ lower_file_format = file_format.lower() metadata_writer = self.metadata_writers[lower_file_format] logger.debug( "Selected metadata writer for '%s': %s", lower_file_format, type(metadata_writer).__name__, ) return metadata_writer