funkwhale/api/funkwhale_api/music/importers.py

44 wiersze
1.4 KiB
Python

def load(model, *args, **kwargs):
importer = registry[model.__name__](model=model)
return importer.load(*args, **kwargs)
class Importer(object):
def __init__(self, model):
self.model = model
def load(self, cleaned_data, raw_data, import_hooks):
mbid = cleaned_data.pop("mbid")
m = self.model.objects.update_or_create(mbid=mbid, defaults=cleaned_data)[0]
for hook in import_hooks:
hook(m, cleaned_data, raw_data)
return m
class Mapping(object):
"""Cast musicbrainz data to funkwhale data and vice-versa"""
def __init__(self, musicbrainz_mapping):
self.musicbrainz_mapping = musicbrainz_mapping
self._from_musicbrainz = {}
self._to_musicbrainz = {}
for field_name, conf in self.musicbrainz_mapping.items():
self._from_musicbrainz[conf["musicbrainz_field_name"]] = {
"field_name": field_name,
"converter": conf.get("converter", lambda v: v),
}
self._to_musicbrainz[field_name] = {
"field_name": conf["musicbrainz_field_name"],
"converter": conf.get("converter", lambda v: v),
}
def from_musicbrainz(self, key, value):
return (
self._from_musicbrainz[key]["field_name"],
self._from_musicbrainz[key]["converter"](value),
)
registry = {"Artist": Importer, "Track": Importer, "Album": Importer, "Work": Importer}