Ahora que disponemos de un Servidor estable y seguro para las gestiones en red. Vamos a seguir añadiendole extras a nuestro Servidor esta vez desde el punto multimedia.

UTILIDADES DE COMPILACIÓN

Estas son las utilidades y aplicaciones necesarias para poder compilar los programas de esta entrada (MiniDLNA, Xupnpd, ...):

sudo apt-get update && sudo apt-get -y install minissdpd autoconf g++ subversion linux-source linux-headers-`uname -r` build-essential tofrodos git-core subversion dos2unix make gcc automake cmake git-core dpkg-dev fakeroot pbuilder dh-make debhelper devscripts patchutils quilt git-buildpackage pristine-tar git yasm cvs mercurial libexif* libid3tag* libavutil* libavcodec-dev libavformat-dev libjpeg-dev libsqlite3-dev libexif-dev libid3tag0-dev libogg-dev libvorbis-dev libflac-dev ffmpeg libssl-dev libgnutls-openssl-dev uuid-dev psmisc

TRANSMISSION

Para descargar archivos, una de las opciones más usadas son las descargas Torrent. Hay muchos programas que nos permiten realizar este tipo de descargas pero, como es habitual, no son tantas las opciones disponibles en GNU/Linux. De todas formas, las opciones que tenemos disponibles no están faltas de calidad, ni mucho menos, y nos ofrecen todo lo que podemos desear en un cliente de archivos .torrent. Pero, ¿qué cliente Torrent elegimos para nuestro Servidor? Para mi la respuesta es simple y es Transmission. Vamos a entrar en materia, lo primero que tenemos que hacer es actualizar dependencias e instalar la aplicación:

sudo apt-get update && sudo apt-get install transmission-daemon

A continuación para poder continuar con la configuración debemos de parar el servicio:

sudo service transmission-daemon stop

Por defecto transmission-daemon se ejecuta con el usuario debian-transmission, vamos hacer que se ejecute con el usuario pi , editamos el fichero transmission-daemon.service

sudo nano /etc/systemd/system/multi-user.target.wants/transmission-daemon.service

Y cambiamos de valor a la variable USER para que quede asignada nuestro usuario pi:

[Service]
User=pi
Type=notify

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y ahora debemos editar el fichero de variables de transmission-daemon:

sudo nano /etc/init.d/transmission-daemon

Y volvemos a cambiar la variable USER para que quede asignada nuestro usuario pi:

NAME=transmission-daemon
DAEMON=/usr/bin/$NAME
USER=pi

Otro parametro que debemos de modificar en este mismo fichero que estamos editando, es posicionarnos sobre la línea 25 (recuerda Control + C en editor nano para ver nº línea), veremos el siguiente codigo:

start_daemon () {
    if [ $ENABLE_DAEMON != 1 ]; then
        log_progress_msg "(disabled)"
                log_end_msg 255 || true
    else
        start-stop-daemon --start \
        --chuid $USER \
                $START_STOP_OPTIONS \
        --exec $DAEMON -- $OPTIONS || log_end_msg $?
                log_end_msg 0
    fi
}

Y debemos dejarlo de la siguiente forma (hemos añadido la variable --nicelevel 15\) para optimizar el consumo de memoria de transmission:

start_daemon () {
    if [ $ENABLE_DAEMON != 1 ]; then
        log_progress_msg "(disabled)"
                log_end_msg 255 || true
    else
        start-stop-daemon --start \
        --chuid $USER \
                $START_STOP_OPTIONS \
        --nicelevel 15 \
        --exec $DAEMON -- $OPTIONS || log_end_msg $?
                log_end_msg 0
    fi
}

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y volvemos a cargar el servicio para que actualice la nueva configuración:

sudo update-rc.d transmission-daemon defaults && sleep 1 && sudo service transmission-daemon start && sleep 5 && sudo service transmission-daemon stop

Antes de continuar configurando, tenemos que decidir donde alojar las descargas y darle permisos de escritura/lectura:

mkdir -p /home/$USER/Torrents && chmod 777 -R /home/$USER/Torrents

Transmission tiene la posibilidad de configurar un script para que se ejecute cuando una descarga termina, vamos a editar el script:

mkdir -p /home/$USER/scripts && nano /home/$USER/scripts/torrents.sh && chmod +x /home/$USER/scripts/torrents.sh

Y añadimos el siguiente contenido:

#!/bin/bash
SERVER="127.0.0.1:9091"

TORRENTLIST=`transmission-remote $SERVER --list | sed -e '1d;$d;s/^ *//' | cut --only-delimited --delimiter=" "  --fields=1`

