попробуй онбновись и отпиши результат.. все ли исправилось...
Ты проверку в терминалах поставил только на те ивенты, на которые модуль подписан? Это лишним не будет. Но проблема в том, что после обращения с терминала в системе начинает при say генериться ещё и sayto, что терминалы и обрабатывают (что правильно). Я не понимаю, откуда это SAYTO начинает лезть((
Вот, вроде, нашёл. В функции SAY после запуска processSubscriptionsSafe('SAY', array('level' => $level, 'message' => $ph, 'member_id' => $member_id, 'ignoreVoice'=>$ignoreVoice));
ищутся все терминалы онлайн с дроидом или googlehomenotifier и им рассылается SAYTO:
$terminals=SQLSelect("SELECT NAME FROM terminals WHERE (IS_ONLINE=1 AND MAJORDROID_API=1) OR PLAYER_TYPE='googlehomenotifier'");
$total=count($terminals);
for($i=0;$i<$total;$i++) {
sayToSafe($ph, $level, $terminals[$i]['NAME']);
}
Но у меня в терминалах
так а с каким типом терминала проблема? или со всеми?
если с теми двумя типами что ты вспоминал выше, то да это так и есть - тут надо редактировать функцию сей. НО странно то что терминалы на сей функцию не подписаны - и они не должны затрагивать воспроизведение функции сей
Что меня напрягло, что в терминалах хоть и написано // main play instruction with generate message for terminals when not installed TTS идёт рассылка на терминал, у которого не установлена галка Может проигрывать медиа
не напрягайся я хотел написать что если мы не получаем кешированый файл звука то генерируем свой
как оказалось DebMes('Total - '.$total);
if (!$total){
DebMes('Total - '.$total);
return;
}
DebMes('Total 1- '.$total);
for($i=0;$i<$total;$i++) {
//sayToSafe($ph, $level, $terminals[$i]['NAME']);
} н
не причем ..
нашел причину, но не нашел где она работает...
во всем виновата где то команда playMedia
и больше всего в паттернах ПУ
Вот сюда у меня прилетает из терминалов playMedia(гуглофайл,'phone',true), где phone - терминал с дроидом без возможности проигрывания медиа
function playMedia($path, $host = 'localhost', $safe_play = FALSE) {
if(defined('SETTINGS_HOOK_PLAYMEDIA') && SETTINGS_HOOK_PLAYMEDIA != '') {
eval(SETTINGS_HOOK_PLAYMEDIA);
}
if(!$terminal = getTerminalsByName($host, 1)[0]) { //пробуем найти терминал по имени
$terminal = getTerminalsByHost($host, 1)[0]; // иначе пробуем через айпи
}
if(!$terminal['ID']) { //не нашли
$terminal = getTerminalsCanPlay(1)[0]; //возьмём тот, который умеет играть медиа
}
if(!$terminal['ID']) { //не нашли
$terminal = getMainTerminal(); //возьмём главный терминал
}
if(!$terminal['ID']) { //не нашли
$terminal = getAllTerminals(1)[0]; //возьмём любой
}
if(!$terminal['ID']) { //не нашли
return 0; //уйдём ни с чем
}
include_once(DIR_MODULES.'app_player/app_player.class.php');
$player = new app_player();
$player->terminal_id = $terminal['ID']; //отправим в плеер
$player->command = ($safe_play?'safe_play':'play');
$player->param = $path;
$player->ajax = TRUE;
$player->intCall = TRUE;
$player->usual($out);
return $player->json['success'];
}
и меня сюда завели исследования - а вот getMainTerminal() с этим надо бы разобратся - что за главный терминал...
16:37:49 0.36131700 Executing (exclusive): start c:/_majordomo/apps/autoitv3/AutoIt3.exe C:_majordomo\htdocs/rc/scripts/vlc_play.au3 " 'http://192.168.1.22/cms/cached/voice/29 ... google.mp3'"
16:37:47 0.52731400 Executing (exclusive): start c:/_majordomo/apps/autoitv3/AutoIt3.exe C:_majordomo\htdocs/rc/scripts/vlc_close.au3
16:37:42 0.06429000 Executing (exclusive): C:_majordomo\htdocs/rc/madplay.exe C:_majordomo\htdocs/cms/sounds/dingdong.mp3
16:37:41 0.88429000 Терминалы отправили - http://192.168.1.22/cms/cached/voice/29 ... google.mp3
16:37:41 0.05928900 External context response:
Это воспроизводит слово капец (xray) Появилось сие после обновления.Открывается несколько окон VLC и с отставанием повторяет , причем может пол слова .
Если спросить о погоде , откроется до десятка окон VLC и из всех фраз будет повторятся только пару.Похоже на каждую фразу окно VLC.Часть открывается и закрывается сразу, часть висит.
из плейМедиа это передается в апп_плеер
а там проверяется терминал на canplay, и если нет(а в моём случае - нет) -- вызывается главный терминал.
if(!$terminal['CANPLAY']) {
$terminal = getMainTerminal();
И получается мой случай:
Итого:
1.приходит SAY
В этой функции:
Когда две тётки - одна штатная оффлайновая Татьяна, а другая - гундосая из Гугла, наперебой лопочут одно и то же -- очень противно!
Мне кажется, что-то тут не правильно, но думать об этом уже не могу((
пункт 3 не запускается продебаж его и удостоверишся...
п.3 отрабатывает
22:18:56 0.93581400 say sayToSafe ph=добрый вечер!! terminal=phone ---- тут в say
22:18:56 0.76280400 sayToSafe $url http://127.0.0.1:80/objects/?sayTo=1&ph=%D0%B4%D0%... --- тут в sayToSafe
22:18:56 0.55179200 Executing (exclusive): C:_majordomo\htdocs/rc/madplay.exe C:_majordomo\htdocs/cms/sounds/dingdong.mp3
22:18:56 0.26677600 cscript to cache C:_majordomo\htdocs/cms/cached/voice/sapi_d2c949ad13f299dd17e861e5623fae88.mp3
насчет главного, по умолчанию это сервер (MAIN Server (+media: mpd))
https://github.com/sergejey/majordomo/blob/2ac5773...
в сэй добавил
$terminals=SQLSelect("SELECT NAME FROM terminals WHERE (IS_ONLINE=1 AND MAJORDROID_API=1) OR PLAYER_TYPE='googlehomenotifier'");
$total=count($terminals);
for($i=0;$i<$total;$i++) {
sayToSafe($ph, $level, $terminals[$i]['NAME']);
debmes('say sayToSafe ph='.$ph.' terminal='.$terminals[$i]['NAME']); //////////////////////////////////////////////////////////
}
в sayToSafe
function sayToSafe($ph, $level = 0, $destination = '') {
$data=array(
'sayTo'=>1,
'ph'=>$ph,
'level'=>$level,
'destination'=>$destination,
);
$url=BASE_URL.'/objects/?'.http_build_query($data);
if (is_array($params)) {
foreach($params as $k=>$v) {
$url.='&'.$k.'='.urlencode($v);
}
}
debmes('sayToSafe $url'.$url); /////////////////////////////////////////////////////////////////
$result = getURLBackground($url,0);
return $result;
to Logrus
ну да. У меня на нем проигрываются все сообщения say, а теперь туда по описанной логике перенаправляется воспроизведение для терминала phone без медиа(((
так это у тебя терминал с дроид апи и или гуглхомнотифиер?
Заметил, что есть два
\htdocs\lib\terminals.class.php
и
\htdocs\modules\terminals\terminals.class.php
в lib это лишнее уже давно...
вставь в \htdocs\modules\terminals\terminals.class.php
вместо - DebMes ('Терминалы отправили - '.$cached_filename);
playMedia($cached_filename, $target, true);
это и попробуй
$terminals=SQLSelect("SELECT ID FROM terminals WHERE NAME = "'.$target.'" AND ((IS_ONLINE=1 AND MAJORDROID_API=1) OR PLAYER_TYPE='googlehomenotifier'"));
if ($terminals){
return;
}
DebMes ('Терминалы отправили - '.$cached_filename);
playMedia($cached_filename, $target, true);
Ой SQLSelect замени на SQLSelectOne
то tarasfrompir (2018-11-04 22:38:30)
да, у меня терминал с дроид, без возможности проигрывать медиа.
И сейчас на него приходит tts для проговаривания + из терминалов на него через плэймедиа() шлётся гуглофайл мп3, который перенаправляется в апп_плеере на МЭЙН )))
Может, в терминалах сделать, чтобы гуглофайл или кэш рассылался только на те терминалы, у которых нет дроида(они не проговаривают tts) и у которых есть возможность проигрывать медиа?
согласен вполне - но я еще одну ошибку отлавливал и она связана с патернами ПУ....
Ну а это что у тебя - да ....
Опробуй предложенные изменения выше и если все исчезнет - то подам реквест...
Ато у меня не на чем опробовать...
то tarasfrompir (2018-11-04 22:45:28):
Это будет работать, если такой терминал один(( Но мысль верная.
Повторюсь:
Может, в терминалах сделать, чтобы гуглофайл или кэш рассылался только на те терминалы, у которых нет дроида(они не проговаривают tts) и у которых есть возможность проигрывать медиа?
Вроде, логично?
по большому счету надо из функции сей выпилить рассылку на терминалы ...
Но давай не будем заглядывать далеко -
и еще поскольку каждый терминал отрабатывает в цикле -то достаточно таких изменений... что предложены выше...
поэтому прошу еще раз - опробуй такие изменения - и если все окей то буду реквестить...
предлагаю в терминалы добавить
//...
// check the level message for nigth or darknest mode
if ( $minMsgLevel >= $levelMes ){
//add this
//предполагается, что терминал приходит именем или хостом
if(!$terminal = getTerminalsByName($target, 1)[0]) {
$terminal = getTerminalsByHost($target, 1)[0];
}
//если терминал не найден или с дроидом или не может играть медиа выход
if(!$terminal[ID] || $terminal[MAJORDROID_API]==1 || $terminal[CANPLAY] == 0) {
return;
}
//...
Исправление применил, восстановил подписку терминалов на SAYTO, перезагрузился, тестирую, пока всё ок.
кстати по твоему красивше написано - это и вставлю - но вот по скорости обработки данных данный вариант тяжелее поскольку делает как минимум два запроса в базу - а мой только один. что в общем на оптимизацию всего мажордомо плохо сказывается..... я думаю что уже для всяких малинок-калинок вопрос должен начинать подниматся. поскольку оптимизация желает оставлять лучшего... НО это мысли в слух - поскольку сам писатель еще тот
Тарас, но мы же не сдадимся ;)
никогда и ни за что - кроме как победим - тогда сдадимся - но об этом можна и не мечтать
реквест принят - опробуйте
Ок, попробую.
Второй запрос - на случай, если терминал айпишником пришёл. А так - тоже один))
А можно вообще в терминалы засылать minMsgLevel на sayReply/sayTo?
Что бы там уже смотреть говорить или просто текст выводить?
У меня сейчас все терминалом болтается и это никак не отключить
Вроде в новой альфе появилась настройка уровня, но "автоматом" ее менять не получается и
она не шлет даже в текст в терминалы при "не том уровне"
ну если вам не нужно воспроизводить а только в чат - то пользуйте простой сей
Мне надо воспроизводить на терминале так как терминал единственное средство общение с системой
А сейчас если что то спросить даже через телегу оно приезжает и в телегу, и текстом на терминал + голос туда же
Пожалуйста, войдите в систему, чтобы добавлять комментарии Присоединиться!