Apache-MP3-Skin
view release on metacpan or search on metacpan
package Apache::MP3::Skin;
# Subclasses Apache::MP3::Playlist and through the magic
# of HTML::Template allows Apache::MP3 to be skinned.
use strict;
use HTML::Template;
use Apache::Constants qw(:common REDIRECT HTTP_NO_CONTENT DIR_MAGIC_TYPE);
use constant COVERIMAGE => 'cover.jpg';
use CGI qw(param escape);
use Apache::MP3::Playlist;
use Apache::File ();
use Apache::URI ();
use File::Basename 'dirname','basename';
use vars qw(@ISA $VERSION);
@ISA = 'Apache::MP3::Playlist';
$VERSION = '0.91';
sub process_playlist {
my $self = shift;
my $r = $self->r;
my (@playlist,$changed);
if (my $cookies = CGI::Cookie->parse($r->header_in('Cookie'))) {
my $playlist = $cookies->{playlist};
@playlist = $playlist->value if $playlist;
if ($playlist[-1] &&
$r->lookup_uri($playlist[-1])->content_type ne 'audio/mpeg') {
$self->{possibly_truncated}++;
pop @playlist; # get rid of the last
}
}
if (param('Clear All')) {
@playlist = ();
$changed++;
}
if (param('Clear Selected')) {
my %clear = map { $_ => 1 } param('file') or return HTTP_NO_CONTENT;
@playlist = grep !$clear{$_},@playlist;
$changed++;
}
if (param('Add All to Playlist')) {
my %seen;
@playlist = grep !$seen{$_}++,(@playlist,@{$self->find_mp3s});
$changed++;
}
if (param('Add to Playlist')) {
my $dir = dirname($r->uri);
my @new = param('file') or return HTTP_NO_CONTENT;
my %seen;
# The line below is the only line that's different than SUPER::process_playlist
@playlist = grep !$seen{$_}++,(@playlist,map {(m/^\//) ? "$_" : "$dir/$_" } @new);
$changed++;
}
if (param('Play Selected') and param('playlist')) {
my @uris = param('file') or return HTTP_NO_CONTENT;
return $self->send_playlist(\@uris);
}
if (param('Shuffle All') and param('playlist')) {
return HTTP_NO_CONTENT unless @playlist;
return $self->send_playlist(\@playlist,'shuffle');
}
if (param('Play All') and param('playlist')) {
return HTTP_NO_CONTENT unless @playlist;
return $self->send_playlist(\@playlist);
}
if ($changed) {
my $c = CGI::Cookie->new(-name => 'playlist',
-value => \@playlist);
tied(%{$r->err_headers_out})->add('Set-Cookie' => $c);
(my $uri = $r->uri) =~ s!playlist\.m3u$!!;
$self->path_escape(\$uri);
$r->err_header_out(Location => $uri);
return REDIRECT;
}
$self->playlist(@playlist);
return;
}
sub run {
my $self = shift;
my $r = $self->r;
if (param('Shuffle Selected')) {
return HTTP_NO_CONTENT unless my @files = param('file');
$self->shuffle(\@files);
my $uri = dirname($r->uri);
$self->send_playlist([map { (m/^\//) ? "$_" : "$uri/$_" } @files]);
return OK;
}
return $self->SUPER::run();
}
# override the list_directory in Apache::MP3, see if there's a skin file.
# if there's a skin file, we'll handle it otherwise pass it back (SUPER)
# to Apache::MP3
sub list_directory {
my $self = shift;
my $dir = shift;
return DECLINED unless my ($directories,$mp3s,$playlists)
= $self->read_directory($dir);
if ($self->r->header_only) {
$self->r->send_http_header('text/html');
return OK;
}
my $skin = $self->get_skin_path($dir);
if ($skin) {
$self->r->send_http_header('text/html');
# open the html template
my $template = HTML::Template->new(filename => $skin, die_on_bad_params=>0, loop_context_vars=>1);
$self->set_template_params($template, $dir, $directories, $mp3s);
# print the template
my $page = $template->output;
#add the javascript tag
my $script_tag = "<SCRIPT language=\"JavaScript\" src=\"".$self->default_dir."/apache_mp3_skin.js\"></SCRIPT>";
$page =~ s!(</HEAD[^>]*>)!$script_tag$1!oi;
( run in 0.982 second using v1.01-cache-2.11-cpan-6aa56a78535 )