迷人的Kodi屏保

图片替代

将屏幕保护程序分配给Kodi


该项目旨在使用最少的Python源代码创建“迷人的”屏幕保护程序。 该项目是多媒体中心Kodi的最简单插件。

该项目展示了如何完全基于“ OpenSource”社区的工作来创建非常漂亮的屏幕保护程序。 一个集成项目,这是编写两个独立组件的示例,每个组件需要大约80行代码。 第一个组件是内容生成器,shell脚本,第二个组件是Kodi多媒体中心插件,负责显示内容。

最后,如果您是程序员,并且使用Git版本控制系统,则可以可视化您的工作,将其写入视频文件,并在电视或计算机屏幕上欣赏结果,然后向后靠在椅子上喝咖啡。 在凉爽的秋天夜晚,您可以在屏保下舒适地入睡,而不必忘记在Kodi中将设备设置为关闭计时器。

前言


您可以无休止地看三件事:
火如何燃烧,水如何流动以及其他人如何工作。

由于该插件是为“ Kodi多媒体中心”编写的,因此我将可视化“ Kodi Programmers”的超级团队的工作。

在Kodi中使用插件


Kodi多媒体中心是一个功能强大且灵活的程序,可与ffmpeg外部库配合使用,用于解码音频和视频文件。

为了创建第三方应用程序,Kodi使用“附加组件”扩展机制或简单地使用插件。 要创建自己的插件,我需要一些技巧和对Python编程语言的一点了解。

Kodi插件机制非常灵活和方便。 Python是一种解释型语言,这意味着我不需要编译任何东西,也不需要将其编译为单独的软件包,也无需使用诸如“ makefile”之类的生成文件。

对于Kodi插件的最终发行版,只需将其打包在Zip存档中,并遵守目录结构上的一些规则。 有了最终的Zip存档,就可以将其安装在Kodi工作的任何设备上:计算机,平板电脑,最后是电视(指一堆电视+单板),将存档指定为插件源。

Kodi插件结构


 └──screensaver.kodi.universe
     ├──README.md
     ├──addon.xml
     ├──changelog.txt
     ├──create.sh
     ├──fanart.jpg
     ├──icon.png
     ├──资源
     │├──语言
     ││├──英语
     │││└──strings.po
     ││└──俄语
     ││└──strings.po
     │├──settings.xml
     │└──皮肤
     │└──默认
     │├──720p
     ││└──kodi-universe.xml
     │├──1080i
     ││└──kodi-universe.xml
     │└──媒体
     │├──black.jpg
     │├──buran.jpg
     │└──kodi-universe.mkv
     └──screensaver.py


  • README.md-可选文件,包含对github.com的项目的描述
  • addon.xml-带有插件描述的文件;它包含插件类型,编码,版本,依赖项,作者姓名等。
  • changelog.txt-带有项目更改列表的可选文件
  • create.sh是一个可选文件,bash脚本旨在创建一个Zip存档屏幕保护程序(a),并使用Gource工具从Git历史记录生成视频文件,该文件与Kodi插件本身没有关系,为方便分发该插件是必需的。 它是完全自主的,即 仅拥有此文件,您就可以始终创建该插件的完整Zip存档(如果您有Internet连接)。
  • fanart.jpg-插件背景图片
  • icon.png-主图标
  • resources-带有插件资源的目录
  • screensaver.py-插件的主文件,包含Python中插件的所有源代码,文件名可以是任何东西,主要是此名称写在addon.xml文件中

插件资源的描述


资源目录包含以下文件:

  • 语言/英文/strings.po-英文原始插件界面字符串
  • language /俄语/ strings.po-俄语翻译,该文件包含在Kodi标准机制中,用于将内容翻译成国家/地区的本国语言,文件的开头包含几行的标准文本标题(可在kodi.wiki网站的“插件”部分找到示例) ,然后有由三个字段组成的换行符:

    • msgctxt-链接到唯一的行号
    • msgid-英文原始字符串标识符
    • msgstr-msgid值转换为本国语言,在这种情况下,转换为俄语(俄语目录)

  • settings.xml-插件设置的主文件,描述了插件属性的图形菜单,可以更改其字符串参数,其中:

    • id-文本资源标识符
    • label-文本字段的唯一数字标签(与翻译的strings.po文件中的msgctxt字段相对应)
    • type-预定义的资源类型(所有可能的类型都在kodi.wiki网站的“插件”部分中进行了描述)
    • default-参数的默认值(您可以使用相同名称的Kodi菜单将参数重置为该值)

  • 资源/外观/默认/ 1080i / kodi-universe.xml-xml配置文件
  • resources / skins / default / 720p / kodi-universe.xml-配置xml文件,用于描述插件控件(控件)的位置,其几何形状,整体大小,元素的位置,可见性的类型等。 配置名称取决于视频适配器的模式(例如1080i或720p)

