feat: Implement server-managed camera settings with new API endpoints, client-side application, and updated documentation.

This commit is contained in:
sebseb7
2025-12-18 14:55:23 +01:00
parent f7663c04c6
commit 0a93ee6713
4 changed files with 282 additions and 0 deletions

View File

@@ -194,6 +194,72 @@ app.get('/stats/:cameraId', authenticate, (req, res) => {
}
});
// Camera settings storage
const SETTINGS_FILE = process.env.PICUPPER_SETTINGS_FILE || path.join(__dirname, 'camera-settings.json');
function loadCameraSettings() {
try {
if (fs.existsSync(SETTINGS_FILE)) {
return JSON.parse(fs.readFileSync(SETTINGS_FILE, 'utf8'));
}
} catch (error) {
console.error('Error loading camera settings:', error.message);
}
return {};
}
function saveCameraSettings(settings) {
fs.writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 2));
}
// Get camera settings
app.get('/settings/:cameraId', authenticate, (req, res) => {
const { cameraId } = req.params;
const allSettings = loadCameraSettings();
const settings = allSettings[cameraId] || {};
res.json({
cameraId,
settings: {
focus_automatic_continuous: settings.focus_automatic_continuous ?? 0,
focus_absolute: settings.focus_absolute ?? 30,
exposure_auto: settings.exposure_auto ?? 1,
exposure_absolute: settings.exposure_absolute ?? 200,
brightness: settings.brightness ?? 0,
contrast: settings.contrast ?? 32,
...settings
}
});
});
// Update camera settings
app.put('/settings/:cameraId', authenticate, express.json(), (req, res) => {
const { cameraId } = req.params;
const newSettings = req.body;
if (!newSettings || typeof newSettings !== 'object') {
return res.status(400).json({ error: 'Settings object required in request body' });
}
const allSettings = loadCameraSettings();
allSettings[cameraId] = {
...(allSettings[cameraId] || {}),
...newSettings,
updatedAt: new Date().toISOString()
};
try {
saveCameraSettings(allSettings);
res.json({
success: true,
cameraId,
settings: allSettings[cameraId]
});
} catch (error) {
res.status(500).json({ error: 'Failed to save settings', details: error.message });
}
});
// Error handling middleware
app.use((error, req, res, next) => {
if (error instanceof multer.MulterError) {