brunner56's picture
implement app
0bfe2e3
import { Router, Request, Response } from 'express';
import {
AIOStreams,
APIError,
constants,
Env,
getSimpleTextHash,
UserData,
} from '@aiostreams/core';
import { Manifest } from '@aiostreams/core';
import { createLogger } from '@aiostreams/core';
import { stremioManifestRateLimiter } from '../../middlewares/ratelimit';
const logger = createLogger('server');
const router = Router();
export default router;
router.use(stremioManifestRateLimiter);
const manifest = async (config?: UserData): Promise<Manifest> => {
let addonId = Env.ADDON_ID;
if (config) {
addonId = addonId += `.${config.uuid?.substring(0, 12)}`;
}
let catalogs: Manifest['catalogs'] = [];
let resources: Manifest['resources'] = [];
let addonCatalogs: Manifest['addonCatalogs'] = [];
if (config) {
const aiostreams = new AIOStreams(config, true);
await aiostreams.initialise();
catalogs = aiostreams.getCatalogs();
resources = aiostreams.getResources();
addonCatalogs = aiostreams.getAddonCatalogs();
}
return {
name: config?.addonName || Env.ADDON_NAME,
id: addonId,
version: Env.VERSION === 'unknown' ? '0.0.0' : Env.VERSION,
description: config?.addonDescription || Env.DESCRIPTION,
catalogs,
resources,
types: resources.reduce((types, resource) => {
const resourceTypes =
typeof resource === 'string' ? [resource] : resource.types;
return [...new Set([...types, ...resourceTypes])];
}, [] as string[]),
background:
config?.addonBackground ||
'https://raw.githubusercontent.com/Viren070/AIOStreams/refs/heads/main/packages/frontend/public/assets/background.png',
logo:
config?.addonLogo ||
'https://raw.githubusercontent.com/Viren070/AIOStreams/refs/heads/main/packages/frontend/public/assets/logo.png',
behaviorHints: {
configurable: true,
configurationRequired: config ? false : true,
},
addonCatalogs,
stremioAddonsConfig:
Env.STREMIO_ADDONS_CONFIG_ISSUER && Env.STREMIO_ADDONS_CONFIG_SIGNATURE
? {
issuer: Env.STREMIO_ADDONS_CONFIG_ISSUER,
signature: Env.STREMIO_ADDONS_CONFIG_SIGNATURE,
}
: undefined,
};
};
router.get('/', async (req: Request, res: Response<Manifest>, next) => {
logger.debug('Manifest request received', { userData: req.userData });
try {
res.status(200).json(await manifest(req.userData));
} catch (error) {
logger.error(`Failed to generate manifest: ${error}`);
next(new APIError(constants.ErrorCode.INTERNAL_SERVER_ERROR));
}
});