エントリー
これは、独自のインターフェースを備えたXBMCのプラグインの作成に関する一連の記事のパートIIIです。 前のパート(
パートIと
パートII )で、XBMCプラグインインターフェイスを作成する基本原則について説明し、いくつかの簡単な例を示しました。 このパートでは、XBMCと対話するためのさまざまなAPIについて非常に簡単に説明し、インターフェイスのレイアウトを簡素化するマイクロフレームワークを示します。
2014年11月3日の更新:最初の2つのパートを書いている間、私はすぐに記事の3番目のパートを書くことを約束しました。 しかし、残念なことに、人生はそれ自身の調整を行い、第三部の執筆はより良い時代まで延期されなければなりませんでした。 今、私はその約束を全うするわけではありませんが、実現しようとします。マイクロフレームワークについての話はいくらか単純化されます。
API
XBMC用のプラグインを作成することについての話は、プラグインがXBMCと対話できるようにするさまざまなAPIについて少なくとも簡単な話がなければ完了しません。 これまでの記事では、インターフェースを作成するためのAPIを扱ってきましたが、プラグインは他のタスクを実行する必要があります。メディアファイルに関する情報の取得、再生の制御など。 (組み込み)、JSON-RPCプロトコル、およびInfolabels。 次に、それぞれについて簡単に説明します。
Python API
5つのPythonモジュールのセット:XBMCと対話するためのxbmc、xbmcgui、xbmcplugin、xbmcaddon、xbmcvfs。 モジュールは、Python-C API(SWIG)を使用してC ++で記述されています。 以下に簡単な概要を示します。
xbmc-XBMCとの一般的な相互作用。
xbmcgui-GUIとの相互作用。
xbmcplugin-コンテンツソースプラグインの編成。
xbmcaddon-さまざまなプラグインパラメーター(設定、言語ファイルなど)へのアクセス。
xbmcvfs-ファイルシステムを操作します。
組み込み関数
XBMCを管理するための一連のコマンド。 組み込み関数を呼び出すために、プログラムコードを記述する必要はありません。たとえば、対応する構成ファイルを編集することにより、リモートコントロールまたはキーボードのボタンにアタッチできます。 組み込み関数のリストは
こちらにあります 。
Pythonスクリプトから組み込み関数を呼び出すには、xbmc.executebuiltin()関数があります。
JSON-RPCプロトコル
JSON-RPCに基づくXBMCのローカルおよびリモート制御用のプロトコル。 双方向の情報交換など、XBMCとの十分なやり取りの機会を提供します。 XBMCのJSON-RPCプロトコルの詳細については、
こちらをご覧ください 。
JSON-RPCプロトコルを介したローカル管理および情報交換には、xbmc.executeJSONRPC()関数が使用されます。 さらに、JSON文字列の処理を簡素化するために、jsonモジュールがPython標準ライブラリに含まれています。
他のコンピューター上のXBMCとのリモート対話は、標準ライブラリモジュールurllib2を使用して実行できます。
情報ラベル
XBMCからさまざまな情報を受信するためのAPI。 利用可能なすべてのInfolabelsのリストは、
ここにあります 。
関数xbmc.getInfoLabel()は、情報を要求するために使用されます。
これらのAPIの機能は部分的に重複しており、多くの場合、同じ操作を異なる方法で実行できます。
注:バージョン11.0まで、XBMCには、URLエンコード表記のコマンドを使用してXBMCを制御できるWeb-APIもありました。 ただし、バージョン12.0以降では、JSON-RPCがより多くの機能を提供するため、冗長性のために削除されました。
PyXBMCt-プラグインインターフェイスレイアウトを簡素化するためのマイクロフレームワーク
このシリーズの記事の前の部分からわかるように、Window / WindowDialogクラスとControlクラスの子孫に基づいてプラグインインターフェイスを作成するためのAPIはあまり便利ではありません。絶対座標で操作する必要があり、インターフェイスのグラフィックデザインは完全に開発者にかかっています。
プラグインインターフェイス(当然、XBMC Python APIの機能内)の作成を簡素化するマイクロフレームワークを作成するというアイデアは、字幕をダウンロードするための独自のプラグインを作成したときに生まれました。 バージョン13.0より前のXBMCでは、字幕プラグインは完全に独立したスクリプトであり、インターフェイスの作成は開発者の責任でした。 ところで、バージョン13.0では、字幕プラグインのアーキテクチャが完全に変更され、
コンテンツソースプラグインと同様に動作するようになりました。ベースコードはXBMCです(ところで、14番目のバージョンからメディアセンターはKodiと呼ばれます)。
インターフェイス要素の絶対座標を気にしないために、Gridジオメトリマネージャーの類似性を実装するWindow / WindowDialog / Controlクラスの周りにラッパーを作成し、デフォルトのXBMCスキン-Confluenceから取得したテクスチャで全体を飾りました。 それはかなりうまくいったので、これに基づいて本格的なマイクロフレームワークを作成することにしました。 PyQtはサンプルとして使用されたため、フレームワークはPyXBMCtと名付けられました。
このフレームワークは、4つの基本コンバータークラスと9つのすぐに使用できるウィジェット、またはXBMCで呼び出されるようにコントロールを提供します。 グリッドジオメトリマネージャーは、コントロールを画面に配置する役割を果たし、インタラクティブなコントロールは、PyQtのシグナルスロットメカニズムに似た機能/メソッドに関連付けられています。 PyQt / PySideに精通している人は、PyXBMCtを2つの方法で学ぶ必要があります。
明確にするために、非常に単純な例を考えてみましょう。
PyXBMCtマイクロフレームワークは公式のXBMC / Kodiリポジトリに存在するため、使用するには、プラグインファイルのaddon.xmlセクションに次の行を追加する必要があります(プラグインアーキテクチャの詳細について)。
<import addon="script.module.pyxbmct" version="1.1.4"/>
これで、リポジトリまたはZIPファイルからプラグインをインストールすると、マイクロフレームワークが公式リポジトリから自動的にプルアップされます。 さらに、Kodi 14.0「Helix」では、サービスプラグインを手動でインストールできるようになり、PyXBMCtプラグインを事前にインストールすることができます。
簡単な例として、当然ながら「Hello World」を取り上げます。
すべてが正しく行われると、ボタンのあるウィンドウが画面に表示されます。
さて、詳細な分析。 行番号を表示するには、メモ帳++などの適切な機能を備えたテキストエディターを使用します。 PyQt / PySideや他の「大人の」GUIフレームワークに慣れている人は、何が何であるかをすぐに理解するだろうと思うので、私は明白なことをスキップします。
行13:self.setGeometry()メソッドは、ウィンドウの幅と高さ、およびコントロールが配置されている親ウィンドウの座標グリッドの解像度を設定します。 この原理は、QtGui.QGridLayoutリンカーに完全に類似しています。 デフォルトでは、ウィンドウは画面の中央に配置されますが、必要に応じて、このメソッドの追加パラメーターの形式でウィンドウの正確な座標を指定できます。
17行目:self.placeControl()メソッドは、選択したコントロールをグリッドに配置します。 実際のQtGui.QGridLayoutと同様に、コントロールは複数の行と列を占有できます。
注意! コントロールインスタンスメソッド(たとえば、ラベルのテキストを変更するsetLabel())は、placeControl()を使用してこのコントロールをウィンドウに追加した後にのみ呼び出す必要があります。 それ以外の場合、さまざまな不具合が発生する可能性があります。
23行目:setFocus()メソッドは、選択したコントロールに初期フォーカスを設定します。 インタラクティブなコントロールがある場合、このメソッドが
必要です 。それ以外の場合は、キーボード/リモートコントロールからプラグインを制御できません。
複数のインタラクティブコントロールがある場合は、それらの間のナビゲーションルールも構成する必要があります(前のパートを参照)。
25行目と27行目:self.connect()メソッドは、キーボードイベントのコントロールまたは数値コードを関数/メソッドに関連付けます。 当然、関数参照はここでは(括弧
()なしで
)使用され、関数呼び出しではありません。
ここでラムダを使用することもでき
ます -実際のPyQtと同じです。
アクティブ化されたときにイベントを生成するコントロールのみをリンクできます。これらは
Button 、
RadioButton 、および
Listです。 他のコントロールはイベントを生成せず、それらのバインドは役に立ちません。
コントロール(キーボード、マウス、ジョイスティックなど)によって生成されたイベントの数値コードは、
ここにあります 。 PyXBMCtには、一般的に使用されるイベントのシンボル名が含まれています。
数値コード
ACTION_PREVIOUS_MENUまたは
10 (デフォルトはキーボードのESCキー)は、常にウィンドウを閉じて再割り当てできないclose()メソッドに関連付けられています。 これは、プラグインウィンドウを常に閉じることができるようにするためです。
35行目:使用後、ウィンドウインスタンスは強制的に削除されます(ウィンドウインスタンスのデストラクタとそれに関連付けられているすべてのオブジェクトが呼び出されます)。 ここでのポイントは、何らかの理由でガベージコレクターがプラグインの完了後にxbmcguiクラスのオブジェクトを削除しないため、メモリリークが発生する可能性があることです。 したがって、xbmcgui / PyXBMCtに基づいて開いているウィンドウは、メモリから強制的に削除する必要があります。
PyXBMCtの実際の使用例は
、ex.ua.alternativeプラグインで見ることができ
ます 。ここでは、マイクロフレームワークを使用してサイトのログインウィンドウを作成します。
PyXBMCtの詳細については、以下のリンク(英語)をご覧ください。
PyXBMCtクイックスタートガイド 。
PyXBMCtクラスおよびメソッドの自動生成ドキュメント 。
GithubのPyXBMCtリポジトリ 。
公式フォーラムXBMC(Kodi)のトピック 。
PyXBMCtの機能を示すプラグイン (スポイラーの下のスクリーンショット)。
もちろん、PyXBMCtに基づいて作成されたプラグインインターフェイスは、XMLスキンに基づくインターフェイスよりも機能と「装飾」が劣っています。 ただし、多くの場合、その機能は十分であり、「デスクトップ」GUIフレームワーク、特にPyQt / PySideに精通している人は、PyXBMCtを非常にすばやく学習できます。
おわりに
これで、XBMC(Kodi)のプラグインの作成に関する一連の記事を終了します。 残念ながら、多くの状況により、3番目の部分はかなり遅れて出てきますが、彼らが言うように、「絶対に遅れるよりはましです」。
PS InfoLabelsに関する情報を追加しました。
前の記事
XBMCのシンプルなプラグインの詳細な構造 。
独自のインターフェースを持つXBMCのプラグインを作成しています:パートI-理論と最も簡単な例 。
独自のインターフェースを備えたXBMC用のプラグインを作成しています:パートII-ダイアログと装飾 。