User Tools

Site Tools


kodi:kodi21-debian-dlbox

Kodi 21 Debian DLBox

Debian 12.11 Bookworm Kodi + Docker download box

BIOS settings

  • set SATA mode to AHCI (anything but raid!)
  • enable SGX
  • Set secure boot to audit
  • Change boot order to USB first
  • enable wake on LAN

Debian and Kodi install

Boot Debian 12.11 bookworm via USB and install as following:

  • configure language + country
  • setup wifi or ethernet as desired
  • hostname kodi
  • domain empty
  • root pw kodi2025
  • user full name kodi
  • username kodi
  • password kodi
  • disk: guided use entire disk (not lvm or encrypted!)
  • all in one partition
  • packet manager UK, default mirror, no proxy
  • don't participate in package usage survey
  • only install ssh server and standard system utilities. no desktop environment!
  • remove USB stick and reboot

Log in as root and set up ssh for easier configuration from a remote system:

ssh-keygen
ssh-copy-id user@targethost

check ip address with “ip addr”
set up any internal portforwarding if required

on remote system, ssh to system using kodi@IP-ADDR

su -
apt install zip unzip vim

Set bash fancy prompt and prefs:

cat >> /etc/bash.bashrc << "EOD"
# set a fancy prompt colour
if [ "$LOGNAME" = root ] || [ "`id -u`" -eq 0 ] ; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u\[\033[00m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u\[\033[00m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
fi

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# Warn if removing more than 3 files or recursively
alias rm='rm -I'

#exclude docker overlay from df command
alias df='/usr/bin/df -x overlay'

EOD

source /etc/bash.bashrc

Set VIM preferences

cat > /etc/vimrc << "EOD"
"placeholder as /usr/share/vim/vim80/defaults.vim is loaded if no ~/.vimrc exists
if has("syntax")
  syntax on
endif

set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.

set shiftwidth=4    " Indents will have a width of 4

set softtabstop=4   " Sets the number of columns for a TAB

set expandtab       " Expand TABs to spaces

set nocompatible    " Fix telnet issues where cursor keys add A B etc

set mouse-=a        " Disable automatic visual mode when selecting with mouse

set copyindent      " Disable auto indent when copying indented text

set ruler           " Show line/cursor number and percentage position of file in bottom right

" Only do this part when compiled with support for autocommands.
if has("autocmd")

  " Enable file type detection.
  " Use the default filetype settings, so that mail gets 'tw' set to 72,
  " 'cindent' is on in C files, etc.
  " Also load indent files, to automatically do language-dependent indenting.
  " Revert with ":filetype off".
  filetype plugin indent on

  " Put these in an autocmd group, so that you can revert them with:
  " ":augroup vimStartup | au! | augroup END"
  augroup vimStartup
    au!

    " When editing a file, always jump to the last known cursor position.
    " Don't do it when the position is invalid or when inside an event handler
    " (happens when dropping a file on gvim).
    autocmd BufReadPost *
      \ if line("'\"") >= 1 && line("'\"") <= line("$") |
      \   exe "normal! g`\"" |
      \ endif

  augroup END

endif " has("autocmd")

EOD
cp /etc/vimrc /root/.vimrc
cp /etc/vimrc /home/kodi/.vimrc
chown kodi:kodi /home/kodi/.vimrc

Disable IPv6:

cat >> /etc/sysctl.conf << "EOD"
# Disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1
#

EOD
sysctl -p

Install X server for Intel GPUs and sound system

apt-get install software-properties-common xorg xserver-xorg-legacy alsa-utils mesa-utils git librtmp1 libmad0 lm-sensors libmpeg2-4 avahi-daemon libnfs13 libva2 vainfo i965-va-driver dbus-x11 pastebinit xserver-xorg-video-intel intel-media-va-driver firmware-linux

# Allow anybody to start the x server:

#dpkg-reconfigure xserver-xorg-legacy
cat > /etc/X11/Xwrapper.config << "EOD"
allowed_users=anybody
needs_root_rights=yes
EOD

# add kodi user to all required groups

usermod -a -G cdrom,audio,video,plugdev,users,dialout,dip,input,render kodi

# allow kodi user to shutdown, suspend, upgrade system - enables option in kodi to shutdown/restart etc

cat >> /etc/polkit-1/rules.d/50-kodi.rules << "EOD"
polkit.addRule(function(action, subject) {
    if (subject.user == "kodi") {
        polkit.log("action=" + action);
        polkit.log("subject=" + subject);
        if (action.id.indexOf("org.freedesktop.login1.") == 0) {
            return polkit.Result.YES;
        }
        if (action.id.indexOf("org.freedesktop.udisks.") == 0) {
            return polkit.Result.YES;
        }
        if (action.id.indexOf("org.freedesktop.udisks2.") == 0) {
            return polkit.Result.YES;
        }
        if (action.id.indexOf("org.freedesktop.upower.") == 0) {
            return polkit.Result.YES;
        }

        if (action.id.indexOf("org.debian.apt.upgrade-packages") == 0) {
            return polkit.Result.YES;
        }
        if (action.id.indexOf("org.debian.apt.update-cache") == 0) {
            return polkit.Result.YES;
        }

    }
});
EOD

/usr/sbin where the reboot command is located is not in user paths by default, so add:

cat >> /home/kodi/.profile << "EOD"

PATH="/usr/sbin:$PATH"
EOD

# system d service that actively waits for network connection:

cat >> /etc/systemd/system/kodi.service << "EOD"
[Unit]
Description = kodi-standalone using xinit
Requires = dbus.service
After = systemd-user-sessions.service sound.target network-online.target mysql.service
Wants = mysql.service

[Service]
User = kodi
Group = kodi
Type = simple
PAMName=login
ExecStart = /usr/bin/xinit /usr/bin/dbus-launch --exit-with-session env KODI_AE_SINK=ALSA /usr/bin/kodi-standalone -- :0 -nolisten tcp vt7
Restart = always
RestartSec = 5
#Restart = on-abort

[Install]
WantedBy = multi-user.target
EOD

In case of use of AV receiver and/or HDMI connection and device disappearing when receiver/tv turned off, add this to X config to disable power management:

cat >> /etc/X11/xorg.conf.d/10-monitors.conf << "EOD"
Section "Extensions"
    Option "DPMS" "Disable"
EndSection
EOD

# setting nice priority of kodi to -1

sed -i '/# End of file/ikodi             -       nice            -1' /etc/security/limits.conf

# fake display manager service

ln -s /etc/systemd/system/kodi.service /etc/systemd/system/display-manager.service

Add Debian Multimedia repository for Kodi

cat >> /etc/apt/sources.list.d/deb-multimedia.sources << "EOD"
Types: deb
URIs: https://www.deb-multimedia.org
Suites: bookworm bookworm-backports
Components: main
Signed-By: /etc/apt/trusted.gpg.d/deb-multimedia-keyring.asc
EOD

# https://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/

wget https://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/deb-multimedia-keyring_2024.9.1_all.deb
dpkg -i deb-multimedia-keyring*.deb

# lower priority of deb multimedia repo

cat >> /etc/apt/preferences.d/99deb-multimedia << "EOD"
Package: *
Pin: origin www.deb-multimedia.org
Pin-Priority: 1
EOD
apt update

# Install Kodi

apt install kodi kodi-inputstream-adaptive kodi-vfs-libarchive kodi-vfs-rar -t "o=Unofficial Multimedia Packages"

# Set Kodi boot logo and silent boot

sed -i 's/#quiet_boot="0"/quiet_boot="1"/' /etc/grub.d/10_linux
sed -i 's/#vt_handoff="0"/vt_handoff="1"/' /etc/grub.d/10_linux

cat > /etc/default/grub << "EOD"
GRUB_DEFAULT=0
GRUB_TIMEOUT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_GFXPAYLOAD_LINUX=keep
GRUB_DISABLE_OS_PROBER=true
#GRUB_CMDLINE_LINUX="i915.modeset=1 console=tty12"
GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vt.global_cursor_default=0"
GRUB_GFXMODE=1920x1080
EOD

update-grub

echo FRAMEBUFFER=y > /etc/initramfs-tools/conf.d/framebuffer
git clone https://github.com/solbero/plymouth-theme-kodi-animated-logo
cd plymouth-theme-kodi-animated-logo
apt-get install -y fakeroot plymouth-label plymouth-themes
./build.sh
dpkg -i plymouth-theme-kodi-animated-logo.deb
# update-alternatives: using /usr/share/plymouth/themes/kodi-animated-logo/kodi-animated-logo.plymouth to provide /usr/share/plymouth/themes/default.plymouth (default.plymouth) in auto mode
plymouth-set-default-theme kodi-animated-logo
update-initramfs -u
update-grub

# for intel gpus prevent flickering by preserving framebuffer of bios/bootloader and prevent flickering

echo "options i915 fastboot=1" > /etc/modprobe.d/i915.conf

# set to 8×18 or largest font size

dpkg-reconfigure console-setup

# set up unattended system upgrades

apt-get install -y unattended-upgrades
cat >> /etc/apt/apt.conf.d/50unattended-upgrades << "EOD"
Unattended-Upgrade::Origins-Pattern {
      "o=Debian,n=bullseye";
      "o=Debian,n=bullseye-updates";
      "o=Debian,n=bullseye-proposed-updates";
      "o=Debian,n=bullseye-security";
      "o=Debian,n=bullseye,l=Debian-Security";
      "o=Unofficial Multimedia Packages,a=stable";
      "o=Unofficial Multimedia Packages,a=stable-backports";

//To enable ALL updates, use this:      
//      "site=*";
};

#Don't force updates
Unattended-Upgrade::AutoFixInterruptedDpkg "false";

#set mail to whoever should receive it and make sure bsd-mailx or sendmail 
#is installed and able to send mails
Unattended-Upgrade::Mail "root";

#configure reboot if desired.
Unattended-Upgrade::Automatic-Reboot "false";
EOD

cat >> /etc/apt/apt.conf.d/20auto-upgrades << "EOD"
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "3";
APT::Periodic::Unattended-Upgrade "1";
EOD

# mount ext usb at same point and add to fstab

# get uuid
blkid /dev/sda1
#add to fstab:
UUID=20e3cd6b-df8a-44a0-bf3b-4e2c59413e99 /mnt/usb/ ext4 defaults,auto,users,rw 0 0
cat >> /etc/udev/rules.d/99-mount.rules << "EOD"
ACTION=="add", SUBSYSTEMS=="usb", SUBSYSTEM=="block", ENV{ID_FS_USAGE}=="filesystem", RUN{program}+="/usr/bin/systemd-mount --no-block --automount=yes --collect $devnode /mnt/usb"
EOD
/etc/init.d/udev restart

# set primary wifi network interface:

vi /etc/network/interfaces
iface wlp3s0 inet static
        wpa-ssid ssid-name
        wpa-psk  wifipassword
        address 192.168.1.100
        netmask 255.255.255.0
        gateway 192.168.1.254
        dns-nameservers 192.168.1.254 8.8.8.8

# Set maximum 100MB journald log files

sed -i 's/#SystemMaxUse=/SystemMaxUse=500M/' /etc/systemd/journald.conf
mkdir -p /etc/systemd/journald.conf.d/
cat >> /etc/systemd/journald.conf.d/max-size.conf << "EOF"
[Journal]
SystemMaxUse=100M
MaxRetentionSec=7day
EOF

systemctl restart systemd-journald

Docker install

Assumptions:
download dir: /media/downloads
media storage: /mnt/usb/

mkdir -p /opt/audiobookshelf-storage/{metadata,config}
mkdir /opt/heimdall
mkdir /opt/portainer
mkdir /opt/prowlarr
mkdir /opt/qbittorrent
mkdir /opt/radarr
mkdir /opt/sonarr

mkdir -p /media/downloads/{complete,incomplete,watch}
chmod g+s /media/downloads -R

mkdir /mnt/usb/movies
mkdir /mnt/usb/tv
mkdir /mnt/usb/audiobooks
mkdir /mnt/usb/ebooks

Docker compose files

mkdir /root/docker

cat >> /root/docker/docker-audiobookshelf.yml << "EOD"
name: audiobookshelf
services:
  audiobookshelf:
    image: advplyr/audiobookshelf
    container_name: audiobookshelf
    ports:
      - 13378:80
    volumes:
      - /mnt/usb/ebooks:/ebooks
      - /mnt/usb/audiobooks:/audiobooks
      - /opt/audiobookshelf-storage/metadata:/metadata
      - /opt/audiobookshelf-storage/config:/config
    restart: unless-stopped
EOD


cat >> /root/docker/docker-flaresolverr.yml << "EOD"
name: flaresolverr
services:
  flaresolverr:
    image: ghcr.io/flaresolverr/flaresolverr:latest
     # DockerHub mirror flaresolverr/flaresolverr:latest
     #image: 21hsmw/flaresolverr:fixlooping
     #image: docker.io/library/oui:oui
     #image: ghcr.io/flaresolverr/flaresolverr:latest
     #image: ghcr.io/flaresolverr/flaresolverr:pr-1282
     #jcolfej/flaresolverr:pr-1272
     #image: alexfozor/flaresolverr:pr-1300
     #image: alexfozor/flaresolverr:pr-1300-experimental
    container_name: flaresolverr
    environment:
      - LOG_LEVEL=debug
      - LOG_HTML=false
      - CAPTCHA_SOLVER=none
      - TZ=Europe/London
      - LANG=en_GB
    ports:
      - "8191:8191"
    restart: unless-stopped 
EOD

cat >> /root/docker/docker-heimdall.yml << "EOD"
name: heimdall
services:
  heimdall:
    image: lscr.io/linuxserver/heimdall:latest
    container_name: heimdall
    environment:
      - PUID=1007
      - PGID=1007
      - TZ=Europe/London
    volumes:
      - /opt/heimdall:/config
    ports:
      - 80:80
      - 443:443
    restart: unless-stopped
EOD

cat >> /root/docker/docker-portainer.yml << "EOD"
name: portainer
services:
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: always
    environment:
      - TZ=Europe/London
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /opt/portainer:/data
    ports:
      - 8000:8000
      - 9443:9443/tcp
EOD

cat >> /root/docker/docker-prowlarr.yml << "EOD"
name: prowlarr
services:
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:develop #or latest
    container_name: prowlarr
    environment:
      - PUID=1001
      - PGID=1001
      - TZ=Europe/London
    volumes:
      - /opt/prowlarr:/config
    ports:
      - 9696:9696
    restart: unless-stopped
EOD

cat >> /root/docker/docker-qbittorrent.yml << "EOD"
name: qbittorrent
services:
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    environment:
      - PUID=1004
      - PGID=1001
      - TZ=Europe/London
      - WEBUI_PORT=9092
      - TORRENTING_PORT=6881
    volumes:
      - /opt/qbittorrent:/config
      - /media/downloads:/downloads
      - /mnt/usb/tv:/tv
      - /mnt/usb/movies:/movies
    ports:
      - 9092:9092
      - 6881:6881
      - 6881:6881/udp
    restart: unless-stopped

# notes:
# login admin, password random shown via docker logs qbittorrent
# changing ports requires changing webui/torrenting env as well
EOD

cat >> /root/docker/docker-radarr.yml << "EOD"
name: radarr
services:
  radarr:
    image: lscr.io/linuxserver/radarr:develop
    container_name: radarr
    environment:
      - UMASK_SET=022
      - PUID=1003
      - PGID=1001
      - TZ=Europe/London
    volumes:
      - /mnt/usb/movies:/movies
      - /media/downloads/complete:/downloads
      - /opt/radarr:/config
    ports:
      - 7878:7878
    restart: unless-stopped
EOD

cat >> /root/docker/docker-sonarr.yml << "EOD"
name: sonarr
services:
  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr
    environment:
      - PUID=1002
      - PGID=1001
      - TZ=Europe/London
    volumes:
      - /mnt/usb/tv:/data
      - /media/downloads/complete:/downloads
      - /opt/sonarr:/config
    ports:
      - 8989:8989
    restart: unless-stopped
EOD

install docker community edition

apt-get -y install curl unzip dialog
curl -fSSL get.docker.com | sh

Setup docker containers and start

adduser --system --uid 1007 --no-create-home --group  "heimdall"
chown heimdall:heimdall /opt/heimdall-config -R
docker compose -f docker-heimdall.yml up -d

groupadd --gid 1001 media
adduser --system --uid 1001 --no-create-home --ingroup "media" "prowlarr"
chown prowlarr:media /opt/prowlarr
docker compose -f docker-prowlarr.yml up -d

adduser --system --uid 1004 --no-create-home --ingroup "media" "bittorrent"
mkdir -p /media/downloads/{complete,incomplete,watch}
chmod 775 /media/downloads/{complete,incomplete,watch}
chown bittorrent:media /media/downloads -R
docker compose -f docker-transmission.yml up -d
mkdir -p /opt/qbittorrent/
chown bittorrent:media /opt/qbittorrent
docker compose -f docker-qbittorrent.yml up -d

mkdir /mnt/usb/tv
mount /mnt/usb/tv
adduser --system --uid 1002 --no-create-home --ingroup "media" "sonarr"
chown sonarr:media /opt/sonarr/
docker compose -f docker-sonarr.yml up -d

mkdir /mnt/usb/movies
mkdir /media/downloads
adduser --system --uid 1003 --no-create-home --ingroup "media" "radarr"
chown radarr:media /opt/radarr/
docker compose -f docker-radarr.yml up -d

docker compose -f docker-portainer.yml up -d

docker compose -f docker-flaresolverr.yml up -d

docker compose -f docker-audiobookshelf.yml up -d

Docker auto update

curl -L https://github.com/regclient/regclient/releases/latest/download/regctl-linux-amd64 >/usr/local/bin/regctl
chmod 755 /usr/local/bin/regctl
cat >> /root/docker/update-all-containers.sh << "EOD"
#!/usr/bin/env bash
script_dir=$(dirname "$0")

#curl -L https://github.com/regclient/regclient/releases/latest/download/regctl-linux-amd64 >/usr/local/bin/regctl
#chmod 755 /usr/local/bin/regctl

### If not in PATH, set full path. Else just "regctl"
regbin="/usr/local/bin/regctl"
### options to allow exclude:
while getopts "e:" options; do
  case "${options}" in
    e) Exclude=${OPTARG} ;;
    *) exit 0 ;;
  esac
done
shift "$((OPTIND-1))"
### Create array of excludes
IFS=',' read -r -a Excludes <<< "$Exclude" ; unset IFS

SearchName="$1"

for i in $(docker ps --filter "name=$SearchName" --format '{{.Names}}') ; do
  ### Looping every item over the list of excluded names and skipping:
  for e in "${Excludes[@]}" ; do [[ "$i" == "$e" ]] && continue 2 ; done
  #printf ". "
  RepoUrl=$(docker inspect "$i" --format='{{.Config.Image}}')
  LocalHash=$(docker image inspect "$RepoUrl" --format '{{.RepoDigests}}')
  ### Checking for errors while setting the variable:
  if RegHash=$($regbin image digest --list "$RepoUrl" 2>/dev/null) ; then
    if [[ "$LocalHash" = *"$RegHash"* ]] ; then
        NoUpdates+=("$i");
    else
        GotUpdates+=("$i");
        docker rm -f "$i" 2>&1
        docker compose -f "$script_dir/docker-$i.yml" pull -q 2>&1 >/dev/null

        if [ ! $? -eq 0 ]
        then
            echo; echo;
            echo "Could not pull image for $i."
        else
            docker compose -f "$script_dir/docker-$i.yml" up -d 2>&1 >/dev/null
            if [ ! $? -eq 0 ]
            then
                echo; echo;
                echo "Could not start new container for $i."
            else
                docker image prune -f 2>&1 >/dev/null
                echo "Updated $i."
            fi
        fi
    fi
  else
    echo "Container has errors: $i"
  fi
done
EOD

chmod +x /root/docker/update-all-containers.sh

cat >> /etc/cron.daily/docker-containers << "EOD"
#!/bin/bash
/root/docker/update-all-containers.sh
EOD

chmod 755 /etc/cron.daily/docker-containers

App Configurations

qbittorrent

The password for the initial username “admin” is auto-generated by qbittorrent docker
log in as root

docker logs qbittorrent

note the random password and log in using those details via browser on http://192.168.1.100:9092/

settings:

webui: change username and password "something"
downloads: "set Merge trackers to existing torrent"
downloads: set "append .!qB extension to incomplete files"
downloads: Default Torrent Management Mode "automatic"
downloads: Default save path "/downloads/complete"
downloads: tick "Keep incomplete torrents in" "/downloads/incomplete"
downloads: set automatically add torrents from "/downloads/watch"
connection: set "global max connnections" to 1200
bittorrent: set max active downloads to 30, max active uploads to 10, max active torrents to 50
bittorrent: set seeding limits when ratio reaches 0.1, total time 60 minutes
bittorrent: auto add trackers to new downloads:
udp://tracker.opentrackr.org:1337/announce
udp://tracker.torrent.eu.org:451
udp://open.stealth.si:80/announce
udp://opentracker.i2p.rocks:6969

#in case of permission issues:
downloads: Run external program on torrent completion set to: | chmod -R 770 “%F/” 

radarr

set forms login page auth method, username/password something
settings:
show advanced options!

  • media management
    • colon replacement: replace with space dash space
    • movie folder format for large collections: “{Movie TitleFirstCharacter}/{Movie Title} ({Release Year})”
    • enable “delete empty movie folders”
    • import extra files and set to “srt”
    • set “unmonitor deleted files”
    • add root folder “/movies”
  • profiles
    • HD-720p: set upgrades allowed, upgrade until bluray-720p
    • HD-1080p: set upgrades allowed, upgrade until bluray-1080p, untick remux-1080p
    • HD-720p/1080p: set upgrades allowed, upgrade until bluray-1080p, untick remux-1080p
    • any: set upgrades allowed, upgrade until bluray-480p, remove all 4k and telecine/sync/cam
    • delete SD profile
    • ultra-hd: set upgrades allowed, upgrade until bluray-2160p, remove remux
    • add release profiles:
      • dub/sub: must not contain: Hchdrip, Korsub, Azerbaijani Dubbed, Uzbek Dubbed
      • cam: must not contain: Camrip, Hdcam
      • Not multi: must not contain: iTA-ENG, TeeWee, ITA-ENG, ITA ENG
      • 3D/xvid: must not contain: 3D, xvid
  • quality:
    • HDTV-720 min 14.1
    • WEBDL-720 min 19.4
    • WEBRIp-720 min 19.4
    • Bluray-720 min 19.4
    • HDTV-1080 min 23
    • WEBDL-1080 min 25, max 135.5
    • WEBRIP-1080 min 25
    • Bluray-1080 min 44
  • download clients
    • qBittorrent, 192.168.1.100, port 9092, username/password something
    • remotepathmappings: 192.168.1.100, remote “/downloads/complete”, local “/downloads/”
  • connections
    • kodi on grab/file import/file upgrade/rename only, host 192.168.1.100 port 8080, user/pass kodi, gui notification, update lib, clean lib, always up
  • metadata
    • kodi enable, tick “use movie nfo”
  • general: copy api key for heimdall and prowlarr
    • disable usage data
  • UI
    • set first day of week and uk date/time formats

sonarr

set forms login page auth method, username/password something
show advanced options!
settings:

  • media management
    • multi episode style: extend
    • add root folder /data
  • profiles
    • delete SD, set allow upgrades for all.
    • add release profile “nodub” must not contain dubbed
  • download clients
    • qBittorrent, 192.168.1.100, port 9092, username/password something
    • remotepathmappings: 192.168.1.100, remote “/downloads/complete/”, local “/downloads/”
  • connections
    • kodi on grab/file import/file upgrade/rename, series delete, episode file delete, episode file delete for upgrade only, host 192.168.1.100 port 8080, user/pass kodi, gui notification, update lib, clean lib, always up
  • metadata
    • kodi enable, untick series metadata, episode metadata
  • general: copy api key for heimdall and prowlarr
    • disable usage data
  • UI
    • set first day of week and uk date/time formats

prowlarr

set forms login page auth method, username/password something
settings:
show advanced options!

Indexers:

  • ext torrent: base ext.to, tag flaresolverr
  • thepiratebay
  • kickasstorrents.to: base ninjaproxy1.com, tag flaresolverr

Audiobookshelf

root user: root, pw something
settings: set uk date format
users: add user account
api key: add title heimdall, for root user. add to heimdall
backups: enable automatic backups, keeping 5
Libraries

  • add Books, Audiobooks, icon headphones, audible.com, /audiobooks folder
    • settings: audiobooks only
  • add Books, ebooks, icon books, google books, /ebooks folder
    • settings: disable use square book covers

Kodi

settings → sidebar - set to expert settings
System:

  • Power saving
    • put display to sleep when idle: 30 minutes

Media:

  • library:
    • add sources:
      • movies - /mnt/usb/movies movies
      • tvshows - /mnt/usb/tv tv
      • scan to library
  • general:
    • allow file renaming and deletion
  • videos
    • show info for unwatched items - disable episode thumb
  • music
    • Switch to Visualisation on Playback

Interface:

  • screensaver: black
  • regional: set to UK
  • skin - configure skin: disable all entries not required (pvr, games, addons, etc)

services

  • control
    • enable, set to kodi kodi and require auth
  • Addons
    • install from repo
      • program-addons: backup, up next
      • services: kodi check previous episode, kodi playback resumer, stinger scene notification, unpause jumpback
      • subtitles: opensubtitles.com, opensubtitles.org, subscene

configure addons:
backup:

general: 10 backups, compressed, progress display: none
rempte dir: /home/kodi/backup (create backup folder in home dir)
file selection: all but game saves
scheduling enabled, run on startup if missed, every day

command line as kodi user:

#disable kodi splash screen:
vi ~/.kodi/userdata/advancedsettings.xml

<advancedsettings>
    <splash>false</splash>
</advancedsettings>

## Estuary MOD V2 Omega

cd ~
# https://repo.kodinerds.net/ red button at top
wget https://repo.kodinerds.net/addons/repository.kodinerds/repository.kodinerds-7.0.1.7.zip

in kodi interface → settings/system → addons → unknown sources enable
addons → install from zip file → home folder → kodinerds repo zip
addons → install from repo → kodinerds repo → look & feel → estuary mod v2 omega

skin settings
home menu

  • minimise main menu
  • show item label on top
  • customise menu items → delete all non-required entries
  • show smaller icons for categories widgets
  • display of episodes: watched/total
  • greyed out watched items

library

  • greyed out watched items

extras

  • disable splash screen

necessary add-ons:

  • global search
  • genre icons
  • studio icons

artworks:

  • video genres icon pack: movie genres icons for estuary mod v2 matrix
  • studio icons pack: studio icons - white
cd ~
wget https://github.com/AnonTester/kodi-repo/raw/master/repository.anontester/repository.anontester-1.0.0.zip

addons → install from zip file → home folder → anontester repo zip
addons → install from repo → wuff repo → services → after Watch

##### hardware decoding notes, probably not required any longer
system →Player→Processing:
Enable HQ Scalers for scaling above: 20%
Allow hardware acceleration - VAAPI: on
Use Mpeg-2 VAAPI: Yes
Use Mpeg-4 VAAPI: if you like
UseVC-1 VAAPI: on
Use VP8 VAAPI: on (if your device supports it)
Use VP9 VAAPI: on (if your device supports it)
Use HEVC VAAPI: on (if your device supports it)
######

Static IP

set static IP

vi /etc/dhcp/dhclient.conf

interface eth0
static ip_address=192.168.0.100/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8

interface wlan0
static ip_address=192.168.0.100/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8

Kodi Customisation

Auto focus first menu item in skin settings:

sed -i.bak 's/<defaultcontrol always="true">9000<\/defaultcontrol>/<defaultcontrol always="true">9000<\/defaultcontrol>/' ~/.kodi/addons/skin.estuary.modv2/xml/SkinSettings.xml

Exclude in-progress movies from unwatched list:

sed -i.bak '/<\/rule>/a\ \ \ \ <rule field="inprogress" operator="false" \/>' ~/.kodi/addons/skin.estuary.modv2/playlists/unwatched_movies.xsp

Reduce font size of CPU usage on Hardware screen for 12 core system

sed -i.bak '1269s/font14/font12/' ~/.kodi/addons/skin.estuary.modv2/xml/Home.xml

Add option to close Video OSD immediately when resuming:

cd ~/.kodi/addons/skin.estuary.modv2


sed -i.bak 's/<onclick condition="String.IsEqual(Skin.String(autoclose_osd),31578)">Skin.SetString(autoclose_osd,31580)<\/onclick>/<onclick condition="String.IsEqual(Skin.String(autoclose_osd),31579)">Skin.SetString(autoclose_osd,31580)<\/onclick>/' xml/SkinSettings.xml

sed -i '/<onclick condition="String.IsEqual(Skin.String(autoclose_osd),31579)">Skin.SetString(autoclose_osd,31580)<\/onclick>/a\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ <onclick condition="String.IsEqual(Skin.String(autoclose_osd),31578)">Skin.SetString(autoclose_osd,31579)<\/onclick>' xml/SkinSettings.xml

sed -i 's/!String.IsEqual(Skin.String(autoclose_osd),31578) + /!String.IsEqual(Skin.String(autoclose_osd),31578) + !String.IsEqual(Skin.String(autoclose_osd),31579) + /' xml/SkinSettings.xml

sed -i.bak '/Skin.String(autoclose_osd),31578)">\$LOCALIZE\[31578\]<\/value>/a\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ <value condition="String.IsEqual(Skin.String(autoclose_osd),31579)">$LOCALIZE[31579]<\/value>' xml/Variables.xml

sed -i.bak "/msgctxt \"#31579\"/imsgctxt \"#31579\"\nmsgid \"0 seconds\"\nmsgstr \"\"\n\n" language/resource.language.en_gb/strings.po

# other closing times defined in xml/Custom_1110_CloseVideoOSD.xml

Move next episodes to watch to top. Install embuary helper addon (through skin settings)
Move this:

<include content="WidgetNextWatchEpisodes" condition="System.AddonIsEnabled(script.embuary.helper) + Library.HasContent(tvshows) + !Skin.HasSetting(hide_nextepisodes) + Skin.HasSetting(HomeBanner)">
                                                        <param name="content_path" value="plugin://script.embuary.helper?info=getnextup"/>
                                                        <param name="widget_header" value="$LOCALIZE[31212]"/>
                                                        <param name="widget_header_focus" value="$INFO[Container(6700).ListItem.TVShowTitle, | , - ]$INFO[Container(6700).ListItem.Season,,x]$INFO[Container(6700).ListItem.Episode,,. ]$INFO[Container(6700).ListItem.Title]$INFO[Container(6700).ListItem.Year, (,)]"/>
                                                        <param name="browse" value="never"/>
                                                        <param name="widget_target" value="videos"/>
                                                        <param name="list_id" value="6700"/>
                                                </include>
                                                <include content="WidgetNextWatchEpisodesBanner" condition="System.AddonIsEnabled(script.embuary.helper) + Library.HasContent(tvshows) + !Skin.HasSetting(hide_nextepisodes) + !Skin.HasSetting(HomeBanner)">
                                                        <param name="content_path" value="plugin://script.embuary.helper?info=getnextup"/>
                                                        <param name="widget_header" value="$LOCALIZE[31212]"/>
                                                        <param name="widget_header_focus" value="$INFO[Container(67001).ListItem.TVShowTitle, | , - ]$INFO[Container(67001).ListItem.Season,,x]$INFO[Container(67001).ListItem.Episode,,. ]$INFO[Container(67001).ListItem.Title]$INFO[Container(67001).ListItem.Year, (,)]"/>
                                                        <param name="widget_target" value="videos"/>
                                                        <param name="browse" value="never"/>
                                                        <param name="list_id" value="67001"/>
                                                </include>

just under:

                                                <include content="WidgetListCategoriesSmall" condition="Library.HasContent(tvshows) + !Skin.HasSetting(hide_tvshowscategory)">
                                                        <param name="widget_header" value="$LOCALIZE[31148]"/>
                                                        <param name="list_id" value="69001"/>
                                                        <param name="visible" value="Skin.HasSetting(UseSmallerCategories)" />
                                                </include>

YouTube addon

The Kodi YouTube addon requires a google account and a personal API key and OAuth credentials.

Add the “unofficial” repository as the version in the official Kodi repository is outdated and likely will not work.
Links as per https://github.com/anxdpanic/plugin.video.youtube/wiki/Installation

wget "https://ftp.fau.de/osmc/osmc/download/dev/anxdpanic/repositories/repository.yt.unofficial-2.0.7.zip"

Install repo in Kodi via settings → addons → install from zip file → home folder → yt unofficial zip

Create API key and OAuth credentials:
https://github.com/anxdpanic/plugin.video.youtube/issues/1095
https://forum.kodi.tv/showthread.php?tid=356934&pid=3224383#pid3224383
https://github.com/anxdpanic/plugin.video.youtube/issues/439

https://console.developers.google.com/

How to add API key and OAuth credentials:
https://ytaddon.page.link/keys

Enable API page, then enter the key and credentials on:
http://192.168.1.11:50152/youtube/api

Kodi forum support thread:
https://forum.kodi.tv/showthread.php?tid=356934&page=223

kodi/kodi21-debian-dlbox.txt · Last modified: by Wulf Rajek