[Из песочницы] Феерический screensaver для Kodi
Назначение хранителя экрана для «Kodi»
Проект предназначен для создания «Феерического» хранителя экрана с минимальным количеством исходного кода на языке Python. Проект является простейшим плагином для мультимедиа центра Kodi.
Проект показывает как можно создать очень красивый хранитель экрана целиком опираясь на работу «OpenSource» сообщества. Проект интеграционный, это пример написания двух независимых компонентов, каждый из которых занимает порядка 80 строчек кода. Первый компонент — генератор контента, shell скрипт, второй компонент — плагин для мультимедиа центра Kodi, отвечает за отображение контента.
Ну и напоследок если вы программист и используете систему контроля версий Git, то вы можете визуализировать вашу работу, записать ее в видео файл и наслаждаться полученным результатом на экране телевизора или компьютера, откинувшись на спинку кресла с чашечкой кофе. А прохладными осенними вечерами вы можете убаюкивающе засыпать под ваш screensaver, не забыв при этом поставить таймер выключения устройства в Kodi.
Преамбула
Бесконечно можно смотреть на три вещи:
как горит огонь, как течет вода и как работают другие люди.
Так как плагин пишется для «Мультимедиа центра Kodi», то и визуализировать я буду работу супер команды «Kodi программистов».
Использование плагинов в Kodi
Мультимедиа центр Kodi является очень мощной и гибкой программой, работающей в связке с внешней библиотекой ffmpeg, для декодирования аудио и видео файлов.
Для создания стороннего приложения Kodi использует механизм расширений «addons» или попросту плагинов. Для создания собственного плагина мне потребуются некоторые навыки и небольшое знание языка программирования Python.
Механизм плагинов Kodi является чрезвычайно гибким и удобным. Python интерпретируемый язык, а это значит что мне не нужно ничего компилировать, собирать в отдельный пакет программного обеспечения, мучиться с файлами сборки типа «makefile» и т.п.
Для конечного распространения Kodi плагина достаточно упаковать его в Zip архив, соблюдая некоторые правила по структуре каталогов. Имея на руках конечный Zip архив его можно установить на любом устройстве в котором работает Kodi: компьютере, планшете, и наконец телевизоре (имеется ввиду связка TV + одноплатник), указав архив в виде источника плагина.
Структура плагина для Kodi
└── 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
- README.md — необязательный файл, содержит описание проекта для github.com
- addon.xml — файл с описанием плагина, содержит тип плагина, кодировку, версию, зависимости, имя автора и т.п.
- changelog.txt — необязательный файл, со списком изменений проекта
- create.sh — необязательный файл, bash скрипт предназначен для создания Zip архива screensaver (а) и генерации видео файла по Git истории с помощью инструмента Gource, к самому Kodi плагину файл отношения не имеет, необходим для удобного распространения плагина. Является полностью автономным, т.е. имея только этот файл вы всегда можете создать полный Zip архив плагина (при наличие интернет соединения).
- fanart.jpg — фоновое изображение плагина
- icon.png — основная иконка
- resources — каталог с ресурсами плагина
- screensaver.py — основной файл плагина, содержит весь исходный код плагина на языке Python, название файла может быть любым, главное, чтобы это название было прописано в файла addon.xml
Описание ресурсов плагина
Каталог resources содержит следующие файлы:
- language/English/strings.po — оригинальные строки интерфейса плагина на английском языке
- language/Russian/strings.po — перевод на русский язык, файл входит в стандартный механизм Kodi по переводу содержимого на национальные языки стран, в начале файла содержится стандартная текстовая шапка из нескольких строк (пример можно взять на сайте kodi.wiki, раздел плагины), затем идут переводы строк, состоящие из трех полей:
- msgctxt — ссылка на уникальный номер строки
- msgid — оригинальный текстовый идентификатор строки на английском языке
- msgstr — перевод значения msgid на национальный язык, в данном случае на русский (каталог Russian)
- settings.xml — основной файл настроек плагина, описывает графическое меню свойств плагина, строковые параметры которого можно изменить, где:
- id — текстовый идентификатор ресурса
- label — уникальная числовая метка текстового поля (соответствует полю msgctxt в файле strings.po переводов)
- type — предопределенный тип ресурса (все возможные типы описаны на сайте kodi.wiki, раздел плагины)
- default — значение параметра по умолчанию (можно сбросить параметр в это значение с помощью одноименного меню Kodi)
- resources/skins/default/1080i/kodi-universe.xml — конфигурационный xml файл
- resources/skins/default/720p/kodi-universe.xml — конфигурационный xml файл, описывающий расположение управляющих элементов плагина (controls), их геометрию, общие размеры, позицию элементов, тип видимости и т.д. Имя конфигурации определяется в зависимости от режима видео адаптера (например 1080i или 720р)
# 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 "Не запускать видео"
Медиа ресурсы плагина:
- resources/skins/default/media/black.jpg — черный фон, которым заполняется экран, перед запуском видео
- resources/skins/default/media/buran.jpg — футуристическое изображение космического корабля «Буран, на крыльях Мечты»
- resources/skins/default/media/kodi-universe.mkv — основной видео файл, который циклически проигрывается плагином, до наступления события пробуждения
Корневой конфигурационный файл плагина — addon.xml
Addon.xml — является основным конфигурационным файлом плагина, из которого Kodi берет всю необходимую информацию для запуска плагина и его интеграции в работу мультимедиа центра.
all
Kodi Universe
Вселенная Коди
Screensaver - Kodi Universe
Хранитель экрана - Вселенная Коди
GNU GENERAL PUBLIC LICENSE. Version 2, June 1991
Основными параметрами плагина являются:
- Секция addon
- id — уникальный текстовый идентификатор плагина
- name — название плагина
- version — версия плагина
- provider-name — имя провайдера плагина
- Секция requires — зависимости
в этой секции указываются модули от которых зависит работа данного плагина - Секция extension — расширений
в этой секции (их может быть несколько) указывается тип плагина,
основная точка входа в плагин:
point=«xbmc.ui.screensaver» library=«screensaver.py»в нашем случае плагин является «Хранителем экрана», которому передается
управление с помощью вызова python скрипта с именем «screensaver.py»так же в секции расширений может быть указана point=«xbmc.addon.metadata»
с типом платформы на которой плагин может работать, названием и описанием плагина
на определенном языке/языках, а также тип ЛИЦЕНЗИИ плагина
Общее количество метаданных, которые можно указать в этой секции extension может быть
достаточно большим и более подробную информацию вы можете найти на сайте
kodi.tv
Реализация плагина
Так как плагин должен быть предельно простым и понятным, то в его реализации я ограничусь одним основным файлом исходного кода screensaver.py, размещенным в корневом каталоге screensaver (а)
Для того, чтобы python скрипт вызывался, я прописал его в файле addon.xml, см. секцию выше
Язык программирования Python достаточно гибкий, он позволяет одно и тоже действие выполнить несколькими способами, и для наглядности я буду использовать объектно-ориентированный подход с классами.
# -*- coding: utf-8 -*-
# Plugin for Kodi mediacenter
# Kodi Universe - Very Simple Screensaver
# 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
class Screensaver (xbmcgui.WindowXMLDialog)
Основной класс хранителя экрана
В Python Kodi API входят несколько базовых модулей: xbmc, xbmcgui, xbmcplugin, xbmcaddon и xbmcvfs. Для работы с графическим интерфейсом Kodi я буду использовать модуль xbmcgui. Этот модуль содержит классы, отвечающие за разные элементы интерфейса
Для создания диалогового окна плагина со своим интерфейсом описанным в конфигурационном xml файле используется класс xbmcgui.WindowXMLDialog
Background image
0
0
FF555555
scale
1920
1080
buran.jpg
VideoWindow
0
0
1920
1080
true
Конфигурационный XML файл описывает два управляющих элемента:
Первый с идентификатором — 1, представляет собой фоновое изображение — «Буран, на крыльях Мечты», определенных размеров, выровненное по центру экрана.
Второй элемент с идентификатором — 2, является окном для проигрывания Видео, с признаком видимости и определенными геометрическими размерами.
Класс Screensaver наследуется от класса WindowXMLDialog, и имеет три метода:
- Конструктор __init__ метод вызывается автоматически при создании объекта
- Метод onInit — графической инициализации, вызывается перед первым отображением окна
- Метод onAction — метод обработки событий, вызывается при наступлении определенных событий, в данном случае при наступлении события пробуждения, т.е. нажатия кнопки мыши, клавиатуры, перемещении указателя мыши или прихода любого события от пульта управления.
Класс Screensaver использует два вспомогательных класса:
- Класс BsPlayer — наследуемого от стандартного XBMC класса видео проигрывателя xbmc.Player, класс содержит три метода:
- Конструктор __init__ метод вызывается автоматически при создании объекта
- Переопределение метода начала проигрывания видео onPlayBackStarted
- Переопределение метода окончания проигрывания видео onPlayBackStopped
Примечание: так как я переопределил метод остановки проигрывания и он пустой,
то сработает правило: Don’t Stop Let’s Go
- Класс BsPlaylist — класс списка предназначенный для возврата объекта xbmc.PlayList
класс содержит два метода:- Конструктор __init__ метод вызывается автоматически при создании объекта
- Метод getPlaylist для определения списка воспроизведения, используется стандартный список XBMC — xbmc.PlayList
Общий алгоритм работы Screensaver (а) следующий:
- При наступлении события вызова Screensaver (a) — отсутствие активности пользователя указанное количество минут и отсутствие активного видео/аудио воспроизведения, Kodi передает управление скрипту screensaver.py
- На основе конфигурационного 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)
Видео файл проигрывается по кругу, до того момента, пока не наступит
событие просыпания т.е. любое активное действие пользователя
Создание визуализации для плагина Kodi в Ubuntu
Примечание:
Все инструкции описанные ниже я буду запускать под операционной системой Linux, а именно дистрибутивом Ubuntu
также возможно выполнить описанные ниже действия в 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 (https://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 и 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(a)
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(а)
test -d ${NAME_PROJ}/.git && rm -fr ${NAME_PROJ}/.git
zip -r ${NAME_PROJ}.zip ${NAME_PROJ}
Скрипт должен выполняться под обычным пользователем, но в процессе запуска скрипт требует установки следующих программ «git zip ffmpeg gource»
В случае их отсутствия скрипт попытается их установить с помощью команды повышения привилегий — sudo.
Вкратце скрипт выполняет следующее:
- Загружает из Интернета два проекта c Github.
Первый проект — сам Screensaver
Второй проект — XBMC (Kodi)в случае указания аргумента в командной строки представляющего собой Git путь, можно загрузить любой Git проект для визуализации, пример загрузки другого Git проекта:
./create.sh https://github.com/facebook/react.git
в данном случае я беру для визуализации всем известный движок «Facebook» — React - Запускает программу Gource c аргументами командной строки, для генерации видео фрагментов в несжатом формате PPM.
Генерация видео будет происходить до тех пор, пока пользователь не закроет окно Gource мышкой (нажатие на крестик) или же пока пользователь не нажмет клавишу ESCПримечание:Не рекомендую вам генерировать видео длительностью больше трех минут, так как это может занять достаточно длительное время и потребует от вас для хранения более 30 Гбайт свободного места на жестком диске. Одна минута изображений с разрешением 1920×1080 (FullHD) и частотой 30 кадров в секунду требует порядка 10 Gбайт на жестком диске. Это временный файл, и после генерации правильного MKV видео контейнера (кодек h.264) с помощью FFmpeg, этот файл удаляется и остается результирующий файл, который занимает 20 Мбайт на одну минуту видео FullHD c частотой 25 кадров в секунду.
C теми настройками Gource, которые использует скрипт вы получаете возможность выбора любого временного участка с начала разработки проекта по настоящее время, за это отвечает линейная шкала внизу Gource окна. Вы можете мышкой выбрать любое время, при этом визуализация начинается с этого момента т.е. все предыдущие объекты на экране исчезают, это делает видео более динамическим.
- Запускает программу FFmpeg cо списком аргументов для создания MKV контейнера из исходного набора изображений Gource;
- Создает конечный Zip архив с проектом Screensaver (а) и сгенерированным видео файлом;
Параметры Gource
- 01 --camera-mode track режим работы камеры
(отслеживает текущих активных пользователей) - 02 --stop-position 1.0 конечная позиция
(задает конечную позицию для воспроизведения, диапазон от 0.0 до 1.0) - 03 --seconds-per-day 1 количество дней в секунде видео
(параметр определяет, какое количество работы вы увидите в интервале одной секунды видео) - 04 --git-branch origin/master рабочая ветка проекта
- 05 --stop-at-end остановиться после завершения git журнала
- 06 --multi-sampling включение сглаживания
- 07 --hide-filenames убирать названия файлов
- 08 --highlight-users подсвечивать названия пользователей
- 09 --file-idle-time 13 время простоя для файла
(количество времени, через которое имя файла снимается с индикации) - 10 --max-files 0 максимальное количество файлов
(значение 0 снимает ограничение на количество отображаемых имен файлов) - 11 --hide date убирать дату, для которой показывается текущий кадр
- 12 --title Kodi название, которое выводиться в левом нижнем углу видеозаписи
- 13 --bloom-multiplier 1.0 управление эффектом «легкого цветения» с помощью радиуса.
- 14 --bloom-intensity 1.0 управление эффектом «легкого цветения» с помощью интенсивности.
- 15 --output-framerate 30 выходное количество кадров в секунду
- 16 --output-ppm-stream name название выходного файла в формате PPM
примечание: некоторые параметры могут быть взаимоисключающими,
полный список параметров можно посмотреть здесь.
Краткая инструкция по созданию видео для Screensaver (а)
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.
(используется кодек h.264)
Также замечу, что размер Git базы XBMC (Kodi) занимает более 700 Мбайт
и время загрузки зависит от вашей скорости подключения к сети
Интернет.
Размер временного видео файла в формате PPM занимает порядка
10Гбайт на одну минуту видео (формат FullHD, 30 кадров в секунду).
Вы можете установить "Хранитель" экрана в Kodi
(для этого требуется разрешить установку дополнений из других источников)
Выбрав меню Kodi - "Дополнения" => "Браузер дополнений"
=> "Установка Zip архива"
После успешной установки, необходимо
активировать хранитель экрана Kodi Universe
в общем списке Screensaver(ов), так как их там несколько.
меню Settings (значок шестеренки) => "Настройки интерфейса"
=> "Заставка"