#!/usr/bin/perl #H# Plays random files using the xplay script. If no args select all files from #H# current dir. Else select file name from given args. #H# This program will bundle together files that contain (part #). #H# #H# If called as "vnrxplay" it will do on-the-fly volume normalization. # print out help info if requested if ($ARGV[0] eq "-h" || $ARGV[0] eq "--help" || $ARGV[0] eq "help") { open (SELF, $0); while () { if ($_ =~ /^#H# /) { $_ =~ s/^#H# //; print $_; } } exit; } # ANSI colors... $Black= "\e[0;30m"; $Red= "\e[0;31m"; $Green= "\e[0;32m"; $Yellow="\e[0;33m"; $Blue= "\e[0;34m"; $Purple="\e[0;35m"; $Cyan= "\e[0;36m"; $White= "\e[0;37m"; # Do normalizing if called as vnrxplay if ($0 =~ /vnr.play$/) { $XplayParams="-ac mp3, -af volnorm=2"; } else { } # allow for rmr?play $RemoveFile="N"; if ($0 =~ /rmrtplay/) { $Xplay="tplay"; $RemoveFiles="Y"; } elsif ($0 =~ /rmrvplay/) { $Xplay="vplay"; $RemoveFiles="Y"; } elsif ($0 =~ /rmrxplay/) { $Xplay="xplay"; $RemoveFiles="Y"; } elsif ($0 =~ /rmoplay/) { $Xplay="oplay"; $RemoveFiles="Y"; } if ($RemoveFiles eq "Y") { print "WARNING!!! You are telling this program to remove files after it plays them regardless of what happens during playback!!!\n"; print "If you don't want to do this hit ^C right now.\n"; print "If you are sure you want to do this then hit enter now."; $Input=<>; chomp $Input; if ($Input ne "") { die "You hit something other than enter.\n"; } } # allow for tplay if ($0 =~ /rtplay/) { $Xplay="tplay"; } elsif ($0 =~ /rvplay/) { $Xplay="vplay"; } elsif ($0 =~ /roplay/) { $Xplay="oplay"; } else { $Xplay="xplay"; } @Files=(); srand; if ($#ARGV < 1) { open (FILELIST, "/bin/ls |"); while () { if ($_ !~ /\.md5$/) { if ($_ !~ /\.par2$/) { if ($_ !~ /\.par$/) { if ($_ !~ /\.txt$/) { push (@Files, $_); } } } } } close (FILELIST); } else { @Files=@ARGV; } chomp @Files; $NumFiles=$#Files; $ArrayPos=0; while ($ArrayPos <= $NumFiles) { if ($Files[$ArrayPos] =~ /part 1\)\./) { $EndFound="N"; $NextArrayPos=$ArrayPos+1; $Part=1; while ($EndFound ne "Y") { $Part++; if ($Files[$NextArrayPos] =~ /part $Part\)\./) { $Files[$ArrayPos]="$Files[$ArrayPos]+++$Files[$NextArrayPos]"; splice (@Files,$NextArrayPos,1); } else { $EndFound="Y"; } } } $ArrayPos++; } $NumFiles=$#Files; $ArrayPos=0; while ($ArrayPos <= $NumFiles) { if ($Files[$ArrayPos] =~ /part 01\)\./) { $EndFound="N"; $NextArrayPos=$ArrayPos+1; $Part=1; while ($EndFound ne "Y") { $Part++; $PaddedPart = sprintf("%02d", $Part); if ($Files[$NextArrayPos] =~ /part $PaddedPart\)\./) { $Files[$ArrayPos]="$Files[$ArrayPos]+++$Files[$NextArrayPos]"; splice (@Files,$NextArrayPos,1); } else { $EndFound="Y"; } } } $ArrayPos++; } $NumFiles=$#Files; print "$White"; $PlayedCount=0; while ($NumFiles >= 0) { $DisplayNumFiles=$NumFiles; $NumFiles=$NumFiles+1; $FileNum=int(rand($NumFiles)); $File=$Files[$FileNum]; $File =~ s/\*$//; $File =~ s/\@$//; $File =~ s/\/$//; $DisplayFileName=$File; $DisplayFileName =~ s/.*\///; $PlayedCount++; if ($File =~ /\+\+\+/) { @MultiPart=split (/\+\+\+/,$File); $NumParts=$#MultiPart; foreach $File (@MultiPart) { print "${Yellow}Playing $File ($PlayedCount/$DisplayNumFiles) (+$NumParts parts)...$White\n"; #system qq[xtermcontrol --title "$DisplayFileName ($PlayedCount/$DisplayNumFiles) (+$NumParts parts)"]; $NumParts=$NumParts-1; #sleep 1; if ($XplayParams =~ /volnorm/ && $File =~ /ac3/) { system qq[$Xplay "$File" -af volume=20:1,volnorm=2 > /dev/null]; #system qq[$Xplay "$File" -af volume=20:1,volnorm=2]; } else { system qq[$Xplay "$File" $XplayParams > /dev/null]; #system qq[$Xplay "$File" $XplayParams]; } if ($RemoveFiles eq "Y") { system qq[/bin/rm -v "$File"]; sleep 2; } } } else { print "${Green}Playing $File ($PlayedCount/$DisplayNumFiles)...$White\n"; #system qq[xtermcontrol --title "$DisplayFileName ($PlayedCount/$DisplayNumFiles)"]; sleep 1; if ($XplayParams =~ /volnorm/ && $File =~ /ac3/) { system qq[$Xplay "$File" -ac mp3, -af volume=20:1,volnorm=2 > /dev/null]; #system qq[$Xplay "$File" -ac mp3, -af volume=20:1,volnorm=2]; } else { system qq[$Xplay "$File" $XplayParams > /dev/null]; #system qq[$Xplay "$File" $XplayParams]; } if ($RemoveFiles eq "Y") { system qq[/bin/rm -v "$File"]; sleep 2; } } splice (@Files,$FileNum,1); $NumFiles=$#Files; } #system "xtf";