Xor

 
<<< Назад

Используем зомбо-ящик в Мажордомо

Качаем тв-программу и следим за передачами из Мажордомо.
Теперь тёща не пропустит свой сериал, а жена - Лигу Чемпионов

К делу!

http://programtv.ru/xmltv.xml.gz Программа обновляется каждый день в полночь по Московскому времени. Часовой пояс телепрограммы +3 часа - Московское время.

Создаём две таблицы в db_terminal:


CREATE TABLE `tv_channels` (
 `id` int(11) NOT NULL,
 `ch_name` varchar(50) NOT NULL,
 `icon` varchar(255) DEFAULT NULL,
 `sel` int(11) DEFAULT NULL,
 `loc_channel` varchar(50) DEFAULT NULL,
 UNIQUE KEY `channel` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

CREATE TABLE `tv_programm` (
 `CHANNEL_ID` int(11) NOT NULL,
 `NAME` varchar(255) DEFAULT NULL,
 `CATEGORY` varchar(100) DEFAULT NULL,
 `START` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `STOP` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `SEL` int(11) DEFAULT NULL,
 KEY `CHANNEL_ID` (`CHANNEL_ID`,`START`),
 KEY `CATEGORY` (`CATEGORY`),
 KEY `SEL` (`SEL`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

Создаём скрипт tvguide:

//echo('tvguide start! '.date('H:i:s').'<br>');
$file_load = './cms/cached/tmp/xmltv.xml.gz';//локально
$file_to = str_replace('.gz','',$file_load);//распаковано

$file = file_get_contents("http://programtv.ru/xmltv.xml.gz"); //скачаем
file_put_contents ($file_load,$file);//положим локально
uncompress($file_load, $file_to); //распакуем
unlink($file_load); //почистим архив

if (file_exists($file_to)) {
    //$sql = "truncate table `tv_channels` ";
    //SQLExec($sql);
    $sql = "truncate table `tv_programm` ";
    SQLExec($sql);
    $xml = simplexml_load_file($file_to);
    //заполним каналы
    foreach ($xml->channel as $ch) {
     // echo('id='.$ch['id'].' name='.$ch->{"display-name"}.' icon='.$ch->icon['src'].'<br>');
     $Record = SQLSelectOne("SELECT * FROM tv_channels WHERE ch_name='".$ch->{"display-name"}."'");
       //обновим ид и иконку -- заметил, что ид канала может поменяться !!!!
       $Record['id'] = $ch['id'];
       $Record['icon'] = $ch->icon['src'];

       If (IsSet($Record['ch_name'])) {
        $Record['sel'] = $Record['sel'];
        $Record['loc_channel'] = $Record['loc_channel'];
        SQLUpdate('tv_channels', $Record);
       //} Else { // раскомментим 3 строки для первичного наполнения таблицы каналов   
        //$Record['ch_name'] = trim($ch->{"display-name"});
        //SQLInsert('tv_channels', $Record);
       }
    }

     $Record = array();
     foreach ($xml->programme as $pr) {
      //echo('canal='.$pr['channel'].' start='.$pr['start'].' tim '.$start.' name='.$pr->{"title"}.' category='.$pr->{"category"}.'<br>');
     $Rec = SQLSelectOne("SELECT * FROM tv_channels WHERE id='".$pr['channel']."'");
     if($Rec){
       $start = substr($pr['start'],0,4).'-'.substr($pr['start'],4,2).'-'.substr($pr['start'],6,2).' '.substr($pr['start'],8,2).':'.substr($pr['start'],10,2).':00';
       $stop = substr($pr['stop'],0,4).'-'.substr($pr['stop'],4,2).'-'.substr($pr['stop'],6,2).' '.substr($pr['stop'],8,2).':'.substr($pr['stop'],10,2).':00';
       if(strtotime($stop)>time()){ //не пишем закончившиеся
         $Record['CHANNEL_ID'] = $pr['channel'];
         $Record['NAME'] = $pr->{"title"};
         $Record['CATEGORY'] = $pr->{"category"};
         $Record['sel'] = 0;
         $Record['START'] = $start;
         $Record['STOP'] = $stop;

         SQLInsert('tv_programm', $Record);
       }
     }
     }
   SQLExec("delete from tv_programm WHERE `STOP`<now() - interval 1 hour");

} else {
    return('Failed to open xml.');
}
echo('done! '.date('H:i:s'));

Для первого запуска раскомментим 3 строки для первичного наполнения таблицы каналов.
Для себя выбрал такую схему работы - ненужные мне каналы просто удалил из базы, для этого сначала думал использовать для этого поле Sel, но потом отказался. После чистки таблицы от барахла не забудем вновь закомментить те три строки, чтобы не гонять впустую байты.
Поле loc_channel - команды для ИК-пульта для выбора локального канала (да, не смарт)

Скрипт запускаем по ночам, глубина предсказания - 3 дня.
В результате имеем набитую передачами таблицу 'tv_programm' по заданным нами каналам.

Использование в Мажордомо:

Сообщаем о начале фильма

Создаём скрипт tv_prog:

$sql = "SELECT ch.ch_name,p.* FROM tv_programm p "
    . "join tv_channels ch on ch.id=p.CHANNEL_ID "
    . "WHERE p.START > now() and p.CATEGORY='фильмы' "
    . "ORDER BY p.START limit 0,3";
ClearScheduledJob("next_film_%"); //голосуем за исправление ClearScheduledJob на Коннекте!!! 

$recs = SQLSelect($sql);
foreach($recs as $rec) { 
   if(isset($rec['NAME'])){
     $start = strtotime($rec['START']);
     $ch = $rec['ch_name'];
     $src = $rec['NAME'];
//     $cmd = "say('на канале «".$ch."» начинается фильм «".$src."»',gg('TVInfoMode.active'));rs('wiki_api', array('zapros' => '«".$src."» (фильм)'));";
     $src = str_replace("'","\'",$src); // если кино называется Жанна Д'Арк
     $cmd = "say('на канале «".$ch."» начинается фильм «".$src."»',gg('TVInfoMode.active'));";
       AddScheduledJob("next_film_".md5($src),$cmd,$start);

   }
}

Запускаю его каждый час. Он ищет три ближайших по времени фильма и создает три информационных джоба с напоминалками. В принципе, можно и другие действия придумать. Закомментированная строка c $cmd, например, ещё лезла в Википедию за описанием.

Нюанс - не работает заявленная фича ClearScheduledJob("title%"), у себя я поправил, можете проголосовать в багах/идеях на Коннекте
https://connect.smartliving.ru/comments/idea613.ht...
или
https://connect.smartliving.ru/comments/idea612.ht...

Вот мой вариант:

function myclearScheduledJob($title)
{
    $title = str_replace("_", "\_", dbsafe1($title)); 
    SQLExec("DELETE FROM jobs WHERE TITLE LIKE '" . $title . "'");
}

Сообщаем о начале матчей ЛЧ

Создаём скрипт tv_match:

$sql = "SELECT ch.ch_name, ch.loc_channel,p.`NAME`,p.`START` FROM `tv_programm` p "
    . "join tv_channels ch on p.`CHANNEL_ID`=ch.id "
    . "where `CATEGORY`='спорт'  "
    . "and `NAME` like 'Футбол. Лига чемпионов%' "
    . "and `START`> now() "
    . "order by `START`";
ClearScheduledJob("next_match%");
$rec = SQLSelectOne($sql);
if(isset($rec['NAME'])){
     $start = strtotime($rec['START']);
     $ch = $rec['ch_name'];
     $src = $rec['NAME'];
     $cmd = "say('на канале «".$ch."» начинается «".$src."»',1);";
     AddScheduledJob("next_match_".md5($src),$cmd,$start);
 } 

Запуск аналогичен предыдущему.

Всё

upd

Cпасибо С_ЗАХАРОВ за замеченные недочёты:
Папка ./cms/cached/tmp должна существовать
Должна быть определена функция

//uncompress("./myfile.txt.gz", "./myfile.txt");
function uncompress($srcName, $dstName) {
   $zp = gzopen($srcName, "r");
   while(!gzeof($zp))
        $string .= gzread($zp, 4096);
   gzclose($zp);

   $fp = fopen($dstName, "w");
   fwrite($fp, $string, strlen($string));
   fclose($fp);
}

Всё (2)

Обсуждение (8) (13)

Смотрите так же:
12.02.2024 Китайская панель в подрозетник с экраном 480*480
29.10.2023 MQTT в МДМ - способ обработки топика через метод
03.04.2023 Todoer: обмен данными с Яндекс календарём
31.03.2023 Todoer: календарь на год
30.03.2023 Todoer: анонс + программное создание задачи
08.05.2022 Глобальный поиск - добавление своих сущностей. Upd Внедрено
05.01.2022 Яндекс Лампочка в Yandex Devices - добавление сцен
18.04.2021 Переезд на мастер спустя год
24.03.2021 Ещё о старте/остановке МДМ в Винде
18.02.2021 Модуль Todoer
06.01.2021 Для виндузятников - перенос бд на рам-диск
22.11.2020 Календарь-планировщик
01.08.2020 Irbis как терминал
18.05.2020 Китайская камера rtsp + vlc как перекодировщик для html
12.05.2020 Опыт интеграции МДМ с Я.Алисой ещё одним способом - без белого адреса, москита, ПУ.(дополнено)
07.05.2020 Поправим формат даты в Панели управления
11.04.2020 Баловство с шаблонами
26.03.2020 Простые правила - вариант модуля. ч. 2
25.03.2020 Простые правила - вариант модуля
20.12.2019 расширение средств работы с events updated
20.11.2019 По следам наших выступлений - сколько мы наэкономили?
04.11.2019 Группа как объект - экономим на коде - 2
26.10.2019 Прикручиваем Grafana к Мажордому
11.10.2019 Группа как объект - экономим на коде
25.09.2019 Если у вас нет телеги...
11.09.2019 Датчик присутствия из ип камеры
30.07.2019 Win-платформа-замена ffmpeg для получения скриншотов из rstp - потока
24.06.2019 Форматированный отчет в телеграм - имитация таблицы
24.03.2019 О среднем в Мажордомо
31.10.2018 Об "обделённых" пользователях Win-систем -- с точки зрения кэширования winTTS сообщений
16.09.2018 Перезагрузка Мажордомо в Win-системах

Домодедово, Россия

На форуме: xor