俄语/strings.po的内容
# 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 "  " 



settings.xml的内容
  <?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> 


插件的媒体资源:

  • 资源/皮肤/默认/媒体/ black.jpg-开始播放视频之前先在屏幕上填充黑色背景
  • 资源/皮肤/默认/媒体/ buran.jpg-飞船“ Buran,在梦想的翅膀上”的未来派图像
  • resources / skins / default / media / kodi-universe.mkv-插件周期性播放直到唤醒事件之前的主要视频文件

插件根配置文件-addon.xml


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> 


插件的主要参数是:

  • 附加部分
    • id-插件的唯一文本标识符
    • 名称 -插件名称
    • 版本 -插件版本
    • provider- name-插件提供者的名称

  • 需要部分 -依赖项
    在本节中,此插件的操作所依赖的模块
  • 扩展部分 -扩展
    在本节中(可能有几个),指示了插件的类型,
    插件的主要入口点:
    点=“ xbmc.ui.screensaver”库=“ screensaver.py”

    在我们的例子中,插件是“屏幕保护程序”,将其发送到
    通过调用名为“ screensaver.py”的python脚本进行控制

    point =“ xbmc.addon.metadata”也可以在扩展部分中指定
    以及可以使用插件的平台类型,插件的名称和描述
    特定语言/种以及LICENSE插件的类型
    在此扩展部分中可以指定的元数据总量可以是
    您可以在网站上找到足够大的更详细的信息
    科迪电视

插件实现


由于该插件应该非常简单明了,因此在实现过程中,我将自己限制在屏幕保护程序根目录(a)中的一个主源文件screensaver.py

为了调用python脚本,我在addon.xml文件中注册了它,请参见上面的部分。

Python编程语言非常灵活,它允许您以几种方式执行相同的操作,为清楚起见,我将对类使用面向对象的方法。

screensaver.py内容
  # -*- 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 


屏幕保护程序类(xbmcgui.WindowXMLDialog)


屏幕保护程序的主要类别

Python Kodi API包含几个核心模块: xbmc,xbmcgui,xbmcplugin,xbmcaddon和xbmcvfs 。 要使用Kodi GUI,我将使用xbmcgui模块。 该模块包含负责不同接口元素的类。

要使用XML配置文件中描述的界面创建一个插件对话框,请使用xbmcgui类。

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类,并具有三个方法:

  • 创建对象时会自动调用构造函数__init__方法
  • OnInit-图形初始化方法,在第一个窗口显示之前调用
  • onAction方法是一种事件处理方法,在某些事件发生时(在这种情况下,当唤醒事件发生时)即在事件发生时调用。 单击鼠标按钮,键盘,移动鼠标指针或控制面板上任何事件的到来。

屏幕保护程序类使用两个帮助程序类:

  • BsPlayer类-从标准XBMC视频播放器类xbmc.Player继承 ,该类包含三个方法:
    1. 创建对象时会自动调用构造函数__init__方法
    2. 覆盖onPlayBackStarted视频启动方法
    3. 覆盖onPlayBackStopped视频结束方法

      注意:由于我重新定义了停止播放的方法,并且该方法为空,
      那么规则就会起作用:不要停止让我们走

  • BsPlaylist类-旨在返回xbmc.PlayList对象的列表类
    该类包含两个方法:

    1. 创建对象时会自动调用构造函数__init__方法
    2. 使用标准XBMC列表-xbmc.PlayList定义播放列表的getPlaylist方法

屏幕保护程序(a)的一般算法如下:

  1. 当发生屏幕保护程序呼叫事件(a)-用户在指定的分钟数内没有活动并且没有有效的视频/音频播放时,Kodi会将控制权转移到screensaver.py脚本
  2. 基于xml配置文件,创建插件的主图形窗口。 初始化图形窗口后,将加载插件设置的字符串资源(菜单为“设置”)。

如果未指定视频文件
__addon __。getSetting(“视频文件”)

它使用默认参数填充
video_url = def_video_url
__addon __。setSetting(“视频文件”,video_url)

如果没有标记-“禁用视频播放”
__addon __。getSetting(“非视频”)

放映两秒钟的未来派图像“梦想中的暴风雪”
xbmc.sleep(2000)

进一步通过控件1的标识符,设置黑色背景图像
self.getControl(1).setImage(“ black.jpg”)

然后XBMC视频播放器以单文件播放列表开始
self.player.play(self.vpl,windowed = True)

视频文件将循环播放,直到出现为止
唤醒事件即 任何活动的用户操作

在Ubuntu中为Kodi插件创建可视化


注意事项:
我将在Linux操作系统(即Ubuntu发行版)下运行以下描述的所有指令