for TORRENTID in $TORRENTLIST
do
    DL_COMPLETED=`transmission-remote $SERVER --torrent $TORRENTID --info | grep "Percent Done: 100%"`

    STATE_STOPPED=`transmission-remote $SERVER --torrent $TORRENTID --info | grep "State: Seeding\|Stopped\|Finished\|Idle"`

    if [ "$DL_COMPLETED" ] && [ "$STATE_STOPPED" ]; then
        transmission-remote $SERVER --torrent $TORRENTID --remove
    else
        echo "Torrent #$TORRENTID no esta completo. Ignorado."
    fi
done

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y editamos el fichero de configuración ~/.config/transmission-daemon/settings.json:

nano ~/.config/transmission-daemon/settings.json

Adjunto mi fichero de configuración:

{
    "alt-speed-down": 32768,
    "alt-speed-enabled": true,
    "alt-speed-time-begin": 540,
    "alt-speed-time-day": 127,
    "alt-speed-time-enabled": false,
    "alt-speed-time-end": 1020,
    "alt-speed-up": 16384,
    "bind-address-ipv4": "0.0.0.0",
    "bind-address-ipv6": "::",
    "blocklist-enabled": true,
    "blocklist-url": "http://list.iblocklist.com/?list=bt_level1&fileformat=p2p&archiveformat=gz",
    "cache-size-mb": 4,
    "dht-enabled": true,
    "download-dir": "/home/pi/Torrents",
    "download-queue-enabled": true,
    "download-queue-size": 5,
    "encryption": 1,
    "idle-seeding-limit": 30,
    "idle-seeding-limit-enabled": false,
    "incomplete-dir": "/home/pi/Torrents",
    "incomplete-dir-enabled": true,
    "lpd-enabled": false,
    "message-level": 1,
    "peer-congestion-algorithm": "",
    "peer-id-ttl-hours": 6,
    "peer-limit-global": 200,
    "peer-limit-per-torrent": 50,
    "peer-port": 51412,
    "peer-port-random-high": 65535,
    "peer-port-random-low": 49152,
    "peer-port-random-on-start": false,
    "peer-socket-tos": "default",
    "pex-enabled": true,
    "port-forwarding-enabled": false,
    "preallocation": 1,
    "prefetch-enabled": true,
    "queue-stalled-enabled": true,
    "queue-stalled-minutes": 30,
    "ratio-limit": 2,
    "ratio-limit-enabled": false,
    "rename-partial-files": true,
    "rpc-authentication-required": false,
    "rpc-bind-address": "0.0.0.0",
    "rpc-enabled": true,
    "rpc-host-whitelist": "",
    "rpc-host-whitelist-enabled": true,
    "rpc-password": "{85fb5348e424d6d0b289abb1853d76f63571daec86gXyli4",
    "rpc-port": 9091,
    "rpc-url": "/transmission/",
    "rpc-username": "/pi/",
    "rpc-whitelist": "127.0.0.1",
    "rpc-whitelist-enabled": false,
    "scrape-paused-torrents-enabled": true,
    "script-torrent-done-enabled": true,
    "script-torrent-done-filename": "/home/pi/scripts/torrents.sh",
    "seed-queue-enabled": false,
    "seed-queue-size": 10,
    "speed-limit-down": 16384,
    "speed-limit-down-enabled": true,
    "speed-limit-up": 8192,
    "speed-limit-up-enabled": true,
    "start-added-torrents": true,
    "trash-original-torrent-files": false,
    "umask": 18,
    "upload-slots-per-torrent": 14,
    "utp-enabled": true,
    "watch-dir": "/home/pi/Torrents",
    "watch-dir-enabled": true
}

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y arrancamos el servicio de transmission ya configurado al 100% para nuestro sistema y usuario:

sudo service transmission-daemon start

Recuerda que se pueden administrar los torrents desde cualquier ordenador de nuestra red a través del navegador en la dirección http://direccion_ip_servidor:9091 en nuestro caso:

http://192.168.1.90:9091

SAMBA

Samba es una suite de aplicaciones Unix que habla el protocolo SMB (Server Message Block). Los sistemas operativos Microsoft Windows y OS/2 utilizan SMB para compartir por red archivos e impresoras y para realizar tareas asociadas. Gracias al soporte de este protocolo, Samba permite a las máquinas Unix entrar en el juego, comunicándose con el mismo protocolo de red que Microsoft Windows y aparecer como otro sistema Windows en la red (desde la perspectiva de un cliente Windows). Hoy en día, la suite Samba gira alrededor de un par de demonios Unix que permiten la compartición de recursos entre los clientes SMB de una red. Estos demonios son:

  • smbd: Demonio que permite la compartición de archivos e impresoras sobre una red SMB y proporciona autentificación y autorización de acceso para clientes SMB.
  • nmbd: Demonio que soporta el servicio de nombres NetBIOS y WINS, que es una implementación de Microsoft del servicio de nombres NetBIOS (NBNS). Este demonio también ayuda añadiendo la posibilidad de navegar por la red.

