Создание очереди сообщений для терминалов через таймер
На сегодня полностью реализация переписана - блог несет чисто информативный характер....!!!!!!
Надумался я тут сделать очередь для сообщений в терминалах - поскольку она как фактически отсутствует..
Предварительные испытания показывают - что все нормально...
Не решено - получение текущего проигрываемого файла и его позиции - НА СЕГОДНЯ это вопросы к теримналам.
Время сообщения - решаемо через ФФМПЕГ. (Уже РЕШЕНО)....
Изменения для терминалов
Строку в файле terminals.class.php
Для функции СейТУ
315 - $this->terminalSayByCache($terminal_rec, $filename, $details['level']);
заменит на - $this->terminalSayByCacheQueue($terminal_rec,$details['level'],$filename);
Вот код функции
/**
* очередь сообщений
*
* @access public
*/
function terminalSayByCacheQueue($target, $levelMes, $cached_filename) {
// berem vse soobsheniya po urovnyu
$l_level_mesage = SQLSelect("SELECT * FROM jobs WHERE TITLE LIKE'".'sayTo-timers-'.$target['TITLE'].'-level-'.$levelMes.'-number-'."%' ORDER BY `TITLE` , 'RUNTIME'");
/// last mesage for levelmes
$last_mesage = max(array_column($l_level_mesage,'TITLE'));
// opredelyaem posledniy nomer soobsheniya esli ih netu to poluchim #001
$pos = strripos($last_mesage, '-');
$last_number = substr($last_mesage, $pos+1)+1;
if ($last_number<1 ){
$last_number='001';
} else if ($last_number<10 ) {
$last_number='00'.$last_number;
} else {
$last_number='0'.$last_number;
}
// poluchaem adress cashed files dlya zapuska ego na vosproizvedeniye
if (preg_match('/\/cms\/cached.+/',$cached_filename,$m)) {
$server_ip = $this->getLocalIp();
if (!$server_ip) {
DebMes("Server IP not found", 'terminals');
return false;
} else {
$cached_filename='http://'.$server_ip.$m[0];
}
} else {
DebMes("Unknown file path format: " . $cached_filename, 'terminals');
return false;
}
// esli net soobsheniy dlya takogo urovnya to sozdaem pervoe s takim urovnem
if (!$last_mesage) {
$time_shift = $this->getDurationSeconds($cached_filename); // тут надо получить всремя сообщения через ффмпег
DebMes("Create first mesage",'terminals');
addScheduledJob('sayTo-timers-'.$target['TITLE'].'-level-'.$levelMes.'-number-'.$last_number, "playMedia('".$cached_filename."', '".$target['TITLE']."');", time()+1, $time_shift);
} else {
// esli soobsheniya sushestvuyut to vstavlayem svoe poslednim po spisku s uchetom urovnya soobsheniya
$time_shift = $this->getDurationSeconds($cached_filename); // тут надо получить всремя сообщения через ффмпег
DebMes("Add new message".$last_mesage,'terminals');
addScheduledJob('sayTo-timers-'.$target['TITLE'].'-level-'.$levelMes.'-number-'.$last_number, "playMedia('".$cached_filename."', '".$target['TITLE']."');", time()+100, $time_shift);
}
// vibiraem vse soobsheniya dla terminala s sortirovkoy po nazvaniyu
$all_messages = SQLSelect("SELECT * FROM jobs WHERE TITLE LIKE'".'sayTo-timers-'.$target['TITLE'].'-level-'.'%-number-'."%' ORDER BY `TITLE`");
$first_fields = reset($all_messages);
$runtime = (strtotime($first_fields['RUNTIME']));
DebMes($runtime);
foreach ($all_messages as $message) {
$expire = (strtotime($message['EXPIRE']))-(strtotime($message['RUNTIME']));
$rec['ID'] = $message['ID'];
$rec['TITLE'] = $message['TITLE'];
$rec['COMMANDS'] = $message['COMMANDS'];
$rec['RUNTIME'] = date('Y-m-d H:i:s', $runtime);
$rec['EXPIRE'] = date('Y-m-d H:i:s', $runtime+$expire);
$runtime = $runtime + $expire;
SQLUpdate('jobs', $rec);
}
DebMes("Timers sorted",'terminals');
}
/**
* Get duration in seconds of media file from ffmpeg
* @param $file
* @return bool|string
*/
function getDurationSeconds($file){
if (!defined('PATH_TO_FFMPEG')) {
if (IsWindowsOS()) {
define("PATH_TO_FFMPEG", SERVER_ROOT.'/apps/ffmpeg/ffmpeg.exe');
} else {
define("PATH_TO_FFMPEG", 'ffmpeg');
}
}
$dur = shell_exec(PATH_TO_FFMPEG." -i ".$file." 2>&1");
if(preg_match("/: Invalid /", $dur)){
return false;
}
preg_match("/Duration: (.{2}):(.{2}):(.{2})/", $dur, $duration);
if(!isset($duration[1])){
return false;
}
$hours = $duration[1];
$minutes = $duration[2];
$seconds = $duration[3];
return $seconds + ($minutes*60) + ($hours*60*60)+3; // zadergka eksperementalnaya
}