diff --git a/packages/addon/src/server.ts b/packages/addon/src/server.ts index 4b5a6764..2ac060b2 100644 --- a/packages/addon/src/server.ts +++ b/packages/addon/src/server.ts @@ -47,7 +47,7 @@ app.get('/stream/:type/:id', (req: Request, res: Response) => { res.status(200).json(missingConfig(rootUrl(req))); }); -app.get('/:config/stream/:type/:id', (req: Request, res: Response) => { +app.get('/:config/stream/:type/:id.json', (req: Request, res: Response) => { const config = req.params.config; // Decode Base64 encoded JSON config @@ -63,9 +63,8 @@ app.get('/:config/stream/:type/:id', (req: Request, res: Response) => { const decodedPath = decodeURIComponent(req.path); const streamMatch = new RegExp( - `/stream/(movie|series)/tt([0-9]{7,})(?::([0-9]+):([0-9]+))?\.json` + `/stream/(movie|series)/([^/]+)\.json` ).exec(decodedPath.replace(`/${config}`, '')); - if (!streamMatch) { // log after removing config if present console.error(`Invalid request: ${decodedPath.replace(`/${config}`, '')}`); @@ -73,46 +72,18 @@ app.get('/:config/stream/:type/:id', (req: Request, res: Response) => { return; } - const [type, id, season, episode] = streamMatch.slice(1); + const [type, id] = streamMatch.slice(1); console.log( - `Received /stream request with Type: ${type}, ID: ${id}, Season: ${season}, Episode: ${episode}` + `Received /stream request with Type: ${type}, ID: ${id}` ); - let streamRequest: StreamRequest; - - switch (type) { - case 'series': - if (!season || !episode) { - res.status(400).send('Invalid request'); - console.log( - `Request type was series but season or episode was missing` - ); - return; - } - streamRequest = { - id, - type: 'series', - season, - episode, - }; - break; - case 'movie': - if (season || episode) { - console.log(`Request type was movie but season or episode was present`); - res.status(400).send('Invalid request'); - return; - } - streamRequest = { - id, - type: 'movie', - }; - break; - default: - console.log(`Request type was invalid`); - res.status(400).send('Invalid request'); - return; + if (type !== 'movie' && type !== 'series') { + res.status(400).send('Invalid type'); + return; } + let streamRequest: StreamRequest = { id, type }; + try { const { valid, errorCode, errorMessage } = validateConfig(configJson); if (!valid) { diff --git a/packages/cloudflare-worker/src/index.ts b/packages/cloudflare-worker/src/index.ts index 9b77cdb5..da37798c 100644 --- a/packages/cloudflare-worker/src/index.ts +++ b/packages/cloudflare-worker/src/index.ts @@ -71,7 +71,7 @@ export default { const config = components[0]; const decodedPath = decodeURIComponent(url.pathname); - const streamMatch = /\/stream\/(movie|series)\/tt(\d{7,})(?::(\d+):(\d+))?.json/.exec(decodedPath.replace(`/${config}`, '')); + const streamMatch = /stream\/(movie|series)\/([^/]+)\.json/.exec(decodedPath.replace(`/${config}`, '')); if (!streamMatch) { let path = decodedPath.replace(`/${config}`, ''); @@ -79,9 +79,9 @@ export default { return createResponse('Invalid request', 400); } - const [type, id, season, episode] = streamMatch.slice(1); + const [type, id] = streamMatch.slice(1); console.log( - `Received /stream request with Type: ${type}, ID: ${id}, Season: ${season}, Episode: ${episode}` + `Received /stream request with Type: ${type}, ID: ${id}` ); let decodedConfig: Config; @@ -101,30 +101,12 @@ export default { ); } - let streamRequest: StreamRequest; - - switch (type) { - case 'series': - if (!season || !episode) { - return createResponse('Invalid Request', 400); - } - streamRequest = { - id, - type: 'series', - season: season, - episode: episode, - }; - break; - case 'movie': - streamRequest = { - id, - type: 'movie', - }; - break; - default: - return createResponse('Invalid Request', 400); + if (type !== 'movie' && type !== 'series') { + return createResponse('Invalid Request', 400); } + let streamRequest: StreamRequest = { id, type }; + const aioStreams = new AIOStreams(decodedConfig); const streams = await aioStreams.getStreams(streamRequest); return createJsonResponse({ streams }); diff --git a/packages/types/src/types.ts b/packages/types/src/types.ts index 485b13c1..646f904a 100644 --- a/packages/types/src/types.ts +++ b/packages/types/src/types.ts @@ -73,20 +73,11 @@ export interface Subtitle { lang: string; } -interface MovieRequest { +export interface StreamRequest { id: string; - type: 'movie'; + type: 'series' | 'movie'; } -interface SeriesRequest { - id: string; - type: 'series'; - season: string; - episode: string; -} - -export type StreamRequest = MovieRequest | SeriesRequest; - export type Resolution = { [key: string]: boolean }; export type Quality = { [key: string]: boolean }; export type VisualTag = { [key: string]: boolean }; diff --git a/packages/wrappers/src/base.ts b/packages/wrappers/src/base.ts index 4b763880..83710268 100644 --- a/packages/wrappers/src/base.ts +++ b/packages/wrappers/src/base.ts @@ -8,7 +8,7 @@ import { extractSizeInBytes, parseFilename } from '@aiostreams/parser'; import { serviceDetails } from './details'; export class BaseWrapper { - private readonly streamPath: string = 'stream/{type}/tt{id}.json'; + private readonly streamPath: string = 'stream/{type}/{id}.json'; private indexerTimeout: number; protected addonName: string; private addonUrl: string; @@ -37,15 +37,11 @@ export class BaseWrapper { } private getStreamUrl(streamRequest: StreamRequest) { - let finalId = - streamRequest.type === 'series' - ? `${streamRequest.id}:${streamRequest.season}:${streamRequest.episode}` - : streamRequest.id; return ( this.addonUrl.replace('manifest.json', '') + this.streamPath .replace('{type}', streamRequest.type) - .replace('{id}', finalId) + .replace('{id}', streamRequest.id) ); }