Как написать плагин для kodi

Have you ever wanted to create an amazing Kodi add-on by yourself? Great, but you first need to learn the basics. Every programming language (or software in our case) has its basic program called Hello World. This tutorial will teach you how to create your first add-on as the first step in learning how to develop complex Kodi add-ons. It doesn’t require any prior knowledge.

The Hello World add-on

The Hello World add-on

Before starting, you need to have two things ready:

  • Kodi installed on your device
  • Text editor. We recommend using Notepad++ that you can download from here.

Installing the Hello World add-on:

  • In this tutorial, you will use our Hello World add-on. Download this add-on as a ZIP file from here.
  • Launch Kodi
  • Click Add-ons
  • Click the Add-on browser icon  add-on browser icon
  • Click Install from zip file
  • Locate where you downloaded the file and select script.hello.world-master.zip

Testing the Hello World add-on:

  • Go back to the Kodi home page
  • Click Add-ons
  • Hover over Program add-ons
  • Click on the Hello World add-on. Once clicking the add-on a popup appears with three lines of text

The structure of the add-on:

Hello World structure

The add-on contains several files and a directory located in the AppData folder. For Windows it is found under this location: C:Users<username>AppDataRoamingKodiaddonsscript.hello.world

Those files include the following:

  • resources – This directory contains images for the add-on information screen
  • addon.py – The code of the add-on
  • addon.xml – The metadata of the add-on
  • changelog.txt – The changelog of the add-on containing information about every release
  • fanart.jpg – The background image of the add-on that appears when hovering over it or after launching it. We recommend a 1280×720 JPEG file
  • icon.png – The icon of the add-on. Must be a 256×256 or 512×512 PNG file
  • LICENSE.txt – The license of this add-on
  • readme.txt – This file contains information about the add-on

The metadata of the add-on (addon.xml):

addon.xml

You can see here the metadata of the add-on which is in XML format:

  • The addon tag – includes details about the add-on including ID, name, version and author. The ID should be unique
  • The require tag – describes which code should be imported by the add-on. In our case, nothing is required
  • The extension tag is used twice, each one with a different point:
    • The first one defines the type of the add-on which is executable
    • The second one defines the metadata of the add-on, which includes fields like platform, description, license, language and more

The code of the add-on (addon.py):

You can see here the code of the add-on written in Python. To start learning Python, we recommend learning from this tutorial.

Addon code

Here is what every line of code means:

  • Lines 1-2 import the necessary code for this add-on
  • Line 4 declares that this is an add-on
  • Line 5 assigns to a variable the name of the add-on (taken from the name field of the metadata file) that is displayed in the title of the popup
  • Lines 7 and 10 are comments. In Python, comments start with the # character
  • Line 8 contains the text of the popup. In Python, newlines are represented by n
  • Line 11 opens the popup with the title, text and OK button

Change the code of the add-on:

After you understand the structure of the add-on it is time to change it a bit.

You first need to extract the ZIP file of the add-on to a folder so you can edit the files inside of it.

Edit this file addon.py using Notepad++ and replace line 8 with the following line of code:

line1 = “My first add-on works well!nGoodbye”

Save the file and compress the folder to a ZIP file. Now you have the add-on with your updated code.

Test the add-on. You will see that the text in the popup was changed according to the changes made by you.

Congratulations, you just created your first Kodi add-on!

What’s next?

You have just finished your first Kodi add-on that was basic and simple. In the next tutorial, you will learn to use arguments, add a menu to Kodi add-ons and expand your knowledge.

Table of Contents

How to write a Kodi Addon

Here are some notes I wrote while writing the Kodi plugin script.picture.photo-frame.

What I needed was a slideshow plugin witout fancy transition effects (no transition effects at all!), but with the ability to select only some pictures from a directory and the ability to crop a selected portion of the images, without the need to actually modify the original ones. The need arose because I shot my photos using a 4:3 digital camera, but I wish to show them on a 16:9 TV screen. Black borders are unacceptable to me. Automatic zoom/crop is not an option because I want the control on it; also keeping a copy of each original photo is not an acceptable option.

I also opened this forum thread about adding this functionality to Kodi.

The idea was to start from a playlist file, which contains the list of images to show, along with geometry data to crop each image. Something like this:

IMG_6602.JPG|4000x2250+0+332
IMG_6605.JPG|2971x1671+796+628
IMG_6606.JPG|4000x2250+0+442
IMG_6610.JPG|3810x2143+90+387

My starting point was the Hello World Addon, but I had to solve several problems, so here are my notes.

Add-on types

First of all we need to understand the differences between a script add-on and a plugin add-on. As explained in the About Add-ons page:

Unlike Scripts (which can basically perform any action), Plugins do not really provide new functionality to Kodi, instead what they do is provide a directory listing (for instance, like your movie library) to Kodi. Another difference is that scripts can create their own gui (skin) while plugins can’t. Plugin listings are presented in the current skin.

