[Модуль] DLNA (app_dlna)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Аватара пользователя
Hold
Сообщения: 57
Зарегистрирован: Пн окт 16, 2017 4:11 pm
Благодарил (а): 81 раз
Поблагодарили: 5 раз

Re: [Модуль] DLNA

Сообщение Hold » Вт мар 27, 2018 9:05 am

fandaymon писал(а): Потом в phpmyadmin в таблице settings найти HOOK_EVENT_SAY и поставить у rhvoice priority=50
По идее теперь когда Мажордомо будет что-то произносить, то RHVoice закеширует сообщение, а DLNAVoice отправит этот файл на DLNA устройство. Но конечно всё это умозрительно и надо пробовать
Файл подредактирвал, директорию создал и закинул его, как инсталлировать? Файл installed тоже копировать? И не смог найти в phpmyadmin таблицу settings и HOOK_EVENT_SAY :)

Спустя пару часов ...
Модуль появился в списке приложений, приоритет так и не поставил.
Пока файл редактировал и кидал в малину, 2 раза обрушил все из за синтаксиса, помогло удаление папки dlnavoice и
sudo php /var/www/html/cycle.php :D
fandaymon
Сообщения: 1570
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Модуль] DLNA

Сообщение fandaymon » Вт мар 27, 2018 11:49 am

А в чём проблема таблицу найти? База данных называется DB_Terminal, на второй странице есть таблица settings
Аватара пользователя
Hold
Сообщения: 57
Зарегистрирован: Пн окт 16, 2017 4:11 pm
Благодарил (а): 81 раз
Поблагодарили: 5 раз

Re: [Модуль] DLNA

Сообщение Hold » Вт мар 27, 2018 12:37 pm

fandaymon писал(а):А в чём проблема таблицу найти?
Дак я туда заходил 1 раз когда образ поставил, пароль поменять и все.
Поменял, сейчас попробую что выйдет.

Видимо до вечера из дома, работа ...
fandaymon
Сообщения: 1570
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Модуль] DLNA

Сообщение fandaymon » Вт мар 27, 2018 1:43 pm

Приоритет можно и сценарием поменять

Код: Выделить всё

$rec = SQLSelectOne("SELECT * FROM settings WHERE NAME = 'HOOK_EVENT_SAY'");
$data = json_decode($rec['VALUE'], true);
$data['rhvoice']['priority'] = 50;
$rec['VALUE']       = json_encode($data);
SQLUpdate('settings', $rec); 
За это сообщение автора fandaymon поблагодарил:
Hold (Вт мар 27, 2018 2:13 pm)
Рейтинг: 1.16%
Аватара пользователя
Hold
Сообщения: 57
Зарегистрирован: Пн окт 16, 2017 4:11 pm
Благодарил (а): 81 раз
Поблагодарили: 5 раз

Re: [Модуль] DLNA

Сообщение Hold » Вт мар 27, 2018 7:30 pm

fandaymon писал(а):Приоритет можно и сценарием поменять
Так проще.

Вот с кодом в модуле загвоздка
Изменил то что ранее обсуждалось, а что убрать не ясно.
И в Before SAY (code): не нужно же ничего писать?
В таком виде не работает.

Код: Выделить всё

<?php

/**
 * rhvoice 
 * @package project
 * @author Dark_Veter <veter.dark@gmail.com>
 * @copyright Dark_Veter (c)
 * @version 0.1 (wizard, 15:03:33 [Mar 14, 2016])
 */
//
//
class dlnavoice extends module {

    /**
     * rhvoice
     *
     * Module class constructor
     *
     * @access private
     */
    function dlnavoice() {
        $this->name = "dlnavoice";
        $this->title = "DLNAVoice";
        $this->module_category = "<#LANG_SECTION_APPLICATIONS#>";
        $this->checkInstalled();
}

