Подробна анатомия на прост XBMC плъгин, phpBB Dev Blog

Въведение

Целият плъгин е разрешен за изтегляне от тук.

Забележка: по-нататък в текста терминът "работа" се използва по отношение на някои файлове и папки. Това означава, че XBMC търси такива папки и файлове, без да ги посочва директно в кода на приставката. "Работи" != "незаменим", а по-примитивните добавки може да не съдържат сервизни файлове.

Главна информация

Python се използва за писане на XBMC добавки. XBMC под Windows е компилиран с версия 2.6.6, а под Linux, както разбирам, версията на Python зависи от инсталираните библиотеки за разработчици, използвани в компилацията. Във всеки случай, когато пишете кода на плъгина, трябва да се съсредоточите върху синтаксиса и вероятностите на Python 2.6. Python в XBMC е напълно функционален: присъства почти всяка стандартна библиотека, с изключение може би на Tkinter/ttk/tix (които тук очевидно са излишни). За взаимодействие с XBMC са добавени 5 модула: xbmc, xbmcgui, xbmcplugin, xbmcaddon и xbmcvfs, които заедно съставят XBMC Python API. Кратка справка за модулите можете да намерите тук. За съжаление има неточности в помощта. В допълнение, операторът за печат вместо конзолата записва в регистрационния файл на XBMC с нивото на известието, което може да се използва при отстраняване на грешки, да речем, за обобщаване на стойностите на променливите. Малко за терминологията: първоначално разработчиците на XBMC използваха термина „добавка“ (addon) за всякакви добавки, които от своя страна се разделят на плъгини (източници на съдържание), скриптове (програми), скрепери (изтеглящи информация към медийно съдържание) и други. С течение на времето обаче представянията на „добавка“ и „плъгин“ се смесиха и сега те често се използват за обозначаване на всяка добавка.

Настройка на IDE

Внимание: това са модули, а несъдържат използваем код и опитът за стартиране на програмата, която ги препраща директно от IDE, ще доведе до неочаквани резултати. Въпреки това, тези, които желаят, могат да добавят код за отстраняване на грешки към тези модули, който имитира поведението на реални функции и методи на XBMC Python API.

Конструкция на плъгини

Моят плъгин за "обучение" има следната конструкция:

Сега повече за предназначението на всички тези файлове и папки.

addon.xml е работният файл на приставката, от който вграденият каталогизатор на приставки XBMC взема цялата необходима информация. Това е ексклузивен, основен плъгин файл и някои типове плъгини (скрепери, хранилища и т.н.) може изобщо да не съдържат код или други помощни файлове.

Редове 8-10 съдържат информация за външни зависимости - други компоненти, необходими за работата на плъгина. Както можете да видите, този плъгин изисква само XBMC Python API версия 2.0 или по-нова. Не знам точния номер на версията, използвана в реално време, но 2.0 със сигурност е работеща версия. Ако вашият плъгин изисква друг плъгин, посочете го тук в същия етикет. Да кажем, че ако вашият плъгин изисква приставка за Youtube за нещо, трябва да се добави допълнителен таг към секцията:

На теория липсващите зависимости трябва да се инсталират механично, когато плъгинът е инсталиран.

Следва по-подробен анализ. Пропускам важни неща.

Редове 11-15 са дефиницията на параметрите на плъгина. Повечето плъгини използват променливи с двойно подчертаване, но не ги харесвам естетически и не се препоръчват и от PEP 8.

11: задайте името на плъгина. Името на приставката трябва да съвпада с името, посочено в addon.xml и името на папката (в този случай приставката може да не работи).

12: създайте екземпляр на класа Addon за достъп до настройкитеплъгин.

