Skip to content

Commit f5cc228

Browse files
Louis RannouLouis Rannou
authored andcommitted
Prepare musicbrainzngs replacement
Some of the work that was done in musicbrainzngs requires to be done in beets to lighten the musicbrainz API. Signed-off-by: Louis Rannou <[email protected]>
1 parent 8693edb commit f5cc228

File tree

2 files changed

+82
-22
lines changed

2 files changed

+82
-22
lines changed

beets/autotag/mb.py

Lines changed: 76 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,64 @@
4949
"year": "date",
5050
}
5151

52-
musicbrainzngs.set_useragent("beets", beets.__version__, "https://beets.io/")
52+
53+
class MbInterface():
54+
VALID_BROWSE_INCLUDES = musicbrainzngs.VALID_BROWSE_INCLUDES
55+
VALID_INCLUDES = musicbrainzngs.VALID_INCLUDES
56+
57+
class WebServiceError(musicbrainzngs.WebServiceError):
58+
pass
59+
60+
class MusicBrainzError(musicbrainzngs.MusicBrainzError):
61+
pass
62+
63+
class ResponseError (musicbrainzngs.ResponseError):
64+
pass
65+
66+
def __init__(self):
67+
pass
68+
69+
def set_useragent(self, app, version, contact=None):
70+
return musicbrainzngs.set_useragent(app, version, contact=contact)
71+
72+
def set_hostname(self, hostname, https):
73+
return musicbrainzngs.set_hostname(hostname, https)
74+
75+
def set_rate_limit(self, interval, ratelimit):
76+
return musicbrainzngs.set_rate_limit(interval, ratelimit)
77+
78+
def browse_recordings(self, artist=None, release=None, includes=[],
79+
limit=None, offset=None):
80+
return musicbrainzngs.browse_recordings(
81+
artist=artist, release=release, includes=includes,
82+
limit=limit, offset=offset)
83+
84+
def search_recordings(self, query='', limit=None, offset=None,
85+
strict=False, **fields):
86+
return musicbrainzngs.search_recordings(
87+
query=query, limit=limit, offset=offset,
88+
strict=strict, **fields)
89+
90+
def get_release_by_id(self, id, includes=[],
91+
release_status=[], release_type=[]):
92+
return musicbrainzngs.get_release_by_id(id, includes=includes,
93+
release_status=release_status,
94+
release_type=release_type)
95+
96+
def get_recording_by_id(self, id, includes=[],
97+
release_status=[], release_type=[]):
98+
return musicbrainzngs.get_recording_by_id(id, includes=includes,
99+
release_status=release_status,
100+
release_type=release_type)
101+
102+
def search_releases(self, query='', limit=None, offset=None,
103+
strict=False, **fields):
104+
return musicbrainzngs.search_releases(query=query, limit=limit, offset=offset,
105+
strict=strict, **fields)
106+
107+
108+
mbi = MbInterface()
109+
mbi.set_useragent("beets", beets.__version__, "https://beets.io/")
53110

54111

55112
class MusicBrainzAPIError(util.HumanReadableException):
@@ -59,7 +116,7 @@ class MusicBrainzAPIError(util.HumanReadableException):
59116

60117
def __init__(self, reason, verb, query, tb=None):
61118
self.query = query
62-
if isinstance(reason, musicbrainzngs.WebServiceError):
119+
if isinstance(reason, mbi.WebServiceError):
63120
reason = "MusicBrainz not reachable"
64121
super().__init__(reason, verb, tb)
65122

@@ -94,14 +151,14 @@ def get_message(self):
94151
"recording-rels",
95152
"release-rels",
96153
]
97-
if "work-level-rels" in musicbrainzngs.VALID_BROWSE_INCLUDES["recording"]:
154+
if "work-level-rels" in mbi.VALID_BROWSE_INCLUDES["recording"]:
98155
BROWSE_INCLUDES.append("work-level-rels")
99156
BROWSE_CHUNKSIZE = 100
100157
BROWSE_MAXTRACKS = 500
101158
TRACK_INCLUDES = ["artists", "aliases", "isrcs"]
102-
if "work-level-rels" in musicbrainzngs.VALID_INCLUDES["recording"]:
159+
if "work-level-rels" in mbi.VALID_INCLUDES["recording"]:
103160
TRACK_INCLUDES += ["work-level-rels", "artist-rels"]
104-
if "genres" in musicbrainzngs.VALID_INCLUDES["recording"]:
161+
if "genres" in mbi.VALID_INCLUDES["recording"]:
105162
RELEASE_INCLUDES += ["genres"]
106163

107164

