#!/usr/bin/perl # A simple EPG to HTML converter # # Converts the EPG data written by 'vdr' into the file /video/epg.data # into a simple HTML programme listing, consisting of one file per channel # plus an 'index.htm' file. All output files are written into the current # directory. # # Usage: epg2html.pl < /video/epg.data # # See the main source file 'vdr.c' for copyright information and # how to reach the author. # # $Id: epg2html.pl 1.5 2004/02/22 13:18:27 kls Exp $ @Index = (); sub GetDay { return substr(localtime(shift), 0, 10); } sub GetTime { return substr(localtime(shift), 11, 5); } sub Tags { my $s = shift; $s =~ s/\&/&/g; $s =~ s//>/g; return $s; } while (<>) { chomp; if (/^C ([^ ]+) *(.*)/) { my $Channel = $2; (my $Page = $Channel) =~ y/\/ /-_/; $Page .= ".htm"; $Channel = Tags($Channel); push(@Index, qq{$Channel
\n}); my %Events = (); while (<>) { if (/^E (.*?) (.*?) ([^ ]*)/) { (my $Time, $Duration) = ($2, $3); my $Title = "", $Subtitle = "", $Description = "", $Vps = 0; while (<>) { if (/^T (.*)/) { $Title = Tags($1); } elsif (/^S (.*)/) { $Subtitle = Tags($1); } elsif (/^D (.*)/) { $Description = Tags($1); } elsif (/^V (.*)/) { $Vps = $1; } elsif (/^e/) { $Events{$Time} = [($Duration, $Title, $Subtitle, $Description, $Vps)]; last; } } } elsif (/^c/) { my @Schedule = (); my $Day = ""; for $t (sort keys %Events) { (my $Duration, $Title, $Subtitle, $Description, $Vps) = @{$Events{$t}}; my $d = GetDay($t); if ($d ne $Day) { push(@Schedule, "\n") if ($Day && @Schedule); push(@Schedule, "

$d

\n"); push(@Schedule, "\n"); $Day = $d; } my $Entry = $Title; $Entry .= "
$Subtitle" if $Subtitle; $Entry .= "
$Description" if $Description; $Entry .= "
(VPS = " . scalar localtime($Vps) . ")" if $Vps && $Vps != $t; push(@Schedule, "\n"); } push(@Schedule, "
" . GetTime($t) . "$Entry
\n") if (@Schedule); open(PAGE, ">$Page") or die "$Page: $!\n"; print PAGE "\n$Channel\n\n"; print PAGE "

$Channel

\n"; print PAGE @Schedule; print PAGE "\n\n"; close(PAGE); last; } } } } open(INDEX, ">index.htm") or die "index.htm: $!\n"; print INDEX "\nEPG Index\n\n"; print INDEX sort { lc($a) cmp lc($b) } @Index; print INDEX "\n\n"; close(INDEX);