So it is clear that I want a script add-on, because I want full control on how each picture is displayed, I don’t want to rely on the standard Kodi’s picture viewer.

Kodi add-ons are mainly developed in Python language. Kodi provides its own version of Python, so it does not need to rely on the underlaying operating system. Kodi 17 comes with Python 2.7, Kodi version 19 will include Python 3.

addon.xml and addon.py

The add-on is composed mainly by two files: addon.xml and addon.py. The first one defines how the add-on is integrated in Kodi, so it is read on Kodi startup. The second file is actually the Python program run on add-on activation. You can modifiy it while Kodi is running and start it again to see the effects.

There is a dedicated page on the wiki about addon.xml.

Let’s see some parts of the addon.xml file:

<addon>
    <extension point="xbmc.python.script" library="addon.py">
        <provides>executable</provides>
    </extension>
</addon>

To be considered a script add-on, we have declared it at the extension point xbmc.python.script. The library attribute defines the name of the Python script to be executed, addon.py in our case.

The addon.py in this study case is used also to create the user interface. In fact we use the Python classes xbmcgui.Window() and xbmcgui.ControlImage() to creat all we need. Another approach is to use the xbmcgui.WindowXML() class, where you provide an XML file where the user interface is defined.

Install add-on from a local zip file

The target directory for add-on installation is /home/kodi/.kodi/addons/, where each add-on have its directory. But it is not sufficient to unzip the archive there, you have to use the add-on installation procedure of Kodi. The add-on must be packed into a zip file, containing the add-on directory at the top level. Then use the following:

Main Menu ⇒ Add-ons ⇒ Search (Add-on browser) ⇒ Cancel ⇒ Install from zip file

Disable the Screen Saver

Our add-on script will perform a slideshow, so we have to disable the Kodi screensaver before starting it. We also need to re-enable the same screensaver before exiting the add-on code. We will use Kodi RPC to get the screensaver status and to set it. Passing an empty string means disabling the screensaver.

Here it is an example using the xbmc.executeJSONRPC() function and json:

import json
import xbmcaddon
import xbmcgui
 
def getScreensaver():
    command = {
        'jsonrpc': '2.0', 'id': 0, 'method': 'Settings.getSettingValue',
        'params': { 'setting': 'screensaver.mode' }
    }
    json_rpc = json.loads(xbmc.executeJSONRPC(json.dumps(command)))
    try:
        result = json_rpc['result']['value']
    except:
        result = None
    return result
 
def setScreensaver(mode):
    command = {
        'jsonrpc': '2.0', 'id': 0, 'method': 'Settings.setSettingValue',
        'params': { 'setting': 'screensaver.mode', 'value': mode}
    }
    json_rpc = json.loads(xbmc.executeJSONRPC(json.dumps(command)))
    try:
        result = json_rpc['result']
    except:
        result = False
    return result
 
 
saved_screensaver = getScreensaver()
setScreensaver('')
# ...
setScreensaver(saved_screensaver)

Run the Script using the Context Menu

The Context Menu is activated in Kodi by pressing the C key or the right mouse button. It is possibile to add an item to the Context Menu to launch our add-on. Just add an <extension> section into the addon.xml file:

<addon>
    <extension point="kodi.context.item">
        <menu id="kodi.core.main">
            <item library="addon.py">
                <label>View in Photo Frame</label>
                <visible>ListItem.IsFolder + Container.Content(images)</visible>
            </item>
        </menu>
    </extension>
</addon>

The <visible> tag allows to specify when the menu item will be visible. Here we specified two conditions, so that the menu will be available on folders and over containers containing images, which specifically means an m3u playlists. The two conditions should be both true (the plus sign means a logical AND), so it seems that a playlist file is considered as with IsFolder = True. See the wiki about Conditional visibility.

Inside the add-on Python code you can retrieve the item that was active when the Context Menu was selected:

contextmenu_item = xbmc.getInfoLabel('ListItem.FilenameAndPath')

Using settings.xml

Adding a settings page to an add-on is as simple as writing an XML file. Create the file resources/settings.xml and follow the syntax described into the Add-on settings page. Once deployed, you can access the settings page from Main menuAdd-onsAdd-on Context MenuSettings. Kodi take cares of displaying the settings page and storing the user preferences.

Here it is an example of settings.xml which allow to set two values, identified by the id attribute:

<settings>
    <category label="Window Size">
        <setting label="Width"  type="labelenum" id="WindowWidth"  values="720|1280|1920"    option="int" default="1280"/>
        <setting label="Height" type="labelenum" id="WindowHeight" values="480|576|720|1080" option="int" default="720"/>
    </category>
</settings>

