Protetor de tela encantador para Kodi

imagem alt

Atribuindo um protetor de tela ao Kodi


O projeto foi criado para criar um protetor de tela "Encantador" com uma quantidade mínima de código fonte em Python. O projeto é o plugin mais simples para o centro multimídia Kodi.

O projeto mostra como você pode criar um protetor de tela muito bonito, inteiramente baseado no trabalho da comunidade "OpenSource". Um projeto de integração, este é um exemplo de gravação de dois componentes independentes, cada um com cerca de 80 linhas de código. O primeiro componente é um gerador de conteúdo, script de shell, o segundo componente é um plug-in do centro multimídia Kodi, responsável pela exibição do conteúdo.

E, finalmente, se você é um programador e usa o sistema de controle de versão Git, pode visualizar seu trabalho, gravá-lo em um arquivo de vídeo e apreciar o resultado em uma TV ou tela de computador, recostando-se na cadeira com uma xícara de café. E nas noites frias de outono, você pode dormir tranquilamente sob o protetor de tela, sem esquecer de desligar o dispositivo no Kodi.

Preâmbulo


Você pode olhar infinitamente para três coisas:
como o fogo queima, como a água flui e como as outras pessoas trabalham.

Como o plugin foi escrito para o “Kodi Multimedia Center”, visualizarei o trabalho da super equipe de “Kodi Programmers”.

Usando plugins no Kodi


O Kodi Multimedia Center é um programa muito poderoso e flexível, trabalhando em conjunto com a biblioteca externa ffmpeg, para decodificar arquivos de áudio e vídeo.

Para criar um aplicativo de terceiros, o Kodi usa o mecanismo de extensão "addons" ou simplesmente plug-ins. Para criar meu próprio plugin, preciso de algumas habilidades e um pouco de conhecimento da linguagem de programação Python.

O mecanismo de plug-in do Kodi é extremamente flexível e conveniente. Python é uma linguagem interpretada, o que significa que não preciso compilar nada, compilá-lo em um pacote de software separado, sofrer com arquivos de compilação como "makefile" etc.

Para a distribuição final do plug-in Kodi, basta compactá-lo no arquivo Zip, observando algumas regras na estrutura de diretórios. Tendo o arquivo Zip final em mãos, ele pode ser instalado em qualquer dispositivo em que o Kodi funcione: um computador, tablet e, finalmente, uma TV (o que significa um monte de TV + placa única), especificando o arquivo como fonte de plug-in.

Estrutura do plugin Kodi


 └── screensaver.kodi.universe
     ├── README.md
     Add── addon.xml
     ├── changelog.txt
     Create── create.sh
     ├── fanart.jpg
     ├── icon.png
     ├── recursos
     │ ├── idioma
     │ │ ├── inglês
     │ │ │ ─── strings.po
     │ │ └── russo
     │ │ └── strings.po
     │ ├── settings.xml
     │ └── peles
     │ └── padrão
     720p ├── 720p
     K │ └── kodi-universe.xml
     │ ├── 1080i
     K │ └── kodi-universe.xml
     │ └── mídia
     Black ├── black.jpg
     │ ├── buran.jpg
     K └── kodi-universe.mkv
     └── screensaver.py


  • README.md - arquivo opcional, contém uma descrição do projeto para github.com
  • addon.xml - um arquivo com uma descrição do plug-in, que contém o tipo, codificação, versão, dependências, nome do autor, etc.
  • changelog.txt - um arquivo opcional com uma lista de alterações no projeto
  • create.sh é um arquivo opcional, um script bash é projetado para criar um protetor de tela de arquivo Zip (a) e gerar um arquivo de vídeo do histórico do Git usando a ferramenta Gource, o arquivo não tem uma relação com o próprio plug-in Kodi, é necessário para uma distribuição conveniente do plug-in. É totalmente autônomo, ou seja, tendo apenas esse arquivo, você sempre pode criar um arquivo Zip completo do plug-in (se você tiver uma conexão com a Internet).
  • fanart.jpg - imagem de fundo do plugin
  • icon.png - o ícone principal
  • resources - diretório com recursos de plug-in
  • screensaver.py - o arquivo principal do plugin, contém todo o código-fonte do plugin em Python, o nome do arquivo pode ser qualquer coisa, o principal é que esse nome esteja escrito no arquivo addon.xml

Descrição dos recursos do plugin


