通过 artist_id 筛选来自 browse_release_groups 的结果以获取唱片,python

Filter results from browse_release_groups by artist_id to get discography, python

我正在尝试检索各种艺术家的唱片目录。对于我检查过的艺术家,维基百科和 MusicBrainz.org 的手动网络界面似乎都同意由哪些专辑组成。我的第一个想法是尝试 screen-scrape 这些资源中的任何一个,但要正确地做到这一点似乎很难。

直接查询 musicbrainz 数据似乎提供了一种获取干净数据的更快方法。理想情况下,我会构建这样的请求...

data = get_release_groups(artist=mbid,
                          primary_type='Album',
                          status='Official',
                          includes=['first_release_date',
                                    'title',
                                    'secondary_type_list'])

我选择使用 python 包装器 musicbrainsngs,因为我对 python 相当有经验。它让我可以选择三种方法,get_、search_ 和 browse_。 get_ 不会 return 足够的记录。 Browse_ 似乎是我想要的,所以我首先尝试了它,尤其是当 search_ 被记录在 python 示例中,而不是我已经拥有的 mb_id 中寻找文本时。

当我做一个browse_release_groups(artist=artist_id,)时,我得到了一个发行组列表,每个发行组都包含我想要的数据,即专辑名称、类型和年份.但是,我还得到了大量其他发行组,这些发行组没有出现在他们的手动网络结果中(例如滚石乐队)https://musicbrainz.org/artist/b071f9fa-14b0-4217-8e97-eb41da73f598

似乎没有任何方法可以在 status='official' 的查询中进行过滤,或者将状态作为结果的一部分包含在内,因此我可以手动进行过滤。

在回答这个问题时,维兰德建议我使用 search_ 查询。我已经测试了 search_release_groups(arid=mbid, status='official', primarytype='Album', strict=True, limit=...) 和这个 returns 更少的版本团体。就录音室专辑而言,它匹配 1:1。汇编中仍然存在一些小差异,我可以接受。但是,这个查询没有 return first-release-date,到目前为止,我一直在尝试寻找如何包含它的尝试。我在服务器搜索代码中注意到每个查询都开始操纵 rgm.first_release_date_year 等,但不清楚 how/when 这是从查询中获取的 return。

我刚刚想到我可以同时使用 browse_ 和 search_ ,因为它们一起为我提供了所有信息。所以我有一个解决方法,但感觉很农业。

TL;DR 我想要按艺术家 ID 排列的发行组(标题、日期、类型、状态)。如果我浏览,我会得到日期,但不能包含或按状态过滤。如果我搜索,我可以按状态过滤,但不获取日期。我怎样才能在一次查询中同时获得两者?

我不完全确定你的问题是什么,但是发布组的 find_by_artist 方法(来源 here)正在为艺术家页面过滤发布组,特别是:

     # Show only RGs with official releases by default, plus all-status-less ones so people fix the status
    unless ($show_all) {
    push @$conditions, "(EXISTS (SELECT 1 FROM release where release.release_group = rg.id AND release.status = '1') OR
                        NOT EXISTS (SELECT 1 FROM release where release.release_group = rg.id AND release.status IS NOT NULL))";
    }

不幸的是,我认为不可能在普通的网络服务调用中表达该条件。但是,您可以使用搜索 Web 服务按至少包含一个 "official" 版本的滚石来筛选版本组:http://musicbrainz.org/ws/2/release-group/?query=arid:b071f9fa-14b0-4217-8e97-eb41da73f598%20AND%20status:official&offset=0。在 python-musicbrainzngs 中,对此的调用是

search_release_groups(arid="b071f9fa-14b0-4217-8e97-eb41da73f598", status="official", strict=True)

遗憾的是,搜索结果不包含 first-release-date 字段。有一个 open ticket 关于它,但它不会在不久的将来被修复。