#!/usr/bin/perl -w # # Playlist Builder # # Send bug reports to Eric Wieling # # Yeah, I know the programming style looks like C. Deal with it. # # Usage: buildplay.pl [options] # -datafile Read from "file" instead of STDIN # -nostamp Don't add time information to playlist # -musicdir Location of .mp3 files # -all All put all songs in playlist sub randomize(@) { my $array = shift; my $i; for ($i = @$array; --$i; ) { my $j = int rand ($i+1); next if $i == $j; @$array[$i,$j] = @$array[$j,$i]; }; }; #use strict; use Getopt::Long; use POSIX; use MP3::Info; use diagnostics; #my $datafile; #my $musicdir; #my $all; #my $nostamp; #my $line; #my $filename; #my $type; #my $record; #my $time; #my $length; #my $file_info; #my $hour; #my $min; #my $sec; #my $timestr; #my @rawlist; #my @misc; #my @new_age; #my @trance; #my @hard; #my @playlist; GetOptions("datafile=s" => \$datafile, "musicdir=s" => \$musicdir, "nostamp" => \$nostamp, "all" => \$all); if (!defined($musicdir)) { $musicdir = "../mp3s"; }; if (!defined($datafile)) { open(DATAFILE, "<& STDIN"); } else { open(DATAFILE, "< $datafile") || die "Cannot open $datafile"; }; while($line = ) { chop($line); ($filename, $type) = split(",", $line); if (!defined($filename) || !defined($type)) { printf("Error in datafile: %s\n", $line); next; }; push(@rawlist, [ $filename, $type ]); }; close(DATAFILE); if (defined($all)) { foreach $record (@rawlist) { ($filename, $type) = @$record; printf("%s\n", $filename); }; exit 0; }; randomize( \@rawlist ); randomize( \@rawlist ); randomize( \@rawlist ); foreach $record (@rawlist) { ($filename, $type) = @$record; $file_info = get_mp3info("$musicdir/$filename"); if (!defined($file_info)) { printf("Bad mp3 file: %s\n", $filename); next; }; $length = ($file_info->{"MM"} * 60) + $file_info->{"SS"}; if ($type eq "misc") { push(@misc, [ $filename, $length ]); next; }; if ($type eq "ambient") { push(@ambient, [ $filename, $length ]); next; }; if ($type eq "new age") { push(@new_age, [ $filename, $length ]); next; }; if ($type eq "dance") { push(@dance, [ $filename, $length ]); next; }; if ($type eq "trance") { push(@trance, [ $filename, $length ]); next; }; if ($type eq "hard") { push(@hard, [ $filename, $length ]); next; }; if ($type eq "rock") { push(@rock, [ $filename, $length ]); next; }; if ($type eq "start") { push(@start, [ $filename, $length ]); next; }; printf("Bad type: %s\n", $type); exit 1; }; undef @rawlist; $time = 0; ($filename, $length) = @{pop(@start)}; push(@playlist, $filename); $time = $time + $length; while ($time < 14400) { if (!defined($nostamp)) { $timestr = sprintf("----------- %s -----------", strftime("%a %I:%M %p", gmtime($time+86400+72000))); push(@playlist, $timestr); }; ($filename, $length) = @{pop(@new_age)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@misc)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@dance)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@trance)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@trance)}; push(@playlist, $filename); $time = $time + $length; }; while ($time < 28800) { if (!defined($nostamp)) { $timestr = sprintf("----------- %s -----------", strftime("%a %I:%M %p", gmtime($time+86400+72000))); push(@playlist, $timestr); }; ($filename, $length) = @{pop(@new_age)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@trance)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@trance)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@trance)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@hard)}; push(@playlist, $filename); $time = $time + $length; }; while ($time < 43200) { if (!defined($nostamp)) { $timestr = sprintf("----------- %s -----------", strftime("%a %I:%M %p", gmtime($time+86400+72000))); push(@playlist, $timestr); }; ($filename, $length) = @{pop(@new_age)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@new_age)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@trance)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@trance)}; push(@playlist, $filename); $time = $time + $length; }; while ($time < 72000) { if (!defined($nostamp)) { $timestr = sprintf("----------- %s -----------", strftime("%a %I:%M %p", gmtime($time+86400+72000))); push(@playlist, $timestr); }; ($filename, $length) = @{pop(@ambient)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@new_age)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@ambient)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@new_age)}; push(@playlist, $filename); $time = $time + $length; }; while ($time < 82800) { if (!defined($nostamp)) { $timestr = sprintf("----------- %s -----------", strftime("%a %I:%M %p", gmtime($time+86400+72000))); push(@playlist, $timestr); }; ($filename, $length) = @{pop(@rock)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@rock)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@rock)}; push(@playlist, $filename); $time = $time + $length; ($filename, $length) = @{pop(@rock)}; push(@playlist, $filename); $time = $time + $length; }; if (!defined($nostamp)) { $timestr = sprintf("----------- %s -----------", strftime("%a %I:%M %p", gmtime($time+86400+72000))); push(@playlist, $timestr); }; foreach $record (@playlist) { printf("%s\n", $record); }; exit 0;