CoolRaoul

podfetcher

Jul 26th, 2012
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.55 KB | None | 0 0
  1. #! /opt/bin/perl -w
  2. use strict;
  3.  
  4. use XML::Feed;
  5. use LWP::Simple;
  6. use File::Path;
  7.  
  8. use Fcntl ':mode';
  9.  
  10.  
  11. use open qw(:std :utf8);
  12. binmode(STDOUT, ":utf8");
  13. binmode(STDERR, ":utf8");
  14.  
  15. my $verbose=1;
  16.  
  17. my @jobs;
  18.  
  19.  
  20. while (<>) {
  21.   s/#.*//;          # uncomment
  22.   next if /^\s*$/;      # ignore blank lines
  23.   if (m@^\s*(http://\S+)\s+(.*)\s*$@) {
  24.     push @jobs, [$1,$2];
  25.    } else {
  26.      die "invalid line : $_";
  27.    }
  28. }
  29.  
  30. foreach my $job (@jobs) {
  31.   my ($url, $dir) = @{$job};
  32.   my $feed = XML::Feed->parse(URI->new($url));
  33.   my $feed_title = $feed->title();
  34.   $dir =~ s /%t/$feed_title/g;
  35.   if ( ! -d $dir ) {
  36.     mkpath($dir) or die ("$! creating $dir\n");
  37.   }
  38.  
  39.   for my $entry ($feed->entries()) {
  40.     my $title = $entry->title();
  41.     my $pubdate = $entry->issued();
  42.     my $mp3url = $entry->enclosure()->url();
  43.     my $filename = sprintf("%s/%4.4d-%2.2d-%2.2d-%s.mp3",
  44.               $dir ,
  45.               $pubdate->year(), $pubdate->month(), $pubdate->day(),
  46.               clean_name($title));
  47.     if ( -f $filename ) {
  48.       print STDERR "Skipped $filename\n" if $verbose >=2;
  49.  
  50.     } else {
  51.       print STDERR "Fetching $filename\n" if $verbose;
  52.       if (getstore ($mp3url, "$filename.$$")) {
  53.     rename "$filename.$$", $filename;
  54.     my $mode = (stat($filename))[2];
  55.     $mode |=  S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH;
  56.     chmod $mode, $filename;
  57.       } else {
  58.     unlink "$filename.$$";
  59.       }
  60.     }
  61.     1;
  62.   }
  63.   1;
  64. }
  65.  
  66. sub clean_name {
  67.   my $name=shift;
  68.   $name =~ s{[:\\/]}{_}g;
  69.   $name =~ s/"//g;
  70.   return $name;
  71.  
  72. }
  73. exit:
  74.  
  75. # Local Variables:
  76. # mode: cperl
  77. # End:
Advertisement
Add Comment
Please, Sign In to add comment