tarasfrompir

<<< Назад

Очередь сообщений в терминалах (через таймер) (УЖЕ в Альфе)

Создание очереди сообщений для терминалов через таймер (не доведено до ума)

На сегодня полностью реализация переписана - блог несет чисто информативный характер....!!!!!!
Надумался я тут сделать очередь для сообщений в терминалах - поскольку она как фактически отсутствует..
Предварительные испытания показывают - что все нормально...

Не решено - получение текущего проигрываемого файла и его позиции - НА СЕГОДНЯ это вопросы к теримналам.
Время сообщения - решаемо через ФФМПЕГ. (Уже РЕШЕНО)....

Изменения для терминалов
Строку в файле 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
}

Обсуждение (5) (6)

Пирятин, Украина

На форуме: tarasfrompir1