Vamos a entrar a configurar nuestro Servidor para compartir información con otros Sistemas Operativos de casa:

sudo apt-get update && sudo apt-get install samba

Vamos a crear una carpeta que usaremos para que cualquier usuario de nuestra red deje información en el servidor:

mkdir -p /home/$USER/Samba && chmod 777 -R /home/$USER/Samba

Hacemos copia de seguridad del fichero /etc/samba/smb.conf:

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

Una vez que tenemos la copia hecha, editamos la configuración:

sudo nano /etc/samba/smb.conf

Al final del fichero añadimos el recurso a compartir, una carpeta sera pública para la red y la otra privada que nos solicitara usuario y contraseña:

[Compartido]
  comment = Overclock Server - Publica
  path = /home/pi/Samba
  available = yes
  writable = yes
  browseable = yes
  only guest = no
  create mask = 0777
  directory mask = 0777
  public = yes

[Descargas]
  comment = Overclock Server - Privada
  path = /home/pi/Torrents
  available = yes
  writable = yes
  browseable = yes
  only guest = no
  create mask = 0777
  directory mask = 0777

En este mismo archivo, casi al principio, vas a encontrar la variable wins support comentada con un corchete, quitale el # para que quede así:

wins support = yes

Adicionalmente la variable workgroup, quede de la siguiente forma:

workgroup = WORKGROUP

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y añadimos el usuario pi a samba y le ponemos clave:

sudo smbpasswd -a pi

Solo nos queda reiniciar el servicio y tendriamos el sistema configurado:

sudo systemctl restart smbd

Ahora desde el explorar de ficheros accedemos a la dirección ip del Servidor, veremos el recurso compartido. Al intentar acceder a la carpeta privada, nos pedirá un nombre de usuario y la contraseña (la que pusimos en el paso anterior). Si las credenciales son correctas, veremos el contenido de la carpeta que hemos compartido.

VNC

Como tenemos instalado un entorno gráfico en el Servidor puede ser interesante controlarlo de forma remota mediante VNC. VNC (inglés: Virtual Network Computing). Es también llamado software de escritorio remoto, no impone restricciones en el sistema operativo del ordenador servidor con respecto al del cliente: es posible compartir la pantalla de una máquina con cualquier sistema operativo que soporte VNC conectándose desde otro ordenador o dispositivo que disponga de un cliente VNC portado. Vamos a actualizar repositorios e instalar el servidor de VNC:

sudo apt update && sudo apt-get -y install tightvncserver

Cuando termine la instalación lanzamos el programa para generar la configuración en nuestro sistema:

vncserver

Nos solicitara la creación de una contraseña y su posterior check:

Output
You will require a password to access your desktops.

Password: *****
Verify: *****

Nos preguntara si queremos crear un password de visualización solo, la respuesta será n:

Would you like to enter a view-only password (y/n)? n

Y nos dira que ha creado la configuración necesaria en nuestra carpeta de usuario:

xauth:  file /home/pi/.Xauthority does not exist

New 'X' desktop is your_hostname:1

Creating default startup script /home/pi/.vnc/xstartup
Starting applications specified in /home/pi/.vnc/xstartup
Log file is /home/pi/.vnc/lordpedal:1.log

Para configurar el Servidor de VNC en nuestro Servidor tenemos que detener el programa en ejecución:

vncserver -kill :1

Hacemos un backup del fichero xstartup generado:

mv ~/.vnc/xstartup ~/.vnc/xstartup.bak

Vamos a crear el nuestro personalizado y darle permisos de ejecución:

nano ~/.vnc/xstartup && chmod +x ~/.vnc/xstartup

Y dentro del fichero anexamos la siguiente configuración (Escritorio MATE):

#!/bin/bash
xrdb $HOME/.Xresources
xsetroot -solid grey
export XKL_XMODMAP_DISABLE=1
/usr/bin/mate-session &

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y ahora vamos a crear un servicio de autoarranque en SystemD con nuestro editor nano:

sudo nano /etc/systemd/system/vncserver@.service

Y agregamos el siguiente codigo:

[Unit]
Description=TightVNC Server
After=syslog.target network.target

[Service]
Type=forking
User=pi
Group=pi
WorkingDirectory=/home/pi

PIDFile=/home/pi/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x720 :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y recargamos los servcios de SystemD:

sudo systemctl daemon-reload

Ahora ya podemos habilitar el autoarranque de VNC tras reiniciar y habilitarlo en la sesión actual:

sudo systemctl enable vncserver@2.service && sudo systemctl start vncserver@2.service

