utils.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import logging
  2. import re
  3. from scrobbles.musicbrainz import (
  4. lookup_album_dict_from_mb,
  5. lookup_artist_from_mb,
  6. )
  7. logger = logging.getLogger(__name__)
  8. from music.models import Album, Artist, Track
  9. def get_or_create_artist(name: str, mbid: str = None) -> Artist:
  10. artist = None
  11. logger.debug(f'Got artist {name} and mbid: {mbid}')
  12. if 'feat.' in name.lower():
  13. name = re.split("feat.", name, flags=re.IGNORECASE)[0].strip()
  14. if 'featuring' in name.lower():
  15. name = re.split("featuring", name, flags=re.IGNORECASE)[0].strip()
  16. artist_dict = lookup_artist_from_mb(name)
  17. mbid = mbid or artist_dict['id']
  18. logger.debug(f'Looking up artist {name} and mbid: {mbid}')
  19. artist, created = Artist.objects.get_or_create(
  20. name=name, musicbrainz_id=mbid
  21. )
  22. logger.debug(f"Cleaning artist {name} with {artist_dict['name']}")
  23. # Clean up bad names in our DB with MB names
  24. # if artist.name != artist_dict["name"]:
  25. # artist.name = artist_dict["name"]
  26. # artist.save(update_fields=["name"])
  27. return artist
  28. def get_or_create_album(name: str, artist: Artist, mbid: str = None) -> Album:
  29. album = None
  30. album_created = False
  31. albums = Album.objects.filter(name__iexact=name)
  32. if albums.count() == 1:
  33. album = albums.first()
  34. else:
  35. for potential_album in albums:
  36. if artist in album.artist_set.all():
  37. album = potential_album
  38. if not album:
  39. album_created = True
  40. album = Album.objects.create(name=name, musicbrainz_id=mbid)
  41. album.save()
  42. album.artists.add(artist)
  43. if album_created or not mbid:
  44. album_dict = lookup_album_dict_from_mb(
  45. album.name, artist_name=artist.name
  46. )
  47. album.year = album_dict["year"]
  48. album.musicbrainz_id = album_dict["mb_id"]
  49. album.musicbrainz_releasegroup_id = album_dict["mb_group_id"]
  50. album.musicbrainz_albumartist_id = artist.musicbrainz_id
  51. album.save(
  52. update_fields=[
  53. "year",
  54. "musicbrainz_id",
  55. "musicbrainz_releasegroup_id",
  56. "musicbrainz_albumartist_id",
  57. ]
  58. )
  59. album.artists.add(artist)
  60. album.fetch_artwork()
  61. return album
  62. def get_or_create_track(
  63. title: str,
  64. mbid: str,
  65. artist: Artist,
  66. album: Album,
  67. run_time=None,
  68. run_time_ticks=None,
  69. ) -> Track:
  70. track = None
  71. if mbid:
  72. track = Track.objects.filter(
  73. musicbrainz_id=mbid,
  74. ).first()
  75. if not track:
  76. track = Track.objects.filter(
  77. title=title, artist=artist, album=album
  78. ).first()
  79. # TODO Can we look up mbid for tracks?
  80. if not track:
  81. track = Track.objects.create(
  82. title=title,
  83. artist=artist,
  84. album=album,
  85. musicbrainz_id=mbid,
  86. run_time=run_time,
  87. run_time_ticks=run_time_ticks,
  88. )
  89. return track