From the Python add-on code, it will be possible to access the setting values using the getSetting() function. E.g.:

img_w = int(ADDON.getSetting('WindowWidth'))

Localization

Localization of a Kodi add-on takes place in several files. First of all we can localize the Information item of the Context Menu, by just adding the relevant part into the addon.xml file:

<addon>
    <extension point="xbmc.addon.metadata">
        <summary lang="en">Photo Frame Slideshow</summary>
        <summary lang="it">Presentazione Photo Frame</summary>
    </extension>
</addon>

Besides the <summary> tag, you can localize also <description>, etc. The supported language codes are the alpha-2 ISO-639 codes (two letters), and they are listed into the ISO-639:1988 Kodi Wiki page.

Then you will need to localize text strings used into Python code and into XML files (e.g. addon.xml, settings.xml, etc.). For each language you intend to support, you have to prepare a file:

  • resources/language/resource.language.en_gb/strings.po

  • resources/language/resource.language.it_it/strings.po

NOTICE: Kodi documentation says to use here the alpha-4 ISO-639 codes (four letters) as directory name suffix.

Every file begins with a preamble:

# Kodi Media Center language file
# Addon Name: Photo Frame
# Addon id: script.picture.photo-frame
# Addon Provider: niccolo@rigacci.org
msgid ""
msgstr ""
"Project-Id-Version: XBMC-Addonsn"
"Report-Msgid-Bugs-To: niccolo@rigacci.orgn"
"POT-Creation-Date: 2019-09-11 15:40+0200n"
"PO-Revision-Date: 2019-09-12 11:56+0200n"
"Last-Translator: Niccolo Rigacci <niccolo@rigacci.org>n"
"Language-Team: LANGUAGEn"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=UTF-8n"
"Content-Transfer-Encoding: 8bitn"
"Language: it_ITn"
"Plural-Forms: nplurals=2; plural=(n != 1)n"

then the file contains every string to be localized along with its translation. Here it is an excerpt of the Italian file:

msgctxt "#32001"
msgid "View in Photo Frame"
msgstr "Presentazione Photo Frame"

msgctxt "#32007"
msgid "Auto Play"
msgstr "Avanzamento automatico"

msgctxt "#32013"
msgid "Bad geometry for image "%s""
msgstr "Geometria errata per l'immagine "%s""

Notice that msgid is the original, untranslated English text. The msgstr is the localized version and msgctxt is an unique ID for each string.

If a localization is missing, the british english version will be used by default, so the file for the en_gb regional must exists. That file contains only the original text, not the translation:

msgctxt "#32001"
msgid "View in Photo Frame"
msgstr ""

msgctxt "#32007"
msgid "Auto Play"
msgstr ""

msgctxt "#32013"
msgid "Bad geometry for image "%s""
msgstr ""

Beware of this:

  • For scripts add-ons, according to the page Language support, we should use the range 32000 thru 32999 for string IDs.

  • If a string contains a double quote, it must be escaped with a backslash. Notice that C syntax is applied, so backslash is used as the escape character.

  • For better reading a string can be split over several lines. Just close the string with a double quote and start a new line with a double quote too. No newline characters will be added automatically, you have to include the sequence n explicitly.

Finally we have to change the Python code, substituting the strings with a function call and the string ID:

ADDON = xbmcaddon.Addon()
__localize__ = ADDON.getLocalizedString
 
heading = __localize__(32004)
message = __localize__(32005)
xbmcgui.Dialog().notification(heading, message, xbmcgui.NOTIFICATION_WARNING)

Where __localize__ is simply an handy name that we will use to call the xbmcaddon.Addon().getLocalizedString() function.

We can use the string IDs also in <label> tags, label attributes, etc. in XML files. Here an example from a settings.xml:

<settings>
    <category label="32016">
        <setting label="32017" type="labelenum" id="WindowWidth"  ... />
        <setting label="32018" type="labelenum" id="WindowHeight" ... />
    </category>
</settings>

Here an example from addon.xml:

<addon>
    <extension point="kodi.context.item">
        <menu id="kodi.core.main">
            <item library="addon.py">
                <label>32001</label>
            </item>
        </menu>
    </extension>
</addon>

Change Regional Settings

Regional default for Kodi is English, which means British English (en_gb). Other English variants are labeled e.g. English (US), which requires the resource.language.en_us add-on.

When you change regional settings in Kodi (Settings ⇒ …) — if the choosen set is not already installed — the system tries to download the appropriate archive. In our test case (Kodi 17.6 on the Raspberry Pi, Debian Stretch 9.3) the download URL is something like this:

http://mirrors.kodi.tv/addons/krypton/resource.language.en_us/resource.language.fr_fr-3.0.6.zip.md5