Si queremos comprobar como esta trabajando el servicio hacemos un check de status:

sudo systemctl status vncserver@2

En mi caso devuelve el siguiente código:

pi@lordpedal:~/.vnc$ sudo systemctl status vncserver@2
● vncserver@2.service - TightVNC Server
   Loaded: loaded (/etc/systemd/system/vncserver@2.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-04-14 16:21:22 CEST; 1 day 1h ago
 Main PID: 1386 (Xtightvnc)
   CGroup: /system.slice/system-vncserver.slice/vncserver@2.service
           ├─ 1386 Xtightvnc :2 -desktop X -auth /home/pi/.Xauthority -geometry 1280x1024 -depth 24 -rfbwait 120000 -rfb           
           ├─ 2005 /bin/sh /etc/X11/Xvnc-session
           ├─ 2007 x-session-manager
           ├─ 2031 dbus-launch --autolaunch 21d0957d47914be79fd212f1ac66978d --binary-syntax --close-stderr
           ├─ 2035 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
           ├─ 2053 /usr/bin/dbus-launch --exit-with-session --sh-syntax
           ├─ 2058 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
           ├─ 2075 /usr/bin/ssh-agent x-session-manager
           ├─ 2077 /usr/lib/at-spi2-core/at-spi-bus-launcher
           ├─ 2082 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-ad           
           ├─ 2084 /usr/lib/at-spi2-core/at-spi2-registryd --use-gnome-session
           ├─ 2089 /usr/lib/dconf/dconf-service
           ├─ 2095 gnome-keyring-daemon --start
           ├─ 2101 /usr/bin/mate-settings-daemon
           ├─ 2105 marco
           ├─ 2109 mate-panel
           ├─ 2111 /usr/lib/gvfs/gvfsd
           ├─ 2119 /usr/lib/gvfs/gvfsd-fuse /home/pi/.gvfs -f -o big_writes
           ├─ 2136 /usr/bin/pulseaudio --start --log-target=syslog
           ├─ 2166 mate-screensaver
           ├─ 2168 nm-applet
           ├─ 2171 mate-volume-control-applet
           ├─ 2200 /usr/lib/mate-panel/wnck-applet

A partir de ahora cuando queramos conectarnos vía VNC debemos recordar que sera la IP de acceso y el puerto 5902 junto con la contraseña que le hubiesemos definido:

vnc://192.168.1.90:5902

MINIDLNA

MiniDLNA informalmente conocido como ReadyMedia, es un servidor streaming que funcionará perfectamente en una máquina con pocos recursos. Aunque su configuración es bastante simple, para su instalación quizás necesitemos algo mas de habilidades (pocas) pero no se asusten, en esta entrada veremos como instalar y configurar MiniDLNA. Tenemos dos opciones de instalación, recomiendo la primera en caso de inexperiencia. En la primera lo instalamos desde la paquetería y en la segunda lo compilamos desde las sources.

Opción 1: APT

Actualizamos repositorios e instalamos el paquete:

sudo apt-get update && sudo apt-get -y install minidlna minissdpd

Vamos a configurarlo con las rutas a definir donde buscar contenido multimedia, pero antes debemos de parar el servicio:

sudo service minidlna stop

Con el servicio parado procedemos a configurar el programa:

sudo nano /etc/minidlna.conf

Adjunto fichero configuración:

# port for HTTP (descriptions, SOAP, media transfer) traffic
port=8200

# network interfaces to serve, comma delimited
network_interface=br0,tun0

# specify the user account name or uid to run as
#user=minidlna

# set this to the directory you want scanned.
# * if you want multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to specific content types, you
#   can prepend the types, followed by a comma, to the directory:
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)
#   + "PV" for pictures and video (eg. media_dir=PV,/home/jmaggard/digital_camera)
media_dir=AVP,/home/pi/Descargas
media_dir=A,/home/pi/Música
media_dir=V,/home/pi/Vídeos
media_dir=P,/home/pi/Imágenes
media_dir=AVP,/home/pi/Torrents
media_dir=AVP,/home/pi/Samba

# set this to merge all media_dir base contents into the root container
# note: the default is no
#merge_media_dirs=no

# set this if you want to customize the name that shows up on your clients
friendly_name=Lordpedal DLNA

# set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache
db_dir=/var/cache/minidlna

# set this if you would like to specify the directory where you want MiniDLNA to store its log file
#log_dir=/var/log

# set this to change the verbosity of the information that is logged
# each section can use a different level: off, fatal, error, warn, info, or debug
#log_level=general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=warn

# this should be a list of file names to check for when searching for album art
# note: names should be delimited with a forward slash ("/")
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg

# set this to no to disable inotify monitoring to automatically discover new files
# note: the default is yes
inotify=yes

