What?
If you run tvheadend and kodi on one device you want to wait to start kodi until hdmi is conected,
Why?
kodi has bugs that cause issues when started before connected to hdmi
- Sometimes it crashes
- Sometimes it stops to render text in menu
How to work arround?
Wait for HDMI and timeout if no recording is upcomming
#!/bin/bash
# This scripts wait <TIMEOUTINSECONDS> till hdmi connection got established or shutdown if no tvheadend recording is running, upcomming or some stream is consumed, served by tvheaden
# Howto https://debianisttoll.blogspot.com/2021/07/wait-till-hdmi-is-connected-before.html
# Source https://gist.githubusercontent.com/stesee/9ebb11cc2db6a58e6b42afb2d74e7e7b/raw/7327e42950c449c1153ebf546f60ee1d8e3d0d0d/waitTillHdmiConnected.sh
# install stuff before using this script
# sudo apt install libxml-xpath-perl curl
# setup systemconfiguration
# allow current user to execute shutdown and waskup - add this line to /etc/sudoers - replace "username" with your username
# username ALL = NOPASSWD: /usr/bin/setwakeup.sh, /usr/sbin/pm-suspend
# configure your settings
WARNINGTIMEOUTINSECONDS=800
TIMEOUTINSECONDS=900
POLLINGDURATIONINSECONDS=5
LOGFILE="$HOME/waitTillHdmiConnected.log"
# configure your tvheadend settings
URL=localhost
PORT=9981
USERNAME=kodi
PASSWORD=kodi
# Time this script will wait without shutting down for a planned recording
TIMEBEFORENEXTRECORDINMINUTES=20
#set start conditions, is this some bash magic? seems like SECONDS will be increased by every second without coding anything
SECONDS=0
triggerTimeoutActions(){
#set next wakeup time
OUTPUT=$(curl --anyauth -u $USERNAME:$PASSWORD --silent --max-time 5 "http://$URL:$PORT/status.xml")
NEXTRECORD=$(echo "$OUTPUT" | xpath -q -e "/currentload/recordings[1]/recording/next/text()")
NEXTRECORD_TICKS=$(date '+%s' -d "+ $NEXTRECORD minutes")
#TODO Add sanity check value and fall back to someting reasonable... e.g. 24h in future
FAILSAFE=`date '+%s' -d '+ 24 hours'`
#TODO Add sanity check value and fall back to someting reasonable... e.g. 24h in future
sudo /usr/bin/setwakeup.sh "$NEXTRECORD_TICKS"
# e.g. shutdown the system
echo "Shuting down next wakup set to $NEXTRECORD_TICKS" | tee -a "$LOGFILE"
echo $(date && echo "shutting realy down") | tee -a "$LOGFILE"
shutdown +1 | tee -a "$LOGFILE"
exit
}
triggerHdmiConnectedActions(){
# e.g. set some overscan hack
#xrandr --output HDMI-3 --transform 1.05,0,-34,0,1.05,-20,0,0,1
# e.g. start kodi
kodi &
exit
}
isHdmiPortConnected(){
if xrandr 2> /dev/null | grep -q 'HDMI-[0-9] connected'; then
echo "HDMI connected" | tee -a "$LOGFILE"
return 0
else
echo "HDMI not connected waiting $POLLINGDURATIONINSECONDS seconds" | tee -a "$LOGFILE"
return 1
fi
}
isTvheadenRecordingActive(){
# check if tvheadend is responding
OUTPUT=$(curl --anyauth -u $USERNAME:$PASSWORD --silent --max-time 5 "http://$URL:$PORT/status.xml")
if [ -z "$OUTPUT" ]; then
echo "Tvheadend is not responding" | tee -a "$LOGFILE"
return 1
else
# check if tvheadend is recording
if echo "$OUTPUT" | grep "<status>Recording</status>" >/dev/null; then
echo "Tvheadend is recording" | tee -a "$LOGFILE"
return 0
fi
# check if tvheadend recording is upcomming in TIMEBEFORENEXTRECORDINMINUTES
if echo "$OUTPUT" | grep "<next>" >/dev/null; then
echo "Tvheadend waiting for an upcomming recording" | tee -a "$LOGFILE"
echo "$OUTPUT"
NEXTRECORD=$(echo "$OUTPUT" | xpath -q -e "/currentload/recordings[1]/recording/next/text()")
echo Next recording starts in "$NEXTRECORD" minutes | tee -a "$LOGFILE"
if [ "$TIMEBEFORENEXTRECORDINMINUTES" -gt "$NEXTRECORD" ]; then
echo "Tvheadend will start to record in short time" | tee -a "$LOGFILE"
return 0
fi
fi
# check if tvheadend rcording serving some stream
if echo "$OUTPUT" | grep "<subscriptions>" >/dev/null; then
SUBS=$(echo "$OUTPUT" | xpath -q -e "/currentload/subscriptions/text()")
if [ "$SUBS" -gt 1 ]; then
echo "$SUBS subscriptions running" | tee -a "$LOGFILE"
return 0
elif [ "$SUBS" -eq 0 ]; then
echo "No subscriptions" | tee -a "$LOGFILE"
fi
fi
fi
return 1
}
echo $(date && echo "Start polling") | tee -a "$LOGFILE"
while true
do
if isHdmiPortConnected; then
triggerHdmiConnectedActions
fi
duration=$SECONDS
if isTvheadenRecordingActive; then
SECONDS=0
else
echo "$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed since first poll." | tee -a "$LOGFILE"
if [ "$duration" -gt "$WARNINGTIMEOUTINSECONDS" ]; then
echo "Warning: HDMI connection timeout is about to occure!" | tee -a "$LOGFILE"
if [ "$duration" -gt "$TIMEOUTINSECONDS" ]; then
triggerTimeoutActions
fi
fi
fi
sleep $POLLINGDURATIONINSECONDS
done
Allow shutdown
Add this to /etc/sudoers
htpc ALL = NOPASSWD: /usr/bin/setwakeup.sh, /usr/sbin/pm-suspend
To lookhup how to create /usr/bin/setwakeup.sh see https://debianisttoll.blogspot.com/2021/06/send-to-sleep-and-wake-up-tvheadend.html
Kommentare