@@ -122,8 +179,8 @@ def configure():
122179
# Only call set_hostname when a custom server is configured. Since
123180
# musicbrainz-ngs connects to musicbrainz.org with HTTPS by default
124181
if hostname != "musicbrainz.org":
125-
musicbrainzngs.set_hostname(hostname, https)
126-
musicbrainzngs.set_rate_limit(
182+
mbi.set_hostname(hostname, https)
183+
mbi.set_rate_limit(
127184
config["musicbrainz"]["ratelimit_interval"].as_number(),
128185
config["musicbrainz"]["ratelimit"].get(int),
129186
)
@@ -427,7 +484,7 @@ def album_info(release: Dict) -> beets.autotag.hooks.AlbumInfo:
427484
for i in range(0, ntracks, BROWSE_CHUNKSIZE):
428485
log.debug("Retrieving tracks starting at {}", i)
429486
recording_list.extend(
430-
musicbrainzngs.browse_recordings(
487+
mbi.browse_recordings(
431488
release=release["id"],
432489
limit=BROWSE_CHUNKSIZE,
433490
includes=BROWSE_INCLUDES,
@@ -720,10 +777,10 @@ def match_album(
720777

721778
try:
722779
log.debug("Searching for MusicBrainz releases with: {!r}", criteria)
723-
res = musicbrainzngs.search_releases(
780+
res = mbi.search_releases(
724781
limit=config["musicbrainz"]["searchlimit"].get(int), **criteria
725782
)
726-
except musicbrainzngs.MusicBrainzError as exc:
783+
except mbi.MusicBrainzError as exc:
727784
raise MusicBrainzAPIError(
728785
exc, "release search", criteria, traceback.format_exc()
729786
)
@@ -751,10 +808,10 @@ def match_track(
751808
return
752809

753810
try:
754-
res = musicbrainzngs.search_recordings(
811+
res = mbi.search_recordings(
755812
limit=config["musicbrainz"]["searchlimit"].get(int), **criteria
756813
)
757-
except musicbrainzngs.MusicBrainzError as exc:
814+
except mbi.MusicBrainzError as exc:
758815
raise MusicBrainzAPIError(
759816
exc, "recording search", criteria, traceback.format_exc()
760817
)
@@ -794,7 +851,7 @@ def _find_actual_release_from_pseudo_release(
794851

795852
actual_id = translations[0]["target"]
796853

797-
return musicbrainzngs.get_release_by_id(actual_id, RELEASE_INCLUDES)
854+
return mbi.get_release_by_id(actual_id, RELEASE_INCLUDES)
798855

799856

800857
def _merge_pseudo_and_actual_album(
@@ -847,18 +904,18 @@ def album_for_id(releaseid: str) -> Optional[beets.autotag.hooks.AlbumInfo]:
847904
log.debug("Invalid MBID ({0}).", releaseid)
848905
return None
849906
try:
850-
res = musicbrainzngs.get_release_by_id(albumid, RELEASE_INCLUDES)
907+
res = mbi.get_release_by_id(albumid, RELEASE_INCLUDES)
851908

852909
# resolve linked release relations
853910
actual_res = None
854911

855912
if res["release"].get("status") == "Pseudo-Release":
856913
actual_res = _find_actual_release_from_pseudo_release(res)
857914

858-
except musicbrainzngs.ResponseError:
915+
except mbi.ResponseError:
859916
log.debug("Album ID match failed.")
860917
return None
861-
except musicbrainzngs.MusicBrainzError as exc:
918+
except mbi.MusicBrainzError as exc:
862919
raise MusicBrainzAPIError(
863920
exc, "get release by ID", albumid, traceback.format_exc()
864921
)
@@ -883,11 +940,11 @@ def track_for_id(releaseid: str) -> Optional[beets.autotag.hooks.TrackInfo]:
883940
log.debug("Invalid MBID ({0}).", releaseid)
884941
return None
885942
try:
886-
res = musicbrainzngs.get_recording_by_id(trackid, TRACK_INCLUDES)
887-
except musicbrainzngs.ResponseError:
943+
res = mbi.get_recording_by_id(trackid, TRACK_INCLUDES)
944+
except mbi.ResponseError:
888945
log.debug("Track ID match failed.")
889946
return None
890-
except musicbrainzngs.MusicBrainzError as exc:
947+
except mbi.MusicBrainzError as exc:
891948
raise MusicBrainzAPIError(
892949
exc, "get recording by ID", trackid, traceback.format_exc()
893950
)

test/test_mb.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,8 @@ def test_match_track(self):
775775
}
776776
ti = list(mb.match_track("hello", "there"))[0]
777777

778-
p.assert_called_with(artist="hello", recording="there", limit=5)
778+
p.assert_called_with(query="", limit=5, offset=None, strict=False,
779+
artist="hello", recording="there")
779780
self.assertEqual(ti.title, "foo")
780781
self.assertEqual(ti.track_id, "bar")
781782

@@ -828,8 +829,10 @@ def test_match_album(self):
828829

829830
ai = list(mb.match_album("hello", "there"))[0]
830831

831-
sp.assert_called_with(artist="hello", release="there", limit=5)
832-
gp.assert_called_with(mbid, mock.ANY)
832+
sp.assert_called_with(query="", limit=5, offset=None, strict=False,
833+
artist="hello", release="there")
834+
gp.assert_called_with(mbid, includes=mock.ANY,
835+
release_status=[], release_type=[])
833836
self.assertEqual(ai.tracks[0].title, "foo")
834837
self.assertEqual(ai.album, "hi")
835838

0 commit comments

Comments
 (0)