#!/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 < /video/epg.data # # See the main source file 'vdr.c' for copyright information and # how to reach the author. # # $Id: epg2html 2.2 2013/03/04 12:13:11 kls Exp $ @Index = (); ($Charset = $ENV{LANG}) =~ s/^[^.]*\.?(.*)/$1/; $Charset = "utf-8" unless $Charset || $ENV{LANG} == 'C'; 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; $s =~ s/>/>/g; return $s; } while (<>) { chomp; if (/^C ([^ ]+) *(.*)/) { my $Channel = $2; (my $Page = $Channel) =~ y/\/ /-_/; $Page .= ".htm"; $Channel = Tags($Channel); push(@Index, qq{<a href="$Page">$Channel</a><br>\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); $Description =~ s/\|/<br>/g; } 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, "</table>\n") if ($Day && @Schedule); push(@Schedule, "<h2>$d</h2>\n"); push(@Schedule, "<table cellspacing=2>\n"); $Day = $d; } my $Entry = $Title; $Entry .= "<br><i>$Subtitle</i>" if $Subtitle; $Entry .= "<br>$Description" if $Description; $Entry .= "<br>(VPS = " . scalar localtime($Vps) . ")" if $Vps && $Vps != $t; push(@Schedule, "<tr><td valign=top>" . GetTime($t) . "</td><td>$Entry</td></tr>\n"); } push(@Schedule, "</table>\n") if (@Schedule); open(PAGE, ">$Page") or die "$Page: $!\n"; print PAGE "<html>\n"; print PAGE "<head>\n"; print PAGE "<title>$Channel</title>\n"; print PAGE "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=$Charset\">\n"; print PAGE "</head>\n"; print PAGE "<body>\n"; print PAGE "<h1>$Channel</h1>\n"; print PAGE @Schedule; print PAGE "</body>\n"; print PAGE "</html>\n"; close(PAGE); last; } } } } open(INDEX, ">index.htm") or die "index.htm: $!\n"; print INDEX "<html>\n"; print INDEX "<head>\n"; print INDEX "<title>EPG Index</title>\n"; print INDEX "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=$Charset\">\n"; print INDEX "</head>\n"; print INDEX "<body>\n"; print INDEX sort { lc($a) cmp lc($b) } @Index; print INDEX "</body>\n"; print INDEX "</html>\n"; close(INDEX);