File size: 2,405 Bytes
07436b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
const express = require('express');
const log = require('../helpers/logger');
const { fetchData, getGenreId } = require('../api/tmdb');

const router = express.Router();

router.get("/:configParameters?/catalog/:type/:id/:extra?.json", async (req, res) => {
    const { configParameters, type, id, extra } = req.params;
    const { cacheDuration = '3d', ...query } = req.query;
    const config = configParameters ? JSON.parse(decodeURIComponent(configParameters)) : {};
    const { language, hideNoPoster, tmdbApiKey, fanartApiKey, rpdbApiKey } = config;

    log.info(`Catalog request: type=${type}, id=${id}, language=${language}`);
    log.debug(`Extra parameters: ${JSON.stringify(query)}`);

    const mediaType = type === 'series' ? 'tv' : type;
    if (!['movie', 'tv'].includes(mediaType)) {
        log.error(`Invalid catalog type: ${mediaType}`);
        return res.status(400).json({ metas: [] });
    }

    try {
        let extraParams = { ...query };

        if (extra) {
            const decodedExtra = decodeURIComponent(extra);
            extraParams = {
                ...extraParams,
                ...Object.fromEntries(
                    decodedExtra.split(/(?<!\s)&(?!\s)/).map(param => {
                        const [key, value] = param.split('=').map(decodeURIComponent);
                        return [key.trim(), value.trim()];
                    })
                )
            };
        }

        if (language) extraParams.language = language;
        if (hideNoPoster !== undefined) extraParams.hideNoPoster = String(hideNoPoster);

        if (extraParams.genre) {
            const genreId = await getGenreId(mediaType, extraParams.genre);
            if (genreId) {
                extraParams.with_genres = genreId;
            } else {
                log.warn(`Genre ${extraParams.genre} not found for ${mediaType}`);
            }
        }

        log.debug(`Extra parameters after processing: ${JSON.stringify(extraParams)}`);

        const metas = await fetchData(mediaType, id, extraParams, cacheDuration, tmdbApiKey, rpdbApiKey, fanartApiKey);

        res.json({
            metas: extraParams.hideNoPoster === 'true' ? metas.filter(meta => meta.poster) : metas
        });
    } catch (error) {
        log.error(`Error fetching catalog data: ${error.message}`);
        res.status(500).json({ metas: [] });
    }
});

module.exports = router;