    /**
     * saveParams
     *
     * Saving module parameters
     *
     * @access public
     */
    function saveParams($data = 0) {
        $p = array();
        if (IsSet($this->id)) {
            $p["id"] = $this->id;
        }
        if (IsSet($this->view_mode)) {
            $p["view_mode"] = $this->view_mode;
        }
        if (IsSet($this->edit_mode)) {
            $p["edit_mode"] = $this->edit_mode;
        }
        if (IsSet($this->tab)) {
            $p["tab"] = $this->tab;
        }
        return parent::saveParams($p);
    }

    /**
     * getParams
     *
     * Getting module parameters from query string
     *
     * @access public
     */
    function getParams() {
        global $id;
        global $mode;
        global $view_mode;
        global $edit_mode;
        global $tab;
        if (isset($id)) {
            $this->id = $id;
        }
        if (isset($mode)) {
            $this->mode = $mode;
        }
        if (isset($view_mode)) {
            $this->view_mode = $view_mode;
        }
        if (isset($edit_mode)) {
            $this->edit_mode = $edit_mode;
        }
        if (isset($tab)) {
            $this->tab = $tab;
        }
    }

    /**
     * Run
     *
     * Description
     *
     * @access public
     */
    function run() {
        global $session;
        $out = array();
        if ($this->action == 'admin') {
            $this->admin($out);
        } else {
            $this->usual($out);
        }
        if (IsSet($this->owner->action)) {
            $out['PARENT_ACTION'] = $this->owner->action;
        }
        if (IsSet($this->owner->name)) {
            $out['PARENT_NAME'] = $this->owner->name;
        }
        $out['VIEW_MODE'] = $this->view_mode;
        $out['EDIT_MODE'] = $this->edit_mode;
        $out['MODE'] = $this->mode;
        $out['ACTION'] = $this->action;
        $this->data = $out;
        $p = new parser(DIR_TEMPLATES . $this->name . "/" . $this->name . ".html", $this->data, $this);
        $this->result = $p->result;
    }

    /**
     * BackEnd
     *
     * Module backend
     *
     * @access public
     */
    function admin(&$out) {
        $this->getConfig();
        $out['VOICE']=$this->config['VOICE'];
        $out['USE_SPD']=$this->config['USE_SPD'];
        $out['USE_CACHE']=$this->config['USE_CACHE'];
        if (!$out['VOICE']) {
            $out['VOICE'] = 'Anna+CLB';
        }
        if ($this->view_mode == 'update_settings') {
            global $voice;
            $this->config['VOICE']=$voice;
            global $use_spd;
            $this->config['USE_SPD']=$use_spd;
            global $use_cache;
            $this->config['USE_CACHE']=$use_cache;

            $this->saveConfig();
            $this->redirect("?");
        }
    }

    /**
     * FrontEnd
     *
     * Module frontend
     *
     * @access public
     */
    function usual(&$out) {
        $this->admin($out);
    }

    function processSubscription($event, &$details) {
        $this->getConfig();
        if ($event == 'SAY' && !$details['ignoreVoice']) {
            $level = $details['level'];
            $message = $details['message'];
            if ($level >= (int) getGlobal('minMsgLevel') && !IsWindowsOS()) {
                $out = '';
                $voice=$this->config['VOICE'];
                $use_spd = $this->config['USE_SPD'];
                $use_cache = $this->config['USE_CACHE'];
                if ($use_spd) {
                    safe_exec('spd-say "'.$message.'" -w -y ' . $voice, 1, $out);
                } else {
                 if ($use_cache) {
                   $cached_filename = 'cached/voice/rh_' . md5($message) . '.wav';
                   if (!file_exists($cached_filename)) 
                        $url='http://192.168.2.74/'.$cached_filename; 
            sg('MultiCastKitchen.playUrl',$url);
                                  } 
                }
                $details['ignoreVoice'] = 1;
            }
            //...
        }
    }

    /**
     * Install
     *
     * Module installation routine
     *
     * @access private
     */
    function install($data = '') {
        subscribeToEvent($this->name, 'SAY');
        parent::install();
    }
    
