Update tsv to use utility functions

This commit is contained in:
2023-02-13 18:31:57 -05:00
parent 31907ed1b2
commit 87f068dccd
2 changed files with 87 additions and 50 deletions

View File

@ -0,0 +1,77 @@
#!/usr/bin/env python3
from typing import Optional
from scrobbles.musicbrainz import (
lookup_album_dict_from_mb,
lookup_artist_id_from_mb,
)
from music.models import Artist, Album, Track
def get_or_create_artist(name: str) -> Artist:
artist, artist_created = Artist.objects.get_or_create(name=name)
if artist_created:
artist.musicbrainz_id = lookup_artist_id_from_mb(artist.name)
artist.save(update_fields=["musicbrainz_id"])
return artist
def get_or_create_album(name: str, artist: Artist) -> Album:
album = None
album_created = False
albums = Album.objects.filter(name=name)
if albums.count() == 1:
album = albums.first()
else:
for potential_album in albums:
if artist in album.artist_set.all():
album = potential_album
if not album:
album_created = True
album = Album.objects.create(name=name)
album.save()
album.artists.add(artist)
if album_created:
album_dict = lookup_album_dict_from_mb(
album.name, artist_name=artist.name
)
album.year = album_dict["year"]
album.musicbrainz_id = album_dict["mb_id"]
album.musicbrainz_releasegroup_id = album_dict["mb_group_id"]
album.musicbrainz_albumartist_id = artist.musicbrainz_id
album.save(
update_fields=[
"year",
"musicbrainz_id",
"musicbrainz_releasegroup_id",
"musicbrainz_albumartist_id",
]
)
album.artists.add(artist)
album.fetch_artwork()
return album
def get_or_create_track(
title: str,
mbid: str,
artist: Artist,
album: Album,
run_time=None,
run_time_ticks=None,
) -> Track:
track, track_created = Track.objects.get_or_create(
title=title,
artist=artist,
musicbrainz_id=mbid,
)
if track_created:
track.album = album
track.run_time = run_time
track.run_time_ticks = run_time_ticks
track.save(update_fields=['album', 'run_time', 'run_time_ticks'])
return track

View File

@ -3,12 +3,11 @@ import logging
from datetime import datetime from datetime import datetime
import pytz import pytz
from music.models import Album, Artist, Track
from scrobbles.models import Scrobble from scrobbles.models import Scrobble
from music.utils import (
from vrobbler.apps.scrobbles.musicbrainz import ( get_or_create_album,
lookup_album_dict_from_mb, get_or_create_artist,
lookup_artist_id_from_mb, get_or_create_track,
) )
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -35,57 +34,18 @@ def process_audioscrobbler_tsv_file(file_path, user_tz=None):
extra={'row': row}, extra={'row': row},
) )
continue continue
artist, artist_created = Artist.objects.get_or_create(name=row[0]) artist = get_or_create_artist(row[0])
if artist_created: album = get_or_create_album(row[1])
artist.musicbrainz_id = lookup_artist_id_from_mb(artist.name)
artist.save(update_fields=["musicbrainz_id"])
album = None track = get_or_create_track(
album_created = False
albums = Album.objects.filter(name=row[1])
if albums.count() == 1:
album = albums.first()
else:
for potential_album in albums:
if artist in album.artist_set.all():
album = potential_album
if not album:
album_created = True
album = Album.objects.create(name=row[1])
album.save()
album.artists.add(artist)
if album_created:
album_dict = lookup_album_dict_from_mb(
album.name, artist_name=artist.name
)
album.year = album_dict["year"]
album.musicbrainz_id = album_dict["mb_id"]
album.musicbrainz_releasegroup_id = album_dict["mb_group_id"]
album.musicbrainz_albumartist_id = artist.musicbrainz_id
album.save(
update_fields=[
"year",
"musicbrainz_id",
"musicbrainz_releasegroup_id",
"musicbrainz_albumartist_id",
]
)
album.artists.add(artist)
album.fetch_artwork()
track, track_created = Track.objects.get_or_create(
title=row[2], title=row[2],
mbid=row[7],
artist=artist, artist=artist,
album=album, album=album,
musicbrainz_id=row[7], run_time=row[4],
run_time_ticks=row[4] * 1000,
) )
if track_created:
track.run_time = int(row[4])
track.run_time_ticks = int(row[4]) * 1000
track.save()
timestamp = ( timestamp = (
datetime.utcfromtimestamp(int(row[6])) datetime.utcfromtimestamp(int(row[6]))
.replace(tzinfo=user_tz) .replace(tzinfo=user_tz)