mirror of
https://github.com/KevinMidboe/spotify-downloader.git
synced 2025-12-08 20:39:08 +00:00
Refactor embedding metadata to media
This commit is contained in:
88
spotdl/metadata/embedder_base.py
Normal file
88
spotdl/metadata/embedder_base.py
Normal file
@@ -0,0 +1,88 @@
|
||||
import os
|
||||
|
||||
from abc import ABC
|
||||
from abc import abstractmethod
|
||||
|
||||
class EmbedderBase(ABC):
|
||||
"""
|
||||
The class must define the supported media file encoding
|
||||
formats here using a static variable - such as:
|
||||
|
||||
>>> supported_formats = ("mp3", "opus", "flac")
|
||||
"""
|
||||
supported_formats = ()
|
||||
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
"""
|
||||
For every supported format, there must be a corresponding
|
||||
method that applies metadata on this format.
|
||||
|
||||
Such as if mp3 is supported, there must exist a method named
|
||||
`as_mp3` on this class that applies metadata on mp3 files.
|
||||
"""
|
||||
# self.targets = { fmt: eval(str("self.as_" + fmt))
|
||||
# for fmt in self.supported_formats }
|
||||
#
|
||||
# TODO: The above code seems to fail for some reason
|
||||
# I do not know.
|
||||
self.targets = {}
|
||||
for fmt in self.supported_formats:
|
||||
# FIXME: Calling `eval` is dangerous here!
|
||||
self.targets[fmt] = eval("self.as_" + fmt)
|
||||
|
||||
def get_encoding(self, path):
|
||||
"""
|
||||
This method must determine the encoding for a local
|
||||
audio file. Such as "mp3", "wav", "m4a", etc.
|
||||
"""
|
||||
_, extension = os.path.splitext(path)
|
||||
# Ignore the initial dot from file extension
|
||||
return extension[1:]
|
||||
|
||||
def apply_metadata(self, path, metadata, encoding=None):
|
||||
"""
|
||||
This method must automatically detect the media encoding
|
||||
format from file path and embed the corresponding metadata
|
||||
on the given file by calling an appropriate submethod.
|
||||
"""
|
||||
if encoding is None:
|
||||
encoding = self.get_encoding(path)
|
||||
if encoding not in self.supported_formats:
|
||||
raise TypeError(
|
||||
'The input format ("{}") is not supported.'.format(
|
||||
encoding,
|
||||
))
|
||||
embed_on_given_format = self.targets[encoding]
|
||||
embed_on_given_format(path, metadata)
|
||||
|
||||
def as_mp3(self, path, metadata):
|
||||
"""
|
||||
Method for mp3 support. This method might be defined in
|
||||
a subclass.
|
||||
|
||||
Other methods for additional supported formats must also
|
||||
be declared here.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def as_opus(self, path, metadata):
|
||||
"""
|
||||
Method for opus support. This method might be defined in
|
||||
a subclass.
|
||||
|
||||
Other methods for additional supported formats must also
|
||||
be declared here.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def as_flac(self, path, metadata):
|
||||
"""
|
||||
Method for flac support. This method might be defined in
|
||||
a subclass.
|
||||
|
||||
Other methods for additional supported formats must also
|
||||
be declared here.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
Reference in New Issue
Block a user