<?php
set_time_limit(0);
ob_start();
include "../common.php";
if (!Config::getSafe('enable_jtv_file', false)){
header("HTTP/1.0 404 Not Found");
exit;
}
// Путь для создания файлов формата JTV
$temp_path = "/var/tmp/";
$jtv_zip = new ZipArchive();
if ($jtv_zip->open ($temp_path."jtv.zip", ZipArchive::CREATE) != true)
{
exit ("Can not open jtv.zip\n");
}
// Выбрали все каналы, для которых есть программа
$channels = Mysql::getInstance()->from('itv')->where(array('status' => 1, 'xmltv_id !=' => ''))->orderby('number')->get()->all();
foreach ($channels as $channel)
{
// Смещение на начало данных программы
$offset = 26;
// Получили все программы для текущего канала
$channel_epgs = Mysql::getInstance()->from('epg')->where(array('ch_id' => $channel['id']))->orderby('ch_id')->get()->all();
$channel['name'] = str_replace (array(' ', '.', ','), array('_', '_', '_'), $channel['name']);
// Получили имя файла для текущего канала
$channel_filename = $channel['name'];
$pdt_filename = $channel_filename.".pdt";
$ndx_filename = $channel_filename.".ndx";
// Открыли файлы для записи
$pdt_file = fopen ($temp_path.$pdt_filename, "wb");
$ndx_file = fopen ($temp_path.$ndx_filename, "wb");
// Записали заголовок файла *.pdt
fwrite ($pdt_file, "JTV 3.x TV Program Data\x0A\x0A\x0A", $offset);
// Записали количество программ для текущего канала
fwrite ($ndx_file, pack ("v", count ($channel_epgs)), 2);
foreach ($channel_epgs as $channel_epg)
{
// Записали заголовок записи
fwrite ($ndx_file, pack ("v", 0), 2);
// Готовим время и дату начала передачи для записи в файл
$filetime = bcmul (bcadd (strtotime ($channel_epg['time']) + 25200, "11644473600"), "10000000");
for ($i = 0; $i < 8; $i++)
{
$byte = (int) bcmod ($filetime, "256");
fwrite ($ndx_file, pack("c", $byte), 1);
$filetime = bcdiv ($filetime, "256");
}
// Записали смещение - указатель на длину названия передачи в файле *.pdt
fwrite ($ndx_file, pack("v", $offset), 2);
// Получили длину названия передачи
$epg_name_length = strlen (iconv ("UTF-8", "windows-1251", $channel_epg['name']));
// Записали длину названия передачи
fwrite ($pdt_file, pack("v", $epg_name_length), 2);
// Записали название передачи
fwrite ($pdt_file, iconv ("UTF-8", "windows-1251", $channel_epg['name']), $epg_name_length);
$offset += $epg_name_length + 2;
}
// Сбросили буфера
fflush ($pdt_file);
fflush ($ndx_file);
// Закрыли файлы
fclose ($pdt_file);
fclose ($ndx_file);
// Добваили файлы в архив
$jtv_zip->addFile ($temp_path.$ndx_filename, iconv ("UTF-8", "CP866", $ndx_filename));
$jtv_zip->addFile ($temp_path.$pdt_filename, iconv ("UTF-8", "CP866", $pdt_filename));
}
$jtv_zip->close ();
?>
$timezone = new DateTimeZone(date_default_timezone_get());
$offset = $timezone->getOffset(new DateTime()); //смещение в секундах от UTC$channels = Mysql::getInstance()->from('itv')->where(array('status' => 1, 'xmltv_id !=' => ''))->orderby('number')->get();
while ($channel = $channels->next()){
...
}есть же уже готовые JTV
<?php
set_time_limit(0);
ob_start();
include "../common.php";
if (!Config::getSafe('enable_jtv_file', false))
{
header("HTTP/1.0 404 Not Found");
exit;
}
// Проверяем переданный параметр с требуемым именем файла jtv
if (isset($_GET['name']) && !empty($_GET['name']))
{
// Получаем имя файла jtv из переменной
$jtv_name = $_GET['name'];
}
else
{
// Устанавливаем имя файла, если переменная пустая
$jtv_name = "jtv.zip";
}
// Путь для создания файлов формата JTV
$temp_path = "/var/tmp/";
$jtv_zip = new ZipArchive();
if ($jtv_zip->open ($temp_path.$jtv_name, ZipArchive::CREATE) != true)
{
exit ("Can not open ".$jtv_name." \n");
}
// Получили смещение времени в секундах для текущей временной зоны
$timezone = new DateTimeZone(date_default_timezone_get());
$tz_offset = $timezone->getOffset(new DateTime());
// Выбрали все каналы, для которых есть программа
$channels = Mysql::getInstance()->from('itv')->where(array('status' => 1, 'xmltv_id !=' => ''))->orderby('number')->get()->all();
foreach ($channels as $channel)
{
// Смещение на начало данных программы
$offset = 26;
// Получили все программы для текущего канала
$channel_epgs = Mysql::getInstance()->from('epg')->where(array('ch_id' => $channel['id']))->orderby('ch_id')->get()->all();
$channel['name'] = str_replace (array(' ', '.', ','), array('_', '_', '_'), $channel['name']);
// Получили имя файла для текущего канала
$channel_filename = $channel['name'];
$pdt_filename = $channel_filename.".pdt";
$ndx_filename = $channel_filename.".ndx";
// Открыли файлы для записи
$pdt_file = fopen ($temp_path.$pdt_filename, "wb");
$ndx_file = fopen ($temp_path.$ndx_filename, "wb");
// Записали заголовок файла *.pdt
fwrite ($pdt_file, "JTV 3.x TV Program Data\x0A\x0A\x0A", $offset);
// Записали количество программ для текущего канала
fwrite ($ndx_file, pack ("v", count ($channel_epgs)), 2);
foreach ($channel_epgs as $channel_epg)
{
// Записали заголовок записи
fwrite ($ndx_file, pack ("v", 0), 2);
// Готовим время и дату начала передачи для записи в файл
$filetime = bcmul (bcadd (strtotime ($channel_epg['time']) + $tz_offset, "11644473600"), "10000000");
for ($i = 0; $i < 8; $i++)
{
$byte = (int) bcmod ($filetime, "256");
fwrite ($ndx_file, pack("c", $byte), 1);
$filetime = bcdiv ($filetime, "256");
}
// Записали смещение - указатель на длину названия передачи в файле *.pdt
fwrite ($ndx_file, pack("v", $offset), 2);
// Получили длину названия передачи
$programme_name = iconv ("UTF-8", "windows-1251", $channel_epg['name']);
$programme_name_length = strlen ($programme_name);
// Записали длину названия передачи
fwrite ($pdt_file, pack("v", $programme_name_length), 2);
// Записали название передачи
fwrite ($pdt_file, $programme_name, $programme_name_length);
$offset += $programme_name_length + 2;
}
// Сбросили буфера
fflush ($pdt_file);
fflush ($ndx_file);
// Закрыли файлы
fclose ($pdt_file);
fclose ($ndx_file);
$jtv_zip->addFile ($temp_path.$ndx_filename, iconv ("UTF-8", "CP866", $ndx_filename));
$jtv_zip->addFile ($temp_path.$pdt_filename, iconv ("UTF-8", "CP866", $pdt_filename));
//echo $ndx_filename;
}
$jtv_zip->close ();
$jtv_path = $temp_path.$jtv_name;
// Проверяем, что файл существует
if (file_exists ($jtv_path))
{
if (ob_get_level())
{
ob_end_clean();
}
// заставляем браузер показать окно сохранения файла
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename='.basename($jtv_path));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: '.filesize($jtv_path));
// читаем файл и отправляем его пользователю
readfile($jtv_path);
}
?>
<?php
set_time_limit(0);
ob_start();
include "../common.php";
if (!Config::getSafe('enable_jtv_file', false))
{
header("HTTP/1.0 404 Not Found");
exit;
}
function SendFile($filepath)
{
if (file_exists ($filepath))
{
if (ob_get_level())
{
ob_end_clean();
}
// заставляем браузер показать окно сохранения файла
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename='.basename($filepath));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: '.filesize($filepath));
// читаем файл и отправляем его пользователю
readfile($filepath);
}
}
// Проверяем переданный параметр с требуемым именем файла jtv
if (isset($_GET['name']) && !empty($_GET['name']))
{
// Получаем имя файла jtv из переменной
$jtv_name = $_GET['name'];
}
else
{
// Устанавливаем имя файла, если переменная пустая
$jtv_name = "jtv.zip";
}
// Путь для создания файлов формата JTV
$temp_path = "/var/tmp/";
// Проверяем наличие файла архива и дату его создания, если прошло меньше 24 часов - отдаём файл пользователю, иначе создаём новый
if (file_exists ($temp_path.$jtv_name) && filemtime ($temp_path.$jtv_name) > time() - (24 * 60 * 60))
{
SendFile ($temp_path.$jtv_name);
exit;
}
//Список файлов для удаления
$files_to_remove = array();
$jtv_zip = new ZipArchive();
if ($jtv_zip->open ($temp_path.$jtv_name, ZipArchive::CREATE) != true)
{
exit ("Can not open ".$jtv_name." \n");
}
// Получили смещение времени в секундах для текущей временной зоны
$timezone = new DateTimeZone(date_default_timezone_get());
$tz_offset = $timezone->getOffset(new DateTime());
// Выбрали все каналы, для которых есть программа
$channels = Mysql::getInstance()->from('itv')->where(array('status' => 1, 'xmltv_id !=' => ''))->orderby('number')->get()->all();
foreach ($channels as $channel)
{
// Смещение на начало данных программы
$offset = 26;
// Получили все программы для текущего канала
$channel_epgs = Mysql::getInstance()->from('epg')->where(array('ch_id' => $channel['id']))->orderby('ch_id')->get()->all();
$channel['name'] = str_replace (array(' ', '.', ','), array('_', '_', '_'), $channel['name']);
// Получили имя файла для текущего канала
$channel_filename = $channel['name'];
$pdt_filename = $channel_filename.".pdt";
$ndx_filename = $channel_filename.".ndx";
// Добавили имена фалов в список на удаление
$files_to_remove[] = $pdt_filename;
$files_to_remove[] = $ndx_filename;
// Открыли файлы для записи
$pdt_file = fopen ($temp_path.$pdt_filename, "wb");
$ndx_file = fopen ($temp_path.$ndx_filename, "wb");
// Записали заголовок файла *.pdt
fwrite ($pdt_file, "JTV 3.x TV Program Data\x0A\x0A\x0A", $offset);
// Записали количество программ для текущего канала
fwrite ($ndx_file, pack ("v", count ($channel_epgs)), 2);
foreach ($channel_epgs as $channel_epg)
{
// Записали заголовок записи
fwrite ($ndx_file, pack ("v", 0), 2);
// Готовим время и дату начала передачи для записи в файл
$filetime = bcmul (bcadd (strtotime ($channel_epg['time']) + $tz_offset, "11644473600"), "10000000");
for ($i = 0; $i < 8; $i++)
{
$byte = (int) bcmod ($filetime, "256");
fwrite ($ndx_file, pack("c", $byte), 1);
$filetime = bcdiv ($filetime, "256");
}
// Записали смещение - указатель на длину названия передачи в файле *.pdt
fwrite ($ndx_file, pack("v", $offset), 2);
// Получили длину названия передачи
$programme_name = iconv ("UTF-8", "windows-1251", $channel_epg['name']);
$programme_name_length = strlen ($programme_name);
// Записали длину названия передачи
fwrite ($pdt_file, pack("v", $programme_name_length), 2);
// Записали название передачи
fwrite ($pdt_file, $programme_name, $programme_name_length);
$offset += $programme_name_length + 2;
}
// Сбросили буфера
fflush ($pdt_file);
fflush ($ndx_file);
// Закрыли файлы
fclose ($pdt_file);
fclose ($ndx_file);
$jtv_zip->addFile ($temp_path.$ndx_filename, iconv ("UTF-8", "CP866", $ndx_filename));
$jtv_zip->addFile ($temp_path.$pdt_filename, iconv ("UTF-8", "CP866", $pdt_filename));
}
$archive_closed = $jtv_zip->close ();
SendFile ($temp_path.$jtv_name);
// Удаляем файлы по списку
foreach ($files_to_remove as $file_to_remove)
{
unlink ($temp_path.$file_to_remove);
}
?>
$channel_epgs = Mysql::getInstance()->from('epg')->where(array('ch_id' => $channel['id']))->orderby('time')->get()->all();