13: вземете идентификатора за време на изпълнение на плъгина (манипулатор). Идентификаторът е цяло число, което се предава като втори аргумент при извикване на плъгина от XBMC. Този идентификатор се използва като един от аргументите на функцията за списък със съдържание addDirectoryItem(). Тук си струва да се спрем по-подробно на параметрите за извикване на плъгина. Както бе споменато по-горе, разликата от плъгините за източник на съдържание и плъгините за скрипт е, че плъгините за източник са списъци (директории) със съдържание, докато скриптовете могат да правят каквото пожелаят в границите на езика Python и API на XBMC. Допълнителна разлика се крие в параметрите за повикване, предадени на приставката. Когато се извиква от интерфейса на XBMC или се извиква рекурсивно от себе си (повече за това по-долу), плъгинът източник получава 3 параметъра в списъка sys.argv: своя въображаем URL, идентификатор за време на изпълнение (низ, съдържащ цяло число) и допълнителни параметри за извикване като URL-кодирана последователност. Плъгинът на скрипта от своя страна не получава никакви параметри и за него sys.argv е празен списък. Следователно функциите и методите, които изискват идентификатора за изпълнение на плъгина като аргумент, да речем addDirectoryItem(), няма да работят в плъгини за скриптове. Относно виртуалния URL адрес и допълнителните параметри за повикване по-долу.

Фигури 52-64: Функцията за генериране на списък с подкаст групи на cnet.com, по същество списък с виртуални папки. Нека го разгледаме подробно.

57: тук за всеки елемент от списъка създаваме екземпляр на класа xbmcgui.ListItem. Този клас е контейнер за съхраняване на свойствата на някакъв елемент от списък, представящ мултимедийно съдържание. Елементът на списъка трябва да има поне текстов надпис, но за положителен дизайн е желателно да посочите изображение за него(скица) и тапет (fanart).

59: добавете фенарт към елемент от списъка. Както можете да видите, фанартът на плъгина се използва за всички елементи от списъка, но нищо не ви пречи да присвоите личен фанарт на всеки елемент.

61: компилиране на връзка за рекурсивно извикване на плъгина. Аргументите на повикването са имената на подкаст групите, изчистени от ненужни знаци. Съответно, когато изберете подходящата група, рекурсивно стартираният плъгин ще генерира списък с подкасти за тази група.

63: Функцията за добавяне на елемент към списъка със съдържание. Тук се нуждаем от идентификатора на плъгина, получен от sys.argv[1]. Нека ви напомня, че този параметър се предава само на добавки за източник на съдържание. Съответно във всички останали типове добавки функцията addDirectoryItem() не може да се използва. Параметърът isFolder=True указва на XBMC, че този елемент от списъка е виртуална папка, т.е. когато този елемент е избран, трябва да се покаже някакъв вложен списък, а не да се отваря тази връзка в плейъра. В параметъра url добавяме връзки към виртуални папки, генерирани от плъгина, но тук също е позволено да прилагате пътища към реални папки с мултимедийни файлове на локално или мрежово устройство.

65: Добавяне на метод за сортиране. Въпросът е, че по подразбиране елементите от списъка се показват в реда, в който са добавени, което не винаги е желателно.

67: Казваме на XBMC, че списъкът е завършен.

72-77: действителна функция за превключване на изгледа. Получаваме текущата кожа и преминаваме към желания вид. Код 500 съответства на изгледа с миниатюри на стандартната кожа на Confluence, а код 512 съответства на изгледа на информационната стена на кожата на Aeon-Nox. За всички останали кожи ще се прилага общият им вид.

101: получаваме необходимото качество на подкастите, избрано в панела с настройки на плъгина. Всички настройки са непроменени.се връщат като низове и трябва да бъдат преобразувани в правилния тип, ако е необходимо.

Папката с ресурси е служебна папка и съдържа различни допълнителни файлове на плъгини.

settings.xml

settings.xml е работещ файл, който описва панела с настройки на плъгина на специален XML-базиран език, който се извиква при избиране на подменюто "Настройки". Поради този подход панелът с настройки на плъгина неизменно има „нативен“ вид във всяка кожа.

