#!/usr/bin/perl -w
use strict;
use warnings;

use Time::HiRes qw(time sleep);

use File::Basename;

if (@ARGV == 0 || $ARGV[0] =~ /^-/) {
	die "usage: ".basename($0)." time_limit_mins time_sleep_secs [dir ...]\n";
}

my ($time_limit_mins, $time_sleep_secs, @dirs) = @ARGV;
my $dirs = \@dirs;

my $shuffle_dirs = 1;
my $shuffle_files = 1;
my $player = "mp -volume 20";
my $blank_reset_time = 3;

my @filesets;

sub shuffle {
	my $ary = $_[0];
	my @out;
	while (@$ary) {
		my $i = int rand(@$ary);
		push @out, splice @$ary, $i, 1;
	}
	return \@out;
}

$dirs = shuffle $dirs if $shuffle_dirs;
for my $dir (@$dirs) {
	my $dh;
	opendir $dh, $dir or die "can't open dir $dir";
	my $files = [grep { !/^\./ && -f $_ } map { "$dir/$_" } readdir $dh];
	closedir $dh;
	$files = shuffle $files if $shuffle_files;
	push @filesets, $files;
}

my $start = time();
my $end = $start + $time_limit_mins * 60;

while (1) {
	@filesets = grep { @$_ } @filesets;
	last if !@filesets;
	for my $files (@filesets) {
		my $f = shift @$files;
		print "$f\n";
		system "$player \Q$f\E" if $player;
		goto done if time() > $end;
		if ($time_sleep_secs < $blank_reset_time) {
			sleep $time_sleep_secs;
		} else {
			sleep 0.1;
			system "xset s activate";
			sleep $time_sleep_secs - $blank_reset_time - 0.1;
			system "xset s reset";
			sleep $blank_reset_time;
		}
	}
}
done:

