Skip to content

Instantly share code, notes, and snippets.

@stesee
Last active October 16, 2021 08:30
Show Gist options
  • Save stesee/9ebb11cc2db6a58e6b42afb2d74e7e7b to your computer and use it in GitHub Desktop.
Save stesee/9ebb11cc2db6a58e6b42afb2d74e7e7b to your computer and use it in GitHub Desktop.
#!/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
WARMUPTIMEINMINUTES=2
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=$(echo "$NEXTRECORD-$WARMUPTIMEINMINUTES"|bc)
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 0 ]; then
echo "$SUBS subscriptions running" | tee -a "$LOGFILE"
return 0
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment