From a65b8fb507f1127ec4335b2bb50b4e89283f0cc9 Mon Sep 17 00:00:00 2001 From: WebStreamr <210764791+webstreamr@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:43:30 +0000 Subject: [PATCH] fix(extractor): use title from XPrime API --- src/extractor/XPrime.test.ts | 2 +- src/extractor/XPrime.ts | 14 ++++++++++++-- src/extractor/__snapshots__/XPrime.test.ts.snap | 8 ++++---- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/extractor/XPrime.test.ts b/src/extractor/XPrime.test.ts index f843697..51d9e7f 100644 --- a/src/extractor/XPrime.test.ts +++ b/src/extractor/XPrime.test.ts @@ -20,7 +20,7 @@ describe('XPrime', () => { }); test('primebox Alien: Earth', async () => { - expect(await extractorRegistry.handle(ctx, new URL('https://backend.xprime.tv/primebox?name=Alien%3A%20Earth&year=2025&season=1&episode=1'), CountryCode.en, 'Alien: Earth')).toMatchSnapshot(); + expect(await extractorRegistry.handle(ctx, new URL('https://backend.xprime.tv/primebox?name=Alien%3A%20Earth&year=2025&season=1&episode=1'), CountryCode.en, 'Alien: Earth 1x1')).toMatchSnapshot(); }); test('primebox not found', async () => { diff --git a/src/extractor/XPrime.ts b/src/extractor/XPrime.ts index f0fecd8..2628f57 100644 --- a/src/extractor/XPrime.ts +++ b/src/extractor/XPrime.ts @@ -4,6 +4,13 @@ import { Extractor } from './Extractor'; interface XPrimePrimeboxResponsePartial { streams: Record; + series_info?: { + episode: number; + season: number; + title: string; + year: string; + }; + title?: string; } export class XPrime extends Extractor { @@ -25,7 +32,7 @@ export class XPrime extends Extractor { return null !== url.host.match(/xprime/); } - protected async extractInternal(ctx: Context, url: URL, countryCode: CountryCode, title: string | undefined): Promise { + protected async extractInternal(ctx: Context, url: URL, countryCode: CountryCode): Promise { const urlResults: UrlResult[] = []; const referer = url.protocol + '//' + url.hostname.split('.').slice(-2).join('.'); // Strip subdomains @@ -35,6 +42,9 @@ export class XPrime extends Extractor { for (const [resolution, stream] of Object.entries(jsonResponse.streams)) { const url = new URL(stream); + const title = jsonResponse.series_info + ? `${jsonResponse.series_info.title} ${jsonResponse.series_info.season}x${jsonResponse.series_info.episode} (${jsonResponse.series_info.year})` + : jsonResponse.title; urlResults.push({ url, @@ -46,7 +56,7 @@ export class XPrime extends Extractor { countryCodes: [countryCode], bytes: parseInt((await this.fetcher.head(ctx, url, { headers: { Referer: referer }, minCacheTtl: this.ttl }))['content-length'] as string), height: parseInt(resolution), - title: `${title}`, + title, }, requestHeaders: { Referer: referer, diff --git a/src/extractor/__snapshots__/XPrime.test.ts.snap b/src/extractor/__snapshots__/XPrime.test.ts.snap index c7a881e..ac9172d 100644 --- a/src/extractor/__snapshots__/XPrime.test.ts.snap +++ b/src/extractor/__snapshots__/XPrime.test.ts.snap @@ -11,7 +11,7 @@ exports[`XPrime primebox Alien: Earth 1`] = ` "en", ], "height": 1080, - "title": "Alien: Earth", + "title": "Alien: Earth 1x1 (2025)", }, "requestHeaders": { "Referer": "https://xprime.tv", @@ -29,7 +29,7 @@ exports[`XPrime primebox Alien: Earth 1`] = ` "en", ], "height": 480, - "title": "Alien: Earth", + "title": "Alien: Earth 1x1 (2025)", }, "requestHeaders": { "Referer": "https://xprime.tv", @@ -52,7 +52,7 @@ exports[`XPrime primebox Superman 1`] = ` "en", ], "height": 480, - "title": "Superman (2025)", + "title": "Superman", }, "requestHeaders": { "Referer": "https://xprime.tv", @@ -70,7 +70,7 @@ exports[`XPrime primebox Superman 1`] = ` "en", ], "height": 720, - "title": "Superman (2025)", + "title": "Superman", }, "requestHeaders": { "Referer": "https://xprime.tv",