O diretório de recursos contém os seguintes arquivos:

  • language / English / strings.po - strings da interface do plugin original em inglês
  • language / Russian / strings.po - tradução para o russo, o arquivo está incluído no mecanismo padrão Kodi para traduzir o conteúdo para os idiomas nacionais dos países, o início do arquivo contém um cabeçalho de texto padrão de várias linhas (um exemplo pode ser encontrado no site kodi.wiki , seção plug-ins) , existem feeds de linha compostos por três campos:

    • msgctxt - link para um número de linha exclusivo
    • msgid - identificador de string de texto original em inglês
    • msgstr - tradução do valor msgid para o idioma nacional, neste caso, para russo (diretório russo)

  • settings.xml - o arquivo principal das configurações do plug-in, descreve o menu gráfico das propriedades do plug-in, cujos parâmetros de string podem ser alterados, em que:

    • id - identificador de recurso de texto
    • label - um rótulo numérico exclusivo para o campo de texto (corresponde ao campo msgctxt no arquivo de traduções strings.po)
    • type - um tipo de recurso predefinido (todos os tipos possíveis são descritos no site kodi.wiki , seção de plugins)
    • default - o valor padrão do parâmetro (você pode redefinir o parâmetro para esse valor usando o menu Kodi com o mesmo nome)

  • resources / skins / default / 1080i / kodi-universe.xml - arquivo de configuração xml
  • resources / skins / default / 720p / kodi-universe.xml - arquivo xml de configuração que descreve a localização dos controles de plug-in (controles), sua geometria, tamanhos gerais, posição dos elementos, tipo de visibilidade etc. O nome da configuração é determinado dependendo do modo do adaptador de vídeo (por exemplo, 1080i ou 720p)

conteúdo de Russian / 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 "  " 



conteúdo de 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> 


Recursos de mídia do plug-in:

  • resources / skins / default / media / black.jpg - fundo preto que preenche a tela antes de iniciar o vídeo
  • resources / skins / default / media / buran.jpg - imagem futurista da nave espacial "Buran, nas asas de um sonho"
  • resources / skins / default / media / kodi-universe.mkv - o principal arquivo de vídeo que é reproduzido ciclicamente pelo plug-in até o evento de despertar

Arquivo de configuração raiz do plug-in - addon.xml


Addon.xml - é o principal arquivo de configuração do plug-in, do qual o Kodi obtém todas as informações necessárias para iniciar o plug-in e integrá-lo ao centro multimídia.

conteúdo 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> 


Os principais parâmetros do plugin são:

  • Seção Addon
    • id - identificador de texto exclusivo do plug-in
    • name - nome do plugin
    • version - versão do plugin
    • nome do provedor - nome do provedor do plug-in

  • Requer seção - dependências
    Nesta seção, os módulos dos quais a operação deste plug-in depende
  • Seção de extensão - extensões
    nesta seção (pode haver vários), o tipo do plug-in é indicado,
    principal ponto de entrada para o plug-in:
    point = "xbmc.ui.screensaver" library = "screensaver.py"

    no nosso caso, o plugin é o “Protetor de Tela” ao qual é transmitido
    controle chamando um script python chamado "screensaver.py"

    point = “xbmc.addon.metadata” também pode ser especificado na seção de extensões
    com o tipo de plataforma na qual o plug-in pode funcionar, o nome e a descrição do plug-in
    em um idioma / idiomas específicos, bem como o tipo de plug-in LICENSE
    A quantidade total de metadados que pode ser especificada nesta seção de extensão pode ser
    Você pode encontrar informações grandes e mais detalhadas suficientes no site
    kodi.tv

Implementação de plugins


Como o plug-in deve ser extremamente simples e direto, em sua implementação vou me limitar a um arquivo de origem principal screensaver.py localizado no diretório raiz do screensaver (a)

Para que o script python seja chamado, eu o registrei no arquivo addon.xml, consulte a seção acima

A linguagem de programação Python é bastante flexível, permite executar a mesma ação de várias maneiras e, para maior clareza, usarei a abordagem orientada a objetos com classes.

conteúdo 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 


Protetor de tela de classe (xbmcgui.WindowXMLDialog)


A classe principal do protetor de tela

A API do Python Kodi inclui vários módulos principais: xbmc, xbmcgui, xbmcplugin, xbmcaddon e xbmcvfs . Para trabalhar com a GUI do Kodi, usarei o módulo xbmcgui. Este módulo contém classes responsáveis ​​por diferentes elementos da interface.

Para criar uma caixa de diálogo de plug-in com sua interface descrita no arquivo de configuração xml, a classe xbmcgui é usada.

conteúdo de 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> 


O arquivo XML de configuração descreve dois elementos de controle:

O primeiro com o identificador - 1 , é uma imagem de fundo - "Tempestade de neve, nas asas de um sonho", de certos tamanhos, alinhada ao centro da tela.

