Плагин не работает на MusicBrainz v1.2

В качестве упражнения для обучения я пытаюсь написать плагин для MusicBrainz, который соответствует формату albumartistsort к albumartist и artistsort к artist, в отличие от (очевидно) стандартного формата Last Name, First Name. в настоящее время использую.

Я только изучаю Python, и поэтому я пытаюсь использовать другой плагин в качестве руководства, но необходимо внести некоторые важные изменения, и именно здесь я, вероятно, облажался.

Когда я пытаюсь установить плагин, он не появляется в списке плагинов, хотя копируется в папку плагинов; и файл .pyo не создается. Я предполагаю, что это связано с ошибкой компиляции, но я не смог включить все, что мне нужно, поэтому я могу использовать модуль picard (не знаю, где его найти и импортировать), чтобы я мог протестировать его на своем питоне устный переводчик.

Это код, который у меня есть:

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 и match, которые они используют в разных плагинах с re, не объясняются в ссылках на документацию, на которые я ссылаюсь.

Если для него есть более подробная документация, вы можете указать, что я делаю не так в своем коде, или знаете, как включить модуль picard в интерпретатор (где его найти И как его включить), то ваши комментарии очень важны ценные и действительные ответы на этот вопрос.


person Kevin    schedule 09.12.2013    source источник
comment
Во-первых, вы уверены, что вам нужен плагин, а не просто скрипт тегера?   -  person abarnert    schedule 10.12.2013
comment
Во-вторых, вы знаете о запуске Picard с флагом -d, чтобы вы могли видеть его вывод, и/или как использовать модуль Python logger для создания собственного отладочного вывода в системных журналах/файле/что угодно, верно? Выполнение одного или другого из них в значительной степени необходимо для отладки плагинов.   -  person abarnert    schedule 10.12.2013
comment
В-третьих, artist и artistsort — это поля метаданных дорожки, а не поля метаданных альбома, поэтому вам почти наверняка понадобится процессор дорожек, а также процессор альбомов.   -  person abarnert    schedule 10.12.2013
comment
Спасибо, я пропустил, где делаются tagger scritp при чтении документа. Теперь это работает. Я вообще не знаю, как управлять Пикардом. В настоящее время я использую Options > Options > Plugins > Install plugin... и смотрю, добавлено ли оно в список или нет. Настаивать на версии плагина только потому, что она уже написана, добавление четвертого аргумента и переход на обработчик альбомов тоже не сработали.   -  person Kevin    schedule 10.12.2013
comment
Ты не знаешь, как управлять Пикардом? Тогда как вы добрались до опций?   -  person abarnert    schedule 10.12.2013
comment
Я работаю в Windows и не понял, что имя исполняемого файла с именем MusicBrainz Picard было picard.exe. Но попробовав, я понял, что вы имели в виду.   -  person Kevin    schedule 10.12.2013


Ответы (1)


Я думаю, ваша самая большая проблема заключается в том, что вы смешиваете API плагинов с язык сценариев тегов.

Скрипты Tagger написаны на простом пользовательском языке; плагины написаны на Python. Вы не можете смешивать и сочетать синтаксис между двумя языками. Особенно:

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

Эти $not, $eq и т. д. ничего не значат в Python. Если вы хотите проверить, равны ли вещи, вы используете оператор ==. Если вы хотите использовать re.search, вы используете синтаксис регулярных выражений. И так далее.

Кроме того, ваш код должен быть действительным Python с допустимым отступом. Ваш код, по крайней мере, как здесь.


Но давайте рассмотрим ваши вопросы один за другим:

Я пытаюсь написать плагин для MusicBrainz, который сопоставляет сортировку альбомов по исполнителям и исполнителям по исполнителям, в отличие от (очевидно) используемого по умолчанию формата Фамилия, Имя, который он использует в настоящее время.

В MusicBrainz очень мало автоматических значений по умолчанию. У каждого исполнителя есть имя и имя сортировки в базе данных, введенные пользователем-человеком и проверенные другими пользователями. Вы можете увидеть это из веб-интерфейса. Например, перейдите на страницу Дэвид Боуи и в разделе "Информация об исполнителе" панели справа вы увидите «Имя сортировки: Боуи, Дэвид». Если вы не привыкли использовать веб-интерфейс MusicBrainz, вам следует изучить его, прежде чем пытаться расширить Picard.

Когда я пытаюсь установить плагин, он не появляется в списке плагинов, хотя копируется в папку плагинов; и файл .pyo не создается. Я предполагаю, что это связано с ошибкой компиляции

