> #!/usr/bin/perl
> #
> # tv2html.pl - Einfache Skript zum konvertieren von
> # Programmseiten nach HTML mit Hilfe des Video::Capture::V4l
> # Interface von Marc Lehmann
> #
> use Video::Capture::V4l;
> use Video::Capture::VBI;
> 
> package Decoder;
> 
> use Video::Capture::VBI;
> 
> # Hier wird vom Videotext-Dekoder "geerbt"
> use base 'Video::Capture::VBI::VT';
> 
> my ($morgens, $vormittags, $mittags, $nachmittags, $abends, $nachts);
> my (@morgens, @vormittags, @mittags, @nachmittags, @abends, @nachts);
> 
> 
> # Diese Seiten sollen aus dem TV-Programm extrahier werden...
> my %seite = (
>   morgens => [0x301,\$morgens,\@morgens],
>   vormittags => [0x302,\$vormittags,\@vormittags],
>   mittags => [0x303,\$mittags,\@mittags],
>   nachmittags => [0x304,\$nachmittags,\@nachmittags],
>   abends => [0x305,\$abends,\@abends],
>   nachts => [0x306,\$nachts,\@nachts],
> );
> 
> # Umlaute nach HTML wandeln
> sub umlaute2html {
>   my ($line) = @_;
>   $line =~ s/ä/\&auml;/g;
>   $line =~ s/ö/\&ouml;/g;
>   $line =~ s/ü/\&uuml;/g;
>   $line =~ s/ß/\&szlig;/g;
>   $line =~ s/Ä/\&Auml;/g;
>   $line =~ s/Ö/\&Ouml;/g;
>   $line =~ s/Ü/\&Uuml;/g;
> 
>   return $line;
> }
> 
> # Zähler fuer die gefundenen Seiten...
> my $index = 0;
> 
> # Überladene Methode enter_page aus dem VBI.pm - Modul
> sub enter_page {
>    my($self,$page)=@_;
>    my $sub = $page->{ctrl} & VTX_SUB;
> 
>    # nur die angegebenen Seiten aus dem Videotext extrahieren...
> 
>    foreach(keys(%seite)) {
>     if(($page->{page}==$seite{$_}->[0]) && ($seite{$_}->[1] != 1)) {
>       for($y=0;$y<25;$y++) {
>         my @zeile = decode_vtpage $page->{packet}[$y];
>         push(@{$seite{$_}->[2]},@zeile);
>       }
>       $seite{$_}->[1] = 1;
>       $index++;
>     }
>    }
> 
>    if($index == 6)
> {
>      # HTML Ausgabe beginnen...
>      print <<EOFHTML;
> 
>      <HTML><HEAD><TITLE>YOUR PER(sona)L TV</TITLE></HEAD>
>      <BODY BGCOLOR="#ffffff">
>      <H1>ZDF-Tagesprogramm</H1>
>      <H2>Einfaches Videotext nach HTML Beispielprogramm
>       basierend auf dem Video::Capture::V4l-Modul von Marc
> Lehmann</H2>
>      <H3>Von <A HREF="mailto:ramon\@wartala.de">Ramon
> Wartala<A>, <A
> HREF="mailto:astrid\@wonner.de">Astrid
>  Wonner</A></H3>
>      <HR>
>      <TABLE WIDTH=100% BORDER=1>
> EOFHTML
> 
>      # Wenn alle Seiten gefunden wurden, dann der Reihenfolge nach die HTML
>      # Seite erzeugen
> 
>      foreach $zeit ("morgens", "vormittags", "mittags", "nachmittags",
>                     "abends", "nachts") {
>        my @seite = @{$seite{$zeit}->[2]};
>        foreach $zeile( @seite ) {
>        #print $zeile,"\n";
>        if($zeile =~ /^(\s+)(\d\d)\.(\d\d)(\s+)(.*)/) {
>          print "<TR><TD>\n";
>          print $2,":",$3," Uhr<\/TD><TD>",umlaute2html($5),"\n";
>        }
>        if($zeile =~ /^(\s+)(\d\d\d\d)(.*)(\d\d\d)/) {
>          print &umlaute2html($3),"\n";
>          print "<\/TD><\/TR>\n";
>        }
>      }
>      } # foreach $zeit
> 
>      # HTML Seite beendet!
>      print "<\/TABLE><HR>\n";
>      print "<I>Automatisch erzeugt von <B>tv2html<\/B><\/I>\n";
>      print "<\/BODY><\/HTML>\n";
> 
>      exit(0);
>    }
> }
> 
> sub enter_packet {
>    my $packet = $_;
> }
> 
> package main;
> 
> $vbi = new Video::Capture::V4l::VBI or die;
> 
> $vbi->backlog(25);
> 
> $vt = new Decoder;
> 
> #
> # Endlosschleife fuer den Durchlauf durch alle Videotextseiten
> # Beendet wird sie mit dem exit in "enter_page"
> for(;;) {
>    $vt->feed(decode_field $vbi->field, VBI_VT) while $vbi->queued;
> }