如何比较MusicBrainz Picard插件中的两个版本?

时间:2014-07-07 21:09:32

标签: python metadata tagging musicbrainz

我一直在尝试编写一个Picard插件。我的想法是它自动插入音译曲目列表作为带有用非拉丁文脚本编写的曲目标题的版本的评论。 MusicBrainz将这些音译包含为与实际版本并行存在的伪版本。例如,对于a given release,我必须首先阅读相关版本的ID的关系。然后我必须将这些曲目的标题转移到我的文件的注释字段中。在伪代码中:

pseudo_release = actual_release.getTransliteration() # As indicated in a relationship
i = 1
while i <= actual_release.numTracks():
    actual_release.getTrack(i).setComment(pseudo_release.getTrack(i).getTitle())
    i++

第一行是我不知道该怎么办。由于该关系不能作为Picard变量使用,因此无法通过API中指示的任何方式进行访问。

我一直在查看Picard的来源以及the standalone web service,但还没有找到任何东西。这一切都是可能的,如果可以的话,我该怎么做?

2 个答案:

答案 0 :(得分:2)

如果您编写元数据处理器,Picard中提供了有关关系的信息,包括音译列表。迭代发布版本的所有关系的简单插件如下所示:

PLUGIN_NAME = "Find transliterated tracklisting relationships"
PLUGIN_AUTHOR = "Wieland Hoffmann"
PLUGIN_DESCRIPTION = "I'm too lazy"
PLUGIN_VERSION = "0.1"
PLUGIN_API_VERSIONS = ["1.0"]

from picard.metadata import register_album_metadata_processor
from picard import log


# The relationship type id for transliterations from
# https://musicbrainz.org/relationship/fc399d47-23a7-4c28-bfcf-0607a562b644
TRANS_REL_UUID = "fc399d47-23a7-4c28-bfcf-0607a562b644"


@register_album_metadata_processor
def find_transliteration_relationship(album, metadata, release):
    if "relation_list" in release.children:
        for rel in release.relation_list:
            if rel.relation[0].type_id == TRANS_REL_UUID:
                log.info("Found a transliterated tracklisting relationship")
                for release in rel.relation[0].release:
                    log.info("Its target is https://musicbrainz.org/release/%s",
                             release.id)

传递给处理器的release参数是Picards XmlNode类的一个实例,其结构(包括其子对象)类似于通过向MusicBrainz服务器询问此版本获得的XML Web服务(this是您为示例版本返回的内容,如果您只询问关系)。现在您已拥有关系目标的MBID,您可以使用Picards Web服务模块的get方法(album s tagger.xmlws属性是XmlWebService类的实例)来发送另一个请求MusicBrainz网站询问有关该版本的数据(不要忘记输入和减少album s _requests属性,以便在您更改其之前不会完成其加载步骤数据)。

使用此插件来请求和处理更多数据的其他一些插件是the album artist websiteLast.FM.Plus个插件。

/编辑:我刚刚被告知已经a ticket用于改进Picard处理伪记录的方式,这些伪记录具有a plugin链接,可以执行您想要执行的操作。

答案 1 :(得分:0)

MusicBrainz Web Service中,您可以获得如下音译版本: https://musicbrainz.org/ws/2/release/1492ce2b-a9ee-4aa3-b9e2-b18ad093bc51?inc=release-rels (注意inc=release-rels)。 您也可以使用json web service

使用python-musicbrainzngs,您可以执行musicbrainzngs.get_release_by_id("1492ce2b-a9ee-4aa3-b9e2-b18ad093bc51",includes=["release-rels"])

之类的操作

但是,Picard没有附带musicbrainzngs。因此,您必须单独安装python-musicbrainzngs,如果没有它,您的插件将无法工作,或者您必须使用Picard提供的模块。我不确定Picard元数据究竟是什么,也不包含在内,但这些模块可能有所帮助:picard.albumpicard.webservicepicard.mbxml