2

学習の演習として、現在使用している (明らかに) デフォルトのLast Name, First Name形式とは対照的に、albumartistsorttoalbumartistおよびartistsorttoに一致する MusicBrainz 用のプラグインを作成しようとしています。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"]

これらがいつ呼び出されるかを完全には理解していないことを指摘しなければなりません。プラグインのドキュメントherehere、およびhereは、そこにあるプラグインをたどるのに十分ではないと思います (たとえば、さまざまなプラグインで使用するsearchおよびmatchメソッドはre、私が参照しているドキュメント リンクでは説明されていません。

より完全なドキュメントがある場合は、コードで間違っていることを特定するか、picardモジュールをインタープリターに含める方法 (モジュールを見つける場所と含める方法) を知ることができます。コメントは大歓迎です。この質問に対する有効な回答。

4

1 に答える 1

4

あなたの最大の問題は、プラグイン APIタグ付けスクリプト言語を混同していることだと思います。

タガー スクリプトは単純なカスタム言語で記述されます。プラグインは Python で書かれています。2 つの言語間で構文を混在させて一致させることはできません。特に:

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

その$not$eqなどは Python では何の意味もありません。等しいかどうかを調べたい場合は、==演算子を使用します。を使用する場合はre.search、正規表現構文を使用します。等々。

また、コードは有効なインデントを備えた有効な Python でなければなりません。少なくともここに投稿されているコード。


しかし、あなたの質問を一つずつ見ていきましょう:

私は MusicBrainz のプラグインを作成しようとしています。これは、現在使用されている姓、名の形式の (明らかに) デフォルトとは対照的に、albumartistsort を albumartist に、artistsort を artist に一致させます。

MusicBrainz には、自動デフォルトがほとんどありません。各アーティストには、データベース内に名前とソート名があり、人間のユーザーによって入力され、他のユーザーによって検証されます。これは、Web インターフェイスから確認できます。たとえば、David Bowieに移動すると、右側の [Artist Information] パネルに、「Sort name: 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 の基本を理解している必要があります。

その間、あなたがここに何を書こうとしていたのかはわかりませんが、「これらの 2 つのフィールドが等しくない場合は、それらを等しくする」という非常に複雑な試みのように見えます。これは、「無条件に等しくする」と同じことを行います。では、なぜ正規表現と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 に答える