ОсновноеRadiotalkПользовательское
Общие вопросы по интернет радио вещанию
6   •   Посмотреть все темы

Автоматизация эфира: проигрывание свежих подкастов.

 

94
chedim @chedim
Этот пхп-скрипт выводит плейлист треков, которые необходимо поставить в начале СЛЕДУЮЩЕГО за текущим часом.
Для интеграции с сэмом можно использовать функции WebToFile и Queue.AddList.

Скрипт написан в основном с одной целью: ставить свежие подкасты в эфир.

<?
error_reporting(E_NONE);

/*
скрипт возвращает список адресов, которые необходимо поставить после часовой отбивки.
Адреса хранятся в MySQL-таблице:
DROP TABLE IF EXISTS `local`.`timer`;
CREATE TABLE `local`.`timer` (
`time` int(10) unsigned NOT NULL default '0',
`name` varchar(512) NOT NULL,
`day` varchar(3) NOT NULL default '0',
`id` int(10) unsigned NOT NULL auto_increment,
`type` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
поле time: порядковый номер часа (1-24), в который необходимо поставить файл
поле name: адрес файла (url или локальный)
поле day: трехбуквенное обозначения дня недели, в который ставить файл (или ALL, если каждый день)
поле id: номер записи :)
поле type: тип файла (0 - звуковой файл, 1 - rss-файл подкаста)
*/

mysql_connect('host', 'user', 'pass');
mysql_select_db('database');

$day = date('D');

$time = date('G')+1;
$query = "SELECT * FROM `timer` WHERE (`time` = '$time' OR `time` = 0) AND (`day` = '$day' or `day` = 'ALL')";
$res = mysql_query($query) or die(mysql_error());

$ret = '';
while ($ln = mysql_fetch_array($res)) {
if ($ln['type'] == 1) {
$i = 0;
$rss = simplexml_load_file($ln['name']);
$urls = $rss->xpath('//enclosure');
$addr = (is_array($urls[$i]['url'])) ? $urls[$i++]['url'][0] : $urls[$i]['url'];
$i++;
while(($i < count($urls)) && (($url = checkUrl("$addr")) === false)) {
$addr = (is_array($urls[$i]['url'])) ? $urls[$i++]['url'][0] : $urls[$i]['url'];
$i++;
};
if ($url) {
if ($ret) $ret .= "\r\n".$url;
else $ret = $url;
}
} else {
if ($ln['name']) {
if ($ret) $ret .= "\r\n".$ln['name'];
else $ret = $ln['name'];
}
}
}

function checkUrl($url) {
if (stristr($url, '.mp3?')) $adr = array_shift(explode('.mp3?', $url)).'.mp3';
elseif(is_array($url)) $adr = $url[0];
else $adr = $url;
$headers = get_headers($adr, 1);
if (@isset($headers['Location'])) {
return checkUrl($headers['Location']);
}
if (@isset($headers['Content-Length']) && ($headers['Content-Length'] == 0)) return false;
if (@isset($headers['Content-Type']) && (!strstr($headers['Content-Type'], 'audio'))) return false;
return $adr;
}

echo $ret;
?>

94
chedim @chedim
Кстати, мысль: при помощи данного скрипта можно автоматически выводить в эфир диджеев по расписанию. Для этого достаточно в поле name в таблице указать ссылку на аудиопоток диджея (именно на поток, а не на плейлист!!! для IceCast эта ссылка выглядит так: ********** - БЕЗ .m3u!!!). Сэм сможет подключиться к этому потоку и начать его проигрывать.
Плюсы данного метода вывода диджеев в эфир:
- диджеи выходят по расписанию
- диджеи выводятся без артефактов в виде резкого переключения музыки.
- перед выходом диджея в эфир можно поставить джингл, открывающий его программу (для этого нужно немного изменить sql-запрос в скрипте, дописав к нему " ORDER BY `id`").
- если диджея не оказалось в эфире, то сэм это учтет и сразу начнет проигрывать следующий трек.

2605
Александр @AlexIT
Спасибо, будет время - потестим.