O segundo elemento com o identificador - 2 , é uma janela para reproduzir o vídeo, com um sinal de visibilidade e certas dimensões geométricas.

A classe Screensaver herda da classe WindowXMLDialog e possui três métodos:

  • O construtor __init__ método é chamado automaticamente quando o objeto é criado
  • OnInit - método de inicialização gráfica, chamado antes da primeira janela de exibição
  • O método onAction é um método de processamento de eventos que é chamado quando certos eventos ocorrem, nesse caso, quando ocorre um evento de despertar, ou seja, clicando no botão do mouse, teclado, movendo o ponteiro do mouse ou a chegada de qualquer evento no painel de controle.

A classe Screensaver usa duas classes auxiliares:

  • Classe BsPlayer - herdada da classe padrão do player de vídeo XBMC xbmc.Player , a classe contém três métodos:
    1. O construtor __init__ método é chamado automaticamente quando o objeto é criado
    2. Substituindo o método de início de vídeo onPlayBackStarted
    3. Substituindo o método final de vídeo onPlayBackStopped

      Nota: desde que redefini o método de parar a reprodução e ele está vazio,
      então a regra funcionará: não pare, vamos lá

  • Classe BsPlaylist - uma classe de lista projetada para retornar um objeto xbmc.PlayList
    a classe contém dois métodos:

    1. O construtor __init__ método é chamado automaticamente quando o objeto é criado
    2. O método getPlaylist para definir uma lista de reprodução usando a lista XBMC padrão - xbmc.PlayList

O algoritmo geral do Screensaver (a) é o seguinte:

  1. Quando o evento de chamada Screensaver ocorre (a) - a inatividade do usuário pelo número especificado de minutos e a ausência de reprodução ativa de vídeo / áudio, o Kodi transfere o controle para o script screensaver.py
  2. Com base no arquivo de configuração xml, a janela gráfica principal do plug-in é criada. Quando a janela gráfica é inicializada, os recursos de string das configurações do plugin são carregados (o menu é "settings").

Se o arquivo de vídeo não for especificado
__addon __. getSetting ("videofile")

é preenchido com um parâmetro padrão
video_url = def_video_url
__addon __. setSetting ("videofile", video_url)

se não houver sinalizador - "desativar a reprodução de vídeo"
__addon __. getSetting ("não vídeo")

a imagem futurista “Tempestade de neve nas asas do sonho” é mostrada por dois segundos
xbmc.sleep (2000)

ainda pelo identificador do controle 1, uma imagem de fundo preta é definida
self.getControl (1) .setImage ("black.jpg")

e o player de vídeo XBMC começa com uma lista de reprodução de arquivo único
self.player.play (self.vpl, windowed = True)

O arquivo de vídeo é reproduzido em círculo até o momento em que chega
evento de vigília, ou seja, qualquer ação do usuário ativa

Criando visualizações para o plugin Kodi no Ubuntu


Nota:
Todas as instruções descritas abaixo serão executadas no sistema operacional Linux, a saber, a distribuição Ubuntu

Também é possível executar as etapas descritas abaixo em um sistema operacional compatível com Debian - a principal condição para o lançamento será a presença do gerenciador de pacotes Apt no sistema, ou seja, um gerente que permite instalar o software Deb no sistema. Obviamente, você pode executar as seguintes etapas em qualquer sistema Linux, mas isso exigirá ações adicionais de você e é possível alterar a sequência de alguns comandos (como exemplo: instalação de pacotes RPM em vez de Deb, etc.)

Gource é um projeto muito interessante e fascinante. Gource é nomeado após origem, ou seja, código fonte + G (gráficos). Esta aplicação permite visualizar o histórico de alterações no sistema de controle de versão. O Gource entende nativamente o Git, para outros sistemas como SVN, Mercurial existem conversores que permitem converter a base de armazenamento no formato Git.

Gource - torna incrivelmente bonito com o OpenGL e possui um grande número de parâmetros para seu trabalho. Essa ferramenta incrivelmente poderosa para gerar a visualização "Encantadora" será usada.

Para criar uma visualização, preciso de uma sequência de comandos descritos em um script bash

Para gerar o vídeo, preciso de dois programas principais:
Gource - para criar o arquivo de vídeo de origem para o histórico Git de qualquer projeto especificado
FFmpeg - uma biblioteca para codificação e decodificação de vídeo e áudio

Script para gerar um arquivo de vídeo de plug-in


conteúdo 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} 


O script deve ser executado como um usuário comum, mas durante a inicialização, o script requer a instalação dos seguintes programas git zip ffmpeg gource