# set this to yes to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO
enable_tivo=no

# set this to strictly adhere to DLNA standards.
# * This will allow server-side downscaling of very large JPEG images,
#   which may hurt JPEG serving performance on (at least) Sony DLNA products.
strict_dlna=no

# default presentation url is http address on port 80
#presentation_url=http://www.mylan/index.php

# notify interval in seconds. default is 895 seconds.
notify_interval=900

# serial and model number the daemon will report to clients
# in its XML description
serial=21121981
model_number=1

# specify the path to the MiniSSDPd socket
minissdpdsocket=/var/run/minissdpd.sock

# use different container as root of the tree
# possible values:
#   + "." - use standard container (this is the default)
#   + "B" - "Browse Directory"
#   + "M" - "Music"
#   + "V" - "Video"
#   + "P" - "Pictures"
#   + Or, you can specify the ObjectID of your desired root container (eg. 1$F for Music/Playlists)
# if you specify "B" and client device is audio-only then "Music/Folders" will be used as root
#root_container=.
root_container=B

# always force SortCriteria to this value, regardless of the SortCriteria passed by the client
#force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title

# maximum number of simultaneous connections
# note: many clients open several simultaneous connections while streaming
max_connections=10

# set this to yes to allow symlinks that point outside user-defined media_dirs.
#wide_links=no

# enable subtitle support by default on unknown clients.
# note: the default is yes
#enable_subtitles=yes

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y añadimos el usuario pi al grupo minidlna:

sudo gpasswd -a minidlna pi

Ahora debemos de configurar servicio de MiniDLNA, para ello editamos el fichero /etc/default/minidlna

sudo nano /etc/default/minidlna

Y lo dejamos de la siguiente forma:

# Defaults for minidlna initscript
# sourced by /etc/init.d/minidlna
# installed at /etc/default/minidlna by the maintainer scripts

# These options can be set to modify the behavior of the minidlna init script.
# The options commented out show the default values.

# Start the daemon if set to "yes"
START_DAEMON="yes"

# Path to the configuration file
CONFIGFILE="/etc/minidlna.conf"

# Path to the log file
#LOGFILE="/var/log/minidlna.log"

# User and group the daemon should run as
USER="root"
GROUP="root"

# Additional options that are passed to the daemon
DAEMON_OPTS=""

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y recargamos la configuración:

sudo service minidlna force-reload

Opción 2: Compilar Source

Si anteriormente hemos instalado MiniDLNA desde los repositorios de Debian, debemos de eliminar la configuración previa:

sudo apt-get update && sudo apt-get -y purge minidlna

Ahora pasamos a limpiar las dependencias innecesarias:

sudo apt-get autoclean && sudo apt-get clean && sudo apt-get -y autoremove && sudo apt-get update

Creamos una carpeta donde alojaremos el proyecto que vamos a clonar de Sourceforge, compilamos e instalamos:

mkdir ~/.minidlna && cd ~/.minidlna && git clone git://git.code.sf.net/p/minidlna/git minidlna-git && cd minidlna-git && ./autogen.sh && ./configure && make && sudo make install && cp minidlna.conf ~/.minidlna/minidlna.conf

A continuación editamos el fichero de configuración:

nano ~/.minidlna/minidlna.conf

Adjunto mi fichero de configuración:

# port for HTTP (descriptions, SOAP, media transfer) traffic
port=8200

# network interfaces to serve, comma delimited
network_interface=br0,tun0

# specify the user account name or uid to run as
user=pi

# set this to the directory you want scanned.
# * if you want multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to specific content types, you
#   can prepend the types, followed by a comma, to the directory:
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)
#   + "PV" for pictures and video (eg. media_dir=PV,/home/jmaggard/digital_camera)
media_dir=AVP,/home/pi/Descargas
media_dir=A,/home/pi/Música
media_dir=V,/home/pi/Vídeos
media_dir=P,/home/pi/Imágenes
media_dir=AVP,/home/pi/Torrents
medir_dir=AVP,/home/pi/Samba

# set this to merge all media_dir base contents into the root container
# note: the default is no
#merge_media_dirs=no

# set this if you want to customize the name that shows up on your clients
friendly_name=Lordpedal DLNA

# set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache
db_dir=/home/pi/.minidlna

# set this if you would like to specify the directory where you want MiniDLNA to store its log file
#log_dir=/var/log

# set this to change the verbosity of the information that is logged
# each section can use a different level: off, fatal, error, warn, info, or debug
#log_level=general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=warn

# this should be a list of file names to check for when searching for album art
# note: names should be delimited with a forward slash ("/")
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg

# set this to no to disable inotify monitoring to automatically discover new files
# note: the default is yes
inotify=yes

