Tadeas Kosek
apply generated DDD abstraction
92fd1a7
"""Audio format value object."""
from typing import List
from dataclasses import dataclass
from ..exceptions.domain_exceptions import InvalidAudioFormatError
@dataclass(frozen=True)
class AudioFormat:
"""Value object representing an audio format."""
value: str
# Supported formats with their characteristics
FORMATS = {
'mp3': {'extension': '.mp3', 'mime_type': 'audio/mpeg', 'lossy': True},
'aac': {'extension': '.aac', 'mime_type': 'audio/aac', 'lossy': True},
'wav': {'extension': '.wav', 'mime_type': 'audio/wav', 'lossy': False},
'flac': {'extension': '.flac', 'mime_type': 'audio/flac', 'lossy': False},
'm4a': {'extension': '.m4a', 'mime_type': 'audio/mp4', 'lossy': True},
'ogg': {'extension': '.ogg', 'mime_type': 'audio/ogg', 'lossy': True}
}
def __post_init__(self):
if self.value.lower() not in self.FORMATS:
raise InvalidAudioFormatError(self.value, list(self.FORMATS.keys()))
# Normalize to lowercase
object.__setattr__(self, 'value', self.value.lower())
@property
def extension(self) -> str:
"""Get file extension for this format."""
return self.FORMATS[self.value]['extension']
@property
def mime_type(self) -> str:
"""Get MIME type for this format."""
return self.FORMATS[self.value]['mime_type']
@property
def is_lossy(self) -> bool:
"""Check if format uses lossy compression."""
return self.FORMATS[self.value]['lossy']
@classmethod
def supported_formats(cls) -> List[str]:
"""Get list of supported formats."""
return list(cls.FORMATS.keys())
def __str__(self) -> str:
return self.value