Unfortunately the above md5 file does not exists, so the installation of the requested resource fails. You have to download the zip file manually and follow the procedure to install an add-on from a zip file. The installation will create the directory /home/kodi/.kodi/addons/resource.language.fr_fr/.

Web References

Вступление

Это III часть цикла статей, посвященных написанию плагинов для XBMC с собственным интерфейсом. В предыдущих частях (часть I и часть II) я рассказал об основных принципах создания интерфейса плагинов XBMC и дал несколько простых примеров. В этой части я хочу совсем кратко рассказать о различных API для взаимодействия с XBMC, продемонстрировать написанный мною микро-фреймворк, упрощающий компоновку интерфейса.

Дополнение от 3.11.14: во время написания первых двух частей я пообещал вскоре написать 3-ю часть статьи. Но, к сожалению, жизнь вносит свои коррективы, и написание 3-й части пришлось отложить до лучших времен. Теперь я постараюсь исполнить обещанное, хоть и не в полной мере: рассказ о микро-фреймворке будет несколько упрощенным.

API

Рассказ о написании плагинов для XBMC был бы неполным без хотя бы краткого рассказа о различных API, обеспечивающих взаимодействие плагинов с XBMC. До сих пор в статьях речь шла об API для создания интерфейса, но ведь плагинам нужно выполнять и другие задачи: получение информации о медиафайлах, управление проигрыванием и т. п. Для выполнения этих задач в XBMC существует 3 основных API: Python API, встроенные функции (built-ins) и протокол JSON-RPC. Далее совсем кратко поговорим о каждом из них.

Python API

Набор из 5 модулей Python: xbmc, xbmcgui, xbmcplugin, xbmcaddon, xbmcvfs для взаимодействия с XBMC. Модули написаны на C++, используя Python-C API (SWIG). Ниже их краткий обзор:
xbmc — общее взаимодействие с XBMC;
xbmcgui — взаимодействие с GUI;
xbmcplugin — организация плагинов-источников контента;
xbmcaddon — доступ к различным параметрам плагинов (настройки, языковые файлы и т. п.);
xbmcvfs — работа с файловой системой.

Встроенные функции (builtins)

Набор команд для управления XBMC. Для вызова встроенных функций не обязательно писать программный код: их можно, к примеру, привязать к кнопке пульта или клавиатуры путем редактирования соответствующего конфигурационного файла. Перечень встроенных функций можно найти здесь.
Для вызова встроенных функций из скриптов на Питоне существует функция xbmc.executebuiltin().

Протокол JSON-RPC

Протокол для локального и удаленного управления XBMC на базе JSON-RPC. Обеспечивает широкие возможности взаимодействия с XBMC, включая двухсторонний обмен информацией. В последнем примере данной статьи протокол JSON-RPC используется для получения информации о последних добавленных в медиатеку фильмах. Подробнее о протоколе JSON-RPC в XBMC можно почитать здесь.
Для локального управления и обмена информацией по протоколу JSON-RPC используется функция xbmc.executeJSONRPC(). Кроме того, в состав стандартной библиотеки Питона входит модуль json, упрощающий обработку строк JSON.
Удаленное взаимодействие с XBMC на других компьютерах можно осуществлять при помощи модуля urllib2 стандартной библиотеки.

Возможности этих API частично пересекаются, и одну и ту же операцию нередко можно выполнить разными способами.

Примечание: вплоть до версии 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/WindowDialog/Control, реализующий подобие менеджера геометрии Grid, и украсил всё это дело текстурами, взятыми с дефолтного скина XBMC — Confluence. Получилось неплохо, и я решил сделать на базе этого полноценный микро-фреймворк. В качестве образца был взят PyQt, поэтому фреймоврк получил название PyXBMCt.

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

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

<import addon="script.module.pyxbmct" version="1.1.4"/>

Теперь при установке вашего плагина из репозитория или файла ZIP микро-фреймворк подтянется из официального репозитория автоматически. Кроме того, в Kodi 14.0 «Helix» наконец-то появилась возможность устанавливать служебные плагины вручную, и плагин PyXBMCt можно установить заранее самому.
В качестве простейшего примера, естественно, возьмем «Hello World»:

Hello World

# -*- coding: utf-8 -*-
# Импортируем модуль PyXBMCt.
import pyxbmct.addonwindow as pyxbmct


class MyWindow(pyxbmct.AddonDialogWindow):

    def __init__(self, title=''):
        # Вызываем конструктор базового класса.
        super(MyWindow, self).__init__(title)
        # Устанавливаем ширину и высоту окна, а также разрешение сетки (Grid):
        # 2 строки и 3 столбца.
        self.setGeometry(350, 150, 2, 3)
        # Создаем текстовую надпись.
        label = pyxbmct.Label('This is a PyXBMCt window.', alignment=pyxbmct.ALIGN_CENTER)
        # Помещаем надпись в сетку.
        self.placeControl(label, 0, 0, columnspan=3)
        # Создаем кнопку.
        button = pyxbmct.Button('Close')
        # Помещаем кнопку в сетку.
        self.placeControl(button, 1, 1)
        # Устанавливаем начальный фокус на кнопку.
        self.setFocus(button)
        # Связываем кнопку с методом.
        self.connect(button, self.close)
        # Связываем клавиатурное действие с методом.
        self.connect(pyxbmct.ACTION_NAV_BACK, self.close)


