scripts/set-splash.sh
203 Zeilen · 8.1 KB · Shell
| 1 | |
| 2 | # =========================================================================== |
| 3 | # Ersetzt den Startbildschirm (Plymouth-Thema "pix") durch ein eigenes Logo. |
| 4 | # |
| 5 | # Aufruf: sudo /opt/tvwall/scripts/set-splash.sh /pfad/zum/logo.png [--dauer N] |
| 6 | # sudo /opt/tvwall/scripts/set-splash.sh --zurueck |
| 7 | # |
| 8 | # Das Logo wird auf die Bildschirmgroesse zentriert auf schwarzem Grund |
| 9 | # gesetzt - derselbe Hintergrund, den auch der Player verwendet, damit der |
| 10 | # Uebergang vom Start in die Wiedergabe nicht springt. |
| 11 | # |
| 12 | # Dasselbe Bild wird ausserdem als Startlogo des Players hinterlegt |
| 13 | # (BOOT_LOGO). Das ist der zuverlaessige Teil: Viele Fernseher wachen erst |
| 14 | # auf, wenn mpv den Bildmodus setzt - der Startbildschirm des Systems ist bis |
| 15 | # dahin gar nicht zu sehen, beim Herunterfahren dagegen schon. |
| 16 | # |
| 17 | # --dauer N haelt zusaetzlich den System-Startbildschirm bis N Sekunden nach |
| 18 | # dem Einschalten (0 = aus, Standard 0). |
| 19 | # =========================================================================== |
| 20 | set -euo pipefail |
| 21 | |
| 22 | THEME_DIR="/usr/share/plymouth/themes/pix" |
| 23 | SPLASH="$THEME_DIR/splash.png" |
| 24 | BACKUP="$THEME_DIR/splash.original.png" |
| 25 | CONFIG_TXT="/boot/firmware/config.txt" |
| 26 | [[ -f "$CONFIG_TXT" ]] || CONFIG_TXT="/boot/config.txt" |
| 27 | HOLD_BIN="/usr/local/bin/tvwall-splash-hold" |
| 28 | HOLD_UNIT="/etc/systemd/system/tvwall-splash.service" |
| 29 | TVWALL_CONF="/etc/tvwall/tvwall.conf" |
| 30 | BOOT_LOGO="/var/lib/tvwall/boot-logo.png" |
| 31 | DAUER=0 |
| 32 | |
| 33 | info() { printf '\033[1;36m==>\033[0m %s\n' "$*"; } |
| 34 | ok() { printf '\033[1;32m ✓\033[0m %s\n' "$*"; } |
| 35 | warn() { printf '\033[1;33m !\033[0m %s\n' "$*"; } |
| 36 | die() { printf '\033[1;31mFehler:\033[0m %s\n' "$*" >&2; exit 1; } |
| 37 | |
| 38 | [[ $EUID -eq 0 ]] || die "bitte mit sudo starten: sudo $0 $*" |
| 39 | [[ -d "$THEME_DIR" ]] || die "Plymouth-Thema 'pix' nicht gefunden ($THEME_DIR)" |
| 40 | |
| 41 | # --- Aufrufparameter ------------------------------------------------------- |
| 42 | ARGS=() |
| 43 | while [[ $# -gt 0 ]]; do |
| 44 | case "$1" in |
| 45 | --dauer) DAUER="${2:-12}"; shift 2 ;; |
| 46 | --zurueck) ARGS+=("--zurueck"); shift ;; |
| 47 | *) ARGS+=("$1"); shift ;; |
| 48 | esac |
| 49 | done |
| 50 | set -- "${ARGS[@]+"${ARGS[@]}"}" |
| 51 | |
| 52 | # --- zuruecksetzen --------------------------------------------------------- |
| 53 | if [[ "${1:-}" == "--zurueck" ]]; then |
| 54 | [[ -f "$BACKUP" ]] || die "keine Sicherung gefunden ($BACKUP)" |
| 55 | cp -f "$BACKUP" "$SPLASH" |
| 56 | ok "urspruenglicher Startbildschirm wiederhergestellt" |
| 57 | systemctl disable --now tvwall-splash.service >/dev/null 2>&1 || true |
| 58 | rm -f "$HOLD_UNIT" "$HOLD_BIN" |
| 59 | systemctl daemon-reload |
| 60 | ok "Halten des Startbildes entfernt" |
| 61 | if [[ -f "$TVWALL_CONF" ]]; then |
| 62 | sed -i 's|^BOOT_LOGO=.*|BOOT_LOGO=""|' "$TVWALL_CONF" |
| 63 | systemctl restart tvwall 2>/dev/null || true |
| 64 | ok "Startlogo des Players abgeschaltet" |
| 65 | fi |
| 66 | rm -f "$BOOT_LOGO" |
| 67 | update-initramfs -u >/dev/null 2>&1 || true |
| 68 | ok "fertig - beim naechsten Neustart wieder das Original" |
| 69 | exit 0 |
| 70 | fi |
| 71 | |
| 72 | LOGO="${1:-}" |
| 73 | [[ -n "$LOGO" && -f "$LOGO" ]] || die "Bilddatei angeben: sudo $0 /pfad/zum/logo.png" |
| 74 | command -v ffmpeg >/dev/null || die "ffmpeg fehlt: sudo apt install ffmpeg" |
| 75 | |
| 76 | # --- Bildschirmaufloesung ermitteln --------------------------------------- |
| 77 | MODE="$(head -1 /sys/class/drm/*/modes 2>/dev/null | grep -m1 -E '^[0-9]+x[0-9]+' || true)" |
| 78 | W="${MODE%x*}"; H="${MODE#*x}" |
| 79 | if [[ ! "$W" =~ ^[0-9]+$ || ! "$H" =~ ^[0-9]+$ ]]; then |
| 80 | W=1920; H=1080 |
| 81 | warn "Aufloesung nicht erkannt - nehme ${W}x${H}" |
| 82 | else |
| 83 | ok "Bildschirm: ${W}x${H}" |
| 84 | fi |
| 85 | |
| 86 | # --- Startbild bauen ------------------------------------------------------- |
| 87 | info "Baue Startbild aus $(basename "$LOGO")" |
| 88 | LOGO_H=$(( H * 55 / 100 )) # Logo auf 55 % der Bildhoehe |
| 89 | TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT |
| 90 | ffmpeg -v error -y -f lavfi -i "color=c=black:s=${W}x${H}" -i "$LOGO" \ |
| 91 | -filter_complex "[1:v]scale=-1:${LOGO_H}:force_original_aspect_ratio=decrease[logo];\ |
| 92 | [0:v][logo]overlay=(W-w)/2:(H-h)/2:format=auto" \ |
| 93 | -frames:v 1 "$TMP/splash.png" || die "ffmpeg konnte das Bild nicht erzeugen" |
| 94 | ok "Startbild erzeugt ($(stat -c %s "$TMP/splash.png") Bytes)" |
| 95 | |
| 96 | # --- einsetzen ------------------------------------------------------------- |
| 97 | [[ -f "$BACKUP" ]] || { cp -f "$SPLASH" "$BACKUP"; ok "Original gesichert: $BACKUP"; } |
| 98 | install -m 0644 "$TMP/splash.png" "$SPLASH" |
| 99 | ok "eingesetzt: $SPLASH" |
| 100 | |
| 101 | # --- Regenbogen-Quadrat der Firmware abschalten --------------------------- |
| 102 | if [[ -w "$CONFIG_TXT" ]] && ! grep -q "^disable_splash=1" "$CONFIG_TXT"; then |
| 103 | cp -f "$CONFIG_TXT" "$CONFIG_TXT.tvwall-backup" |
| 104 | printf '\n# von tvwall set-splash.sh: kein Regenbogen-Quadrat beim Einschalten\ndisable_splash=1\n' >> "$CONFIG_TXT" |
| 105 | ok "disable_splash=1 in $(basename "$CONFIG_TXT") eingetragen" |
| 106 | fi |
| 107 | |
| 108 | # --- dasselbe Bild als Startlogo des Players ------------------------------- |
| 109 | # Der zuverlaessige Teil: mpv schaltet den Bildschirm ein, also sieht man |
| 110 | # dieses Bild garantiert - unabhaengig davon, wann der Fernseher aufwacht. |
| 111 | if [[ -d "$(dirname "$BOOT_LOGO")" ]]; then |
| 112 | install -m 0644 "$TMP/splash.png" "$BOOT_LOGO" |
| 113 | RUN_USER="$(sed -n 's/^RUN_USER="\(.*\)"/\1/p' "$TVWALL_CONF" 2>/dev/null | head -1)" |
| 114 | [[ -n "${RUN_USER:-}" ]] && chown "$RUN_USER" "$BOOT_LOGO" 2>/dev/null || true |
| 115 | ok "Startlogo des Players: $BOOT_LOGO" |
| 116 | |
| 117 | if [[ -f "$TVWALL_CONF" ]]; then |
| 118 | if grep -q "^BOOT_LOGO=" "$TVWALL_CONF"; then |
| 119 | sed -i "s|^BOOT_LOGO=.*|BOOT_LOGO=\"$BOOT_LOGO\"|" "$TVWALL_CONF" |
| 120 | else |
| 121 | printf '\n# Startlogo, von set-splash.sh eingetragen\nBOOT_LOGO="%s"\nBOOT_LOGO_SECONDS="8"\n' \ |
| 122 | "$BOOT_LOGO" >> "$TVWALL_CONF" |
| 123 | fi |
| 124 | ok "BOOT_LOGO in $TVWALL_CONF eingetragen" |
| 125 | systemctl restart tvwall 2>/dev/null && ok "Dienst neu gestartet - das Logo ist sofort zu sehen" || true |
| 126 | fi |
| 127 | else |
| 128 | warn "$(dirname "$BOOT_LOGO") fehlt - Startlogo des Players nicht gesetzt" |
| 129 | fi |
| 130 | |
| 131 | # --- Startbild stehenlassen, bis die Wiedergabe uebernimmt ---------------- |
| 132 | # Ohne das zeigt Plymouth das Logo nur etwa vier Sekunden; viele Fernseher |
| 133 | # sind zu diesem Zeitpunkt noch gar nicht synchronisiert. |
| 134 | if [[ "$DAUER" == "0" ]]; then |
| 135 | if [[ -f "$HOLD_UNIT" ]]; then |
| 136 | systemctl disable --now tvwall-splash.service >/dev/null 2>&1 || true |
| 137 | rm -f "$HOLD_UNIT" "$HOLD_BIN" |
| 138 | systemctl daemon-reload |
| 139 | ok "Halten des System-Startbildes entfernt (--dauer 0)" |
| 140 | fi |
| 141 | elif [[ -x /usr/bin/plymouth ]]; then |
| 142 | info "System-Startbild bis $DAUER s nach dem Einschalten halten" |
| 143 | cat > "$HOLD_BIN" <<'HOLD' |
| 144 | #!/bin/sh |
| 145 | # Haelt den Plymouth-Startbildschirm, bis die angegebene Zeit seit dem |
| 146 | # Einschalten erreicht ist, und uebergibt ihn dann an die Wiedergabe. |
| 147 | # --retain-splash laesst das Bild stehen, bis mpv das erste Mal malt - so |
| 148 | # gibt es dazwischen keine schwarze Luecke. |
| 149 | ZIEL="${1:-12}" |
| 150 | UP="$(cut -d. -f1 /proc/uptime)" |
| 151 | [ "$UP" -lt "$ZIEL" ] && sleep $(( ZIEL - UP )) |
| 152 | [ -x /usr/bin/plymouth ] && /usr/bin/plymouth quit --retain-splash |
| 153 | exit 0 |
| 154 | HOLD |
| 155 | chmod 0755 "$HOLD_BIN" |
| 156 | |
| 157 | cat > "$HOLD_UNIT" <<UNIT |
| 158 | # Von tvwall set-splash.sh erzeugt. |
| 159 | [Unit] |
| 160 | Description=Startbild halten, bis die Wiedergabe uebernimmt |
| 161 | After=plymouth-start.service |
| 162 | Before=tvwall.service plymouth-quit.service plymouth-quit-wait.service |
| 163 | ConditionPathExists=/usr/bin/plymouth |
| 164 | |
| 165 | [Service] |
| 166 | Type=oneshot |
| 167 | ExecStart=$HOLD_BIN $DAUER |
| 168 | TimeoutStartSec=60 |
| 169 | RemainAfterExit=yes |
| 170 | |
| 171 | [Install] |
| 172 | WantedBy=multi-user.target |
| 173 | UNIT |
| 174 | systemctl daemon-reload |
| 175 | systemctl enable tvwall-splash.service >/dev/null 2>&1 |
| 176 | ok "tvwall-splash.service eingerichtet" |
| 177 | else |
| 178 | warn "/usr/bin/plymouth fehlt - Startbild laesst sich nicht halten" |
| 179 | fi |
| 180 | |
| 181 | # --- Plymouth liest das Bild aus der initramfs ---------------------------- |
| 182 | if command -v update-initramfs >/dev/null; then |
| 183 | info "Aktualisiere initramfs (dauert einen Moment)" |
| 184 | update-initramfs -u >/dev/null 2>&1 && ok "initramfs aktualisiert" \ |
| 185 | || warn "initramfs liess sich nicht aktualisieren - meist trotzdem in Ordnung" |
| 186 | fi |
| 187 | |
| 188 | cat <<EOF |
| 189 | |
| 190 | =========================================================================== |
| 191 | Fertig. |
| 192 | |
| 193 | - Der Player zeigt das Logo beim Start 8 Sekunden lang, bevor die |
| 194 | Playliste beginnt. Das sieht man sicher, weil mpv den Bildschirm |
| 195 | einschaltet. |
| 196 | - Beim Herunterfahren zeigt das System denselben Bildschirm. |
| 197 | |
| 198 | sudo reboot |
| 199 | |
| 200 | Anzeigedauer aendern: BOOT_LOGO_SECONDS in $TVWALL_CONF |
| 201 | Zurueck zum Original: sudo $0 --zurueck |
| 202 | =========================================================================== |
| 203 | EOF |