From 78c91fd1c7a5e0620f1da44ff202e2038dcdbc31 Mon Sep 17 00:00:00 2001 From: ABCbum Date: Wed, 18 Dec 2019 13:30:08 +0700 Subject: [PATCH] Add new functionality and refactor code In order to make mblookup command able to lookup data based on release id, new function getReleaseMetadata is created. To remove duplicated code, importing and set_useragent is moved to the top of the file. Now _getMetadata behaves differently when the discid is not specified. Signed-off-by: ABCbum --- whipper/common/mbngs.py | 61 +++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 2029c61..95967bb 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -24,9 +24,13 @@ Handles communication with the MusicBrainz server using NGS. from urllib.error import HTTPError import whipper +import json +import musicbrainzngs import logging logger = logging.getLogger(__name__) +musicbrainzngs.set_useragent("whipper", whipper.__version__, + "https://github.com/whipper-team/whipper") VA_ID = "89ad4ac3-39f7-470e-963a-56509c546377" # Various Artists @@ -161,7 +165,7 @@ def _getWorks(recording): return works -def _getMetadata(release, discid, country=None): +def _getMetadata(release, discid=None, country=None): """ :type release: dict :param release: a release dict as returned in the value for key release @@ -220,7 +224,7 @@ def _getMetadata(release, discid, country=None): # only show discs from medium-list->disc-list with matching discid for medium in release['medium-list']: for disc in medium['disc-list']: - if disc['id'] == discid: + if discid is None or disc['id'] == discid: title = release['title'] discMD.releaseTitle = title if 'disambiguation' in release: @@ -271,6 +275,40 @@ def _getMetadata(release, discid, country=None): return discMD +def getReleaseMetadata(release_id, discid=None, country=None, record=False): + """ + Return a DiscMetadata object based on MusicBrainz Release ID and Disc ID. + + If the disc id is not specified, it will match with any disc that is on + the release disc-list. Otherwise only returns metadata of one disc in + release disc-list. + + :param release_id: MusicBrainz Release ID + :type release_id: str + :param discid: MusicBrainz Disc ID + :type discid: str or None + :param country: the country the release was issued in + :type country: str or None + :param record: whether to record to disc as a JSON serialization + :type record: bool + :returns: a DiscMetadata object based on MusicBrainz Release ID & Disc ID + :rtype: `DiscMetadata` + """ + # to get titles of recordings, we need to query the release with + # artist-credits + + res = musicbrainzngs.get_release_by_id( + release_id, includes=["artists", "artist-credits", + "recordings", "discids", + "labels", "recording-level-rels", + "work-rels", "release-groups"]) + _record(record, 'release', release_id, res) + releaseDetail = res['release'] + formatted = json.dumps(releaseDetail, sort_keys=False, indent=4) + logger.debug('release %s', formatted) + return _getMetadata(releaseDetail, discid, country) + + # see http://bugs.musicbrainz.org/browser/python-musicbrainz2/trunk/examples/ # ripper.py @@ -287,11 +325,8 @@ def musicbrainz(discid, country=None, record=False): :rtype: list of :any:`DiscMetadata` """ logger.debug('looking up results for discid %r', discid) - import musicbrainzngs logging.getLogger("musicbrainzngs").setLevel(logging.WARNING) - musicbrainzngs.set_useragent("whipper", whipper.__version__, - "https://github.com/whipper-team/whipper") ret = [] try: @@ -314,26 +349,12 @@ def musicbrainz(discid, country=None, record=False): # Display the returned results to the user. - import json for release in result['disc']['release-list']: formatted = json.dumps(release, sort_keys=False, indent=4) logger.debug('result %s: artist %r, title %r', formatted, release['artist-credit-phrase'], release['title']) - # to get titles of recordings, we need to query the release with - # artist-credits - - res = musicbrainzngs.get_release_by_id( - release['id'], includes=["artists", "artist-credits", - "recordings", "discids", "labels", - "recording-level-rels", "work-rels", - "release-groups"]) - _record(record, 'release', release['id'], res) - releaseDetail = res['release'] - formatted = json.dumps(releaseDetail, sort_keys=False, indent=4) - logger.debug('release %s', formatted) - - md = _getMetadata(releaseDetail, discid, country) + md = getReleaseMetadata(release['id'], discid, country, record) if md: logger.debug('duration %r', md.duration) ret.append(md)