You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
7.3 KiB
306 lines
7.3 KiB
#!/bin/sh
|
|
###############################################################################
|
|
#
|
|
# EPGscan.sh 1.02 vanhofen [NI-Team] (basiert auf einer Idee von SnowHead)
|
|
#
|
|
# Ziel:
|
|
# Jeden ersten TV-Kanal eines Transponders in den Bouquets fuer EPG-
|
|
# Aktualisierung anzappen.
|
|
# Erster Aufruf des Skripts dauert lange, da die Datei EPGscan.dat erstellt
|
|
# wird (mit einem Kanal pro Transponder). Die Datei kann danach auch manuell
|
|
# bearbeitet werden.
|
|
# Bei einem Durchlauf wird jeder Sender für 15 Sekunden eingeschaltet.
|
|
# Das sollte für die EPG Daten ausreichen.
|
|
# Bei laufenden Aufnahmen wird gewartet, bis die Aufnahme fertig ist.
|
|
#
|
|
# Parameter einstellbar in /var/tuxbox/config/EPGscan.conf:
|
|
# * Wartezeit pro Sender in Sekunden (wait_period=<sec>)
|
|
# * Löschen von gespeicherten EPG-Daten (del_epgstore=0|1)
|
|
# * Standby-Modus nach dem Zappen erzwingen (force_standby=0|1)
|
|
# * Zappen nur im Standby-Modus starten (need_standby=0|1)
|
|
# * Shutdown nach dem Zappen erzwingen (force_shutdown=0|1|2)
|
|
# * mit 'rcsim' zu den Favoriten zurück zappen (rezap_hack=0|1)
|
|
# * pr-auto-timer nach Zappen starten (pr_auto_timer=0|1)
|
|
# * Nur definierte Bouquets durchsuchen (my_bouquets="bouq1; bouq2")
|
|
#
|
|
###############################################################################
|
|
|
|
create_DATFILE() {
|
|
console "creating $DATFILE"
|
|
fbpopup "Erzeuge Kanalliste... Das kann etwas dauern."
|
|
echo -e "# $DATFILE: data for automatic epg-scan\n#" > $DATFILE
|
|
if [ -n "$my_bouquets" ]
|
|
then
|
|
rm -f /tmp/my_bouquets.xml
|
|
IFS_SAVE=$IFS
|
|
set -f
|
|
IFS=';'
|
|
for my_bouquet in $my_bouquets
|
|
do
|
|
my_bouquet=$(echo $my_bouquet | sed 's/^ *//g;s/ *$//g')
|
|
sed -ne "/Bouquet name=\"$my_bouquet\"/,/\/Bouquet/p" $bouquets >> /tmp/my_bouquets.xml
|
|
done
|
|
IFS=$IFS_SAVE
|
|
set +f
|
|
bouquets="/tmp/my_bouquets.xml"
|
|
fi
|
|
while read tag line
|
|
do
|
|
case ${tag:1:1} in
|
|
"T") # transponder
|
|
tsid_f=$(echo $line | cut -d'"' -f2)
|
|
tsid_s=$(echo $tsid_f | sed -e 's/^0*//')
|
|
done=
|
|
continue
|
|
;;
|
|
"S") # service
|
|
test $done && continue
|
|
echo $line | grep -qE 't="1"|t="11"|t="16"|t="19"|t="d3"' 2>/dev/null || continue
|
|
|
|
name=$(echo $line | cut -d'"' -f4)
|
|
test $(echo "$name" | sed 's/[[:print:]]//g') && continue
|
|
|
|
chid_f=$(echo $line | cut -d'"' -f2)
|
|
chid_s=$(echo $chid_f | sed -e 's/^0*//')
|
|
|
|
grep -qE "(i=\"$chid_f\".*t=\"$tsid_f\".*)" $bouquets 2>/dev/null || \
|
|
grep -qE "(i=\"$chid_s\".*t=\"$tsid_s\".*)" $bouquets 2>/dev/null || continue
|
|
|
|
console "found on TS $tsid_f: $name"
|
|
echo "$tsid_f" "$name" >> $DATFILE
|
|
done=$tsid_f
|
|
;;
|
|
esac
|
|
done < $services
|
|
fbpopup "Kanalliste erzeugt. Beginne Zapping..."
|
|
console "$DATFILE created"
|
|
}
|
|
|
|
fbpopup() {
|
|
wget -q -O /dev/null -Y off $hturl/control/message?popup="${0##*/}%0A${@}"
|
|
}
|
|
|
|
console() {
|
|
echo -e "\033[40;0;33m[${0##*/}] ${@}\033[0m"
|
|
}
|
|
|
|
KILLFILE=/tmp/EPGscan.kill
|
|
|
|
exist_KILLFILE() {
|
|
abort=false
|
|
ret=1
|
|
if [ -e $KILLFILE ]
|
|
then
|
|
fbpopup "Breche EPGscan ab."
|
|
console "aborting scan"
|
|
abort=true
|
|
ret=0
|
|
fi
|
|
return $ret
|
|
}
|
|
|
|
freemem() {
|
|
sync && echo 3 > /proc/sys/vm/drop_caches
|
|
}
|
|
|
|
cleanup() {
|
|
rm -f $KILLFILE
|
|
}
|
|
|
|
eXit() {
|
|
cleanup
|
|
exit $1
|
|
}
|
|
|
|
sig_handler() {
|
|
console "Signal caught - will exiting asap"
|
|
touch $KILLFILE
|
|
}
|
|
|
|
case "$1" in
|
|
-b)
|
|
console "go ahead"
|
|
|
|
CONFIGDIR="/var/tuxbox/config"
|
|
|
|
neutrino=${CONFIGDIR}"/neutrino.conf"
|
|
services=${CONFIGDIR}"/zapit/services.xml"
|
|
|
|
if [ -e ${CONFIGDIR}"/zapit/ubouquets.xml" ]
|
|
then
|
|
bouquets=${CONFIGDIR}"/zapit/ubouquets.xml"
|
|
else
|
|
bouquets=${CONFIGDIR}"/zapit/bouquets.xml"
|
|
fi
|
|
|
|
# ensure to get access to controlapi
|
|
nhttpd=${CONFIGDIR}"/nhttpd.conf"
|
|
htauth=$(grep "^mod_auth.authenticate" $nhttpd | cut -d"=" -f2)
|
|
htuser=$(grep "^mod_auth.username" $nhttpd | cut -d"=" -f2)
|
|
htpass=$(grep "^mod_auth.password" $nhttpd | cut -d"=" -f2)
|
|
htport=$(grep "^WebsiteMain.port" $nhttpd | cut -d"=" -f2)
|
|
if [ "$htauth" = "true" ]; then
|
|
hturl="http://$htuser:$htpass@127.0.0.1:$htport"
|
|
else
|
|
hturl="http://127.0.0.1:$htport"
|
|
fi
|
|
|
|
DATFILE=${CONFIGDIR}"/EPGscan.dat"
|
|
CONFIGFILE=${CONFIGDIR}"/EPGscan.conf"
|
|
|
|
# read/parse keywords in .conf
|
|
test -e $CONFIGFILE && . $CONFIGFILE 2> /dev/null
|
|
|
|
# create .dat if necessary
|
|
test -e $DATFILE || create_DATFILE
|
|
|
|
case $wait_period in
|
|
''|*[!0-9]*) wait_period=15 ;;
|
|
esac
|
|
|
|
# wait until standby (or timeout) if desired
|
|
if [ "$need_standby" = "1" ]
|
|
then
|
|
t=81
|
|
m=$t
|
|
while [ $(wget -q -O - "$hturl/control/standby" | sed 's/\r$//') = "off" ]
|
|
do
|
|
if [ ${t:1:1} -eq ${t:0:1} ]; then
|
|
console "timeout reached - exiting undone"
|
|
eXit 1
|
|
fi
|
|
t=$((t+1))
|
|
console "wait until standby (or timeout)"
|
|
sleep 900
|
|
done
|
|
test $t -ne $m && sleep 60 # a safety sleep
|
|
fi
|
|
|
|
# wait while recording
|
|
while [ $(wget -q -O - "$hturl/control/setmode?status" | sed 's/\r$//') = "on" ]
|
|
do
|
|
fbpopup "Eine Aufnahme laeuft. Ich warte..."
|
|
console "wait while recording"
|
|
sleep 900
|
|
done
|
|
|
|
# remember standby-mode
|
|
standby=$(wget -q -O - "$hturl/control/standby" | sed 's/\r$//')
|
|
|
|
# leave standby-mode if necessary
|
|
if [ "$standby" = "on" ]
|
|
then
|
|
console "leave standby-mode"
|
|
wget -q -O /dev/null "$hturl/control/standby?off&cec=off"
|
|
sleep 10
|
|
fi
|
|
|
|
# remove stored epg-data if desired and allowed
|
|
epg_save=$(grep "^epg_save=" $neutrino | cut -d'=' -f2)
|
|
if [ "$del_epgstore" = "1" -a "$epg_save" = "true" ]
|
|
then
|
|
console "remove stored epg-data"
|
|
epg_dir=$(grep "^epg_dir=" $neutrino | cut -d'=' -f2)
|
|
test $epg_dir && rm -f $epg_dir/*.*
|
|
fi
|
|
|
|
# catch some signals from here till end
|
|
trap sig_handler INT TERM
|
|
|
|
# remember volume-level and turn mute
|
|
volume=$(wget -q -O - "$hturl/control/volume" | sed 's/\r$//')
|
|
pzapit -vol 0 > /dev/null
|
|
|
|
# remember current channel
|
|
curr=$(pzapit -gi | cut -d' ' -f1)
|
|
|
|
# get new epg-data
|
|
while read tsid chan
|
|
do
|
|
test "${tsid:0:1}" = "#" && continue
|
|
|
|
fbpopup "Verbleibe auf TS $tsid fuer $wait_period Sekunden."
|
|
console "stay on TS $tsid ($chan) for $wait_period seconds"
|
|
|
|
freemem
|
|
|
|
pzapit -n "$chan" > /dev/null
|
|
|
|
i=0
|
|
while [ $i -lt $wait_period ]
|
|
do
|
|
i=$((i+1))
|
|
sleep 1
|
|
exist_KILLFILE && break
|
|
done
|
|
|
|
test "$abort" = "true" && break
|
|
done < $DATFILE
|
|
|
|
freemem
|
|
|
|
# rezap
|
|
pzapit -zi $curr
|
|
|
|
if [ "$rezap_hack" = "1" -a -x /bin/rcsim ]
|
|
then
|
|
keys="FAVORITES OK OK"
|
|
for key in $keys
|
|
do
|
|
# a terrible solution :/
|
|
rcsim KEY_${key} && sleep 1
|
|
done
|
|
fi
|
|
|
|
# pump up the volume
|
|
pzapit -vol $volume > /dev/null
|
|
|
|
# enter standby-mode if necessary or desired
|
|
if [ "$standby" = "on" -o "$force_standby" = "1" -o "$force_shutdown" != "0" ]
|
|
then
|
|
console "enter standby-mode"
|
|
wget -q -O /dev/null "$hturl/control/standby?on"
|
|
fi
|
|
|
|
# start pr-auto-timer if desired and found
|
|
if [ "$pr_auto_timer" = "1" -a -x /lib/tuxbox/plugins/pr-auto-timer ]
|
|
then
|
|
console "start pr-auto-timer"
|
|
/lib/tuxbox/plugins/pr-auto-timer --menu &
|
|
fi
|
|
|
|
# reboot/halt if desired
|
|
if [ "$force_shutdown" != "0" ]
|
|
then
|
|
console "prepare shutdown"
|
|
while [ -e /var/run/pr-auto-timer.pid ]
|
|
do
|
|
console "wait for pr-auto-timer"
|
|
sleep 60
|
|
done
|
|
|
|
if [ "$epg_save" = "true" ]
|
|
then
|
|
sleep 120 # for safety
|
|
fi
|
|
|
|
case $force_shutdown in
|
|
1) (sleep 2; halt) & ;;
|
|
2) (sleep 2; reboot) & ;;
|
|
esac
|
|
fi
|
|
|
|
console "done."
|
|
eXit 0
|
|
;;
|
|
*)
|
|
if ps -ef | grep '[E]PGscan.sh -b' > /dev/null
|
|
then
|
|
touch $KILLFILE
|
|
else
|
|
($0 -b > /dev/console) &
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
exit 0
|
|
|