Пишемо плагін для XBMC із власним інтерфейсом частина III

Це III частина циклу статей, присвячених написанню плагінів для XBMC з власним інтерфейсом. У попередніх частинах (частина I та частина II) я розповів про основні принципи створення інтерфейсу плагінів XBMC та дав кілька простих прикладів. У цій частині я хочу зовсім коротко розповісти про різні API для взаємодії з XBMC, продемонструвати написаний мною мікро-фреймворк, що спрощує компонування інтерфейсу. Але, на жаль, життя вносить свої корективи, і написання 3 частини довелося відкласти до кращих часів. Тепер я постараюся виконати обіцяне, хоч і не повною мірою: розповідь про мікро-фреймворок буде дещо спрощеною.

Примітка: аж до версії 11.0 XBMC також був Web-API, який дозволяв керувати XBMC за допомогою команд в URL-encoded нотації. Однак, починаючи з версії 12.0, він був прибраний через надмірність, оскільки JSON-RPC забезпечує набагато більші можливості.

PyXBMCt — мікрофреймворк для спрощення компонування інтерфейсу плагінів Як видно з попередніх частин даного циклу статей, API для створення інтерфейсу плагінів на базі класів Window/WindowDialog і нащадків класу Control не дуже зручний: доводиться оперувати абсолютними координатами, і графічне оформлення. Ідея створення мікро-фреймоврку, який спростив би створення інтерфейсу плагінів (природно, в межах можливостей XBMC Python API), народилася у мене в ході написання власного плагіна для закачування субтитрів. У XBMC до версії 13.0 плагіни субтитрів були повністю автономними скриптами і створення інтерфейсу покладалося на розробника. До слова, у версії 13.0 архітектуру плагінів субтитрів повністюпоміняли, і тепер вони працюють аналогічно до плагінів-джерел контенту, а за інтерфейс відповідає базовий код XBMC (до речі, з 14-ї версії медіацентр буде називатися Kodi). Щоб не возитися з абсолютними координатами елементів інтерфейсу, я написав wrapper навколо класів Window/Windo /Control, що реалізує подобу менеджера геометрії Grid, і прикрасив все це текстурами, взятими з дефолтного скіна XBMC - Confluence. Вийшло непогано, і я вирішив зробити на базі цього повноцінний мікро-фреймворк. Як зразок було взято PyQt, тому фреймоврк отримав назву PyXBMCt.

Фреймворк пропонує 4 базові класи-контерйнери та 9 готових до використання віджетів, або, як вони називаються в XBMC, контролів. За розміщення контролів на екрані відповідає менеджер геометрії Grid, і інтерактивні контроли зв'язуються з функціями/методами аналогічно механізму сигналів-слотів PyQt. Ті, хто знайомий з PyQt/PySide, повинні освоїти PyXBMCt за дві секунди.

Для наочності розглянемо дуже простий приклад. Мікро-фреймворк PyXBMCt присутній в офіційному репозиторії XBMC/Kodi, тому, щоб скористатися ним, потрібно додати до розділу файлу addon.xml вашого плагіна (докладніше про архітектуру плагінів див. тут) наступний рядок:

Тепер при установці вашого плагіна з репозиторію або ZIP-файлу мікро-фреймворк підтягнеться з офіційного репозиторію автоматично. Крім того, в Kodi 14.0 Helix нарешті з'явилася можливість встановлювати службові плагіни вручну, і плагін PyXBMCt можна встановити заздалегідь самому. Як найпростіший приклад, природно, візьмемо Hello World: - Hello World # 8 -*- # Імпортуємо модуль PyXBMCt. import pyxbmct.addonwindow as pyxbmct

class MyWindow (pyxbmct.AddonDialogWindow):

def __init__(self,title=''): # Викликаємо конструктор базового класу. super (MyWindow, self).__init__(title) # Встановлюємо ширину та висоту вікна, а також роздільну здатність сітки (Gr ) # Поміщаємо кнопку в сітку. self.placeControl (button, 1, 1) # Встановлюємо початковий фокус на кнопку. self.setFocus (button) # Зв'язуємо кнопку з методом. self.connect (button, self.close) # Зв'язуємо клавіатурну дію з методом. self.connect (pyxbmct.ACTION_NAV_BACK, self.close)

Рядок 13: метод self.setGeometry () задає ширину та висоту вікна, а також роздільну здатність координатної сітки батьківського вікна, в якій розміщуються контроли. Принцип повністю аналогічний компонувальник QtGui.QGridLayout. За замовчуванням вікно розміщується в центрі екрана, але за бажанням можна задати точні координати вікна у вигляді додаткових параметрів цього методу.

Рядок 17: метод self.placeControl() поміщає вибраний контроль у координатну сітку. Як і в цьому QtGui.QGridLayout, контрол може займати кілька рядків і стовпців.

Рядок 23: метод setFocus () встановлює початковий фокус на вибраний контроль. За наявності будь-яких інтерактивних контролів цей метод є обов'язковим, інакше ви просто не зможете керувати своїм плагіном з клавіатури/пульта. За наявності кількох інтерактивних контролів також потрібно налаштувати правила навігації між ними (див. попередні частини).

Рядок 35: після використання екземпляр вікна примусово видаляється (викликається деструктор екземпляра вікна та всіх об'єктів, пов'язаних з ним). Справа тут у тому, що Garbage Collector чомусь не видаляє об'єкти класів xbmcgui після завершення роботи плагіна, що може призводити до витоків пам'яті. Тому відкриті вікна з урахуванням xbmcgui/PyXBMCt необхідно видаляти з пам'яті примусово.

Практичний приклад використання PyXBMCtможна побачити в моєму плагіні ex.ua.alternative, де мікро-фреймворк використовується для створення вікна входу на сайт:

PyXBMCt QuickStart Guide.

Автоматично згенерована документація за класами та методами PyXBMCt.

Репозиторій PyXBMCt на Github

Тема на офіційному форумі XBMC (Kodi).

Плагін, що демонструє можливості PyXBMCt (скриншот під спойлером нижче).

Зрозуміло, інтерфейс плагіна, створений на базі PyXBMCt, поступається за можливостями і «прикрасами» інтерфейсу на базі XML-скіна. Однак у багатьох випадках його можливостей цілком достатньо, і ті, хто знайомі з настільними GUI-фреймворками, зокрема PyQt/PySide, можуть освоїти PyXBMCt дуже швидко.

Заключение На цьому закінчую цикл статей, присвячених написанню плагінів для XBMC (Kodi). На жаль, через ряд обставин 3-я частина виходить зі значним запізненням, але, як кажуть, «краще пізно, ніж ніколи». Попередні статті Детальна анатомія простого плагіна для XBMC. і найпростіший приклад.Пишемо плагін для XBMC з власним інтерфейсом: частина II - діалоги та прикраси.