Skip to content
Snippets Groups Projects
tasks.py 2.69 KiB
Newer Older
  • Learn to ignore specific revisions
  • import os
    from django.core.files import File
    
    from django.db import transaction
    
    from funkwhale_api.providers.acoustid import get_acoustid_client
    
    from funkwhale_api.music import models, metadata
    
    
    
    @transaction.atomic
    
    def import_track_data_from_path(path):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        track_mbid = data.get("musicbrainz_recordingid", None)
        album_mbid = data.get("musicbrainz_albumid", None)
    
        if album_mbid and track_mbid:
            # to gain performance and avoid additional mb lookups,
            # we import from the release data, which is already cached
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            return models.Track.get_or_create_from_release(album_mbid, track_mbid)[0]
    
        elif track_mbid:
            return models.Track.get_or_create_from_api(track_mbid)[0]
        elif album_mbid:
            album = models.Album.get_or_create_from_api(album_mbid)[0]
    
        artist = album.artist if album else None
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        artist_mbid = data.get("musicbrainz_artistid", None)
    
        if not artist:
            if artist_mbid:
                artist = models.Artist.get_or_create_from_api(artist_mbid)[0]
            else:
                artist = models.Artist.objects.get_or_create(
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    name__iexact=data.get("artist"), defaults={"name": data.get("artist")}
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        release_date = data.get("date", default=None)
    
        if not album:
            album = models.Album.objects.get_or_create(
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                title__iexact=data.get("album"),
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                defaults={"title": data.get("album"), "release_date": release_date},
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        position = data.get("track_number", default=None)
    
        track = models.Track.objects.get_or_create(
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            title__iexact=data.get("title"),
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            defaults={"title": data.get("title"), "position": position},
    
        return track
    
    
    def import_metadata_with_musicbrainz(path):
        pass
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    @celery.app.task(name="audiofile.from_path")
    
    def from_path(path):
        acoustid_track_id = None
        try:
            client = get_acoustid_client()
            result = client.get_best_match(path)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            acoustid_track_id = result["id"]
    
            track = import_track_data_from_path(path)
    
        except (TypeError, KeyError):
            track = import_metadata_without_musicbrainz(path)
        else:
            track, created = models.Track.get_or_create_from_api(
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                mbid=result["recordings"][0]["id"]
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            raise ValueError("File already exists for track {}".format(track.pk))
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        track_file = models.TrackFile(track=track, acoustid_track_id=acoustid_track_id)
        track_file.audio_file.save(os.path.basename(path), File(open(path, "rb")))