Xor

 
<<< Back

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

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

К делу!

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)

Discuss (8) (13)

See also:
2024-02-12 Китайская панель в подрозетник с экраном 480*480
2023-10-29 MQTT в МДМ - способ обработки топика через метод
2023-04-03 Todoer: обмен данными с Яндекс календарём
2023-03-31 Todoer: календарь на год
2023-03-30 Todoer: анонс + программное создание задачи
2022-05-08 Глобальный поиск - добавление своих сущностей. Upd Внедрено
2022-01-05 Яндекс Лампочка в Yandex Devices - добавление сцен
2021-04-18 Переезд на мастер спустя год
2021-03-24 Ещё о старте/остановке МДМ в Винде
2021-02-18 Модуль Todoer
2021-01-06 Для виндузятников - перенос бд на рам-диск
2020-11-22 Календарь-планировщик
2020-08-01 Irbis как терминал
2020-05-18 Китайская камера rtsp + vlc как перекодировщик для html
2020-05-12 Опыт интеграции МДМ с Я.Алисой ещё одним способом - без белого адреса, москита, ПУ.(дополнено)
2020-05-07 Поправим формат даты в Панели управления
2020-04-11 Баловство с шаблонами
2020-03-26 Простые правила - вариант модуля. ч. 2
2020-03-25 Простые правила - вариант модуля
2019-12-20 расширение средств работы с events updated
2019-11-20 По следам наших выступлений - сколько мы наэкономили?
2019-11-04 Группа как объект - экономим на коде - 2
2019-10-26 Прикручиваем Grafana к Мажордому
2019-10-11 Группа как объект - экономим на коде
2019-09-25 Если у вас нет телеги...
2019-09-11 Датчик присутствия из ип камеры
2019-07-30 Win-платформа-замена ffmpeg для получения скриншотов из rstp - потока
2019-06-24 Форматированный отчет в телеграм - имитация таблицы
2019-03-24 О среднем в Мажордомо
2018-10-31 Об "обделённых" пользователях Win-систем -- с точки зрения кэширования winTTS сообщений
2018-09-16 Перезагрузка Мажордомо в Win-системах

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

На форуме: xor