# set this to yes to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO
enable_tivo=no

# set this to strictly adhere to DLNA standards.
# * This will allow server-side downscaling of very large JPEG images,
#   which may hurt JPEG serving performance on (at least) Sony DLNA products.
strict_dlna=no

# default presentation url is http address on port 80
#presentation_url=http://www.mylan/index.php

# notify interval in seconds. default is 895 seconds.
notify_interval=900

# serial and model number the daemon will report to clients
# in its XML description
serial=21121981
model_number=1

# specify the path to the MiniSSDPd socket
minissdpdsocket=/var/run/minissdpd.sock

# use different container as root of the tree
# possible values:
#   + "." - use standard container (this is the default)
#   + "B" - "Browse Directory"
#   + "M" - "Music"
#   + "V" - "Video"
#   + "P" - "Pictures"
#   + Or, you can specify the ObjectID of your desired root container (eg. 1$F for Music/Playlists)
# if you specify "B" and client device is audio-only then "Music/Folders" will be used as root
#root_container=.
root_container=B

# always force SortCriteria to this value, regardless of the SortCriteria passed by the client
#force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title

# maximum number of simultaneous connections
# note: many clients open several simultaneous connections while streaming
max_connections=10

# set this to yes to allow symlinks that point outside user-defined media_dirs.
#wide_links=no

# enable subtitle support by default on unknown clients.
# note: the default is yes
#enable_subtitles=yes

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y editamos nuestro fichero rc.local:

sudo nano /etc/rc.local

Y lo dejamos con los cambios que hemos ido agregando para que quede de la siguiente forma:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
#
# DNS
/usr/local/bin/noip2  & >/dev/null 2>&1
# DLNA
/usr/local/sbin/minidlnad -R -f /home/pi/.minidlna/minidlna.conf
# OPENVPN configurado en openvpn-iptables.service
#iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -I FORWARD -s 10.8.0.0/24 -j ACCEPT
#iptables -I INPUT -p udp --dport 2194 -j ACCEPT
#iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to 192.168.1.90
# SALIR
exit 0

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y editamos el fichero de servico de sistema, le damos privilegios de ejecución y programamos al arranque con el sistema:

sudo nano /etc/init.d/minidlna && sudo chmod +x /etc/init.d/minidlna && sudo update-rc.d minidlna defaults

Este es el codigo a copiar dentro del servicio:

#!/bin/sh
# Mini DLNA
### BEGIN INIT INFO
# Provides:          scriptname
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

case "$1" in
'start')
        /usr/local/sbin/minidlnad -R -f /home/pi/.minidlna/minidlna.conf
        echo Started
        ;;
'stop')
        PID=`/bin/pidof minidlnad`
        if [ ${PID} ]; then sudo kill -SIGTERM ${PID}
        else echo Already Stopped
        fi
        ;;
'restart')
        PID=`/bin/pidof minidlnad`
        if [ ${PID} ]; then sudo kill -SIGTERM ${PID}
        fi
        /usr/local/sbin/minidlnad -R -f /home/pi/.minidlna/minidlna.conf
        echo Restarted
        ;;
'status')
        PID=`/bin/pidof minidlnad`
        if [ ${PID} ]; then echo Running. Process ${PID}
        else echo Stopped
        fi
        ;;
'rescan')
        PID=`/bin/pidof minidlnad`
        if [ ${PID} ]; then sudo kill -SIGTERM ${PID}
        fi
        /usr/local/sbin/minidlnad -R -f /home/pi/.minidlna/minidlna.conf
        echo Rescanning
        ;;
*)
        echo "Usage: $0 { start | stop | restart | status | rescan }"
        ;;
esac
exit 0

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) lanzamos el servicio creado:

sudo service minidlna start

Y ya tendremos listo nuestro servidor de DLNA.

UDPXY

Algunos tenemos contratados servicios de televisión por cable como puede ser Movistar+ y aparte de ver los canales en la TV, queremos verlos a través del PC, móvil o tablet, por mayor comodidad. Pero no todos los dispositivos soportan multicast.

Esto se soluciona con el software udpxy, el cual convierte los protocolos multicast (RTP o UDP) en el protocolo unicast HTTP.

Primero vamos a preparar el entorno de compilación (creamos carpeta compilación + bajamos source programa + descomprimimos + compilamos e instalamos):

cd && mkdir ~/source && cd ~/source && wget http://www.udpxy.com/download/udpxy/udpxy-src.tar.gz && tar -xzvf udpxy-src.tar.gz && rm udpxy-src.tar.gz && cd udpxy* && make && sudo make install && cd ~/source && rm -rf udpxy*

Realizados estos pasos, udpxy estará correctamente instalado, solo nos falta ejecutarlo asignarle un puerto 4022 donde realizara la escucha:

