Added server-side saving for settings

This commit is contained in:
Trevor Mears
2025-12-31 15:35:37 -08:00
parent 404364b904
commit d1bfd1b9e7
7 changed files with 234 additions and 55 deletions
+60 -2
View File
@@ -21,6 +21,7 @@ async function loadDb() {
sources: data.sources || [],
hiddenItems: data.hiddenItems || [],
favorites: data.favorites || [],
settings: data.settings || getDefaultSettings(),
nextId: data.nextId || 1
};
} catch (error) {
@@ -30,6 +31,7 @@ async function loadDb() {
sources: [],
hiddenItems: [],
favorites: [],
settings: getDefaultSettings(),
nextId: 1
};
}
@@ -42,13 +44,47 @@ async function loadDb() {
sources: [],
hiddenItems: [],
favorites: [],
settings: getDefaultSettings(),
nextId: 1
};
}
}
// Default settings
function getDefaultSettings() {
return {
arrowKeysChangeChannel: true,
overlayDuration: 5,
defaultVolume: 80,
rememberVolume: true,
lastVolume: 80,
autoPlayNextEpisode: false,
forceProxy: false,
forceTranscode: false,
forceRemux: false,
streamFormat: 'm3u8',
epgRefreshInterval: '24'
};
}
// Write lock to prevent concurrent writes from corrupting db.json
let writeQueue = Promise.resolve();
async function saveDb(data) {
await fs.writeFile(dbPath, JSON.stringify(data, null, 2));
// Queue this write operation - each write waits for the previous one
writeQueue = writeQueue.then(async () => {
try {
const jsonString = JSON.stringify(data, null, 2);
await fs.writeFile(dbPath, jsonString);
} catch (err) {
console.error('Error writing database:', err);
throw err;
}
}).catch(err => {
console.error('Database write failed:', err);
});
return writeQueue;
}
// Source CRUD operations
@@ -253,4 +289,26 @@ const favorites = {
}
};
module.exports = { sources, hiddenItems, favorites };
// Settings operations
const settings = {
async get() {
const db = await loadDb();
return { ...getDefaultSettings(), ...db.settings };
},
async update(newSettings) {
const db = await loadDb();
db.settings = { ...db.settings, ...newSettings };
await saveDb(db);
return db.settings;
},
async reset() {
const db = await loadDb();
db.settings = getDefaultSettings();
await saveDb(db);
return db.settings;
}
};
module.exports = { sources, hiddenItems, favorites, settings, getDefaultSettings };
+1
View File
@@ -55,6 +55,7 @@ app.use('/api/channels', require('./routes/channels'));
app.use('/api/favorites', require('./routes/favorites'));
app.use('/api/transcode', require('./routes/transcode'));
app.use('/api/remux', require('./routes/remux'));
app.use('/api/settings', require('./routes/settings'));
// SPA fallback - serve index.html for all non-API routes
app.get('*', (req, res) => {
+56
View File
@@ -0,0 +1,56 @@
const express = require('express');
const router = express.Router();
const { settings, getDefaultSettings } = require('../db');
/**
* Get all settings
* GET /api/settings
*/
router.get('/', async (req, res) => {
try {
const currentSettings = await settings.get();
res.json(currentSettings);
} catch (err) {
console.error('Error getting settings:', err);
res.status(500).json({ error: err.message });
}
});
/**
* Update settings (partial update)
* PUT /api/settings
*/
router.put('/', async (req, res) => {
try {
const updates = req.body;
const updatedSettings = await settings.update(updates);
res.json(updatedSettings);
} catch (err) {
console.error('Error updating settings:', err);
res.status(500).json({ error: err.message });
}
});
/**
* Reset settings to defaults
* DELETE /api/settings
*/
router.delete('/', async (req, res) => {
try {
const defaultSettings = await settings.reset();
res.json(defaultSettings);
} catch (err) {
console.error('Error resetting settings:', err);
res.status(500).json({ error: err.message });
}
});
/**
* Get default settings (for reference)
* GET /api/settings/defaults
*/
router.get('/defaults', (req, res) => {
res.json(getDefaultSettings());
});
module.exports = router;