NAME
MP3::Icecast - Generate Icecast streams, as well as M3U and PLSv2 playlists.
SYNOPSIS
use MP3::Icecast;
use MP3::Info;
use IO::Socket;
my $listen_socket = IO::Socket::INET->new(
LocalPort => 8000, #standard Icecast port
Listen => 20,
Proto => 'tcp',
Reuse => 1,
Timeout => 3600);
#create an instance to find all files below /usr/local/mp3
my $finder = MP3::Icecast->new();
$finder->recursive(1);
$finder->add_directory('/usr/local/mp3');
my @files = $finder->files;
#accept TCP 8000 connections
while(1){
next unless my $connection = $listen_socket->accept;
defined(my $child = fork()) or die "Can't fork: $!";
if($child == 0){
$listen_socket->close;
my $icy = MP3::Icecast->new;
#stream files that have an ID3 genre tag of "jazz"
while(@files){
my $file = shift @files;
my $info = new MP3::Info $file;
next unless $info;
next unless $info->genre =~ /jazz/i;
$icy->stream($file,0,$connection);
}
exit 0;
}
#a contrived example to demonstrate that MP3::Icecast
#can generate M3U and PLSv2 media playlists.
print STDERR $icy->m3u, "\n";
print STDERR $icy->pls, "\n";
$connection->close;
}
ABSTRACT
MP3::Icecast supports streaming Icecast protocol over socket or other filehandle (including STDIN). This is useful for writing a streaming media server.
MP3::Icecast also includes support for generating M3U and PLSv2 playlist files. These are common formats supported by most modern media players, including XMMS, Windows Media Player 9, and Winamp.
SEE ALSO
The Icecast project
http://www.icecast.org
Namp! (Apache::MP3)
http://namp.sourceforge.net
Unofficial M3U and PLS specifications
http://forums.winamp.com/showthread.php?threadid=65772
AUTHOR
Allen Day, E<lt>allenday@ucla.eduE<gt>
COPYRIGHT AND LICENSE
Copyright 2003, Allen Day
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
new
Title : new
Usage : $icy = MP3::Icecast->new(%arg);
Function: create a new MP3::Icecast instance
Returns : an MP3::Icecast object
Args : none
add_directory
Title : add_directory
Usage : $icy->add_directory('/usr/local/mp3');
Function: add a directory of files to be added to the playlist
Returns : true on success, false on failure
Args : a system path
_process_directory
Title : _process_directory
Usage : $icy->_process_directory('/usr/local/mp3');
Function: searches a directory for files to add to the playlist
Returns : true on success
Args : a system path to search for files
add_file
Title : add_file
Usage : $icy->add_file('/usr/local/mp3/meow.mp3')
Function: add a file to be added to the playlist
Returns : true on success, false on failure
Args : a system path
files
Title : files
Usage : @files = $icy->files
Function: returns a list of all files that have been added
from calls to add_file() and add_directory()
Returns : a list of files
Args : none
clear_files
Title : clear_files
Usage :
Function:
Example :
Returns :
Args :
m3u
Title : m3u
Usage : $m3u_text = $icy->m3u
Function: generates an Extended M3U string from the
contents of the list returned by files().
files not recognized by MP3::Info are
silently ignored
Returns : a Extended M3U string
Args : none
pls
Title : pls
Usage : $pls_text = $icy->pls
Function: generates a PLSv2 string from the
contents of the list returned by files().
files not recognized by MP3::Info are
silently ignored.
Returns : a PLSv2 string
Args : none
stream
Title : streamll: 1 at /raid5a/allenday/projects/MP3/Icecast.pm line 459.
Usage : $icy->stream('/usr/local/mp3/meow.mp3',0);
$icy->stream('/usr/local/mp3/meow.mp3',0,$io_handle);
Function: stream an audio file. prints to STDOUT unless a
third argument is given, in which case ->print() is
called on the second argument. An IO::Handle or
Apache instance will work here.
Returns : true on success, false on failure
Args : 1) system path to the file to stream
2) offset in file to start streaming
3) (optional) object to call ->print() on, rather
than printing to STDOUT
_open_file
Title : _open_file
Usage : $fh = $icy->open_file('/usr/local/mp3/meow.mp3');
Function:
Example :
Returns :
Args :
_mangle_path
Title : _mangle_path
Usage : $path = $icy->_mangle_path('/usr/local/mp3/meow.mp3');
Function: applies alias substitutions and prefixes to a system path.
this is intended to be used to create resolvable URLs.
Returns : a string
Args : a system path
_path_escape
Title : _path_escape
Usage :
Function:
Example :
Returns :
Args :
_get_info
Title : _get_info
Usage : $mp3_info = $icy->_get_info($file)
Function: constucts and returns an MP3::Info object. the intended
use here is to access MP3 metadata (from ID3 tags,
filesize, etc).
Returns : a new MP3::Info object on success, false on failure
Args : a system path to a file
alias
Title : alias
Usage : #returns 1
$icy->alias('/home/allenday/mp3' => '/mp3');
#returns '/mp3'
$icy->alias('/home/allenday/mp3');
#returns 1
$icy->alias('/usr/local/share/mp3' => '/share/mp3'); #returns 1
#returns qw(/mp3 /share/mp3)
$icy->alias();
Function: this method provides similar behavior to Apache's Alias directive.
it allows mapping of system paths to virtual paths for usage by,
for instance, a webserver. the mapping is simple: when examining
a file, MP3::Icecast tries to match the beginning of the file's
full path to a sorted list of aliases. the first alias to match
is accepted. this may cause unexpected behavior in the event that
a file's path matches multiple alias entries. patches welcome.
Returns : see Usage
Args : see Usage
prefix
Title : prefix
Usage : $icy->prefix('http://');
Function: prefix all entries in the playlist with this value.
this string is *not* uri or system path escaped.
Returns : value of prefix (a scalar)
Args : on set, new value (a scalar or undef, optional)
postfix
Title : postfix
Usage : $obj->postfix($newval)
Function: postfix all entries in the playlist with this value.
this string is *not* uri or system path escaped.
uri escaped.
Returns : value of postfix (a scalar)
Args : on set, new value (a scalar or undef, optional)
recursive
Title : recursive
Usage : $obj->recursive($newval)
Function: flag determining whether a directory is recursively
searched for files when passed to ::add_directory().
default is false (no recursion).
Example :
Returns : value of recursive (a scalar)
Args : on set, new value (a scalar or undef, optional)
shuffle
Title : shuffle
Usage : $obj->shuffle($newval)
Function:
Example :
Returns : value of shuffle (a scalar)
Args : on set, new value (a scalar or undef, optional)
description
Title : description
Usage : $description = $icy->description('/usr/local/mp3/meow.mp3');
Function: returns a description string of an MP3. this is extracted
from the ID3 tags by MP3::Info. the description format can
be customized, see the description_format() method.
Returns : a description string
Args : a valid system path
description_format
Title : description_format
Usage : $icy->description_format($format_string)
Function:
Returns : value of description_format (a scalar)
Args : on set, new value (a scalar or undef, optional)