XBMC (Xbox Media Center) — изначально задуманный и разрабатывающийся как открытый мультимедиа плеер для игровой приставки XBox, позже портированный на GNU / Linux. За более чем десятилетний срок разработки приложение не один раз сменило имя, в августе 2014 года было принято решение дать проекту имя Kodi, сохраняя порядок версий и функционал.
Kodi имеет интуитивно понятный пользовательский интерфейс с графическими эффектами и поддерживающий смену темы оформления. Множественные настройки, возможность расширения плагинами и скриптами позволяют гибко настроить приложение для наиболее комфортного использования.
Расширения Kodi имеет открытый API, что позволяет сторонним разработчикам создавать множество расширений: плагины, скрипты, темы оформления, Web-интерфейсы и многое другое. Разработчики Kodi поощряют создание и распространение пользовательских расширений, предоставляя возможность их установки непосредственно из Kodi. Последние релизы построены по новой архитектуре Addons Framework’а, включают в себя Addons Manager GUI, клиент децентрализованного распространения расширений, который использует сторонние сервисы, предоставляющие контент для Kodi. «Addons Manager» («Addons Browser») позволяет пользователям напрямую загружать расширения.
Проект предназначен для создания "Феерического" хранителя экрана с минимальным количеством исходного кода на языке Python. Проект является простейшим плагином для мультимедиа центра Kodi.
Проект показывает как можно создать очень красивый хранитель экрана целиком опираясь на работу "OpenSource" сообщества. Проект интеграционный, это пример написания двух независимых компонентов, каждый из которых занимает порядка 80 строчек кода. Первый компонент - генератор контента, shell скрипт, второй компонент - плагин для мультимедиа центра Kodi, отвечает за отображение контента.
Ну и напоследок если вы программист и используете систему контроля версий Git, то вы можете визуализировать вашу работу, записать ее в видео файл и наслаждаться полученным результатом на экране телевизора или компьютера, откинувшись на спинку кресла с чашечкой кофе. А прохладными осенними вечерами вы можете убаюкивающе засыпать под ваш screensaver, не забыв при этом поставить таймер выключения устройства в Kodi.
Так как плагин пишется для "Мультимедиа центра Kodi", то и визуализировать я буду работу команды Kodi программистов.
Мультимедиа центр Kodi является очень мощной и гибкой программой, работающей в связке с внешней библиотекой ffmpeg, для декодирования аудио и видео файлов.
Для создания стороннего приложения Kodi использует механизм расширений "addons" или попросту плагинов. Для создания собственного плагина мне потребуются некоторые навыки и небольшое знание языка программирования Python.
Механизм плагинов Kodi является чрезвычайно гибким и удобным. Python интерпретируемый язык, а это значит что мне не нужно ничего компилировать, собирать в отдельный пакет программного обеспечения, мучиться с файлами сборки типа "makefile" и т.п.
Для конечного распространения Kodi плагина достаточно упаковать его в Zip архив, соблюдая некоторые правила по структуре каталогов. Имея на руках конечный Zip архив его можно установить на любом устройстве в котором работает Kodi: компьютере, планшете, и наконец телевизоре (имеется ввиду связка TV + одноплатник), указав архив в виде источника плагина.
└── screensaver.kodi.universe ├── README.md ├── addon.xml ├── changelog.txt ├── create.sh ├── fanart.jpg ├── icon.png ├── resources │ ├── language │ │ ├── English │ │ │ └── strings.po │ │ └── Russian │ │ └── strings.po │ ├── settings.xml │ └── skins │ └── default │ ├── 720p │ │ └── kodi-universe.xml │ ├── 1080i │ │ └── kodi-universe.xml │ └── media │ ├── black.jpg │ ├── buran.jpg │ └── kodi-universe.mkv └── screensaver.py
корневой каталог плагина включает следующие файлы:
каталог resources содержит следующие файлы:
# Kodi Media Center language file
# Addon Name: Screensaver Kodi Universe
# Addon id: screensaver.kodi.universe
# Addon Provider: berserktv
msgid ""
msgstr ""
"Project-Id-Version: Kodi Addons\n"
"Report-Msgid-Bugs-To: alanwww1@kodi.org\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Kodi Translation Team\n"
"Language-Team: English (http://www.transifex.com/projects/p/xbmc-addons/language/en/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgctxt "#32001"
msgid "Screensaver"
msgstr "Хранитель экрана"
msgctxt "#32002"
msgid "Video file"
msgstr "Видеофайл"
msgctxt "#32003"
msgid "Not Video"
msgstr "Не запускать видео"
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<settings height="800">
<category label="32001">
<setting id="videofile" label="32002" type="video"/>
<setting id="not-video" type="bool" label="32003" default="false"/>
</category>
</settings>
Медиа ресурсы плагина:
Addon.xml - является основным конфигурационным файлом плагина, из которого Kodi берет всю необходимую информацию для запуска плагина и его интеграции в работу мультимедиа центра.
Показать/Скрыть содержимое addon.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="screensaver.kodi.universe" name="Kodi Universe" \
version="0.1.2" provider-name="berserktv">
<requires>
<import addon="xbmc.python" version="2.7"/>
</requires>
<extension point="xbmc.ui.screensaver" library="screensaver.py" />
<extension point="xbmc.addon.metadata">
<platform>all</platform>
<source>https://github.com/berserktv/screensaver.kodi.universe</source>
<summary lang="en">Kodi Universe</summary>
<summary lang="ru">Вселенная Коди</summary>
<description lang="en">Screensaver - Kodi Universe </description>
<description lang="ru">Хранитель экрана - Вселенная Коди</description>
<license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
</extension>
</addon>
Основными параметрами плагина являются:
Так как плагин должен быть предельно простым и понятным, то в его реализации я ограничусь одним основным файлом исходного кода screensaver.py, размещенным в корневом каталоге screensaver(а)
Для того, чтобы python скрипт вызывался, я прописал его в файле addon.xml, см. секцию выше
Язык программирования Python достаточно гибкий, он позволяет одно и тоже действие выполнить несколькими способами, и для наглядности я буду использовать объектно-ориентированный подход с классами.
# -*- coding: utf-8 -*-
# Plugin for Kodi mediacenter
# Kodi Universe - Very Simple Screensaver, autor Alexander Demachev (http://berserk.tv)
# GNU GENERAL PUBLIC LICENSE. Version 2, June 1991
import os
import sys
import xbmc
import urllib
import xbmcgui
import xbmcaddon
__id__ = 'screensaver.kodi.universe'
__addon__ = xbmcaddon.Addon(id=__id__)
__path__ = __addon__.getAddonInfo('path')
def_video_url = __path__+'/resources/skins/default/media/kodi-universe.mkv'
class BsPlaylist:
def __init__(self,):
pass
def getPlaylist(self,):
try: xbmc.PlayList(1).clear()
except: pass
self.playlist = xbmc.PlayList(1)
item = xbmcgui.ListItem("item1")
self.playlist.add(__addon__.getSetting("videofile"),item)
return self.playlist
class BsPlayer(xbmc.Player):
def __init__(self,):
pass
def onPlayBackStarted(self):
xbmc.executebuiltin("PlayerControl(RepeatAll)")
def onPlayBackStopped(self):
return
class Screensaver(xbmcgui.WindowXMLDialog):
def __init__( self, *args, **kwargs ):
pass
def onInit(self):
video_url = __addon__.getSetting("videofile")
if (video_url == ""):
video_url = def_video_url
__addon__.setSetting("videofile", video_url)
if (__addon__.getSetting("not-video") == "true" or not os.path.isfile(video_url) ):
return
li = BsPlaylist()
self.vpl = li.getPlaylist()
if self.vpl:
xbmc.sleep(2000)
self.getControl(1).setImage("black.jpg")
self.player = BsPlayer()
if not xbmc.getCondVisibility("Player.HasMedia"):
self.player.play(self.vpl,windowed=True)
def onAction(self,action):
try: xbmc.PlayList(1).clear()
except: pass
try: xbmc.Player().stop()
except: pass
try: self.close()
except: pass
if __name__ == '__main__':
scr = Screensaver(
'kodi-universe.xml',
__path__,
'default',
'',
)
scr.doModal()
del scr
Основной класс хранителя экрана
В Python Kodi API входят несколько базовых модулей: xbmc, xbmcgui, xbmcplugin, xbmcaddon и xbmcvfs. Для работы с графическим интерфейсом Kodi я буду использовать модуль xbmcgui. Этот модуль содержит классы, отвечающие за разные элементы интерфейса
Для создания диалогового окна плагина со своим интерфейсом описанным в конфигурационном xml файле используется класс xbmcgui.WindowXMLDialog
Показать/Скрыть содержимое resources/skins/default/1080i/kodi-universe.xml
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<window type="window">
<controls>
<control type="image" id="1">
<description>Background image</description>
<posx>0</posx>
<posy>0</posy>
<colordiffuse>FF555555</colordiffuse>
<aspectratio scalediffuse="false" align="center" \
aligny="center">scale</aspectratio>
<width>1920</width>
<height>1080</height>
<texture>buran.jpg</texture>
</control>
<control type="videowindow" id="2">
<description>VideoWindow</description>
<posx>0</posx>
<posy>0</posy>
<width>1920</width>
<height>1080</height>
<visible>true</visible>
</control>
</controls>
</window>
Конфигурационный XML файл описывает два управляющих элемента:
Первый с идентификатором - 1, представляет собой фоновое изображение - "Буран, на крыльях Мечты", определенных размеров, выровненное по центру экрана.
Второй элемент с идентификатором - 2, является окном для проигрывания Видео, с признаком видимости и определенными геометрическими размерами.
Класс Screensaver наследуется от класса WindowXMLDialog, и имеет три метода:
1) Конструктор __init__ метод вызывается автоматически при создании объекта
2) Метод onInit - графической инициализации, вызывается перед первым отображением окна
3) Метод onAction - метод обработки событий, вызывается при наступлении определенных событий, в данном случае
при наступлении события пробуждения, т.е. нажатия кнопки мыши, клавиатуры, перемещении управляющего указателя мыши или прихода
любого события от пульта управления.
Класс Screensaver использует два вспомогательных класса:
Общий алгоритм работы Screensaver(а) следующий:
1) При наступлении события вызова Screensaver(a) - отсутствие активности пользователя
указанное количество минут и отсутствие активного видео/аудио воспроизведения,
Kodi передает управление скрипту screensaver.py
2) На основе конфигурационного xml файла создается основное графическое окно плагина.
При инициализации графического окна загружаются строковые ресурсы настроек плагина (меню - "настройки").
В случае если видео файл не указан
__addon__.getSetting("videofile")
он заполняется параметром по умолчанию
video_url = def_video_url
__addon__.setSetting("videofile", video_url)
в случае отсутствия флага - "отключения видео воспроизведения"
__addon__.getSetting("not-video")
происходит показ футуристического изображения
"Буран на крыльях Мечты" в течении двух секунд
xbmc.sleep(2000)
далее по идентификатору элемента управления 1, устанавливается черное изображение фона
self.getControl(1).setImage("black.jpg")
и затем запускается XBMC видео проигрыватель со списком воспроизведения из одного файла
self.player.play(self.vpl,windowed=True)
Видео файл проигрывается по кругу, до того момента, пока не наступит
событие просыпания т.е. любое активное действие пользователя
Примечание:
также возможно выполнить описанные ниже действия в Debian совместимой операционной системе - главным условием запуска будет наличие в системе пакетного менеджера Apt , т.е. менеджера позволяющего установить в системе программное обеспечение в формате Deb. Конечно указанные ниже действия вы можете выполнить в любой Linux системе, но это потребует от вас дополнительных действий и возможно изменение последовательности некоторых команд (как пример: установка RPM пакетов вместо Deb и т.п.)
Gource - очень интересный и завораживающий проект. Gource назван по аналогии с source т.е. исходный код + G(Графика). Это приложение позволяет визуализировать историю изменений в системе контроля версий. Gource нативно понимает Git, для остальных систем например SVN, Mercurial существуют конверторы, которые позволяют преобразовать базу хранения в Git Формат.
Gource - отрисовывает невероятно красиво при помощи OpenGL, и имеет большое количество параметров для своей работы. Вот этот невероятно мощный инструмент для генерации "Феерической" визуализации я и буду использовать.
Для создания визуализации я буду использовать некоторую последовательность команд описанных в bash скрипте
Для генерации видео мне потребуются две основных программы:
Gource - для создания исходного видео файла по Git истории любого указанного проекта
FFmpeg - библиотека для кодирование и декодирования видео и аудио
#!/bin/bash
# This is script of the generation video from "Gource".
# project: Screensaver Kodi Universe (http://berserk.tv)
# This script creates a ZIP archive of a Kodi screensaver.
# GNU GENERAL PUBLIC LICENSE. Version 2, June 1991
#
# скрипт запускается под обычным пользователем,
# но вначале своего выполнения требует установки пакетов
# git zip ffmpeg gource с помощью команды sudo
OUT_DIR="output"
OUT="kodi-universe.mkv"
NAME_PROJ="screensaver.kodi.universe"
MEDIA_PATH="${NAME_PROJ}/resources/skins/default/media"
NAME_REP="https://github.com/berserktv/${NAME_PROJ}.git"
GSFILE="output.ppm"
SECONDS_PER_DAY="1"
GOURCE_FRAME_RATE="30"
RESOLUTION="-1920x1080"
CODEC_OUT_FRAME_RATE="25"
# -vcodec - кодек для кодирования видеопотока,
# libx264 в настоящий момент наиболее современный и быстрый кодек (h.264)
# -profile - профиль для кодека (baseline, main, high, high10, high422, high444)
# -pix_fmt - установка пиксельного формата (yuv420p, yuv422p, yuv444p)
FFPARAM="-vcodec libx264 -profile:v high422 -pix_fmt yuv420p"
GSPARAM1="--camera-mode track ${RESOLUTION} --stop-position 1.0 \
--seconds-per-day ${SECONDS_PER_DAY}"
GSPARAM2="--git-branch origin/master --multi-sampling \
--stop-at-end --hide-filenames"
GSPARAM3="--highlight-users --file-idle-time 13 --max-files 0 --hide date"
GSPARAM4="--title Kodi --bloom-multiplier 1.0 --bloom-intensity 1.0"
VIS="visualize"
# GIT адрес проекта по которому будем создавать визуализацию работы
GIT_REP="https://github.com/xbmc/xbmc.git"
# arg1 - визуализация любого git проекта,
# который можно задать первым аргументом в командной строке
# example: ./create.sh "https://github.com/facebook/react.git"
if [ -n "$1" ]; then GIT_REP="$1"; fi
# установка пакетов git zip ffmpeg и gource
packages="git zip ffmpeg gource"
for i in $packages; do
if ! dpkg -s $i | grep -q "install ok installed"; then
sudo apt-get install -y $i;
fi
done
# очистка выходного каталога
test -d ${OUT_DIR} && rm -rf ${OUT_DIR}
test -d ${OUT_DIR} || mkdir -p ${OUT_DIR}
cd ${OUT_DIR}
# загружаю Screensaver Kodi Universe и GIT проект, для визуализации
if ! git clone ${NAME_REP} ${NAME_PROJ}; then
echo "Error, not load ${NAME_REP}, exit ..."; exit 1;
fi
if ! git clone ${GIT_REP} ${VIS}; then
echo "Error, not load ${GIT_REP}, exit ..."; exit 2;
fi
# генерация видео для screensaver Kodi Universe - "Вселенная Коди"
gource ${VIS} ${GSPARAM1} ${GSPARAM2} ${GSPARAM3} ${GSPARAM4} \
--output-framerate ${GOURCE_FRAME_RATE} --output-ppm-stream ${GSFILE}
ffmpeg -y -r ${GOURCE_FRAME_RATE} -f image2pipe -vcodec ppm \
-i ${GSFILE} ${FFPARAM} -r ${CODEC_OUT_FRAME_RATE} ${OUT} && sync
mv -f ${OUT} ${MEDIA_PATH}
rm -f ${GSFILE}
# секция работы с архивом
# удаляю служебную GIT информацию из проекта screensaver.kodi.universe
test -d ${NAME_PROJ}/.git && rm -fr ${NAME_PROJ}/.git
zip -r ${NAME_PROJ}.zip ${NAME_PROJ}
Скрипт должен выполняться под обычным пользователем, но в процессе запуска скрипт требует установки следующих программ
"git zip ffmpeg gource"
В случае их отсутствия скрипт попытается их установить с помощью команды повышения привилегий - sudo.
Вкратце скрипт выполняет следующее:
git clone https://github.com/berserktv/screensaver.kodi.universe.git
cd screensaver.kodi.universe chmod u+x create.sh ./create.sh
Время генерации зависит от количества минут. Могу порекомендовать делать видео заставку продолжительностью не более трех минут - что займет примерно 20 минут на перекодировку из формата Gource (PPM) в формат MKV видео контейнера с помощью утилиты FFmpeg. Также замечу, что размер Git базы XBMC (Kodi) занимает более 700 Мбайт и время загрузки зависит от вашей скорости подключения к сети Интернет. Размер временного видео файла в формате PPM занимает порядка 10Гбайт на одну минуту видео (формат FullHD, 30 кадров в секунду).
Вы можете установить "Хранитель" экрана в Kodi Выбрав меню - "Установка дополнений" => "Установка Zip архива" После успешной установки, необходимо еще активировать хранитель экрана Kodi Universe в общем списке Screensaver(ов), так как их там несколько.
Вы можете загрузить следующие версии Screensaver(а):
версия - v0.1.2 Тема - Kodi, Isengard дата - от 21.12.2017 MD5 - 606e8f9d56130eaf52ad8c6e99e2f0d8 (контрольная сумма MD5 zip архива) размер архива 56 Мбайт имя файла - screensaver.kodi.universe-v0.1.2.zip ПРИМЕЧАНИЕ: Размер архива примерно 56 Мбайт, что обусловлено тем, что в состав хранителя экрана входит видео файл, который содержит 2.5 минуты "Феерической" разработки программного обеспечения мультимедиа центра Kodi. Разрешение видео файла Full HD (:-) Красота требует жертв )
версия - v0.1.2-facebook-react Тема - Facebook, React дата - от 08.01.2018 MD5 - cd2dfc56a8b1302688adc46d63799600 (контрольная сумма MD5 zip архива) размер архива 34.8 Мбайт имя файла - screensaver.kodi.universe-v0.1.2-facebook-react.zip
версия - v0.1.2-theme-m1 Тема - Kodi, Master дата - от 27.12.2017 MD5 - c15bb9be4231b32d378b5ebd4d45ab43 (контрольная сумма MD5 zip архива) размер архива 58 Мбайт имя файла - screensaver.kodi.universe-v0.1.2-theme-m1.zip