Июн 16 2009

Perl скрипт для Ices

Ices очень простая, но в то же время очень эффективная программа для проигрывания музыки на Icecast, пример настройки я приводил в статье IceCast2 и Ices0 — строим интернет радио, но в той статье я описывал проигрывание файлов из директории случайным образом, все хорошо, но подобная схема не даст гибко обновлять мелодии в директории для проигрывания, в данной схеме прийдется прервать вещание для того, что бы обновить список мелодий, но можно задействовать возможность Ices использовать вызовы скриптов для получения списка мелодий в директории для проигрывания.
Теперь файл настроек Ices будет выглядеть так:

<?xml version="1.0"?>
<ices:Configuration xmlns:ices="http://www.icecast.org/projects/ices">
<Playlist>
<!-- Эта опция теперь не нужна -->
<File>playlist.txt</File>
<Randomize>1</Randomize>
<!-- Для перлового скрипта указываем perl -->
<Type>perl</Type>
<!-- Имя файла который будет обрабатываться перловым интерпретатором
    файл обязательно должен иметь расширение pm -->
<Module>ices</Module>
</Playlist>
<Execution>
<Background>1</Background>
<Verbose>0</Verbose>
<BaseDirectory>/tmp</BaseDirectory>
</Execution>
<Stream>
<Server>
<!-- Сервер на который мы будем отправлять поток -->
<Hostname>89.252.34.107</Hostname>
<Port>8000</Port>
<Password>source-pass</Password>
<Protocol>http</Protocol>
</Server>
<!-- Точка монтирования на сервере и описание нашего потока -->
<Mountpoint>/ices</Mountpoint>
<Name>Default stream</Name>
<Genre>Default genre</Genre>
<Description>Default description</Description>
<URL>http://89.252.34.107:8000/</URL>
<Public>0</Public>
<!-- Настройка передаваемого потока -->
<Bitrate>128</Bitrate>
<Reencode>0</Reencode>
<Channels>2</Channels>
</Stream>
</ices:Configuration>

А перловый скрипт будет такой:

#!/usr/bin/perl -w
#Процедура инициализации, обычно тут вызываются все листинги директории с файлами, 
#подключения к базам и тд и тп
sub ices_init {
print "Perl subsystem Initializing:\n";
return 1;
}
#Процедура завершения работы ices, тут желательно закрыть все соединения из скрипта
#и тому подобное
sub ices_shutdown {
print "Perl subsystem shutting down:\n";
}
#А вот это и есть процедура получения нового трека для проигрывания
#Мы каждый раз перечитываем всю директорию, на тот случай
#на тот случай если появились новые треки для проигрывания на радио
sub ices_get_next {
print "Perl subsystem quering for new track:\n";
#chomp $music[2];
$num=`/bin/ls /home/test/*.mp3 | /usr/bin/wc -l`;
@music=`/bin/ls -1 /home/test/*.mp3`;
$play=int(rand($num));
chomp $music[$play];
return $music[$play];
}
 
# Процедура получения информации о треке, для вывода в плеере
sub ices_get_metadata {
use MP3::Info;
$tag = get_mp3tag($file) or die "No TAG info";
return "$tag->{TITLE} ";
}
 
#
sub ices_get_lineno {
return 1;
}

Скрипт необходимо разместить в /usr/local/etc/modules/
Конечно при большом количестве треков в директории скрипт будет тратить значительное время на получения трека, но для гибкости обновления все же стоит его использовать.

  • By zyat, 27.06.2010 @ 23:48

    А как потом обновлять плейлист?

  • By hilik, 28.06.2010 @ 09:43

    Залить новые звуковые файлы в директорию и скрипт их, после того, как текущая песня доиграет, подхватит.

  • By zyat, 13.08.2010 @ 21:18

    Так как это понимать?

    «Скрипт необходимо разместить в /usr/local/etc/modules/» и
    «Залить новые звуковые файлы в директорию и скрипт их»

    Можно ответ по яснее написать?

  • By hilik, 14.08.2010 @ 23:41

    В скрипте описана директория для mp3 файлов, в нее и загружаются файлы. В общем все.

  • By zyat, 16.08.2010 @ 02:34

    /usr/local/etc/rc.d/ices0: WARNING: failed to start ices0

    Всё перепробовал, нечего не помогает.

Other Links to this Post


Украинская Баннерная Сеть