Se eles estiverem ausentes, o script tentará instalá-los usando o comando de escalonamento de privilégios - sudo .

Em resumo, o script faz o seguinte:

  • Ele baixa dois projetos da Internet com o Github.
    O primeiro projeto é o próprio Screensaver
    Segundo projeto - XBMC (Kodi)

    se você especificar um argumento na linha de comando que representa um caminho Git, poderá carregar qualquer projeto Git para visualização, um exemplo de carregamento de outro projeto Git:

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

    neste caso, eu uso o renomado mecanismo do Facebook para visualização - React
  • Executa o programa Gource com argumentos de linha de comando para gerar fragmentos de vídeo no formato PPM não compactado.
    O vídeo será gerado até que o usuário feche a janela Gource com o mouse (clicando na cruz) ou até que o usuário pressione a tecla ESC

    Nota:
    Não recomendo que você gere um vídeo com duração superior a três minutos , pois isso pode levar um longo tempo e exigirá que você armazene mais de 30 GB de espaço livre no disco rígido. Um minuto de imagens com uma resolução de 1920 × 1080 (FullHD) e uma frequência de 30 quadros por segundo requer cerca de 10 GB de espaço em disco rígido. Este é um arquivo temporário e, após gerar o contêiner de vídeo MKV correto (codec h.264) usando o FFmpeg, esse arquivo é excluído e o arquivo resultante permanece, o que leva 20 MB por um minuto de vídeo FullHD a 25 quadros por segundo.

    Com as configurações do Gource usadas pelo script, você tem a oportunidade de selecionar qualquer seção de tempo desde o início do desenvolvimento do projeto até o presente, a escala linear na parte inferior da janela do Gource é responsável por isso. Você pode usar o mouse para selecionar a qualquer momento, e a visualização começa a partir deste momento, ou seja, todos os objetos anteriores na tela desaparecem, isso torna o vídeo mais dinâmico.


  • Inicia o programa FFmpeg com uma lista de argumentos para criar um contêiner MKV a partir do conjunto de imagens Gource original;
  • Cria o arquivo Zip final com o projeto Screensaver (a) e o arquivo de vídeo gerado;

Opções de origem


  • 01 - modo de câmera de trilha no modo câmera
    (rastreia usuários ativos atuais)
  • 02 - posição final 1.0 posição final
    (define a posição final da reprodução, varia de 0,0 a 1,0)
  • 03 - segundo de dia 1 número de dias por segundo de vídeo
    (o parâmetro determina quanto trabalho você verá no intervalo de um segundo do vídeo)
  • 04 - origem do ramo de git / ramo de trabalho do projeto principal
  • 05 - parada no fim após o término do log do git
  • 06 - a suavização de várias amostras permite
  • 07 --hide-filenames remove nomes de arquivos
  • 08 --highlight-users destacar nomes de usuário
  • 09 - tempo de inatividade do arquivo 13 tempo ocioso do arquivo
    (a quantidade de tempo após a qual o nome do arquivo é removido da exibição)
  • 10 --max-files 0 número máximo de arquivos
    (um valor 0 remove o limite do número de nomes de arquivos exibidos)
  • 11 --hide date remove a data em que o quadro atual é exibido
  • 12 - título Kodi, o nome que aparece no canto inferior esquerdo do vídeo
  • 13 --bloom-multiplicator 1.0 controla o efeito de "light bloom" usando o raio.
  • 14 - Bloom-Intensity 1.0 controla o efeito de "light bloom" usando intensidade.
  • 15 - taxa de quadros de saída 30 quadros de saída por segundo
  • 16 --output-ppm-stream name nome do arquivo de saída no formato PPM

nota: alguns parâmetros podem ser mutuamente exclusivos,
Uma lista completa de parâmetros pode ser encontrada aqui .

Breve tutorial em vídeo para Screensaver (a)



1) Faça o download do projeto no github:
  git clone https://github.com/berserktv/screensaver.kodi.universe.git 


2) Gere um vídeo e crie um arquivo Zip do plug-in:
  cd screensaver.kodi.universe chmod u+x create.sh ./create.sh 


3) Tempo de geração de vídeo e uso de espaço livre em disco:
       .           -    20      Gource (PPM)   MKV      FFmpeg. (  h.264)  ,   Git  XBMC (Kodi)   700            .       PPM   10     ( FullHD, 30   ). 


4) Instale o protetor de tela no Kodi
     ""   Kodi (        )   Kodi - "" => " " => " Zip "   ,     Kodi Universe    Screensaver(),     .  Settings ( ) => " " => "" 

Source: https://habr.com/ru/post/pt466067/


All Articles