# Создаем экземпляр окна.
window = MyWindow('Hello, World!')
# Выводим созданное окно.
window.doModal()
# Принудительно удаляем экземпляр окна после использования.
del window

Если всё сделано правильно, на экране появится такое окошко с кнопкой:
Пишем плагин для XBMC с собственным интерфейсом: часть III — API и микро фреймворк

Теперь, подробный разбор. Для отображения номеров строк используйте текстовый редактор с соответствующей функцией, например Notepad++. Думаю, те, кто знаком с PyQt/PySide или с другими «взрослыми» GUI-фреймворками, сразу поймут, что к чему, поэтому очевидные вещи пропускаю.

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

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

Строка 23: метод setFocus() устанавливает начальный фокус на выбранный контрол. При наличии любых интерактивных контролов этот метод является обязательным, иначе вы просто не сможете управлять своим плагином с клавиатуры/пульта.
При наличии нескольких интерактивных контролов также нужно настроить правила навигации между ними (см. предыдущие части).

Строки 25 и 27: метод self.connect() связывает контрол или числовой код клавиатурного события с функцией/методом. Естественно, здесь используется ссылка на функцию (без круглых скобок ()), а не вызов функции. Также здесь можно использовать lambda — всё как в настоящем PyQt.
Связать можно только те контролы, которые генерируют событие при их активации: это Button, RadioButton и List. Другие контролы не генерируют событий, и связывать их бесполезно.
Числовые коды событий, генерируемых органами управления (клавиатурой, мышью, джойстиком и т. п.) можно найти здесь. PyXBMCt включает символьные имена для часто используемых событий.
Числовой код ACTION_PREVIOUS_MENU или 10 (по умолчанию — клавиша ESC на клавиатуре) всегда связан с методом close(), закрывающим окно, и переназначить его нельзя. Это сделано для того, чтобы окно плагина всегда можно было закрыть.

Строка 35: после использования экземпляр окна принудительно удаляется (вызывается деструктор экземпляра окна и всех объектов, связанных с ним). Дело здесь в том, что Garbage Collector почему-то не удаляет объекты классов xbmcgui после завершения работы плагина, что может приводить к утечкам памяти. Поэтому открытые окна на базе xbmcgui/PyXBMCt нужно удалять из памяти принудительно.

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

Окно входа на ex.ua

Пишем плагин для XBMC с собственным интерфейсом: часть III — API и микро фреймворк

Подробнее с PyXBMCt можно познакомиться по ссылкам ниже (английский язык).

PyXBMCt QuickStart Guide.

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

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

Тема на официальном форуме XBMC (Kodi).

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

Скриншот PyXBMCt Demo

Пишем плагин для XBMC с собственным интерфейсом: часть III — API и микро фреймворк

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

Заключение

На этом я заканчиваю цикл статей, посвященных написанию плагинов для XBMC (Kodi). К сожалению, в силу ряда обстоятельств 3-я часть выходит со значительным запозданием, но, как говорится, «лучше поздно, чем никогда».

Предыдущие статьи

Подробная анатомия простого плагина для XBMC.
Пишем плагин для XBMC с собственным интерфейсом: часть I — теория и простейший пример.
Пишем плагин для XBMC с собственным интерфейсом: часть II — диалоги и украшателства.

Автор: Roman_V_M

Источник

Старый
16.09.2013, 21:02

 
#1

Senior Member

 

Аватар для Roman_V_M

 

Регистрация: 12.06.2011

Адрес: Киев

Сообщений: 1,933

По умолчанию
Русскоязычные статьи о создании плагинов к XBMC


__________________
Координатор русского перевода Kodi:
https://www.transifex.com/projects/p/kodi-main/
——————————
Raspberry PI 2 + LibreELEC 8 (Kodi 17)
Samsung Galaxy Tab A 10.1 + Kodi 17 for Android
——————————
Читаем и пополняем Википедию форума: http://xbmc.ru/wiki
——————————
На любые личные сообщения, не связанные с переводом Kodi, не отвечаю. Для обсуждений и советов есть форум.


Последний раз редактировалось Roman_V_M; 07.11.2014 в 13:30.

Roman_V_M вне форума

 

Ответить с цитированием

 

Старый
19.09.2013, 14:08

 
#2

Senior Member

 

Аватар для LordMerlin

 