sudo udpxy -p 4022 &

Podemos comprobar que el programa esta funcionando correctamente, abriendo en un navegador web a traves de nuestra red local el siguiente enlace:

http://192.168.1.90:4022/status

Este paso tendriamos que realizarlo cada vez que iniciemos el servidor y deseemos hacer uso de udpxy, para ellos vamos a ayudarnos de /etc/rc.local para configurarlo debidamente:

sudo nano /etc/rc.local

Y lo dejamos con los cambios que hemos ido agregando para que quede de la siguiente forma:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
#
# IPTV
/usr/local/bin/udpxy -p 4022 -B 270Kb -R 183 -H -1 -c 7 & >/dev/null 2>&1
# DNS
/usr/local/bin/noip2  & >/dev/null 2>&1
#
# DLNA (Esta opción solo aplica en caso de haber compilado el programa, sino es así borra esta sección)
#
/usr/local/sbin/minidlnad -R -f /home/pi/.minidlna/minidlna.conf
# OPENVPN configurado en openvpn-iptables.service
#iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -I FORWARD -s 10.8.0.0/24 -j ACCEPT
#iptables -I INPUT -p udp --dport 2194 -j ACCEPT
#iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to 192.168.1.90
# SALIR
exit 0

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y cada vez que arranque tendremos operativo el servicio.

XUPNPD

Y la última joya, este otro programa llamado Xupnpd. Este software permite anunciar canales y contenido multimedia a través de DLNA en cooperación con MiniDLNA.

Vía DLNA (UPnP) se entregará una lista personalizada con los canales por ejemplo de Movistar+, Youtube,… a los dispositivos de la LAN. Existen múltiples cliente que pueden consumir este servicio, por ejemplo VLC y así no tener que crear un fichero .m3u en cada ordenador.

Vamos nuevamente a preparar el entorno de trabajo para compilar el software:

cd ~/source && git clone https://github.com/clark15b/xupnpd.git && cd xupnpd/src && make && cd .. && sudo mv src /etc/xupnpd

Finalizado este proceso ya tendremos compilado y disponible para configurar el programa:

