musicbrainz.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import logging
  2. from typing import Iterable
  3. import musicbrainzngs
  4. from dateutil.parser import parse
  5. logger = logging.getLogger(__name__)
  6. def lookup_album_from_mb(musicbrainz_id: str) -> dict:
  7. release_dict = {}
  8. musicbrainzngs.set_useragent("vrobbler", "0.3.0")
  9. release_data = musicbrainzngs.get_release_by_id(
  10. musicbrainz_id,
  11. includes=["artists", "release-groups", "recordings"],
  12. ).get("release")
  13. if not release_data:
  14. return release_dict
  15. primary_artist = release_data.get("artist-credit")[0]
  16. release_dict = {
  17. "artist": {
  18. "name": primary_artist.get("name"),
  19. "musicbrainz_id": primary_artist.get("id"),
  20. },
  21. "album": {
  22. "name": release_data.get("title"),
  23. "musicbrainz_id": musicbrainz_id,
  24. "musicbrainz_releasegroup_id": release_data.get(
  25. "release-group"
  26. ).get("id"),
  27. "musicbrainz_albumaritist_id": primary_artist.get("id"),
  28. "year": release_data.get("year")[0:4],
  29. },
  30. }
  31. release_dict["tracks"] = []
  32. for track in release_data.get("medium-list")[0]["track-list"]:
  33. recording = track["recording"]
  34. release_dict["tracks"].append(
  35. {
  36. "title": recording["title"],
  37. "musicbrainz_id": recording["id"],
  38. "run_time": track["length"] / 1000,
  39. }
  40. )
  41. return release_dict
  42. def lookup_album_dict_from_mb(release_name: str, artist_name: str) -> dict:
  43. musicbrainzngs.set_useragent("vrobbler", "0.3.0")
  44. top_result = musicbrainzngs.search_releases(
  45. release_name, artist=artist_name
  46. )["release-list"][0]
  47. score = int(top_result.get("ext:score"))
  48. if score < 85:
  49. logger.debug(
  50. "Album lookup score below 85 threshold",
  51. extra={"result": top_result},
  52. )
  53. return {}
  54. year = None
  55. if top_result.get("date"):
  56. year = parse(top_result["date"]).year
  57. return {
  58. "year": year,
  59. "title": top_result["title"],
  60. "mb_id": top_result["id"],
  61. "mb_group_id": top_result["release-group"]["id"],
  62. }
  63. def lookup_artist_from_mb(artist_name: str) -> dict:
  64. musicbrainzngs.set_useragent("vrobbler", "0.3.0")
  65. try:
  66. top_result = musicbrainzngs.search_artists(artist=artist_name)[
  67. "artist-list"
  68. ][0]
  69. except IndexError:
  70. return {}
  71. score = int(top_result.get("ext:score"))
  72. if score < 85:
  73. logger.debug(
  74. "Artist lookup score below 85 threshold",
  75. extra={"result": top_result},
  76. )
  77. return {}
  78. return top_result
  79. def lookup_track_from_mb(
  80. track_name: str, artist_mbid: str, album_mbid: str
  81. ) -> str:
  82. musicbrainzngs.set_useragent("vrobbler", "0.3.0")
  83. top_result = musicbrainzngs.search_recordings(
  84. query=track_name, artist=artist_mbid, release=album_mbid
  85. )["recording-list"][0]
  86. score = int(top_result.get("ext:score"))
  87. if score < 85:
  88. logger.debug(
  89. "Track lookup score below 85 threshold",
  90. extra={"result": top_result},
  91. )
  92. return ""
  93. return top_result