Blame scripts/conplay

Packit c32a2d
#!/usr/bin/env perl
Packit c32a2d
Packit c32a2d
# Hacked by Thomas Orgis, use at your leisure.
Packit c32a2d
Packit c32a2d
use strict;
Packit c32a2d
use locale;
Packit c32a2d
Packit c32a2d
use File::Basename qw(basename dirname);
Packit c32a2d
Packit c32a2d
my @mpg123_command = qw(mpg123 --continue -Cv --rva-album);
Packit c32a2d
my $listfile = "conplay.m3u";
Packit c32a2d
my $glob = '*.mp[123]';
Packit c32a2d
Packit c32a2d
my $dir = shift;
Packit c32a2d
Packit c32a2d
unless(defined $dir)
Packit c32a2d
{
Packit c32a2d
	print STDERR "\nThis little wrapper runs $mpg123_command[0] on a given directory (hand in '.' for the current one), playing all $glob files therein in terminal control mode. The extra trick is that a playlist file ($listfile by default) is read and updated (created) with the position you left playback at (via 'q' key), to return on next invokation.\n";
Packit c32a2d
	print STDERR "\nIf you give an existing file instead of a directory, or some non-existing path, as first and only paramter, it is used as playlist name and the directory part is used as the base directory for playback.\n";
Packit c32a2d
	print STDERR "\nThe name stands for CONtinued PLAYback. What did you think?;-)\n\n";
Packit c32a2d
	exit;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
if(-f $dir or (not -e $dir))
Packit c32a2d
{
Packit c32a2d
	$listfile = basename($dir);
Packit c32a2d
	$dir = dirname($dir);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
chdir($dir) or die "Cannot enter $dir ($!)!\n";
Packit c32a2d
Packit c32a2d
print STDERR "Playing things in: $dir\n";
Packit c32a2d
Packit c32a2d
my @files;
Packit c32a2d
my $entry = 1;
Packit c32a2d
my $frame = 0;
Packit c32a2d
Packit c32a2d
if(-e $listfile)
Packit c32a2d
{
Packit c32a2d
	open(LIST, '<', $listfile) or die "Cannot read playlist ($!)!\n";
Packit c32a2d
	while(<LIST>)
Packit c32a2d
	{
Packit c32a2d
		chomp;
Packit c32a2d
		unless(/^#/)
Packit c32a2d
		{
Packit c32a2d
			push(@files, $_);
Packit c32a2d
		}
Packit c32a2d
		elsif(/^#\s*current entry:\s*(\d+)$/)
Packit c32a2d
		{
Packit c32a2d
			$entry = $1;
Packit c32a2d
		}
Packit c32a2d
		elsif(/^#\s*current frame:\s*(\d+)$/)
Packit c32a2d
		{
Packit c32a2d
			$frame = $1;
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	close(LIST);
Packit c32a2d
}
Packit c32a2d
else
Packit c32a2d
{
Packit c32a2d
	@files = get_files($glob);
Packit c32a2d
	write_list();
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
unless(@files)
Packit c32a2d
{
Packit c32a2d
	print STDERR "There are no files to play.\n";
Packit c32a2d
	exit;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
if($entry < 0 or $entry > @files or $frame < 0)
Packit c32a2d
{
Packit c32a2d
	die "You got bad data in your playlist file (mismatch between current entry and total count, bad frame index). Clean that up.\n";
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
push(@mpg123_command, '-k', $frame, '--listentry', $entry, '-@', $listfile);
Packit c32a2d
print STDERR "running player:\n\t@mpg123_command\n\n";
Packit c32a2d
Packit c32a2d
open(MPG123, '-|', @mpg123_command) or die "Cannot run mpg123!";
Packit c32a2d
while(<MPG123>)
Packit c32a2d
{
Packit c32a2d
	print STDOUT $_;
Packit c32a2d
	if(/^\[CONTINUE\]\s+track\s+(\d+)\s+frame\s+(\d+)/)
Packit c32a2d
	{
Packit c32a2d
		$entry = $1;
Packit c32a2d
		$frame = $2;
Packit c32a2d
	}
Packit c32a2d
	if(/^\[BOOKMARK\]\s+track\s+(\d+)\s+frame\s+(\d+)/)
Packit c32a2d
	{
Packit c32a2d
		print STDERR "\nGot bookmark at track $1, frame $2; not yet doing anything with that, besides storing.\n";
Packit c32a2d
		$entry = $1;
Packit c32a2d
		$frame = $2;
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
close(MPG123);
Packit c32a2d
Packit c32a2d
if($entry > @files)
Packit c32a2d
{
Packit c32a2d
	$entry = 0;
Packit c32a2d
	$frame = 0;
Packit c32a2d
}
Packit c32a2d
print STDERR "Continue point is in track $entry, frame $frame.\n";
Packit c32a2d
write_list();
Packit c32a2d
Packit c32a2d
sub write_list
Packit c32a2d
{
Packit c32a2d
	unless(@files)
Packit c32a2d
	{
Packit c32a2d
		print STDERR "Refusing to write empty playlist.\n";
Packit c32a2d
		return;
Packit c32a2d
	}
Packit c32a2d
	open(LIST, '>', $listfile) or die "Cannot write Playlist";
Packit c32a2d
	print LIST "#M3U\n";
Packit c32a2d
	print LIST "#current entry: $entry\n";
Packit c32a2d
	print LIST "#current frame: $frame\n";
Packit c32a2d
	for my $f (@files)
Packit c32a2d
	{
Packit c32a2d
		print LIST "$f\n";
Packit c32a2d
	}
Packit c32a2d
	close(LIST);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
sub get_files
Packit c32a2d
{
Packit c32a2d
	my $glob = shift;
Packit c32a2d
	my @files;
Packit c32a2d
	open(FIND, '-|', 'find', '.', '-type', 'f', '-name', $glob) or die "Cannot exec find to find files: ($!)\n";
Packit c32a2d
	@files = <FIND>;
Packit c32a2d
	close(FIND);
Packit c32a2d
	chomp(@files);
Packit c32a2d
	return sort @files;
Packit c32a2d
}