    /**
     * Uninstall
     *
     * Module deinstallation routine
     *
     * @access private
     */    
    function uninstall() {
        unsubscribeFromEvent($this->name, 'SAY');
        parent::uninstall();
    }

// --------------------------------------------------------------------
}

/*
*
* TW9kdWxlIGNyZWF0ZWQgTWFyIDE0LCAyMDE2IHVzaW5nIFNlcmdlIEouIHdpemFyZCAoQWN0aXZlVW5pdCBJbmMgd3d3LmFjdGl2ZXVuaXQuY29tKQ==
*
*/
fandaymon
Сообщения: 1570
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Модуль] DLNA

Сообщение fandaymon » Вт мар 27, 2018 8:06 pm

Так я ж написал, что надо оставить в функции processSubscription
И в функции admin тоже можно всё закомментировать, так как у модуля будут свои, не похожие сеттингсы

В before say ничего писать не надо, потому что нам перед произнесением фразы ничего делать не надо
СпойлерПоказать

Код: Выделить всё

 function processSubscription($event, &$details) {
        $this->getConfig();
        if ($event == 'SAY' ) {
            $level = $details['level'];
            $message = $details['message'];
            if ($level >= (int) getGlobal('minMsgLevel')  {
                    $cached_filename = 'cached/voice/rh_' . md5($message) . '.wav';
                   if (file_exists(ROOT . $cached_filename)) {
                        $url='http://192.168.2.74/'.$cached_filename; 
                        sg('MultiCastKitchen.playUrl',$url);
                        DebMes($url,'googlenotifier');
                    } 
             }
          }
     }
 
Аватара пользователя
Hold
Сообщения: 57
Зарегистрирован: Пн окт 16, 2017 4:11 pm
Благодарил (а): 81 раз
Поблагодарили: 5 раз

Re: [Модуль] DLNA

Сообщение Hold » Вт мар 27, 2018 8:39 pm

Parse error: syntax error, unexpected ';' in /var/www/html/modules/dlnavoice/dlnavoice.class.php on line 127
на эту строку
$cached_filename = 'cached/voice/rh_' . md5($message) . '.wav';

function admin удалил полностью

Код: Выделить всё

<?php

/**
 * rhvoice 
 * @package project
 * @author Dark_Veter <veter.dark@gmail.com>
 * @copyright Dark_Veter (c)
 * @version 0.1 (wizard, 15:03:33 [Mar 14, 2016])
 */
//
//
class dlnavoice extends module {

    /**
     * rhvoice
     *
     * Module class constructor
     *
     * @access private
     */
    function dlnavoice() {
        $this->name = "dlnavoice";
        $this->title = "DLNAVoice";
        $this->module_category = "<#LANG_SECTION_APPLICATIONS#>";
        $this->checkInstalled();
}

    /**
     * saveParams
     *
     * Saving module parameters
     *
     * @access public
     */
    function saveParams($data = 0) {
        $p = array();
        if (IsSet($this->id)) {
            $p["id"] = $this->id;
        }
        if (IsSet($this->view_mode)) {
            $p["view_mode"] = $this->view_mode;
        }
        if (IsSet($this->edit_mode)) {
            $p["edit_mode"] = $this->edit_mode;
        }
        if (IsSet($this->tab)) {
            $p["tab"] = $this->tab;
        }
        return parent::saveParams($p);
    }

    /**
     * getParams
     *
     * Getting module parameters from query string
     *
     * @access public
     */
    function getParams() {
        global $id;
        global $mode;
        global $view_mode;
        global $edit_mode;
        global $tab;
        if (isset($id)) {
            $this->id = $id;
        }
        if (isset($mode)) {
            $this->mode = $mode;
        }
        if (isset($view_mode)) {
            $this->view_mode = $view_mode;
        }
        if (isset($edit_mode)) {
            $this->edit_mode = $edit_mode;
        }
        if (isset($tab)) {
            $this->tab = $tab;
        }
    }

    /**
     * Run
     *
     * Description
     *
     * @access public
     */
    function run() {
        global $session;
        $out = array();
        if ($this->action == 'admin') {
            $this->admin($out);
        } else {
            $this->usual($out);
        }
        if (IsSet($this->owner->action)) {
            $out['PARENT_ACTION'] = $this->owner->action;
        }
        if (IsSet($this->owner->name)) {
            $out['PARENT_NAME'] = $this->owner->name;
        }
        $out['VIEW_MODE'] = $this->view_mode;
        $out['EDIT_MODE'] = $this->edit_mode;
        $out['MODE'] = $this->mode;
        $out['ACTION'] = $this->action;
        $this->data = $out;
        $p = new parser(DIR_TEMPLATES . $this->name . "/" . $this->name . ".html", $this->data, $this);
        $this->result = $p->result;
    }

    /**
     * BackEnd
     *
     * Module backend
     *
     * @access public
     */
   

     function processSubscription($event, &$details) {
        $this->getConfig();
        if ($event == 'SAY' ) {
            $level = $details['level'];
            $message = $details['message'];
            if ($level >= (int) getGlobal('minMsgLevel')  {
                    $cached_filename = 'cached/voice/rh_' . md5($message) . '.wav';
                   if (file_exists(ROOT . $cached_filename)) {
                        $url='http://192.168.2.74/'.$cached_filename; 
                        sg('MultiCastKitchen.playUrl',$url);
                        DebMes($url,'googlenotifier');
                    } 
             }
          }
     }
 

    /**
     * Install
     *
     * Module installation routine
     *
     * @access private
     */
    function install($data = '') {
        subscribeToEvent($this->name, 'SAY');
        parent::install();
    }
    
    /**
     * Uninstall
     *
     * Module deinstallation routine
     *
     * @access private
     */    
    function uninstall() {
        unsubscribeFromEvent($this->name, 'SAY');
        parent::uninstall();
    }

// --------------------------------------------------------------------
}

/*
*
* TW9kdWxlIGNyZWF0ZWQgTWFyIDE0LCAyMDE2IHVzaW5nIFNlcmdlIEouIHdpemFyZCAoQWN0aXZlVW5pdCBJbmMgd3d3LmFjdGl2ZXVuaXQuY29tKQ==
*
*/
 
fandaymon
Сообщения: 1570
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Модуль] DLNA

Сообщение fandaymon » Вт мар 27, 2018 8:41 pm

В этой строчке скобка пропущена
if ($level >= (int) getGlobal('minMsgLevel') {

надо так

if ($level >= (int) getGlobal('minMsgLevel')) {
fandaymon
Сообщения: 1570
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Модуль] DLNA

Сообщение fandaymon » Вт мар 27, 2018 8:45 pm

функцию admin всё-таки надо было оставить, просто всё внутри закомментировать.
Она вызывается когда в Панели управления выбирается модуль
Аватара пользователя
Hold
Сообщения: 57
Зарегистрирован: Пн окт 16, 2017 4:11 pm
Благодарил (а): 81 раз
Поблагодарили: 5 раз

Re: [Модуль] DLNA

Сообщение Hold » Вт мар 27, 2018 8:55 pm

Заработало!
Но есть одно но.
Если в кеше уже есть файл из текстов ранее произнесенных, то четко срабатывает, если нет, то молчит. И в свойство sg('MultiCastKitchen.playUrl',$url); не передает. Например спросил какая погода, в ответ написала Алиса и молчит в DLNA. Тут же опять спрашиваю какая погода, все произносит.

Остался один шаг к победе
fandaymon писал(а):функцию admin всё-таки надо было оставить, просто всё внутри закомментировать.
Она вызывается когда в Панели управления выбирается модуль
Это не страшно, просто пусто когда модуль выбираю.
Позже можно обстряпать.


И еще, если подряд 2 сообщения, то не успев договорить начинает следующее.
Последний раз редактировалось Hold Вт мар 27, 2018 9:15 pm, всего редактировалось 1 раз.
Ответить