diff --git a/public/app.js b/public/app.js
index 29ac02c..7820108 100644
--- a/public/app.js
+++ b/public/app.js
@@ -280,7 +280,16 @@ async function renderCameraCards() {
- ` + cameras.map(c => `
+
+
+ ${cameras.length} camera(s)
+
+ ` + cameras.map((c, i) => `
+
+
📷 ${c.name || 'Unnamed'} ${c.ip}
+ ⚙️ Config
+
+
📷 ${c.name || 'Unnamed'} ${c.ip}
⚙️ Config
@@ -302,7 +311,28 @@ async function renderCameraCards() {
`).join('');
}
-// ── Settings: Scan ──
+// ── Settings: Add / Remove cameras ──
+function addCamera() {
+ const ip = prompt('Camera IP address:', '192.168.1.');
+ if (!ip) return;
+ const id = 'cam_' + ip.split('.').pop();
+ cameras.push({
+ id, name: 'Camera_' + ip.split('.').pop(),
+ ip, username: 'admin', password: '',
+ onvif_port: 80, rtsp_main: '', rtsp_sub: '',
+ description: '', enabled: true, record: true
+ });
+ renderCameraCards();
+ renderLiveGrid();
+ renderPlaybackCameras();
+}
+function removeCamera(idx) {
+ if (!confirm('Remove camera ' + (cameras[idx]?.name || '') + '?')) return;
+ cameras.splice(idx, 1);
+ renderCameraCards();
+ renderLiveGrid();
+ renderPlaybackCameras();
+}
async function runWizard() {
const from = document.getElementById('wiz-from')?.value || '192.168.1.200';
const to = document.getElementById('wiz-to')?.value || '192.168.1.210';