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