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."» (фильм)'));";
     $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)

Обсуждение (7) (10)

Смотрите так же:
24.06.2019 Форматированный отчет в телеграм - имитация таблицы
24.03.2019 О среднем в Мажордомо
31.10.2018 Об "обделённых" пользователях Win-систем -- с точки зрения кэширования winTTS сообщений
16.09.2018 Перезагрузка Мажордомо в Win-системах

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

На форуме: xor