Регистрация: 11.12.2009

Адрес: Russia

Сообщений: 2,184

По умолчанию


МАЛАДЦА!!!

__________________
Dune HD TV-102/Pioneer VSX-520-K/Samsung ES6727

ВИКИ Настройка DSPlayer:

http://xbmc.ru/wiki/index.php?title=Настройка_DSPlayer
DSPlayer поддержка ускорения GPU: http://xbmc.ru/forum/showthread.php?t=12
XBMC+SVP: http://habrahabr.ru/post/181598/
Крипто-робот, бонус за регистрацию, оплата за результат: https://apitrade.pro/bonus_xbmcru.htm

LordMerlin вне форума

 

Ответить с цитированием

Старый
06.10.2013, 22:05

 
#3

Senior Member

 

Аватар для bigbax

 

Регистрация: 12.12.2009

Адрес: Моск.обл.

Сообщений: 4,475

Отправить сообщение для bigbax с помощью ICQ

По умолчанию


наткнулся на ещё одну статью
p.s. и продолжение статьи
Роман в первых строках своей статьи упоминает эти статьи. А ещё подобные разъяснялки имеются?

__________________
Ubuntu 20.0.х, Kodi next


Последний раз редактировалось bigbax; 06.10.2013 в 22:41.

bigbax вне форума

 

Ответить с цитированием

Старый
07.10.2013, 13:42

 
#4

Senior Member

 

Аватар для Roman_V_M

 

Регистрация: 12.06.2011

Адрес: Киев

Сообщений: 1,933

По умолчанию


Эту статью я упоминал в своей «Подробной анатомии…». ИМХО, хороший пример разработки «бизнес-логики» плагина. Я у себя бизнес-логику почти не затрагивал, основной упор сделал на взаимодействие плагинов с XBMC.

А это 2-я часть моего цикла. См. ссылки в 1-м посте.

Цитата:

А ещё подобные разъяснялки имеются?

На русском, боюсь, нет. На английском в оф. Вики есть кое-что, но ИМХО плохо систематизировано, и некоторая инфа устарела.
Помнится, здесь один человек переводил статью с оф. Вики про создание своего интерфейса, но, насколько я помню, сама исходная статья была достаточно древняя.

Я сейчас допиливаю свой фреймворк для упрощенного написания интерфейсов плагинов. Как только закончу, выпущу обещанную 3-ю часть про интерфейсы.

__________________
Координатор русского перевода Kodi:
https://www.transifex.com/projects/p/kodi-main/
——————————
Raspberry PI 2 + LibreELEC 8 (Kodi 17)
Samsung Galaxy Tab A 10.1 + Kodi 17 for Android
——————————
Читаем и пополняем Википедию форума: http://xbmc.ru/wiki
——————————
На любые личные сообщения, не связанные с переводом Kodi, не отвечаю. Для обсуждений и советов есть форум.

Roman_V_M вне форума

 

Ответить с цитированием

Старый
21.09.2014, 21:03

 
#5

Junior Member

 

Регистрация: 04.09.2014

Сообщений: 9

Отправить сообщение для rew8612010 с помощью AIM Отправить сообщение для rew8612010 с помощью Yahoo Отправить сообщение для rew8612010 с помощью Skype™

По умолчанию


Цитата:

Сообщение от Roman_V_M
Посмотреть сообщение

Эту статью я упоминал в своей «Подробной анатомии…». ИМХО, хороший пример разработки «бизнес-логики» плагина. Я у себя бизнес-логику почти не затрагивал, основной упор сделал на взаимодействие плагинов с XBMC.

А это 2-я часть моего цикла. См. ссылки в 1-м посте.

На русском, боюсь, нет. На английском в оф. Вики есть кое-что, но ИМХО плохо систематизировано, и некоторая инфа устарела.
Помнится, здесь один человек переводил статью с оф. Вики про создание своего интерфейса, но, насколько я помню, сама исходная статья была достаточно древняя.

Я сейчас допиливаю свой фреймворк для упрощенного написания интерфейсов плагинов. Как только закончу, выпущу обещанную 3-ю часть про интерфейсы.

Приветик а ты бы смог сделать видео как правильно создать плагины

rew8612010 вне форума

 

Ответить с цитированием

Старый
21.09.2014, 23:16

 
#6

Senior Member

 

Регистрация: 29.12.2010

Сообщений: 776

По умолчанию


Цитата:

Сообщение от rew8612010
Посмотреть сообщение

Приветик а ты бы смог сделать видео как правильно создать плагины

А,слабо, онлайн классы открыть?

__________________
https://github.com/Silhouette2022/kodi/raw/master/repository.silhouette.zip

Silhouette вне форума

 

Ответить с цитированием

Старый
22.09.2014, 19:33

 
#7

Senior Member

 

Аватар для Roman_V_M

 

