1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
<?php
class MiscHandler extends RequestHandler
{
public function GET_sensors_page() {
global $config;
$clients = [];
foreach ($config['temphumd_servers'] as $key => $params) {
$cl = new TemphumdClient(...$params);
$clients[$key] = $cl;
$cl->readSensor();
}
$this->tpl->set(['sensors' => $clients]);
$this->tpl->set_title('Датчики');
$this->tpl->render_page('sensors.twig');
}
public function GET_cams() {
global $config;
list($hls_debug, $video_events, $high, $camera_ids) = $this->input('b:hls_debug, b:video_events, b:high, id');
if ($camera_ids != '') {
$camera_param = $camera_ids;
$camera_ids = explode(',', $camera_ids);
$camera_ids = array_filter($camera_ids);
$camera_ids = array_map('trim', $camera_ids);
$camera_ids = array_map('intval', $camera_ids);
} else {
$camera_ids = array_keys($config['cam_list']['labels']);
$camera_param = '';
}
$tab = $high ? 'high' : 'low';
// h264
$js_hls_config = [
'opts' => [
'startPosition' => -1,
// // https://github.com/video-dev/hls.js/issues/3884#issuecomment-842380784
'liveSyncDuration' => 2,
'liveMaxLatencyDuration' => 3,
'maxLiveSyncPlaybackRate' => 2,
'liveDurationInfinity' => true,
],
'debugVideoEvents' => !!$video_events,
];
if ($hls_debug)
$js_hls_config['debug'] = true;
// h265
$js_h265webjs_config = [
// https://github.com/numberwolf/h265web.js/blob/master/README_EN.MD#freetoken
'token' => 'base64:QXV0aG9yOmNoYW5neWFubG9uZ3xudW1iZXJ3b2xmLEdpdGh1YjpodHRwczovL2dpdGh1Yi5jb20vbnVtYmVyd29sZixFbWFpbDpwb3JzY2hlZ3QyM0Bmb3htYWlsLmNvbSxRUTo1MzEzNjU4NzIsSG9tZVBhZ2U6aHR0cDovL3h2aWRlby52aWRlbyxEaXNjb3JkOm51bWJlcndvbGYjODY5NCx3ZWNoYXI6bnVtYmVyd29sZjExLEJlaWppbmcsV29ya0luOkJhaWR1',
];
$js_config = [
'isLow' => $tab == 'low',
'proto' => config::get('cam_hls_proto'),
'host' => config::get('cam_hls_host'),
'camIds' => $camera_ids,
'camLabels' => array_map(fn($id) => $config['cam_list']['labels'][$id], $camera_ids)
];
$cams_by_type = [];
$include_h264 = false;
$include_h265 = false;
foreach ($camera_ids as $camera_id) {
$var_name = 'include_'.$config['cam_list']['full'][$camera_id]['type'];
$cams_by_type[$camera_id] = $config['cam_list']['full'][$camera_id]['type'];
$$var_name = true;
}
if ($include_h264) {
$js_config['hlsConfig'] = $js_hls_config;
$this->tpl->add_static('hls.js');
}
if ($include_h265) {
$js_config['h265webjsConfig'] = $js_h265webjs_config;
$this->tpl->add_static('h265webjs-dist/missile.js');
$this->tpl->add_static('h265webjs-dist/h265webjs-v20221106-reminified.js');
}
$js_config['camsByType'] = $cams_by_type;
$hls_key = config::get('cam_hls_access_key');
if ($hls_key)
setcookie_safe('hls_key', $hls_key);
// $cam_filter = function($id) use ($config, $camera_ids) {
// return in_array($id, $camera_ids);
// };
$this->tpl->set([
'js_config' => $js_config,
// 'hls_access_key' => $config['cam_hls_access_key'],
'camera_param' => $camera_param,
// 'cams' => array_values(array_filter($config['cam_list'][$tab], $cam_filter)),
'tab' => $tab,
'video_events' => $video_events
]);
$this->tpl->set_title('Камеры');
$this->tpl->render_page('cams.twig');
}
public function GET_cams_stat() {
global $config;
list($ip, $port) = explode(':', $config['ipcam_server_api_addr']);
$body = jsonDecode(file_get_contents('http://'.$ip.':'.$port.'/api/timestamp/all'));
header('Content-Type: text/plain');
$date_fmt = 'd.m.Y H:i:s';
foreach ($body['response'] as $cam => $data) {
$fix = date($date_fmt, $data['fix']);
$start = date($date_fmt, $data['motion_start']);
$motion = date($date_fmt, $data['motion']);
echo "$cam:\n motion: $motion\n";
echo " motion_start: $start\n";
echo " fix: $fix\n\n";
}
}
}
|