#!/bin/bash
###############################################################################
#                                                                             #
# IPFire.org - A linux based firewall                                         #
# Copyright (C) 2007-2020  IPFire Team  <info@ipfire.org>                     #
#                                                                             #
# This program is free software: you can redistribute it and/or modify        #
# it under the terms of the GNU General Public License as published by        #
# the Free Software Foundation, either version 3 of the License, or           #
# (at your option) any later version.                                         #
#                                                                             #
# This program is distributed in the hope that it will be useful,             #
# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
# GNU General Public License for more details.                                #
#                                                                             #
# You should have received a copy of the GNU General Public License           #
# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
#                                                                             #
###############################################################################
###############################################################################
# w_scan_start - 2020-02-21 Arne Fitzenreiter - update for 2017 wscan version #
#              - 2013-04-30 Arne Fitzenreiter - add atsc                      #
#              - 2013-04-20 Arne Fitzenreiter - path vdr 2                    #
#              - 2012-11-15 Arne Fitzenreiter - inital vers.                  #
###############################################################################

err_msg ()
{
	whiptail --msgbox "$1" 8 70 --title "Error"
	clear
	exit 1
}

chk_cancel ()
{
	if [ ! "${?}" == 0 ];then
		clear
		echo "Terminated by user!"
		exit 0
	fi
}

yes_no ()
{
	whiptail --yesno "$1" 8 70
	chk_cancel
}

WSCAN=$(which w_scan)

# Whiptail does not like en_US.UTF-8
LANG=c

# Some initial checks...
if [ -z $WSCAN ];then 
	err_msg "w_scan not found!";
fi
if [ ! -e /dev/dvb/adapter[0-9]/frontend[0-9] ];then 
	err_msg "No dvb tuner frontend found!";
fi

# Is vdr running?
if [ "$(ps -A | grep " runvdr$")" != "" ] ;then
	yes_no "VDR is running. Cannot scan with active VDR. Should I stop it?"
	clear
	/etc/init.d/vdr stop
fi

# Select system type
whiptail --checklist "\nSelect system type" 12 40 5 \
                     DVB-T "Terrestrial" yes \
                     DVB-C  "Cable"       no \
                     DVB-S  "Satellite"   no \
                     ATSC-T "Terrestrial" no \
                     ATSC-C "Cable"       no \
                     2>/tmp/w_scan_type
chk_cancel
W_SCAN_TYPE=$(cat /tmp/w_scan_type)
rm /tmp/w_scan_type

if [[ "$W_SCAN_TYPE" == *ATSC* ]] || [[ "$W_SCAN_TYPE" == *DVB-T* ]] || [[ "$W_SCAN_TYPE" == *DVB-C* ]]; then
	# Generate and run separate country menubox and default germany
	echo '#!/bin/bash' > /tmp/w_scan_countryselect.sh
	echo 'whiptail --radiolist "\nSelect country" 19 70 10 \' >> /tmp/w_scan_countryselect.sh
	$WSCAN -c? 2>&1 | tail -n +2 | cut -f2,4 | sed 's|[	]| "|g' | sed 's|$|" off \\|g' | sed 's|"GERMANY" off |"GERMANY" on |g' >> /tmp/w_scan_countryselect.sh
	echo ' 2>/tmp/w_scan_country' >> /tmp/w_scan_countryselect.sh
	sh /tmp/w_scan_countryselect.sh
	chk_cancel
	rm /tmp/w_scan_countryselect.sh
	W_SCAN_COUNTRY=$(cat /tmp/w_scan_country)
	rm /tmp/w_scan_country
fi

if [[ "$W_SCAN_TYPE" == *DVB-S* ]]; then
	# Generate and run separate satelite menubox and default astra
	echo '#!/bin/bash' > /tmp/w_scan_satselect.sh
	echo 'whiptail --checklist "\nSelect satellites" 19 70 10 \' >> /tmp/w_scan_satselect.sh
	$WSCAN -s? 2>&1 | tail -n +2 | cut -f2,4 | sed 's|[	]| "|g' | sed 's|$|" off \\|g' | sed 's|19.2 east.*|19.2 east Astra 1F/1G/1H/1KR/1L" on \\|g' >> /tmp/w_scan_satselect.sh
	echo ' 2>/tmp/w_scan_satellite' >> /tmp/w_scan_satselect.sh
	sh /tmp/w_scan_satselect.sh
	chk_cancel
	rm /tmp/w_scan_satselect.sh
	W_SCAN_SATELLITE=$(cat /tmp/w_scan_satellite | sed 's|"||g')
	rm /tmp/w_scan_satellite
fi

# Now start the scan ...
clear
rm -rf /tmp/channels.conf
if [[ "$W_SCAN_TYPE" == *DVB-T* ]]; then
	echo ":->W-SCAN DVB-T $(date +%Y%m%d%H%M)" >>/tmp/channels.conf
	$WSCAN -f t -c $W_SCAN_COUNTRY -C UTF-8 -o 2 >>/tmp/channels.conf
fi
if [[ "$W_SCAN_TYPE" == *DVB-C* ]]; then
	echo ":->W-SCAN DVB-C $(date +%Y%m%d%H%M)" >>/tmp/channels.conf
	$WSCAN -f c -c $W_SCAN_COUNTRY -C UTF-8 -o 2 >>/tmp/channels.conf
fi
if [[ "$W_SCAN_TYPE" == *DVB-S* ]]; then
	for SATELLITE in $W_SCAN_SATELLITE;
	do
		echo ":->W-SCAN DVB-S $SATELLITE $(date +%Y%m%d%H%M)" >>/tmp/channels.conf
		$WSCAN -f s -s $SATELLITE -C UTF-8 -o 2 >>/tmp/channels.conf
	done
fi
if [[ "$W_SCAN_TYPE" == *ATSC-T* ]]; then
	echo ":->W-SCAN ATSC-T $(date +%Y%m%d%H%M)" >>/tmp/channels.conf
	$WSCAN -f a -A 1 -c $W_SCAN_COUNTRY -C UTF-8 -o 2 >>/tmp/channels.conf
fi
if [[ "$W_SCAN_TYPE" == *ATSC-C* ]]; then
	echo ":->W-SCAN ATSC-C $(date +%Y%m%d%H%M)" >>/tmp/channels.conf
	$WSCAN -f a -A 2 -c $W_SCAN_COUNTRY -C UTF-8 -o 2 >>/tmp/channels.conf
fi

# Save result to current dir.
cp /tmp/channels.conf w_scan-$(date +%Y%m%d%H%M).channels.conf
echo Results saved to w_scan-$(date +%Y%m%d%H%M).channels.conf

# Do this only if vdr is installed ...
if [ -e /opt/pakfire/db/installed/meta-vdr ]; then
	yes_no "Install new channels-conf for VDR."
	# Backup old channels conf...
	cp -f /etc/vdr/channels.conf \
		/etc/vdr/channels.conf.backup$(date +%Y%m%d%H%M)
	cp -f /tmp/channels.conf /etc/vdr/
	yes_no "Should i start the VDR?"
	clear
	/etc/init.d/vdr start
fi