sudo chown root:root -R /etc/xupnpd && sudo chmod 755 /etc/xupnpd/*.lua && sudo nano /etc/xupnpd/xupnpd.lua

Adjunto mi fichero de configuración con la configuración previa adquirida en los procesos del blog (br0, 192.168.1.90, 4022, ...):

cfg={}

cfg.ui_auth_file='auth.txt'

cfg.ui_session_file='/tmp/xupnpd.session'

-- multicast interface for SSDP exchange, 'eth0', 'br0', 'br-lan' for example
cfg.ssdp_interface='br0'

-- 'cfg.ssdp_loop' enables multicast loop (if player and server in one host)
cfg.ssdp_loop=0

-- SSDP announcement interval
cfg.ssdp_notify_interval=15

-- SSDP announcement age
cfg.ssdp_max_age=1800

-- HTTP port for incoming connections
cfg.http_port=4044

-- syslog facility (syslog,local0-local7)
cfg.log_facility='local0'

-- 'cfg.daemon' detach server from terminal
cfg.daemon=true

-- silent mode - no logs, no pid file
cfg.embedded=true

-- 'cfg.debug' enables SSDP debug output to stdout (if cfg.daemon=false)
-- 0-off, 1-basic, 2-messages
cfg.debug=1

-- external 'udpxy' url for multicast playlists (udp://@...)
--cfg.udpxy_url='http://192.168.1.90:4022'

-- downstream interface for builtin multicast proxy (comment 'cfg.udpxy_url' for processing 'udp://@...' playlists)
cfg.mcast_interface='br0'

-- 'cfg.proxy' enables proxy for injection DLNA headers to stream
-- 0-off, 1-radio, 2-radio/TV
cfg.proxy=0

-- User-Agent for proxy
cfg.user_agent='Mozilla/5.0'

-- I/O timeout
cfg.http_timeout=30

-- enables UPnP/DLNA notify when reload playlist
cfg.dlna_notify=true

-- UPnP/DLNA subscribe ttl
cfg.dlna_subscribe_ttl=1800

-- group by 'group-title'
cfg.group=true

-- sort files
cfg.sort_files=true

-- Device name
cfg.name='Lordpedal IPTV'

-- static device UUID, '60bd2fb3-dabe-cb14-c766-0e319b54c29a' for example or nil
cfg.uuid='60bd2fb3-dabe-cb14-c766-0e319b54c29a'

-- max url cache size
cfg.cache_size=8

-- url cache item ttl (sec)
cfg.cache_ttl=900

-- default mime type (mpeg, mpeg_ts, mpeg1, mpeg2, ts, ...)
cfg.default_mime_type='mpeg_ts'

-- feeds update interval (seconds, 0 - disabled)
cfg.feeds_update_interval=0
cfg.playlists_update_interval=0

-- playlist (m3u file path or path with alias
playlist=
{
--    { './playlists/mozhay.m3u', 'Mozhay.tv' },
--    { './localmedia', 'Local Media Files' }
--    { './private', 'Private Media Files', '127.0.0.1;192.168.1.1' }  -- only for 127.0.0.1 and 192.168.1.1
}

-- feeds list (plugin, feed name, feed type)
feeds=
{
    { 'vimeo',          'channel/hd',           'Vimeo HD Channel' },
    { 'vimeo',          'channel/hdxs',         'Vimeo Xtreme sports' },
    { 'vimeo',          'channel/mtb',          'Vimeo MTB Channel' },
    { 'youtube',        'channel/top_rated',    'YouTube Top Rated' },
--    { 'youtube',        'Drift0r',              'Drift0r' },
--    { 'youtube',        'XboxAhoy',             'XboxAhoy' },
--    { 'ag',             'videos',               'AG - New' },
--    { 'ivi',            'new',                  'IVI - New' },
--    { 'gametrailers',   'ps3',                   'GT - PS3' },
--    { 'giantbomb',      'all',                  'GiantBomb - All' },
--    { 'dreambox',       'http://192.168.0.1:8001/','Dreambox1' },
}

-- log ident, pid file end www root
cfg.version='1.034'
cfg.log_ident=arg[1] or 'xupnpd'
cfg.pid_file='/var/run/'..cfg.log_ident..'.pid'
cfg.www_root='./www/'
cfg.tmp_path='/tmp/'
cfg.plugin_path='./plugins/'
cfg.config_path='./config/'
cfg.playlists_path='./playlists/'
--cfg.feeds_path='/tmp/xupnpd-feeds/'
cfg.ui_path='./ui/'
cfg.drive=''                    -- reload playlists only if drive state=active/idle, example: cfg.drive='/dev/sda'
cfg.profiles='./profiles/'      -- device profiles feature

dofile('xupnpd_main.lua')

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y vamos a editar una lista de prueba:

cd /etc/xupnpd/playlists && sudo rm *.m3u && sudo nano Youtube.m3u

Y le agregamos el siguiente contenido de prueba:

#EXTM3U name="Youtube by Lordpedal" type=mp4 plugin=youtube
#EXTINF:0 group-title="Youtube",Leo el camion
https://www.youtube.com/watch?v=bSvfRukSU8Y
#EXTINF:0 group-title="Youtube",Cleo y Cuquin
https://www.youtube.com/watch?v=BGw9met3BaY
#EXTINF:0 group-title="Youtube",Cleo y Cuquin (Karaoke)
https://www.youtube.com/watch?v=3AcjgyPakwQ
#EXTINF:0 group-title="Youtube",Pocoyo - Parte 1
https://www.youtube.com/watch?v=SP05XjJFeoo
#EXTINF:0 group-title="Youtube",Pocoyo - Parte 2
https://www.youtube.com/watch?v=lkXBGs9iH2Y

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y ejecutamos el programa para probarlo:

sudo /etc/xupnpd/xupnpd &

Podemos comprobar que el programa esta funcionando correctamente, abriendo en un navegador web a traves de nuestra red local el siguiente enlace:

http://192.168.1.90:4044

Este paso tendriamos que realizarlo cada vez que iniciemos el servidor y deseemos hacer uso de xupnpd, para ellos vamos a ayudarnos nuevamente de /etc/rc.local para configurarlo debidamente:

sudo nano /etc/rc.local

Y lo dejamos con los cambios que hemos ido agregando para que quede de la siguiente forma definitiva:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
#
# IPTV
/usr/local/bin/udpxy -p 4022 -B 270Kb -R 183 -H -1 -c 7 & >/dev/null 2>&1
/etc/xupnpd/xupnpd & >/dev/null 2>&1
# DNS
/usr/local/bin/noip2  & >/dev/null 2>&1
#
# DLNA (Esta opción solo aplica en caso de haber compilado el programa, sino es así borra esta sección)
#
/usr/local/sbin/minidlnad -R -f /home/pi/.minidlna/minidlna.conf
# OPENVPN configurado en openvpn-iptables.service
#iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -I FORWARD -s 10.8.0.0/24 -j ACCEPT
#iptables -I INPUT -p udp --dport 2194 -j ACCEPT
#iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to 192.168.1.90
# SALIR
exit 0

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y cada vez que arranque tendremos operativo el servicio.

Y hasta aquí la configuración específica del apartado en el Servidor Multimedia. En siguientes entradas veremos como añadir ciertos retoques opcionales.