也可以在兼容Debian的操作系统中执行以下描述的步骤-启动的主要条件是系统中是否存在Apt软件包管理器。 一个允许您在系统中安装Deb软件的管理器。 当然,您可以在任何Linux系统上执行以下步骤,但这将需要您执行其他操作,并且可以更改某些命令的顺序(例如:安装RPM软件包而不是Deb等)。

Gource是一个非常有趣且引人入胜的项目。 Gource以来源命名,即 源代码+ G(图形)。 此应用程序使您可以可视化版本控制系统中的更改历史记录。 Gource本身了解Git,对于其他系统(例如SVN,Mercurial),有一些转换器可让您将存储库转换为Git格式。

Gource-使用OpenGL 渲染出令人难以置信的美丽,并且具有大量的工作参数。 我将使用此强大的工具来生成“迷人”的可视化效果。

要创建可视化,我需要一些bash脚本中描述的命令序列

要生成视频,我需要两个主要程序:
Gource-为任何指定项目的Git历史记录创建源视频文件
FFmpeg-用于对视频和音频进行编码和解码的库

生成插件视频文件的脚本


create.sh内容
  #!/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安装它们。

简而言之,脚本执行以下操作:

  • 它使用Github从Internet下载了两个项目。
    第一个项目是屏幕保护程序本身
    第二个项目-XBMC(Kodi)

    如果您在命令行上指定表示Git路径的参数,则可以加载任何Git项目以进行可视化,例如加载另一个Git项目的示例:

     ./create.sh https://github.com/facebook/react.git 

    在这种情况下,我将使用著名的Facebook引擎进行可视化-React
  • 使用命令行参数运行Gource程序以生成未压缩的PPM格式的视频片段。
    视频将一直生成,直到用户用鼠标关闭Gource窗口(在十字架上单击)或直到用户按ESC键为止。

    注意事项:
    我不建议您生成持续时间超过三分钟的视频,因为这可能会花费很长时间,并且需要您在硬盘驱动器上存储30 GB以上的可用空间。 一分钟分辨率为1920×1080(FullHD)且频率为30帧的图像需要大约10 GB的硬盘空间。 这是一个临时文件,使用FFmpeg生成正确的MKV视频容器(h.264编解码器)后,该文件将被删除并保留生成的文件,该文件以每秒25帧的速度占用20分钟的一分钟FullHD视频。

    使用脚本使用的那些Gource设置,您就有机会选择从项目开发的开始到现在的任何时间段,Gource窗口底部的线性刻度负责。 您可以随时使用鼠标进行选择,并且可视化从这一刻开始,即 屏幕上所有先前的对象都消失了,这使视频更具动感。


  • 使用参数列表启动FFmpeg程序,以根据原始Gource映像集创建MKV容器;
  • 使用Screensaver项目(a)和生成的视频文件创建最终的Zip存档;

采购选项


  • 01 --camera-mode跟踪相机模式
    (跟踪当前活跃用户)
  • 02-停止位置1.0结束位置
    (设置播放的结束位置,范围从0.0到1.0)
  • 每天 03 秒-每秒1天的视频
    (该参数决定了您在一秒钟的视频中将看到多少工作)
  • 04 --git-branch起源/主项目工作分支
  • 05 - git日志完成后停止在终点停止
  • 06- 启用多采样平滑
  • 07 --hide-filenames删除文件名
  • 08 --highlight-users高亮显示用户名
  • 09 --file-idle-time 13文件的停机时间
    (从显示中删除文件名的时间)
  • 10 --max-files 0最大文件数
    (值0消除了对显示的文件名数量的限制)
  • 11- 隐藏日期删除显示当前帧的日期
  • 12- 标题Kodi出现在视频左下角名称
  • 13 --bloom-multiplier 1.0使用半径控制“ 光晕 ”的效果。
  • 14- 绽放强度1.0使用强度控制“光晕”的效果。
  • 15-每秒输出帧数30个输出帧
  • 16 --output-ppm-stream名称以PPM格式输出的文件名

注意:某些参数可能是互斥的,
参数的完整列表可以在此处找到。

屏幕保护程序的简短视频教程(a)



1)从github下载项目:
  git clone https://github.com/berserktv/screensaver.kodi.universe.git 


2)生成视频并创建插件的Zip存档:
  cd screensaver.kodi.universe chmod u+x create.sh ./create.sh 


3)视频生成时间和可用磁盘空间使用情况:
       .           -    20      Gource (PPM)   MKV      FFmpeg. (  h.264)  ,   Git  XBMC (Kodi)   700            .       PPM   10     ( FullHD, 30   ). 


4)在Kodi中安装屏幕保护程序
     ""   Kodi (        )   Kodi - "" => " " => " Zip "   ,     Kodi Universe    Screensaver(),     .  Settings ( ) => " " => "" 

Source: https://habr.com/ru/post/zh-CN466067/


All Articles