插件在MusicBrainz v1.2上不起作用



作为一项学习练习,我正在尝试为MusicBrainz编写一个插件,该插件将albumartistsortalbumartistartistsortartist相匹配,而不是它目前使用的默认的姓氏、名字格式。

我只是在学习Python,因此我试图使用另一个插件作为指南,但需要做一些重要的更改,这可能是我搞砸的地方。

当我尝试安装插件时,它不会出现在插件列表中,尽管它被复制到插件文件夹中;并且不生成CCD_ 5文件。我猜这是由于编译错误,但我无法包含我需要的任何内容,所以我可以使用picard模块(不知道在哪里找到它,也不知道导入它),这样我就可以在python解释器中进行测试。

这是我的代码:

PLUGIN_NAME = "Sort Artist and Album Artist"
PLUGIN_AUTHOR = "Kevin Hernandez"
PLUGIN_DESCRIPTION = "Sorts artist/album artist by name as in Artist/Album Artist field instead of Last, First"
PLUGIN_VERSION = "0.1"
PLUGIN_API_VERSIONS = ["0.9.0", "0.10", "0.15", "0.16"]
from picard.metadata import register_album_metadata_processor
import re
def copy_albumartist_to_albumartistsort(tagger, metadata, release):
  match = re.search($not($eq(metadata["albumartistsort"],metadata["albumartist"])))
    if match:
        metadata["albumartistsort"] = metadata["albumartist"]
def copy_artist_to_artistsort(tagger, metadata, release):
  match = re.search($not($eq(metadata["artistsort"],metadata["artist"])))
    if match:
        metadata["artistsort"] = metadata["artist"]
register_album_metadata_processor(copy_albumartist_to_albumartistsort)
register_album_metadata_processor(copy_artist_to_artistsort)

我还尝试将函数定义为:

def copy_albumartist_to_albumartistsort(tagger, metadata, release):
  metadata["albumartistsort"] = metadata["albumartist"]
def copy_artist_to_artistsort(tagger, metadata, release):
  metadata["artistsort"] = metadata["artist"]

我必须指出,我不完全理解这些是什么时候调用的。我认为这里、这里和这里的插件文档不足以遵循他们那里的插件(例如,他们在具有re的不同插件中使用的searchmatch方法在我所指的文档链接中没有解释

如果有更全面的文档,你可以准确地指出我在代码中做错了什么,或者知道如何在解释器中包含picard模块(在哪里找到它以及如何包含它),那么你的评论将是非常感谢的,也是这个问题的有效答案。

我认为您最大的问题是将插件API与tagger脚本语言混淆了。

标签脚本是用一种简单的自定义语言编写的;插件是用Python编写的。这两种语言之间不能混用语法。特别是:

match = re.search($not($eq(metadata["albumartistsort"],metadata["albumartist"])))

$not$eq等在Python中没有任何意义。如果要检查事物是否相等,可以使用==运算符。如果要使用re.search,请使用正则表达式语法。等等。

此外,您的代码必须是有效的Python,并带有有效的缩进。你的代码,至少在这里发布。


但让我们逐一回答您的问题:

我正在尝试为MusicBrainz编写一个插件,将albumartistsort与albumartist和artistsort匹配,而不是目前使用的(显然)默认的Last Name,First Name格式。

MusicBrainz中几乎没有自动默认设置。每个艺术家在数据库中都有一个名称和排序名称,由一个人类用户输入,并由其他用户验证。您可以从web界面看到这一点。例如,转到David Bowie,在右侧的"艺术家信息"面板中,您将看到"排序名称:Bowie,David"。如果你不习惯使用MusicBrainz的网络界面,你应该在尝试扩展Picard之前先浏览一下。

当我尝试安装插件时,它不会出现在插件列表中,尽管它被复制到插件文件夹中;并且不生成.poo文件。我猜这是由于的编译错误

是的。如果您使用-d标志从命令行运行Picard,它将显示错误,而不是默默地禁用插件,因此您不必猜测。故障排除中对此进行了记录。(如果你在Mac上,路径将类似于/Applications/MusicBrainz Picard.app/Contents/MacOS/MusicBrainz Picard;我认为文档没有解释这一点,因为这是标准的OS X应用程序捆绑包。)

但我还不能包含我需要的任何内容,所以我可以使用picard模块(不知道在哪里找到它,也不知道导入它),这样我就可以在我的python解释器中进行测试。

你真的无法在你的翻译中测试它。Picard捆绑了自己定制的Python解释器,而不是使用您的系统Python。在该自定义解释器中,picard包位于sys.path上,但在您的系统Python解释器中,它不是。无论如何,在不实际运行PicardGUI的情况下尝试导入该包并使用其中的内容都不是一个好主意。

如果您真的想探索picard包中的内容,请下载源代码并运行代码的本地构建。但你真的不应该那样做。除了API中记录的函数之外,您不需要任何函数,如果您想调试,您需要在正确的上下文中调试它们,这通常意味着在代码中添加print函数和/或使用logging模块。


我必须指出,我不完全理解这些是什么时候调用的。

在从MusicBrainz服务器下载每个专辑后的某个时刻,所有注册的专辑处理器函数都会随专辑一起调用,所有注册曲目处理器函数也会随专辑上的每个曲目一起调用。

请注意,专辑处理器将无法像音轨艺术家排序那样更改音轨级别字段;你需要一个轨道处理器。


例如,他们在不同的插件中使用的搜索和匹配方法没有在我所指的文档链接中解释。

这是因为它们是Python标准库的一部分,而Python标准库是作为标准Python文档的一部分进行记录的——在本例中,请参见re

在编写Picard插件之前,您需要了解Python的基本知识。

同时,我不确定你在这里想写什么,但说"如果这两个字段不相等,就让它们相等"似乎是一种非常复杂的尝试。这与"无条件地使他们平等"是一样的。那么,为什么还要麻烦regexp和if条件呢?


因此,您的功能可以简化为:

def copy_albumartist_to_albumartistsort(tagger, metadata, release):
    metadata["albumartistsort"] = metadata["albumartist"]
def copy_artist_to_artistsort(tagger, metadata, release, track):
    metadata["artistsort"] = metadata["artist"]
register_album_metadata_processor(copy_albumartist_to_albumartistsort)
register_track_metadata_processor(copy_artist_to_artistsort)

然而,你真的根本不需要一个插件。你应该能够把这整件事写成一个琐碎的标签脚本:

$set(artistsort,%artist%)
$set(albumartistsort,%albumartist%)

相关内容

  • 没有找到相关文章

最新更新