Source code for lrctoolbox.lrc_metadata

"""A module that contains classes that represent LRC metadata."""

from dataclasses import dataclass
from typing import ClassVar, Optional


[docs] class BaseLRCMetadata: """A class that represents base LRC metadata.""" LRC_METADATA_MAPPINGS: ClassVar[dict[str, str]] = {} @property def lrc_formatted_metadata(self) -> list[str]: """Return a list of formatted metadata.""" formatted_metadata = [] for key, value in self.LRC_METADATA_MAPPINGS.items(): if not getattr(self, value): continue formatted_metadata.append(f"[{key}:{getattr(self, value)}]") return formatted_metadata
[docs] @dataclass() class TrackMetadataMixin: """A class that represents track metadata.""" artist: Optional[str] = None title: Optional[str] = None album: Optional[str] = None length: Optional[str] = None lyricist: Optional[str] = None mbid: Optional[str] = None uri: Optional[str] = None language: Optional[str] = None LRC_METADATA_MAPPINGS: ClassVar[dict[str, str]] = { "ar": "artist", "ti": "title", "al": "album", "au": "lyricist", "uri": "uri", "mbid": "mbid", "length": "length", "language": "language", }
[docs] @dataclass() class ModuleMetadataMixin: """A class that represents module metadata.""" re_name: Optional[str] = None version: Optional[str] = None author: Optional[str] = None LRC_METADATA_MAPPINGS: ClassVar[dict[str, str]] = { "re": "re_name", "ve": "version", "by": "author", }
[docs] class LRCMetadata(BaseLRCMetadata, TrackMetadataMixin, ModuleMetadataMixin): """A class that represents combined metadata of module and track.""" LRC_METADATA_MAPPINGS = { **TrackMetadataMixin.LRC_METADATA_MAPPINGS, **ModuleMetadataMixin.LRC_METADATA_MAPPINGS, }
[docs] class TrackMetadata(BaseLRCMetadata, TrackMetadataMixin): """A class that represents track metadata.""" LRC_METADATA_MAPPINGS = TrackMetadataMixin.LRC_METADATA_MAPPINGS
[docs] class ModuleMetadata(BaseLRCMetadata, ModuleMetadataMixin): """A class that represents module metadata.""" LRC_METADATA_MAPPINGS = ModuleMetadataMixin.LRC_METADATA_MAPPINGS