#!/usr/bin/perl -w
package TV::parser;
use Date::Manip;

$:=1;
$src = "/usr/home/jip/tv/";
$metafile = $src."data/pages.meta";
$page=$ARGV[0];
&InitEng;
$file = "$src/data/$page";
$ar="id name namesub nameurl timed endtime zender omroep localf origurl descr";
$ev=$ar;
@evs = $ar =~ m!(\w+)!g;
$ev=~ s/(\w+)/*$1,/g;
chop ($ev);
$ev="($ev) = &Parse(\"$file\");";
print $ev;

eval ($ev);


#foreach $i (@evs){
#    print "\n--------------------------$i\n";
#    foreach (@$i){print;print "\n"}
#}






use Pg;
$dbname = 'tv';
$cnt    = 2;
&pg_init;

$c=0;
foreach $idi (@id){
    my ($ew,$ev);
	$idi = substr($idi,0,39);
    if (db_CheckUniq($idi)){
	print "id '$idi' not there\n";
	print "zender:",$zender[$c];
	if ($zender[$c] && $name[$c] && $timed[$c]){
	    $ev=$ar;
	    $ev=~ s/(\w+)/$1,/g;
	    foreach $i (@evs){
	        my ($t)="";
		$t = $$i[$c] if ($$i[$c]);
		$t=~ s!\'!\\\'!g;
		$t=~ s!\`!\\\`!g;
		$ew .= "'$t' ,";
	    }
	    chop ($ev);
	    chop ($ew);
	$q = "insert into programs ($ev) values ($ew)" ;
	    print "\n$q\n";
	    my ($string,$cmd,$result);
	    $result = $conn->exec($q);   
	    cmp_eq(PGRES_COMMAND_OK, $result->resultStatus);   
	}else{
	    print "id '$idi' has no zender\n";
	}
    } else {
	print "id '$idi' already there\n";
    }
    $c++;
    #print $c;
}




exit 1;

(*id,*name,*zender)= &db_q("select * from programs");

foreach $i(@id){
    print "$i $name{$i} $zender{$i}\n"; 
}


sub db_q{
    my ($q)=@_;
    my ($result,$string,$j,$i,$fieldsn);
    my (@field,@row);
    $result = $conn->exec("$q");
    cmp_eq(PGRES_TUPLES_OK, $result->resultStatus);
    $fieldsn=$result->nfields;
    # mk @field
    for ($k = 0; $k < $fieldsn; $k++) {
	$field[$k] = $result->fname($k); 
	print "field#$k: $field[$k] \n";
    }
    print "\n";
    $rown=0;
    while (@row = $result->fetchrow) {
	$id[$rown] = $row[0];
	$id[$rown] =~ s/\s*$//;
	#print "$rown:", $id[$rown],"\n";
	for ($k = 1; $k < $fieldsn; $k++){
	    $row[$k]=~ s/\s*$// if ($row[$k]);
	    ${$field[$k]}{$id[$k]}=$row[$k];
	}
	$rown++;
    }
    foreach $i (@id){
	print "$j id: $i ";
	foreach $f (@field){
	    print "$f=",${$f}{$i} if (${$f}{$i});
    }
    print "\n";
    $j++;
    }
    print "rows: $rown\n";
    return \@id,\%name,\%zender;
}

sub db_CheckUniq{
    my ($id) = @_;
    my ($string,$cmd,$result);
    #beware of the idiot backtick bluuuuuuuu
    $id=~ s!\'!\\\'!g;
    $id=~ s!\`!\\\`!g;
    $id=~ s!\s$!!;
    print "\n$id\n";
    $cmd = "select (id) from programs where (id ~ '$id')";
    print $cmd;
    $result = $conn->exec($cmd);   
    cmp_eq(PGRES_TUPLES_OK, $result->resultStatus);   
    $string = $result->fetchrow;
   #print "res: -$string-\n id: $id";
    if ($string){
	$string =~ s/\s*$//i;
	$string =~ s!\'!\\\'!g;
	$string =~ s!\`!\\\`!g;
	if ($string eq $id){return 0;}
    }
    return 1;
}

#---------------------------------------------------------
sub cmp_eq {
    my $cmp = shift;
    my $ret = shift;
    my $msg;
    if ("$cmp" eq "$ret") {
        #print "ok $cnt\n";
    } else {
        $msg = $conn->errorMessage;
        print "not ok $cnt: $cmp, $ret\n$msg\n";
        exit;
    }
    $cnt++;
}

sub cmp_ne {
    my $cmp = shift;
    my $ret = shift;
    my $msg;
    if ("$cmp" ne "$ret") {
        #print "ok $cnt\n";
    } else {
        $msg = $conn->errorMessage;
        print "not ok $cnt: $cmp, $ret\n$msg\n";
        exit;
    }
    $cnt++;
}
                           


sub pg_init{
    $PGRES_EMPTY_QUERY    = 0 ;
    $PGRES_COMMAND_OK     = 1 ;
    $PGRES_TUPLES_OK      = 2 ;
    $PGRES_COPY_OUT       = 3 ;
    $PGRES_COPY_IN        = 4 ;
    $PGRES_BAD_RESPONSE   = 5 ;
    $PGRES_NONFATAL_ERROR = 6 ;
    $PGRES_FATAL_ERROR    = 7 ;
    $| = 1;
    $conn = Pg::connectdb("dbname=$dbname");
    $db = $conn->db;
    $user = $conn->user;
    $port = $conn->port;
    print "db: $db, $user, $port\n";
}














#------------------------------------------------------------------------



sub Parse {
    # goto toepasselijke sub
    # massage the returning title's date's etc.
    # return something standard
    my ($file)=@_;
    if (! -s $file ){
	print "file $file has zero size\n";
	return 0 ;
    }
    if ($file =~ /bbc/){
#	return $title,\@name,\@namei,\@url,\@time,\@desc;
	(*title,*name,*namesub,*url,*time,*desc,*url) = &ParseBBC($file);
	($zender,$pdate) = $title =~ m!(\w\w\w\d),\s(\w+\,\s\d+\s\w+\s\d\d\d\d)!i;
	print "\n\n$title => [$zender] voor [$pdate]\n\n\n";
	$dateplus=0;
	for ($c=0; $c < @time; $c++){
	    $time[$c] = &ParseDate ("$pdate $time[$c]");
	    $time[$c] = &DateCalc ($time[$c],"+ 1 hour");
	}
	    
	for ($c=0; $c < @name; $c++){
	    if ($time[$c+1]){
		$endtime[$c] = $time[$c+1]
		}else{
		    $endtime[$c] =&DateCalc( $time[$c],"+2 hours" ); 
		}
	    $endtime[$c]=&DateCalc($endtime[$c],"+1 day") if ($dateplus==1);
	    $time[$c]=&DateCalc($time[$c],"+1 day") if ($dateplus==1);
	    if ($endtime[$c] lt $time[$c]){
		$dateplus++;print "\n new day dawning\n";
		$endtime[$c]=&DateCalc($endtime[$c],"+1 day");
	    }
	    $za[$c]=$zender;
	    print "..$time[$c]-$endtime[$c].. $name[$c] \n" if $name[$c]; 
	}
	@zender=@za;
    }
    if ($file =~ /nos/){
	$dateplus=0;
	$zenderplus=0;
	(*zender,*name,*time,*omroep,*dtime,*title) = &ParseNOS($file);
	($pdate) = $title =~ m!\s\w\w\s(\d\d\s\w\w\w)\s\d\d!i; 
	print "\n $title => $pdate\n";
	# maart -> march
	$pdate =~ s/maa/mar/ig;
	print &ParseDate ("$pdate");
	for ($c=0; $c < @time; $c++){
	    # time 24.00 > 00.00
	    $time[$c] =~ s/24(\.\d\d)/00$1/ if ($time[$c] =~ /24\.\d\d/);
	    $time[$c] =~ s/\./:/;
	    $i=$time[$c]." ".$pdate;
	    $time[$c] = &ParseDate ("$i");
	}
	for ($c=0; $c < @name; $c++){
	    if ($time[$c] lt $time[$c+1]){
		$endtime[$c] = $time[$c+1];
	    } else{
		$endtime[$c]=&ParseDate("$pdate $1:$2") if ($dtime[$c] =~ m!\d\d\.\d\d\-(\d\d)\.(\d\d)$!);
	    }
	    if ($zender[$c] ne $laszender){
		$dateplus=0;
		print "\n New Zender no DatePLusplus nie\n";
	    }
	    $endtime[$c]=&DateCalc($endtime[$c],"+1 day") if ($dateplus==1);
	    $time[$c]=&DateCalc($time[$c],"+1 day") if ($dateplus==1);
	    if ($endtime[$c] lt $time[$c]){
		$dateplus++;print "\n new day dawning\n";
		$endtime[$c]=&DateCalc($endtime[$c],"+1 day");
	    }
	    print "$zender[$c] $time[$c]-$endtime[$c] $name[$c] $omroep[$c] $dtime[$c] \n";
	    $laszender=$zender[$c];
	    $endtime = $time[$c+1];
	}	
    }
    for ($c=0; $c < @name; $c++){
	$id[$c]=$zender[$c].$time[$c].$name[$c];
	$localf[$c]=$file;
    }
    @nameurl=@url;
    return \@id, \@name, \@namesub, \@nameurl, \@time, \@endtime, \@zender, \@omroep, \@localf, \@origurl, \@desc;


}

sub ParseNOS {
    my ($file)=@_;
    my ($i,$c,$trc,$j,$desc,$time,$namet,$name,$table);
    my (@tr,@na,@ta,@oa);
    open (FILE, "<$file") || die "Can't open $file" ;
    @lines = <FILE>;
    until ($title) {
	($title)= $lines[$i++] =~ m!<title>(.+)</title>!i;
    }
    until ($table){
	($table) = $lines[$i++] =~ m!(<pre.*>.+</pre>)!i;
    }
    push(@br, $table =~ m!<b[^<]+!gi);
    ($ttpage)=$title=~/nos-TT\s(\d\d\d)/;
    $zender = $engzender{$ttpage};
    print "title:$title zender:$zender\n";
    $brn=@br;
    $c=0;
    for ($k=0; $k < $brn; $k++){
	$i=$br[$k];
	if ($i =~ m!<br>\s+(\d/\d)\s+!){
	    $subn=$1;
	    $zender = $engzender{"$ttpage-$subn"};
	    print " $ttpage-$subn ";
	}
	$dtime=$1 if ($i =~ m!<br>\s+(\d\d\.\d\d\-\d\d\.\d\d)!);
	$time=0;$name=0;
	$time=$1 if ($i =~ m!<br>\s*(\d\d\.\d\d)\s!i);
	$name=$1 if ($i =~ m!<br>\s(.*)!i);
	$name =~ s/$time//;
	$name =~ s/^\s*//;
	$name =~ s/\s*$//;
	$omroep=$1 if ($i =~ m!([A-Z]*)$!);
	$name =~ s/$omroep//;
	$name =~ s/\s*$//;
	if ($time && $name){
	    print "\t$j: $omroep $time:$name $subn $dtime\n";
	    $na[$c]=$name;
	    $ta[$c]=$time;
	    $oa[$c]=$omroep;
	    $sa[$c]=$subn;
	    $za[$c]=$zender;
	    $da[$c]=$dtime;
	    $c++;
	} 
	# soms nog iets op de next line
	if ($name && !$time){
	    if ($br[$k-1] =~ m!<br>\s*(\d\d\.\d\d)!){
		print "extra:$name";
		$na[$c-1].= " $name";
		print $na[$c-1];
	    }
	}
	$j++;
    }
    return \@za,\@na,\@ta,\@oa,\@da,\$title;
}
#end parseNOS