Ага. Если вы запустите Picard из командной строки с флагом -d, он покажет вам ошибки, а не просто отключит плагин, так что вам не придется гадать. Это описано в разделе Устранение неполадок. (Если вы работаете на Mac, путь будет примерно таким, как /Applications/MusicBrainz Picard.app/Contents/MacOS/MusicBrainz Picard; я думаю, что в документации это не объясняется, потому что это стандартный пакет приложений для OS X.)

но я не смог включить все, что мне нужно, поэтому я могу использовать модуль picard (не знаю, где его найти и импортировать), чтобы я мог протестировать его в своем интерпретаторе Python.

Вы действительно не можете проверить это в своем интерпретаторе. Picard объединяет свой собственный интерпретатор Python, а не использует системный Python. В этом пользовательском интерпретаторе пакет picard находится в пакете sys.path, но в интерпретаторе Python вашей системы его нет. И попытка импортировать этот пакет и использовать что-то из него, фактически не запуская графический интерфейс Picard, в любом случае не будет хорошей идеей.

Если вы действительно хотите изучить содержимое пакета picard, загрузите исходный код и запустите локальную сборку кода. Но вам действительно не нужно этого делать. Вам не нужны какие-либо функции, кроме тех, что задокументированы в API, и если вы хотите что-то отлаживать, вам нужно отлаживать их в правильном контексте, что обычно означает добавление print функций и/или использование тега logging в вашем коде.


Я должен отметить, что я не совсем понимаю, когда они называются.

В какой-то момент после загрузки каждого альбома с сервера MusicBrainz все функции обработки зарегистрированных альбомов вызываются для альбома, а все функции обработки зарегистрированных дорожек вызываются для каждой дорожки в альбоме.

Обратите внимание, что обработчик альбомов не сможет изменять поля уровня трека, такие как сортировка по исполнителю трека; для этого вам понадобится трековый процессор.


например методы поиска и сопоставления, которые они используют в разных плагинах с re, не объясняются в ссылках на документацию, на которые я ссылаюсь.

Это потому, что они являются частью стандартной библиотеки Python, которая задокументирована как часть стандартной документации Python — в этом случае см. re.

Ожидается, что вы будете знать основы Python, прежде чем сможете написать плагин Picard.

Между тем, я не уверен, что вы пытались написать здесь, но это похоже на очень запутанную попытку сказать «если эти два поля не равны, сделайте их равными». Что делает то же самое, что и «безоговорочно сделать их равными». Итак, зачем вообще возиться с регулярным выражением и условием 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%)
person abarnert    schedule 09.12.2013
comment
Я попытался распечатать выход из системы, вызвав picard -d из командной строки, но ничего не распечаталось (Windows 7). А пока я продолжу изучать Python, чтобы не задавать глупых вопросов. Причина, по которой я включил оператор if, заключалась в том, что прямой подход не работал при моей попытке плагина. У меня есть рабочая версия, как и у вас в Tagger Script (спасибо и за это). Спасибо за ссылки, ответы на многие вопросы. - person Kevin; 10.12.2013
comment
@Kevin: Документация, по общему признанию, не является на 100% идеальной или полной, но на самом деле лучшее место для получения информации об API плагина — это, вероятно, форумы, на которые luks и voiceinside вы и другие соответствующие люди обычно ответят более подробной и актуальной информацией, чем та, которую вы найдете на сайте общего назначения. как это. И, как только вы что-то выясните, вы можете предложить обновление документации плагина (или просто отредактировать вики-версию), чтобы помочь будущим людям. - person abarnert; 10.12.2013
comment
@Kevin: Между тем, я не уверен, почему ничего не распечатывается, но у меня есть одно подозрение. IIRC, где-то около 3 лет назад, они добавили функцию, которая запоминает плагины, которые не загружаются, и не пытается повторно загрузить их при следующем запуске. Таким образом, вам, возможно, придется выйти, удалить плагин, возможно, изменить номер версии или удалить ваши настройки, затем переустановить плагин, а затем снова picard -d. (Документы по расширенному методу должны быть всем, что вам нужно, чтобы вручную удалить / переустановить плагины.) Но прошло почти 3 года с тех пор, как я кодировал какой-либо плагин Picard, и я никогда не делал этого в Windows; Я могу ошибаться. - person abarnert; 10.12.2013
comment
Стирание старого сделало свое дело (не нужно ни удалять настройки, ни закрывать пикар) - person Kevin; 10.12.2013
comment
@Кевин: Спасибо. Я понятия не имел, какие части этой перетасовки были необходимы, а какие нет; для тех, кто придет позже, будет намного полезнее знать только минимальные необходимые шаги, а не мои излишние шаги. - person abarnert; 10.12.2013