В този случай панелът с настройки има един контрол - спинбокс (labelenum) за избор на качеството на показваните подкасти (HD или SD). Параметрите label= съдържат текстови описания на елементите на панела с настройки и могат да бъдат лек текст или номера на редове от езикови файлове. За достъп до определени настройки се използват текстови идентификатори в > Подробно резюме на синтаксиса на файла settings.xml и наличните контроли могат да бъдат намерени в Ръководството за разработчици на XBMC Addon (на английски език). Този урок за писане на плъгини е донякъде остарял, но все още съдържа много полезна информация, включително организиране на панела за настройки на плъгини.

Езиковата подпапка е служебна папка. В него, в подпапките на долния слой, които имат имена, съответстващи на английските имена на различни езици, се намират езиковите файлове на плъгина strings.po. Нашият плъгин има подпапки английски, руски и украински, т.е. плъгинът има интерфейс на английски, български и украински. Плъгин, който има собствен интерфейс, трябва да съдържа поне папката на английски със съответния езиков файл. Въпреки това, в някои случаи е възможно да се направи без вашите собствени езикови файлове, но повече за това по-долу.

Както можете да видите, файлът е във формат .po GNU Gettext. XBMC обаче не използваоригинален Gettext: двуезичните файлове не се компилират в .mo и числата, посочени в параметрите msgctxt, се използват за идентифициране на отделни интерфейсни низове. Това се дължи на исторически причини: преди това XBMC използва собствен формат на езиков файл, базиран на XML, но с прехода към системата за онлайн превод www.transifex.net беше решено да се премине към по-известен и поддържан формат за локализация. Очевидно такава междинна опция, използваща .po текстови файлове, е била по-лесна за изпълнение, отколкото пълното преминаване към Gettext. Както вече беше споменато, интерфейсните низове се извличат с помощта на метода getLocalizedString() по номер в msgctxt. В този случай се прилага непрекъснато номериране: основният езиков файл на XBMC, езиковият файл на приставката. Желателно е номерата на редовете на основния езиков файл и плъгина да не се повтарят. В тезата, ако числата в двата файла съвпадат, езиковият файл на плъгина има предимство, но, абсолютно, това е грешка и е невъзможно да се разчита на подобно поведение. Затова изберете лични номера за низовете на интерфейса на приставката. Номерата на редовете на езиковите файлове се използват както в кода на плъгина при създаване на интерфейсни елементи и в резюмето на съобщенията, така и във файла settings.xml с панела с настройки за показване на етикети за контроли. В дипломната работа, ако всички необходими линии на интерфейса могат да бъдат намерени в основния езиков файл на XBMC, тогава езиковите файлове не могат да бъдат създадени в самия плъгин. В този случай номерата на редовете от основния езиков файл ще бъдат използвани на съответните места.

Подпапката lib съдържа нашия допълнителен Python модул, експортиран в приставката. Подпапката lib не е подпапка услуга. Може да се наименува по желание, а самите експортирани модули могат да бъдат разположени където желаете: до основния скриптплъгин, в подпапка на първия слой и т.н. Основни, така че да са налични за импортиране. Лесно е, като правило, по-удобно, ако всички допълнителни файлове на плъгини, както сервизни, така и не, са поставени на едно място.

миниатюри

Подпапката с миниатюри съдържа изображения на подкаст лога на cnet.com. Подобно на lib, тази подпапка не е служебна папка и снимките могат да бъдат поставени на всяко достъпно място по ваш избор.

Завършване

Това завършва анализа на дизайна по отношение на простия плъгин XBMC. Въпреки своята простота, плъгинът има почти всички елементи, присъщи на по-трудните плъгини. Желаещите могат да използват този плъгин като "скелет" за своя собствен плъгин. Следващият път, ако има време и желание, ще говоря за това как да направя плъгин със собствен интерфейс.