+#!/usr/bin/perl
+use LWP::Simple;
+use XML::Twig;
+use strict;
+
+my $id = shift;
+
+my $xml = get("http://video.google.com/timedtext?hl=en&v=$id&type=track&name=&lang=en");
+
+my $t = XML::Twig->new(
+ twig_roots => { 'text' => \&convert_text }
+);
+
+$t->parse($xml);
+
+my $sub_count = 0;
+
+sub ent_decode {
+ local $_ = shift;
+ s/&#(\d+);/chr($1)/ge;
+ return $_;
+}
+
+sub timecode {
+ my $n = shift;
+ my $in = int($n);
+ my $frac = ($n - $in) * 1000;
+ my $s = $in % 60;
+ my $m = int($in / 60) % 60;
+ my $h = int($in / 3600);
+ return sprintf("%02d:%02d:%02d,%03d", $h, $m, $s, $frac);
+}
+
+sub convert_text {
+ my ($t, $elt) = @_;
+ my $start = $elt->att('start');
+ my $end = $elt->att('start') + $elt->att('dur');
+
+ $sub_count++;
+
+ print "$sub_count\n";
+ print timecode($start), ' --> ', timecode($end), "\n";
+ print ent_decode($elt->first_child_text);
+ print "\n\n";
+
+ $elt->purge();
+}