use strict; use warnings; use Parallel::ForkManager; use LWP::Simple; use DateTime; use Fatal qw( unlink rename ); use subs qw( main download_all_shows download_show System ); use vars qw( $MAXJOBS @SHOWS $BASEURL ); sub SUNDAY () { 1 } sub MONDAY () { 2 } sub TUESDAY () { 3 } sub WEDNESDAY () { 4 } sub THURSDAY () { 5 } sub FRIDAY () { 6 } sub SATURDAY () { 7 } @SHOWS = ( { name => "Fubar Omniverse", dow => FRIDAY, files => [ "fubar-1.rm", "fubar-2.rm" ], }, { name => "Groove Garden", dow => SATURDAY, files => [ "groove-1.rm", "groove-2.rm" ], }, { name => "Radio Riot", dow => MONDAY, files => [ "rad_riot-1.rm", "rad_riot-2.rm" ], }, { name => "Strictly Butter", dow => SATURDAY, files => [ "strikbut-1.rm", "strikbut-2.rm" ], }, { name => "Louisiana Rhythms", dow => FRIDAY, files => [ "la_rhthm-1.rm", "la_rhthm-2.rm", ], }, ); $| = 1; $MAXJOBS = 2; $BASEURL = "http://helix.kfai.org/ramgen/replay/"; main; exit; sub main { download_all_shows shows => \ @SHOWS; return 1; } sub download_all_shows { my %p = @_; my $manager = Parallel::ForkManager->new( $MAXJOBS ); for my $show ( @{$p{shows}} ) { for my $file ( @{$show->{files}} ) { my $pid = $manager->start and next; download_show name => $show->{name}, dow => $show->{dow}, file => $file; $manager->finish; } } } sub download_show { my %p = @_; my $file = $p{file}; my $name = $p{name}; my $dow = $p{dow}; my $dt = DateTime->now; # Don't download the show if it airs today. I don't know when it # goes online but I'm guessing that it happens sometime during the # day. return if $dt->dow == $dow; my ( $year, $week ); if ( not $file =~ /(?<=-)(\d+)/ ) { die "Hey! Frumius shit in $file!"; } else { # 1: current week # 2: last week my $weeks_old = $1 - 1; if ( $dow > $dt->dow ) { # If the show airs later in the week, then the week must # be the one prior to whatever I'm in. ++ $weeks_old; } if ( $weeks_old ) { # Move the time back the right # of weeks. my $adj = DateTime::Duration->new( weeks => $weeks_old ); $dt->subtract_duration( $adj ); } # Now ask for the $year = $dt->year; $week = $dt->week_number; return if $dt->dow == $dow; } my ( $wav_file, $mp3_file ); for ( $wav_file, $mp3_file ) { $_ = $file; s/(?<=-)\d+\.rm/$year-$week./ } $wav_file .= "wav"; $mp3_file .= "mp3"; return if -e $mp3_file; my $url = "$BASEURL$file"; my ( $real_url ) = get( $url ) =~ /([^\r\n]+)/; -e $wav_file and unlink $wav_file; print "Downloading $wav_file\n"; eval { System "mplayer -really-quiet -nojoystick -nolirc -prefer-ipv4 -ao pcm -vc dummy -vo null -aofile $wav_file $real_url"; 1; } or do { unlink $wav_file; die $@; }; print "Converting $wav_file -> $mp3_file\n"; eval { System "lame --silent --ty $year --tt '\Q$name\E' --ta '\Q$name\E' --tn $week -h '\Q$wav_file\E' '\Q$mp3_file\E'"; 1; } or do { unlink $wav_file; die $@; }; -e $wav_file and unlink $wav_file; print "Done with $mp3_file\n"; 1; } sub System { 0 == system @_ or die "@_ exit code: @{[$?>>8]}. Signal: @{[$>&127]}." . ( $?&128 ? " Core dumped" : "" ) . "\n"; }