sub ParseBBC {
    my ($file)=@_;
    my ($title,$c,$i,$trc,$j);
    my (@desc,@time,@namet,@name);
    my (@tr);
    open (FILE, "<$file") || die "Can't open $file" ;
    @lines = <FILE>;
    until ($title) {
	($title)= $lines[$i++] =~ m!<title>(.+)</title>!i;
    }
    # get tr's
    $j=0;
    until ($lines[$i] =~ m!</html>!i){
	$j++ if ($lines[$i] =~ m!<tr>!i);
	$tr[$j] .= $lines[$i] if ($lines[$i]);
	$i++;
	if ($i > 10000){`echo meer 10000 in $file|wall`;exit 1};
    }
    #print "\n$title\n";
    $j=0;
    foreach (@tr){
	 s/\n/\t/ig;
    }
    $c=0;$i="";
    #print "------------\n";
    foreach $i (@tr){
	if ($i =~ m!SIZE=-1>\t(.*)\t<br>\t!i){
	    $time[$c]=$1 if ($i =~ m!<b>(\d+:\d+.m)</b>!i);
	    $namet[$c]=$1 if ($i =~ m!SIZE=-1>\t(.*)\t<br>\t!i);
	    $desc[$c]=$1 if ($i =~ m!<br>\t(.+)<br>\t!i);
	    $name[$c]=$1 if ($namet[$c] =~ m!<b>(.*)</b>!i);
	    $name[$c]=~ s!<\/*\w+>!!gi;
	    $namei[$c]=$1 if ($namet[$c] =~ m!<i>(.*)</i>!i); 	 
	    $url[$c]=$1 if ($namet[$c] =~ m!href=\"(.*)\"!i);
	#    print "$time[$c] \t\t $name[$c] \n" if ($namet[$c]);
	    if ($i =~ m!/schedules/images/film.gif!i){
		$name[$c] = "film: ".$name[$c];
	    }
	    $c++;
	}
    }
   # foreach (@name){print;print "-- help --";}
    return \$title,\@name,\@namei,\@url,\@time,\@desc,\@url;
#    return \@name;

}



exit (1);

#read pages.meta
(*urls,*parsed,*fetched,*localf) = &ReadMeta;

foreach $u (@urls){
    print `cat $src$localf{$u}|grep title`;
}

exit (1);

#save pages.meta
foreach $u (@urls){
    print <<GROK;
<page>
    <u>$u</ul>
    <p>$parsed{$u}</p>
    <f>$fetched{$u}</f>
    <l>$localf{$u}</l>
</page>
GROK
}

sub ReadMeta{
    my ($file) = "$metafile"; 
    my ($i,$j,$u,$f,$p);
    my (@item,@urls);
    my (%parsed,%fetched);
    open (FILE, "<$file") || die "Can't open $file" ;
    $i=0;
    while (<FILE>){
	$item[$i] .= $_ if ($_);
	$i++ if ( m!</page>!i );
    }
    $j=0;
    foreach $i (@item) {
	if ($i =~ m!<page>!i){
	    ($u) = $i =~ m!<u>(.+)</u>!i;
	    ($f) = $i =~ m!<f>(.+)</f>!i;
	    ($p) = $i =~ m!<p>(.+)</p>!i;
	    ($l) = $i =~ m!<l>(.+)</l>!i;
	    $urls[$j]=$u if ($u);
	    $parsed{$u}=$p;
	    $fetched{$u}=$f;
	    $localf{$u}=$l;
	    print $j++,": p=$p f=$f url: $u \n";
	    
	}
    } 
    return (\@urls,\%parsed,\%fetched,\%localf);
}

sub InitEng{

%engday = (
	'ma' , 'monday',	
	'di' , 'tuesday',
	'wo' , 'wednesday',
	'do' , 'thursday',
	'vr' , 'friday',
	'za' , 'saturday',
	'zo' , 'sunday',
	);

%nextday = (
        'monday'	,	'tuesday',
        'tuesday'	,	'wednesday',
        'wednesday'	,	'thursday',
        'thursday'	,	'friday',
        'friday'	, 	'saturday',
        'saturday'	,	'sunday',
        'sunday'	,	'monday'
        ); 

%engzender = (
	      '201'	,	'Ned1',
	      '201-1/2'	,	'Ned1',
	      '201-2/2'	,	'Ned1',
	      '201-1/3'	,	'Ned1',
	      '201-2/3'	,	'Ned1',
	      '201-3/3'	,	'Ned1',
	      '202'	,	'Ned2',
	      '202'	,	'Ned2',
	      '202-1/2'	,	'Ned2',
	      '202-2/2'	,	'Ned2',
	      '202-1/3'	,	'Ned2',
	      '202-2/3'	,	'Ned2',
	      '202-3/3'	,	'Ned2',
	      '203'	,	'Ned3',
	      '203-1/2'	,	'Ned3',
	      '203-2/2'	,	'Ned3',
	      '203-1/3'	,	'Ned3',
	      '203-2/3'	,	'Ned3',
	      '203-3/3'	,	'Ned3',
	      '204'	, 	'Ned1',
	      '205'	,	'Ned2',
	      '206'	,	'Ned3',
	      '206-1/2'	,	'Ned3',
	      '206-2/2'	,	'Ned3',
	      '207'	,	'Ned1',
	      '208'	,	'Ned2',
	      '209'	,	'Ned3',
	      '210-1/2'	,	'Wereldomroep',
	      '210'	,	'Wereldomroep',
	      '211'	,	'Ned2',
	      '212'	,	'TV10/SPORT7',
	      '212-1/2'	,	'Fox',
	      '212-2/2'	,	'Disc',	
	      '212-1/3'	,	'FOX',
	      '212-2/3'	,	'FOX',	
	      '212-3/3'	,	'Disc',
	      '212-1/4'	,	'FOX',
	      '212-2/4'	,	'Kinder',	
	      '212-3/4'	,	'Disc',
	      '212-4/4' ,	'Disc',
	      '213'	,	'VOO',
	      '213-1/2'	,	'VOO',
	      '213-2/2'	,	'VOO',
	      '214'	,	'RTL4',
	      '214-1/2'	,	'RTL4',
	      '214-2/2'	,	'RTL4',
	      '215'	,	'RTL5/Eurosport',
	      '215-1'   ,        'RTL5',
	      '215-1/2' ,       'RTL5',
	      '215-2/2' ,       'Eurosport',
	      '216'	,	'SBS6',
	      '216-1/2'	,	'SBS6',
	      '216-2/2'	,	'SBS6',
	      '216-1/3'	,	'SBS6',
	      '216-2/3' ,	'SBS6',
	      '216-3/3' ,	'SBS6',
	);
}
#end initeng





















































































