0

我一直在尝试编写一个 Picard 插件。我的想法是让它自动插入音译的曲目列表,作为以非拉丁脚本编写的曲目标题的版本的评论。MusicBrainz 包含这些音译作为与实际版本并行存在的伪版本。例如,对于给定的版本,我必须首先阅读相关版本 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 的来源以及独立的 Web 服务,但找不到任何东西。这完全有可能吗,如果可以,我该怎么做?

4

2 回答 2

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类的一个实例,其结构(包括其子对象)类似于您通过 Web 服务向 MusicBrainz 服务器询问此版本而获得的 XML(是它为您的示例返回的内容)如果您只询问关系,请释放)。现在您有了关系目标的 MBID,您可以使用Picards webservice 模块的getalbum方法( stagger.xmlws属性是 XmlWebService 类的一个实例)向 MusicBrainz 网站发送另一个请求,询问有关该版本的数据(不要不要忘记增加和减少albums_requests属性,因此在您更改其数据之前它不会完成其加载步骤)。

使用它来请求和处理更多数据的其他一些插件是专辑艺术家网站Last.FM.Plus插件。

/edit:我刚刚被告知,已经有一张票可以改进 Picard 处理伪版本的方式,该版本有一个指向插件的链接,可以做你想做的事情。

于 2014-07-08T17:03:42.470 回答
0

MusicBrainz 网络服务中,您可以像这样获得音译版本: https ://musicbrainz.org/ws/2/release/1492ce2b-a9ee-4aa3-b9e2-b18ad093bc51?inc=release-rels (注意inc=release-rels)。您还可以使用json 网络服务

使用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

于 2014-07-08T09:53:56.243 回答