2

作为学习练习,我正在尝试为 MusicBrainz 编写一个与albumartistsorttoalbumartistartistsortto匹配的插件,而不是它当前使用artist的(显然)默认的姓氏,名字格式。

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

当我尝试安装插件时,虽然它被复制到插件文件夹中,但它并没有出现在插件列表中;并且.pyo文件没有生成。我猜这是由于编译错误造成的,但我无法包含我需要的任何内容,因此我可以使用该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"]

我必须指出,我不完全理解何时调用这些。我相信这里这里这里的插件文档不足以遵循他们在那里拥有的插件(例如,他们在不同插件中使用的方法search和方法在我所指的文档链接中没有解释。matchre

如果有更详尽的文档,您可以查明我在代码中做错了什么,或者知道如何将picard模块包含在解释器中(在哪里找到它以及如何包含它),那么非常感谢您的评论和这个问题的有效答案。

4

1 回答 1

4

我认为您最大的问题是您将插件 API标记脚本语言混合在一起。

标记脚本是用简单的自定义语言编写的;插件是用 Python 编写的。您不能在两种语言之间混合和匹配语法。尤其是:

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

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

此外,您的代码必须是有效的 Python,并具有有效的缩进。您的代码,至少在此处发布。


但是,让我们一一解决您的问题:

我正在尝试为 MusicBrainz 编写一个插件,它将专辑艺术家排序与专辑艺术家和艺术家排序与艺术家匹配,而不是(显然)它当前使用的默认姓氏、名字格式。

MusicBrainz 中很少有自动默认值。每个艺术家在数据库中都有一个名称和一个排序名称,由人类用户输入并由其他用户验证。您可以从 Web 界面中看到这一点。例如,转到David Bowie,在右侧的“艺术家信息”面板中,您会看到“排序名称:Bowie, David”。如果您不习惯使用 MusicBrainz 的 Web 界面,您应该在尝试扩展 Picard 之前先探索一下。

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

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

但我无法包含我需要的任何内容,因此我可以使用 picard 模块(不知道在哪里找到它或导入它),所以我可以在我的 python 解释器中进行测试。

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

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


我必须指出,我不完全理解何时调用这些。

在从 MusicBrainz 服务器下载每张专辑后的某个时间点,所有注册的专辑处理器函数都会被专辑调用,并且所有注册的曲目处理器函数都会被专辑中的每首曲目调用。

请注意,专辑处理器将无法更改曲目级别的字段,例如曲目艺术家排序;为此,您将需要一个跟踪处理器。


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

这是因为它们是 Python 标准库的一部分,该库被记录为标准 Python 文档的一部分——在这种情况下,请参阅re.

在能够编写 Picard 插件之前,您应该了解 Python 的基础知识。

同时,我不确定您要在这里写什么,但是说“如果这两个字段不相等,则使它们相等”看起来确实令人费解。这与“无条件地使它们相等”具有相同的作用。那么,为什么还要为正则表达式和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%)
于 2013-12-09T23:01:29.363 回答