1

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

Этот пхп-скрипт выводит плейлист треков, которые необходимо поставить в начале СЛЕДУЮЩЕГО за текущим часом.
Для интеграции с сэмом можно использовать функции 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;
?>

2

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

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

3

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

Спасибо, будет время - потестим.