Качаем тв-программу и следим за передачами из Мажордомо.
Теперь тёща не пропустит свой сериал, а жена - Лигу Чемпионов
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);
}
Домодедово, Россия
На форуме: xor