fix: xREL progressive 5er-Batches, Badge-Coverage, Dirname zweizeilig nach German.

This commit is contained in:
2026-06-10 17:21:06 +02:00
parent 0f65d5d68e
commit 24975513b6
2 changed files with 71 additions and 52 deletions

View File

@@ -253,33 +253,27 @@ router.get('/movie/:id', authenticate, async (req, res) => {
} catch (e) { res.status(500).json({ error: e.message }); }
});
// POST /api/tools/media/xrel-check Cover-Badge Batch-Check
// POST /api/tools/media/xrel-check Check ob deutsche Releases existieren
// Nimmt max 5 Filme pro Request (Frontend schickt mehrere kleine Batches)
router.post('/xrel-check', authenticate, async (req, res) => {
const movies = (req.body.movies || []).slice(0, 20);
const movies = (req.body.movies || []).slice(0, 5);
if (!movies.length) return res.json({});
const result = {};
// 3er-Batches
for (let i = 0; i < movies.length; i += 3) {
const chunk = movies.slice(i, i + 3);
await Promise.all(chunk.map(async m => {
try {
const extInfoId = await findExtInfoId(m.title, m.original_title);
if (!extInfoId) { result[m.id] = false; return; }
// Schnell-Check: nur P2P Seite 1 prüfen ob german vorhanden
const p2p = await xrelFetch('/p2p/releases.json', { ext_info_id: extInfoId, per_page: 25 });
const p2pHit = (p2p.list || []).some(r => r.main_lang === 'german');
if (p2pHit) { result[m.id] = true; return; }
// Auch Scene prüfen
const scene = await xrelFetch('/release/ext_info.json', { id: extInfoId, per_page: 25 });
const sceneHit = (scene.list || []).some(r => /german|deutsch/i.test(r.dirname || ''));
result[m.id] = sceneHit;
} catch (_) {
result[m.id] = false;
}
}));
if (i + 3 < movies.length) await new Promise(r => setTimeout(r, 250));
}
await Promise.all(movies.map(async m => {
try {
const extInfoId = await findExtInfoId(m.title, m.original_title);
if (!extInfoId) { result[m.id] = false; return; }
// P2P zuerst main_lang ist zuverlässig
const p2p = await xrelFetch('/p2p/releases.json', { ext_info_id: extInfoId, per_page: 25 }, 8000);
if ((p2p.list || []).some(r => r.main_lang === 'german')) { result[m.id] = true; return; }
// Scene als Fallback
const scene = await xrelFetch('/release/ext_info.json', { id: extInfoId, per_page: 25 }, 8000);
result[m.id] = (scene.list || []).some(r => /german|deutsch/i.test(r.dirname || ''));
} catch (_) {
result[m.id] = false;
}
}));
res.json(result);
});