Last active
October 16, 2021 08:30
-
-
Save stesee/9ebb11cc2db6a58e6b42afb2d74e7e7b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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