fix: race condition where race condition where loadMovies/loadSeries was called before

hiddenCategoryIds was populated
This commit is contained in:
Trevor Mears
2026-01-14 15:25:04 -08:00
parent 0a013ec05f
commit 60010cc734
3 changed files with 38 additions and 6 deletions
+32
View File
@@ -252,10 +252,15 @@ class SyncService {
/**
* Batch save streams (channels, vod, series)
* Also purges stale entries that no longer exist in the source
*/
async saveStreams(sourceId, type, items) {
if (!items || items.length === 0) return;
const db = getDb();
// Collect all IDs we're syncing
const syncedIds = new Set();
const stmt = db.prepare(`
INSERT INTO playlist_items (
id, source_id, item_id, type, name, category_id,
@@ -302,6 +307,7 @@ class SyncService {
}
const id = `${sourceId}:${itemId}`;
syncedIds.add(id);
stmt.run(
id,
@@ -329,6 +335,32 @@ class SyncService {
await new Promise(resolve => setImmediate(resolve));
}
// Purge stale entries that no longer exist in the source
// Use temp table approach to avoid SQL parameter limits with large playlists
if (syncedIds.size > 0) {
db.exec('CREATE TEMP TABLE IF NOT EXISTS synced_ids (id TEXT PRIMARY KEY)');
db.exec('DELETE FROM synced_ids');
const insertTemp = db.prepare('INSERT OR IGNORE INTO synced_ids (id) VALUES (?)');
const insertTempBatch = db.transaction((ids) => {
for (const id of ids) {
insertTemp.run(id);
}
});
insertTempBatch([...syncedIds]);
const deleteStmt = db.prepare(`
DELETE FROM playlist_items
WHERE source_id = ? AND type = ?
AND id NOT IN (SELECT id FROM synced_ids)
`);
const deleted = deleteStmt.run(sourceId, type);
if (deleted.changes > 0) {
console.log(`[Sync] Purged ${deleted.changes} stale ${type} items`);
}
}
console.log(`[Sync] Saved ${items.length} ${type} items`);
}