Регистрация: 12.06.2011

Адрес: Киев

Сообщений: 1,933

По умолчанию


Цитата:

Сообщение от rew8612010
Посмотреть сообщение

Приветик а ты бы смог сделать видео как правильно создать плагины

Во-первых, мы с вами на брудершафт не пили.

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

__________________
Координатор русского перевода Kodi:
https://www.transifex.com/projects/p/kodi-main/
——————————
Raspberry PI 2 + LibreELEC 8 (Kodi 17)
Samsung Galaxy Tab A 10.1 + Kodi 17 for Android
——————————
Читаем и пополняем Википедию форума: http://xbmc.ru/wiki
——————————
На любые личные сообщения, не связанные с переводом Kodi, не отвечаю. Для обсуждений и советов есть форум.

Roman_V_M вне форума

 

Ответить с цитированием

Старый
12.05.2015, 13:08

 
#8

Member

 

Регистрация: 29.04.2015

Адрес: Киев

Сообщений: 31

По умолчанию


Здравствуйте.
Статьи по ссылкам выше перечитал.
Еще интересует какой-то набор beast-practice для аддонов каждого вида. Скрипты, контент-провайдеры etc.

Dukobpa3 вне форума

 

Ответить с цитированием

Старый
13.05.2015, 14:30

 
#9

Senior Member

 

Аватар для Roman_V_M

 

Регистрация: 12.06.2011

Адрес: Киев

Сообщений: 1,933

По умолчанию


Цитата:

Сообщение от Dukobpa3
Посмотреть сообщение

Здравствуйте.
Статьи по ссылкам выше перечитал.
Еще интересует какой-то набор beast-practice для аддонов каждого вида. Скрипты, контент-провайдеры etc.

Зверей мы не практикуем , а что касается best practices, то это, прежде всего, здравый смысл.
Но несколько общих рекомендаций можно дать:

Прежде всего, разделяйте код на отдельные модули согласно их функциям. Также желательно отделять код, взаимодействующий с Коди, от кода, выполняющего другие задачи. Тогда можно тестировать код вне Коди хотя бы частично.

Главный скрипт дополнения лучше сделать поменьше, и вынести весь рабочий код во внешние модули. Тогда дополнение будет быстрее запускаться на слабых системах (Paspberry Pi, Андроид). Связано это с особенностью работы транслятора Питона.

В плагинах, проигрывающих контент, проигрывание лучше запускать через xbmcplugin.setResolvedUrl(). Тогда работают закладки и отметки просмотренного. В своих статьях я упустил этот момент (справедливости ради, документация оставляет желать лучшего), но пример кода можно глянуть, например, здесь: http://forum.kodi.tv/showthread.php?…030#pid2003030

__________________
Координатор русского перевода Kodi:
https://www.transifex.com/projects/p/kodi-main/
——————————
Raspberry PI 2 + LibreELEC 8 (Kodi 17)
Samsung Galaxy Tab A 10.1 + Kodi 17 for Android
——————————
Читаем и пополняем Википедию форума: http://xbmc.ru/wiki
——————————
На любые личные сообщения, не связанные с переводом Kodi, не отвечаю. Для обсуждений и советов есть форум.

Roman_V_M вне форума

 

Ответить с цитированием

Старый
14.05.2015, 00:07

 
#10

Senior Member

 

Аватар для HAL9000

 

Регистрация: 15.03.2012

Сообщений: 1,094

По умолчанию


Цитата:

Сообщение от Roman_V_M
Посмотреть сообщение

Главный скрипт дополнения лучше сделать поменьше, и вынести весь рабочий код во внешние модули. Тогда дополнение будет быстрее запускаться на слабых системах (Paspberry Pi, Андроид). Связано это с особенностью работы транслятора Питона.

Вот это сомнительно. Питон подгружает модули синхронно. По мере их встречи в коде. Поэтому, пока не загрузятся все модули, указанные в главном скрипте, он не пойдет дальше.

__________________
RuTracker: http://xbmc.ru/forum/showthread.php?t=2243
Ruhunt.Pulsar: http://xbmc.ru/forum/showthread.php?t=6759
Last.VK: http://xbmc.ru/forum/showthread.php?t=3709
Lovi.fm: http://xbmc.ru/forum/showthread.php?t=6758

HAL9000 вне форума

 

Ответить с цитированием

Плагин к KODI для Smotrim.ru

en
ru-ru

Этот плагин Kodi предназначен для просмотра видео с сайта
Smotrim.ru.

Если у вас есть какие-либо вопросы либо пожелания по работе плагина,
пожалуйста, пишите на форум XBMC.ru тут.

Совместимость

