- PVSM.RU - https://www.pvsm.ru -
Проект предназначен для создания «Феерического» хранителя экрана с минимальным количеством исходного кода на языке 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 Addonsn"
"Report-Msgid-Bugs-To: alanwww1@kodi.orgn"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONEn"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONEn"
"Last-Translator: Kodi Translation Teamn"
"Language-Team: English
(http://www.transifex.com/projects/p/xbmc-addons/language/en/)n"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=UTF-8n"
"Content-Transfer-Encoding: 8bitn"
"Language: enn"
"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 берет всю необходимую информацию для запуска плагина и его интеграции в работу мультимедиа центра.
<?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>
Основными параметрами плагина являются:
в нашем случае плагин является «Хранителем экрана», которому передается
управление с помощью вызова python скрипта с именем «screensaver.py»
так же в секции расширений может быть указана point=«xbmc.addon.metadata»
с типом платформы на которой плагин может работать, названием и описанием плагина
на определенном языке/языках, а также тип ЛИЦЕНЗИИ плагина
Общее количество метаданных, которые можно указать в этой секции extension может быть
достаточно большим и более подробную информацию вы можете найти на сайте
kodi.tv [2]
Так как плагин должен быть предельно простым и понятным, то в его реализации я ограничусь одним основным файлом исходного кода 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
Основной класс хранителя экрана
В Python Kodi API входят несколько базовых модулей: xbmc, xbmcgui, xbmcplugin, xbmcaddon и xbmcvfs. Для работы с графическим интерфейсом Kodi я буду использовать модуль xbmcgui. Этот модуль содержит классы, отвечающие за разные элементы интерфейса
Для создания диалогового окна плагина со своим интерфейсом описанным в конфигурационном xml файле используется класс xbmcgui.WindowXMLDialog
<?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, и имеет три метода:
Класс Screensaver использует два вспомогательных класса:
Примечание: так как я переопределил метод остановки проигрывания и он пустой,
то сработает правило: Don't Stop Let's Go
Общий алгоритм работы Screensaver(а) следующий:
В случае если видео файл не указан
__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)
Видео файл проигрывается по кругу, до того момента, пока не наступит
событие просыпания т.е. любое активное действие пользователя
Примечание:
Все инструкции описанные ниже я буду запускать под операционной системой 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.
Вкратце скрипт выполняет следующее:
в случае указания аргумента в командной строки представляющего собой Git путь, можно загрузить любой Git проект для визуализации, пример загрузки другого Git проекта:
./create.sh https://github.com/facebook/react.git
в данном случае я беру для визуализации всем известный движок «Facebook» — React
Не рекомендую вам генерировать видео длительностью больше трех минут, так как это может занять достаточно длительное время и потребует от вас для хранения более 30 Гбайт свободного места на жестком диске. Одна минута изображений с разрешением 1920×1080 (FullHD) и частотой 30 кадров в секунду требует порядка 10 Gбайт на жестком диске. Это временный файл, и после генерации правильного MKV видео контейнера (кодек h.264) с помощью FFmpeg, этот файл удаляется и остается результирующий файл, который занимает 20 Мбайт на одну минуту видео FullHD c частотой 25 кадров в секунду.
C теми настройками Gource, которые использует скрипт вы получаете возможность выбора любого временного участка с начала разработки проекта по настоящее время, за это отвечает линейная шкала внизу Gource окна. Вы можете мышкой выбрать любое время, при этом визуализация начинается с этого момента т.е. все предыдущие объекты на экране исчезают, это делает видео более динамическим.
примечание: некоторые параметры могут быть взаимоисключающими,
полный список параметров можно посмотреть здесь [3].
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 (значок шестеренки) => "Настройки интерфейса"
=> "Заставка"
Автор: AlexanderDem
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/328949
Ссылки в тексте:
[1] kodi.wiki: http://kodi.wiki/view/Add-on_development
[2] kodi.tv : http://kodi.tv
[3] здесь: https://github.com/acaudwell/Gource/wiki/Controls
[4] Источник: https://habr.com/ru/post/466067/?utm_campaign=466067&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.