feat: Suchen-Tab mit Filmsuche, Such-Endpoint mit Sprach-/Duplikat-Filter
This commit is contained in:
@@ -291,6 +291,29 @@ router.get('/upcoming', authenticate, async (req, res) => {
|
||||
} catch(e) { res.status(500).json({ error: e.message }); }
|
||||
});
|
||||
|
||||
// GET /api/tools/media/search?q=TITEL – Filmsuche
|
||||
router.get('/search', authenticate, async (req, res) => {
|
||||
try {
|
||||
const q = (req.query.q || '').trim();
|
||||
if (!q || q.length < 2) return res.json([]);
|
||||
const [results, genreMap] = await Promise.all([
|
||||
tmdb('/search/movie', { query: q, include_adult: 'false' }),
|
||||
getGenreMap(),
|
||||
]);
|
||||
const seen = new Set();
|
||||
const filtered = (results.results || [])
|
||||
.filter(m => {
|
||||
if (BLOCKED_LANGS.has(m.original_language)) return false;
|
||||
if (seen.has(m.id)) return false;
|
||||
seen.add(m.id);
|
||||
return true;
|
||||
})
|
||||
.slice(0, 20)
|
||||
.map(m => enrichMovie(m, genreMap, null, null));
|
||||
res.json(filtered);
|
||||
} catch(e) { res.status(500).json({ error: e.message }); }
|
||||
});
|
||||
|
||||
// Modal: TMDb-Daten sofort, xREL via separaten Endpoint
|
||||
router.get('/movie/:id', authenticate, async (req, res) => {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user