Качаем тв-программу и следим за передачами из Мажордомо.
Теперь тёща не пропустит свой сериал, а жена - Лигу Чемпионов
![]() |
![]() |
![]() |
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);
}
Запуск аналогичен предыдущему.
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);
}