#!/usr/bin/env perl
use utf8;
use strict;
use warnings;
use DBI;
use FileHandle;
use enum qw(:Chan_=0 Name Freq Inv SymRate Fec Qam VID AID PID);

if (scalar @ARGV != 1) {
	print "usage: $0 <channels.conf>\n";
	exit;
}

my %Inversion = (
	INVERSION_AUTO => 'a',
	INVERSION_ON => '1',
	INVERSION_OFF => '0'
);

my %Fec = (
	FEC_NONE => 'none',
	FEC_1_2 => '1/2',
	FEC_2_3 => '2/3',
	FEC_3_4 => '3/4',
	FEC_4_5 => '4/5',
	FEC_5_6 => '5/6',
	FEC_6_7 => '6/7',
	FEC_7_8 => '7/8',
	FEC_8_9 => '8/9',
	FEC_AUTO => 'auto'
);

my %Qam = (
	QPSK => 'qpsk',
	QAM_16 => 'qam_16',
	QAM_32 => 'qam_32',
	QAM_64 => 'qam_64',
	QAM_128 => 'qam_128',
	QAM_256 => 'qam_256',
	QAM_AUTO => 'auto',
	'8VSB' => '8vsb',
	'16VSB' => '16vsb'
);

my $dbh = DBI->connect('DBI:mysql:database=mythconverg','mythtv','mythtv') || die "$!\n";
my $get_freq_by_name = $dbh->prepare('select freqid, mplexid from channel where name=? and channum=?') || die $dbh->errstr."\n";
my $dvbc = new FileHandle($ARGV[0],'r') || die "$!\n";

$dbh->do('delete from dtv_multiplex where mplexid not in (select distinct mplexid from channel)');

while (my $chan = $dvbc->getline) {
	$chan =~ s/^\s*//;
	$chan =~ s/\s*$//;
	my @chan = split(':',$chan);
	$get_freq_by_name->execute($chan[Chan_Name],$chan[Chan_PID]);
	if ($get_freq_by_name->rows == 1) {
		my $row=$get_freq_by_name->fetchrow_hashref;
		print "$chan[Chan_PID]:$chan[Chan_Name] $row->{'freqid'} => $chan[Chan_Freq]\n";
		$dbh->do("update channel set freqid=".$dbh->quote($chan[Chan_Freq])
			." where name=".$dbh->quote($chan[Chan_Name])
			." and channum=".$dbh->quote($chan[Chan_PID])
		);
		$dbh->do("update dtv_multiplex set frequency=".$dbh->quote($chan[Chan_Freq])
			.", inversion=".$dbh->quote($Inversion{$chan[Chan_Inv]})
			.", symbolrate=".$dbh->quote($chan[Chan_SymRate])
			.", fec=".$dbh->quote($Fec{$chan[Chan_Fec]})
			.", modulation=".$dbh->quote($Qam{$chan[Chan_Qam]})
			.", sistandard='dvb'"
			." where mplexid=".$dbh->quote($row->{'mplexid'})
		);
	}
}

