#!/usr/bin/perl
# Time-stamp: "2008-06-12 12:52:53 ADT"
# See http://www.interglacial.com/rss/ for info on RSS feeds

use strict;
use warnings;
use constant DEBUG => $ENV{'MAILTO'} ? 0 : 3;
$|++;
use XML::RSS::SimpleGen 12;

my $src = "fresh_air.dat";
snare_src();
xsl($src, 'fresh_air_simpler_rss.xsl' => 'fresh_air.xml');
xsl($src, 'fresh_air_just_urls.xsl'   => 'fresh_air.txt');
xsl($src, 'fresh_air_guts.xsl'        => 'fresh_air.ini');

xsl($src, 'fresh_air_m3u.xsl'         => 'fresh_air.m3u');
xsl($src, 'fresh_air_m3u8.xsl'        => 'fresh_air.m3u8');
xsl($src, 'fresh_air_pls.xsl'         => 'fresh_air.pls');

xsl($src, 'fresh_air_linklist_html.xsl' => 'fresh_air_mp3s.html');

DEBUG and print "Done.\n";


#===========================================================================
sub xsl {
  my($from, $style, $to) = @_;
  my $temp = $to . "#";
  my $cmd = "xmlstarlet tr $style $from > $temp";
  DEBUG > 1 and print "Running $cmd\n";
  if( 0 == system($cmd) ) {
    DEBUG > 5 and print "Went okay: $cmd\n";
  } else {
    die "Error while running $cmd -- $?";
  }

  # Swap in the temp file if it's any different.
  if(-e $to and -s $to == -s $temp) {
    my($x,$y) = map {;
      open my $In, "<", $_ or die "Can't read-open $_: $!";
      local $/;
      my $x = <$In>;
      close $In;
      $x;
    } $to, $temp;
    if($x eq $y) {
      DEBUG and print "No need to update $to\n";
      unlink($temp) || die "Can't unlink $temp !?!  $!";
    } else {
      unlink($to) || die "Can't unlink $to ?!  $!";
      rename($temp, $to) || die "Can't rename $temp to $to !?!  $!";
    }
  } else {
    rename($temp, $to);
    DEBUG and print " $to is ready\n";
  }
  chmod 0644, $to;
  DEBUG and print "\n";
  return;
}

#===========================================================================

sub snare_src {
  my $xml = get_url( my $u = 'http://www.npr.org/rss/podcast.php?id=13' );

  DEBUG > 20 and print "Got from $u : \n{{\n", $xml, "\n}}\n";

  die "Aberrant XML from $u !?\n{{\n$xml\n}}\n"
    unless $xml =~ m/\A<\?xml version=/;

  # we don't -g this, so it's just the first title, the show title:
  $xml =~ s@<title>NPR: Fresh Air Podcast</title>@<title>Fresh Air mp3s</title>@;

  # And now the story titles:
  $xml =~ s@<title>NPR: ([-0-9]+) Fresh Air</title>@<title>Fresh Air $1</title>@g;

  open my $Out, ">", $src or die "Can't write-open $src : $!";
  binmode($Out);
  print $Out $xml;
  close($Out);
  return;
}

__END__

