LabCodeHub öffentliche Ansicht
Anmelden
Küpper / ehc-tvwall öffentlich
Branch: main
ehc-tvwall / scripts / set-splash.sh
Verlauf Rohdaten
R Rüdiger Küpper feat: add silent boot script to enhance boot experience
461e563c vor 11 Tagen
scripts/set-splash.sh 203 Zeilen · 8.1 KB · Shell
1
#!/usr/bin/env bash
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