Added server-side saving for settings
This commit is contained in:
+60
-2
@@ -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 };
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user