'use strict'; const router = require('express').Router(); const search = require('>/controller/search'); const { Torrent } = require('>/models'); // Step 1: fuzzy query -> a few TMDB title candidates( with posters) to confirm. router.get('/title', async function(req, res, next){ try{ res.json({results: await search.tmdbSearch(req.query.q)}); }catch(error){ next(error); } }); // Step 2: confirmed title -> TPB search + LLM-curated release options. router.post('/releases', async function(req, res, next){ try{ res.json(await search.findReleases(req.body.tmdbId, req.body.mediaType)); }catch(error){ next(error); } }); // TV: which seasons you have vs are missing (Emby inventory vs TMDB counts). router.get('/seasons', async function(req, res, next){ try{ res.json(await search.seasonPlan(req.query.tmdbId)); }catch(error){ next(error); } }); // TV: queue the best complete-season pack for every missing/incomplete season. router.post('/fill', async function(req, res, next){ try{ let plan = await search.fillMissing(req.body.tmdbId); let queued = []; for(let pick of plan.picks){ try{ await Torrent.create({ magnetLink: pick.magnetLink, isPrivate: false, added_by: req.user.username, category: pick.category, }); queued.push({ season: pick.season, name: pick.name }); }catch(error){ plan.skipped.push({ season: pick.season, reason: error.message }); } } res.json({ title: plan.title, year: plan.year, queued, skipped: plan.skipped }); }catch(error){ next(error); } }); module.exports = router;