Этот плагин тестировался на следующих версиях Kodi и операционных системах:

  • Kodi Leia под Ubuntu 18.04 LTS.
  • Kodi Matrix под Ubuntu 20.04 LTS
  • Kodi Matrix на Android v9 Pie
  • Kodi Matrix на macOS BigSur 11.1
  • Kodi Matrix на Windows 10

Установка

  1. Скачайте этот файл
  2. В Kodi перейдите в меню Система/Дополнения/Установить из zip-файла и
    выберите файл, который вы скачали на шаге 1.
  3. Перейдите в меню Система/Дополнения/Alex Bratchik Kodi repository/
    Видеодополнения
    , и установите плагин «Smotrim.ru».

Готово :) Наслаждайтесь бесплатными фильмами и сериалами с сайта Smotrim.ru

Регистрация

Начиная с версии 1.0.18, этот плагин поддерживает регистрацию пользователей
по номеру мобильного телефона. Чтобы зарегистрироваться, введите номер своего мобильного
в настройках плагина. При первом открытии плагина на экране появится окошко для
ввода кода, который будет отправлен на ваш момбильный в SMS с сайта Smotrim.ru.
Введите код из SMS, и нажмите Готово.
Если регистрация прошла успешно, то при повторном открытии плагина окно для ввода кода
появляться не будет.

На текущий момент, регистрация тестировалась в основном с российскими номерами.
Заграничные номера могут также работать, но это не гарантируется. Если у вас нет российской
SIM-карты, и регистрация не проходит, то необходимо удалить Ваш номер из настроек плагина.

Просмотр прямого эфира ТВ

Начиная с версии 1.1.11, плагин поддерживает потоковое вещание прямого эфира ТВ. Прямые
телевизионные трансляции доступны только для некоторых каналов, и могут быть недоступны
за пределами России.

Чтобы просмотреть прямой эфир интересующего Вас канала, откройте плагин и выберите пункт
меню Каналы > [имя_канала] > Эфир.

Интеграция с IPTV Manager

Начиная с версии 1.1.15, плагин поддерживает интеграцию с ITPV Manager. Активация
интеграции осуществляется следующим образом::

  1. В настройках плагина Smotrim.ru, откройте заклаку Интерфейс. Если IPTV Manager
    не установлен, выберите опцию Установить IPTV Manager и следуйте инструкциям на
    экране.
  2. Если IPTV manager установлен, включите интеграцию в настройках плагина Smotrim.ru.
  3. Откройте настройки плагина IPTV Manager. Перейдите на закладку IPTV Simple
    и убедитесь, что плагин IPTV Simple настраивается через IPTV Manager автоматически.
  4. Перейдите на закладку ТВ каналы, и выберите Обновить каналы и программу сейчас.
    Процедура обновления может занять 2-3 минуты, в зависимисти от параметров вашей системы
    и скорости Интернета.

После этого вы должны увидеть список каналов с программой передач в главном меню
ТВ медиацентра Kodi.

Возможные проблемы с воспроизведением видео

Сайт Smotrim.ru предоставляет потоковое видео в HD-качестве, которое может потребовать
дополнительной конфигурации системы Kodi для устойчивого воспроизведения и комфортного
просмотра программ. Если видео у Вас проигрывается не устойчиво, наблюдаются пропуски
фрагментов, либо же видео вообще не запускается, рекомендуется изменить параметры
буфера данных медиацентра Kodi следующим образом:

memorysize = 41943040
readfactor = 10

Эти параметры можно изменить, отредактировав в ручную файл
advancedsettings.xml.
Однако намного удобнее будет воспользоваться другим плагином,
Unlock Advanced Settings,
который вы можете установить из
того же репозитория,
из которого Вы устанавливали плагин Smotrim.ru.
После установки перейдите на закладку Буфер данных, отредактируйте параметры, как указано выше,
и перезапустите Kodi. После этого проблемы с воспроизведением видео должны исчезнуть.

Некоторые видео могут воспроизводиться некорректно в «автоматическом» режиме выбора
качества. В этом случае рекомендуется явно задавать качество, соответствующее разрешению
вашего монитора и скорости интернет-соединения:

  • fhd-wide (1920×1080)
  • hd-wide (1280×720)
  • high-wide (960×540)
  • high (800×600)
  • medium-wide (640×360)
  • medium (640×480)
  • low-wide (416×243)
  • low (320×240)

О плагине

Это некоммерческий плагин к платформе Kodi, поддерживаемый Интернет-сообществом,
для веб-сайта Smotrim.ru.
Он создан для удобства просмотра российских программ на экране телевизора, просто для
развлечения, и не имеет никакого отношения к компании ВГТРК.

Лицензия: GPL v.3

Понравилась статья? Поделить с друзьями:
  • Как написать плагин для cinema 4d
  • Как написать плагин для chrome
  • Как написать плагин вордпресс
  • Как написать пищевым фломастером на мастике
  • Как написать пиши грамотно