Actualizado a 13 de Octubre de 2022
Es habitual ver centros multimedia en Raspberry Pi, lo que no es tan habitual es montarlos en una imagen Docker, con las mejoras que ha habido en hardware en Raspberri ya es posible tener varios servicios a la vez en una sola Rpi, por ejemplo servidores de vídeo, audio etc..
En este caso se van a detallar los pasos para tener una imagen Docker con Kodi (v19.x) en la última versión Debian disponible en este momento (Bullseye).
Esta imagen Docker contendrá los plugins de HBO, Netflix, Amazon y Disney+ (aunque es posible que se puedan configurar otros).
Configuración Host
Antes de empezar con la imagen Docker necesitaremos una Raspberry operativa, como versión de Raspberry Pi OS podemos usar cualquiera (incluso Lite) una vez instalado Raspberry Pi OS actualizamos el sistema con:
sudo apt-get update
sudo apt-get upgrade
También hace falta instalar el paquete lirc.
apt-get install lirc
Y tendremos también que instalar Docker siguiendo estos pasos sino está ya instalado, en ese mismo enlace se dan algunas recomendaciones sobre rendimiento que pueden ser útiles.
Vídeo
Hay que hacer una pequeña modificación en el fichero /boot/config.txt para que el vídeo se reproduzca correctamente, tenemos que tener esto en el fichero:
[all]
dtoverlay=vc4-fkms-v3d
Y después solo queda reiniciar. A partir de aquí es posible que queramos hacer algunas tareas adicionales, por ejemplo igual queremos añadir como biblioteca de vídeo o audio un USB conectado o crear carpetas de unidad de red para acceder a ficheros remotos.
Docker
Aquí tenemos la imagen Docker, solo hay un parámetro para build que indica que salida de audio se va a utilizar, 1 para HDMI y 0 para la salida Jack.
FROM balenalib/raspberrypi3-debian:bullseye
ARG DEBIAN_FRONTEND=noninteractive
# 1 for HDMI, 0 for headphones
ARG AUDIO=1
RUN apt-get update && \
apt-get -y purge openssl && \
apt-get -y --purge autoremove && \
apt-get dist-upgrade && \
apt-get install -y \
uuid-dev \
upower \
alsa-base \
alsa-utils \
alsa-tools \
dbus-x11 \
libraspberrypi0 \
xterm \
xinput \
xinput-calibrator \
evemu-tools \
libnspr4 \
libwidevinecdm0 \
libc6 \
avahi-daemon \
libnss-mdns \
nano \
lirc \
lirc-compat-remotes \
bluez \
dumb-init \
# Required for AirPlay Mirroring
cmake \
libavahi-compat-libdnssd-dev \
libplist-dev \
libgstreamer1.0-dev \
libx264-dev \
libjpeg-dev \
libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-bad1.0-dev \
gstreamer1.0-plugins-ugly \
gstreamer1.0-tools \
gstreamer1.0-gl \
gstreamer1.0-gtk3 \
git \
git-svn \
libssl-dev \
# Python required for Netflix, Amazon...
python3-pip \
build-essential && \
# Install some Python packages
pip install setuptools pycryptodome pycryptodomex wheel pycrypto && \
apt-get -y --purge autoremove && \
rm -rf /var/lib/apt/lists/*
# besides kodi, we will install a few extra packages:
# - ca-certificates allows Kodi to properly establish HTTPS connections
# - kodi-eventclients-kodi-send allows us to shut down Kodi gracefully upon container termination
# - kodi-game-libretro allows Kodi to utilize Libretro cores as game add-ons
# - kodi-game-libretro-* Libretro cores
# - kodi-inputstream-* input stream add-ons
# - kodi-peripheral-* enables the use of gamepads, joysticks, game controllers, etc.
# - kodi-pvr-* PVR add-ons
# - kodi-screensaver-* additional screensavers
# - lirc,lirc-compat-remotes enables the use of IR Remotes
# - locales additional spoken language support (via x11docker --lang option)
# - pulseaudio in case the user prefers PulseAudio instead of ALSA
# - tzdata necessary for timezone selection
RUN packages=" \
fbset \
ca-certificates \
kodi \
kodi-eventclients-kodi-send \
kodi-inputstream-adaptive \
kodi-inputstream-rtmp \
kodi-peripheral-joystick \
kodi-pvr-argustv \
kodi-pvr-dvblink \
kodi-pvr-dvbviewer \
kodi-pvr-filmon \
kodi-pvr-hdhomerun \
kodi-pvr-hts \
kodi-pvr-iptvsimple \
kodi-pvr-mediaportal-tvserver \
kodi-pvr-mythtv \
kodi-pvr-nextpvr \
kodi-pvr-njoy \
kodi-pvr-pctv \
kodi-pvr-sledovanitv-cz \
kodi-pvr-stalker \
kodi-pvr-teleboy \
kodi-pvr-vbox \
kodi-pvr-vdr-vnsi \
# kodi-pvr-vuplus \ # Not yet available
kodi-pvr-wmc \
kodi-pvr-zattoo \
kodi-screensaver-biogenesis \
kodi-screensaver-matrixtrails \
kodi-screensaver-pyro \
kodi-screensaver-stars \
lirc \
lirc-compat-remotes \
locales \
libnss3 \
tzdata" && \
\
apt-get update && \
apt-get install -y $packages
# Audio settings
RUN echo \
"pcm.!default { \n\
type asym \n\
playback.pcm { \n\
type plug \n\
slave.pcm "output" \n\
} \n\
capture.pcm { \n\
type plug \n\
slave.pcm "input" \n\
} \n\
} \n\
pcm.output { \n\
type hw \n\
card $AUDIO \n\
} \n\
ctl.!default { \n\
type hw \n\
card $AUDIO \n\
}" >> /etc/asound.conf
# Adding user
ENV KODI_ID=1000
RUN adduser \
--uid $KODI_ID \
--disabled-password \
--gecos '' \
--ingroup sudo \
kodi
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
RUN usermod -a -G audio,video,input,dialout,plugdev,netdev,users,cdrom,tty kodi
# Install RpiPlay
WORKDIR /opt/vc
RUN git svn clone https://github.com/raspberrypi/firmware/trunk/opt/vc/include
RUN git svn clone https://github.com/raspberrypi/firmware/trunk/opt/vc/src
RUN git svn clone https://github.com/raspberrypi/firmware/trunk/opt/vc/lib
WORKDIR /repos
COPY rpiplay.tar.gz .
RUN tar -zxvf rpiplay.tar.gz
RUN ls -la
WORKDIR /repos/rpiplay/build
RUN ls -la
RUN cmake ..
RUN make -j 4
WORKDIR /
RUN rm -rf /repos
RUN rm -rf /rpiplay.tar.gz
# Plugins
WORKDIR /plugins
ADD --chown=kodi:sudo https://github.com/castagnait/repository.castagnait/raw/kodi/repository.castagnait-2.0.0.zip .
ADD --chown=kodi:sudo https://k.slyguy.xyz/repository.slyguy.zip .
ADD --chown=kodi:sudo https://github.com/Sandmann79/xbmc/releases/download/Repository/repository.sandmann79.plugins-1.0.4.zip .
# Configuration
EXPOSE 8080 9777/udp
VOLUME /home/kodi
USER kodi
COPY entrypoint.sh /usr/local/bin
CMD ["/usr/local/bin/entrypoint.sh"]
También usaremos el siguiente fichero Docker compose:
version: "3.7"
services:
rpi-kodi:
image: joursain/rpi-kodi:buster
build:
context: .
dockerfile: Dockerfile
container_name: "kodi"
user: kodi
network_mode: host
restart: "no"
privileged: true
devices:
- /dev/fb0:/dev/fb0
- /dev/vchiq:/dev/vchiq
- /dev/tty0:/dev/tty0
- /dev/tty2:/dev/tty2
- /dev/input:/dev/input
- /dev/snd:/dev/snd
- /dev/shm:/dev/shm
volumes:
- /var/run/dbus:/var/run/dbus
- /mnt/media/kodi:/home/kodi
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
- "/usr/bin/tvservice:/usr/bin/tvservice:ro"
tmpfs:
- /tmp
environment:
- DBUS_SYSTEM_BUS_ADDRESS=unix:path=/var/run/dbus/system_bus_socket
Para arrancar lo haremos de la forma habitual (opcionalmente podemos añadir -d si queremos que arranque en segundo plano)
docker-compose up [-d]
Veremos la salida (si no hemos seleccionado -d) de la ejecución y en cuanto haya terminado aparecerá Kodi en pantalla. Esta imagen permite el uso de teclado así que en cuanto esté operativa podremos usar el teclado y escuchar sonidos a medida que se seleccionen diferentes opciones, esto verificará que el sonido está bien configurado.
La carpeta home del usuario kodi (/home/kodi) que contiene la configuración de Kodi está compartida en un volumen por si hiciera falta hacer una copia de seguridad de la configuración o para añadir algún plugin externo se puede dejar en esta carpeta para poder instalarlo desde Kodi.
Al arrancar posiblemente saldrán varias ventanas relacionadas con plugins pidiendo activación, no hace falta hacerlo en un primer momento y se puede hacer más adelante.
Servicios
Es posible configurar algunos servicios de Kodi como por ejemplo UPnP o AirPlay de la siguiente forma:
- Vamos a configuración (el icono de la rueda)
- Icono System
- Services
- Aquí podemos habilitar UPnP/DLNA o AirPlay
En la parte de abajo hay una opción para poder ampliar las opciones de configuración (el nivel máximo es Expert)
Sonido
La imagen Docker por defecto al arrancar ya tiene el sonido habilitado, la configuración que deberíamos ver es la que está en:
- Vamos a configuración (el icono de la rueda)
- Icono System
- Opción audio
- Audio output device
- Marcamos Default (bcm2835 Headphones bcm2835 Headphones) ()
Como detalle si se están compartiendo los altavoces entre Raspberry y otro dispositivo es posible que la imagen arranque sin sonido, solo un dispositivo puede estar habilitado a la vez.
Plugins
Ahora vamos a configurar los diferentes plugins, la imagen Docker los coloca en la carpeta /plugins, antes de instalarlos hay que realizar algunas acciones en la imagen Docker.
- Vamos a configuración (el icono de la rueda).
- Add-ons.
- My add-ons.
- VideoPlayer InputStream.
- InputStream Adaptive.
- Enable.
Ahora tenemos que habilitar la opción de orígenes desconocidos para poder instalar los plugins
- Vamos a configuración (el icono de la rueda).
- System.
- Add-ons.
- Habilitamos Unknown sources y confirmamos el mensaje.
Para instalar los diferentes plugins tendremos que seguir estos pasos.
- Vamos a configuración (el icono de la rueda).
- Add-ons.
- Install from zip file (igual tenemos que usar los .. para subir a un nivel superior y poder ver la opción) y confirmamos el mensaje que saldrá, este mensaje solo nos indica que estos plugins no se actualizan automáticamente y habrá que hacerlo manualmente.
- Nos movemos a la carpeta /plugins (Root filesystem/plugins).
- Aquí se encuentran todos los plugins que iremos instalando.
Instalación
Todos los plugins se instalan de la misma forma, el procedimiento es:
- Desde la carpeta plugins del paso anterior buscamos el plugin que queramos instalar, habrá los siguientes:
- CastagnaIT para Netflix
- SlyGuy para HBO y Disney+
- Sandman para Amazon
- Una vez seleccionado e instalado, vamos a la opción Install From Repository (al mismo nivel que Install from zip File) y veremos varios repositorios, seleccionamos por el mismo nombre que antes el que interese.
- Si solicita componentes adicionales los instalamos también.
Al ejecutar algunos plugins es posible que solicite instalar Widevine CDM, es necesario instalarlo para que funcione el vídeo. Este proceso puede llevar un rato. Es posible también que falle la instalación o de un error al abrir el vídeo, en ese caso hay que apagar el contenedor y volverlo a levantar.
Configuración
Ahora que están los plugins instalados vamos a configurarlos, simplemente hay que acceder a ellos a través de:
- Vamos a configuración (el icono de la rueda)
- Add-ons
- My addons / Video add ons / (plug-in de vídeo)
Básicamente todos los plugins tienen el mismo sistema, algunos pedirán los datos de la cuenta al principio y otros tendrán una sección especial. Cada plugin tiene varias opciones de configuración, por ejemplo idioma o subtítulos, merece la pena dedicarle un rato.
Televisión
Para poder ver la televisión tenemos que ir al apartado de Add-Ons en Sistema y luego en My-AddOns y finalmente instalamos PVR IPTV Simple Client, en la parte de Configure donde dice M3U playlist URL ponemos https://www.tdtchannels.com/lists/tv.m3u8 o https://www.tdtchannels.com/lists/tvradio.m3u8 si también queremos radio.
Ahora solo tenemos que ir al icono de TV que tenemos en la página principal en un lateral y esperar a que cargue los canales, saldrán muchos así que usar el buscador es una buena opción.
Notas
El código fuente aquí.
Como dato adicional se puede usar este mismo docker compose para cambiar Plex por Kodi.
No parece que de buen resultado usar zswap aquí, produce algunos errores al menos en Rpi3, es mejor usar zram.
De igual forma no podemos tener la memoría gráfica por debajo de 160, así que lo dejamos en 256GB.
Bonus
Esta imagen Docker admite AirPlay y Bluetooth, también el uso de infrarrojos si hay uno conectado aunque habría que incluirlo en docker-compose añadiendo – dev/lirc:/dev/lirc o – dev/lirc0:/dev/lirc0
Referencias
https://forum.kodi.tv/showthread.php?tid=365714
https://mundokodi.com/addon-hbo-max-en-kodi/
https://support.zoom.us/hc/en-us/articles/203680359-Protocols-for-Apple-screen-mirroring-AirPlay-
https://forums.raspberrypi.com/viewtopic.php?t=295008
https://github.com/CodaFog/kodi-rpi
https://github.com/rimago/rpi-kodi
https://kodi.wiki/view/AirPlay
https://www.genbeta.com/multimedia/como-ver-netflix-kodi-que-puede-ser-mejor-que-hacerlo-sus-aplicaciones-oficiales
https://www-genbeta-com.cdn.ampproject.org/v/s/www.genbeta.com/multimedia/netflix-hbo-pluto-tv-twitch-youtube-todas-grandes-plataformas-que-puedes-ver-kodi-como-hacerlo/amp?amp_gsa=1&_js_v=a6&usqp=mq331AQIKAGwASCAAgM%3D#amp_tf=De%20%251%24s&aoh=16301408042642&csi=0&referrer=https%3A%2F%2Fwww.google.com&share=https%3A%2F%2Fwww.genbeta.com%2Fmultimedia%2Fnetflix-hbo-pluto-tv-twitch-youtube-todas-grandes-plataformas-que-puedes-ver-kodi-como-hacerlo
https://www.balena.io/docs/learn/more/masterclasses/services-masterclass/#5-running-systemd-in-a-service
https://wiki.ubuntu.com/LircHowto
https://www.linuxquestions.org/questions/linux-from-scratch-13/blfs-svn-dbus-won%27t-start-886338/
https://forums.balena.io/t/dbus-failed-to-connect-to-socket-host-run-dbus-system/3107
https://www.balena.io/docs/learn/develop/runtime/#dbus-communication-with-host-os


