diff --git a/src/extractor/XPrime.test.ts b/src/extractor/XPrime.test.ts new file mode 100644 index 0000000..f843697 --- /dev/null +++ b/src/extractor/XPrime.test.ts @@ -0,0 +1,29 @@ +import winston from 'winston'; +import { createTestContext } from '../test'; +import { CountryCode } from '../types'; +import { FetcherMock } from '../utils'; +import { ExtractorRegistry } from './ExtractorRegistry'; +import { XPrime } from './XPrime'; + +const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }); +const extractorRegistry = new ExtractorRegistry(logger, [new XPrime(new FetcherMock(`${__dirname}/__fixtures__/XPrime`))]); + +const ctx = createTestContext(); + +describe('XPrime', () => { + test('unknown backend is ignored', async () => { + expect(await extractorRegistry.handle(ctx, new URL('https://backend.xprime.tv/unknown?name=Superman&year=2025'), CountryCode.en, 'Superman (2025)')).toMatchSnapshot(); + }); + + test('primebox Superman', async () => { + expect(await extractorRegistry.handle(ctx, new URL('https://backend.xprime.tv/primebox?name=Superman&year=2025'), CountryCode.en, 'Superman (2025)')).toMatchSnapshot(); + }); + + 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(); + }); + + test('primebox not found', async () => { + expect(await extractorRegistry.handle(ctx, new URL('https://backend.xprime.tv/primebox?name=Jurassic%20World%20Rebirth&year=2025'), CountryCode.en, 'Jurassic World Rebirth (2025)')).toMatchSnapshot(); + }); +}); diff --git a/src/extractor/XPrime.ts b/src/extractor/XPrime.ts new file mode 100644 index 0000000..f0fecd8 --- /dev/null +++ b/src/extractor/XPrime.ts @@ -0,0 +1,60 @@ +import { Context, CountryCode, Format, UrlResult } from '../types'; +import { Fetcher } from '../utils'; +import { Extractor } from './Extractor'; + +interface XPrimePrimeboxResponsePartial { + streams: Record; +} + +export class XPrime extends Extractor { + public readonly id = 'xprime'; + + public readonly label = 'XPrime'; + + public override readonly ttl: number = 10800000; // 3h + + private readonly fetcher: Fetcher; + + public constructor(fetcher: Fetcher) { + super(); + + this.fetcher = fetcher; + } + + public supports(_ctx: Context, url: URL): boolean { + return null !== url.host.match(/xprime/); + } + + protected async extractInternal(ctx: Context, url: URL, countryCode: CountryCode, title: string | undefined): Promise { + const urlResults: UrlResult[] = []; + + const referer = url.protocol + '//' + url.hostname.split('.').slice(-2).join('.'); // Strip subdomains + + if (url.href.includes('primebox')) { + const jsonResponse = JSON.parse(await this.fetcher.text(ctx, url)) as XPrimePrimeboxResponsePartial; + + for (const [resolution, stream] of Object.entries(jsonResponse.streams)) { + const url = new URL(stream); + + urlResults.push({ + url, + format: Format.mp4, + label: `${this.label} Primebox`, + sourceId: `${this.id}_${countryCode}_primebox`, + ttl: this.ttl, + meta: { + 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}`, + }, + requestHeaders: { + Referer: referer, + }, + }); + } + } + + return urlResults; + }; +} diff --git a/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-1631c50f388844984edc66178ed9fc16 b/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-1631c50f388844984edc66178ed9fc16 new file mode 100644 index 0000000..485fe5d --- /dev/null +++ b/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-1631c50f388844984edc66178ed9fc16 @@ -0,0 +1 @@ +{"accept-ranges":"bytes","access-control-allow-methods":"*","access-control-allow-origin":"https://xprime.tv","age":"189968","ali-swift-global-savetime":"1755063340","alt-svc":"h3=\":443\"; ma=86400","cache-control":"public, max-age=31536000, immutable","cdn-cache-control":"public, max-age=31536000, immutable","cf-cache-status":"MISS","cf-ray":"96f7f793caffd26c-FRA","connection":"close","content-disposition":"attachment;filename=Alien: Earth-S1E1-480P.mp4","content-length":"420170402","content-type":"video/mp4","date":"Fri, 15 Aug 2025 10:21:48 GMT","eagleid":"2ff617a417552533081123028e","etag":"\"C6A45A0457EDA758D7DF7576FF2FDB1C-12\"","last-modified":"Wed, 13 Aug 2025 05:30:23 GMT","nel":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}","report-to":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=iK6KXy00H4dsUV65PssAn7rKLgvq2C2cak5DPDyN0R%2BpG8MpU3RJIVMrmmf4Ux79jlRKXxBT3S%2Bjp210eZLTAkruPkqJBbm%2BRgrYNXnjwBaTOkkKhDwZC3Hdb6OKpX0sbnvb2YXyqsTpQ0786Z35AARB6RaQhms%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}","server":"cloudflare","server-timing":"cfL4;desc=\"?proto=TCP&rtt=0&min_rtt=0&rtt_var=0&sent=0&recv=0&lost=0&retrans=0&sent_bytes=0&recv_bytes=0&delivery_rate=0&cwnd=0&unsent_bytes=0&cid=2581445feac3607a&ts=721&x=0\"","timing-allow-origin":"*","vary":"Accept-Encoding","via":"ens-cache30.l2us4[160,160,206-0,M], ens-cache20.l2us4[161,0], ens-cache15.us22[0,0,200-0,H], ens-cache16.us22[5,0]","x-cache":"HIT TCP_HIT dirn:11:315619406 mlen:0","x-oss-cdn-auth":"success","x-oss-hash-crc64ecma":"16834050796546943518","x-oss-object-type":"Multipart","x-oss-request-id":"689C242CA5D3D93034286C85","x-oss-server-time":"8","x-oss-storage-class":"Standard","x-swift-cachetime":"31104000","x-swift-savetime":"Wed, 13 Aug 2025 05:35:40 GMT"} \ No newline at end of file diff --git a/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-ab4d9eb3b877778ac1dc5049b76b4c6b b/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-ab4d9eb3b877778ac1dc5049b76b4c6b new file mode 100644 index 0000000..4b90aad --- /dev/null +++ b/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-ab4d9eb3b877778ac1dc5049b76b4c6b @@ -0,0 +1 @@ +{"accept-ranges":"bytes","access-control-allow-methods":"*","access-control-allow-origin":"https://xprime.tv","age":"199101","ali-swift-global-savetime":"1755054206","alt-svc":"h3=\":443\"; ma=86400","cache-control":"public, max-age=31536000, immutable","cdn-cache-control":"public, max-age=31536000, immutable","cf-cache-status":"MISS","cf-ray":"96f7f7937a70d26c-FRA","connection":"close","content-disposition":"attachment;filename=Alien: Earth-S1E1-1080P.mp4","content-length":"871281904","content-type":"video/mp4","date":"Fri, 15 Aug 2025 10:21:47 GMT","eagleid":"a3b5fea017552533074354078e","etag":"\"A916E682B7AC6E06B851A8C778FECF87-51\"","last-modified":"Wed, 13 Aug 2025 03:03:24 GMT","nel":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}","report-to":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=4VKbB%2B%2BCwOuVnc8rJR1AXcYR6yksEpmK1RNI5BXUt0EZW5HhZwtdvOVk%2BOdtenwt492cI5myJvdekV2GKA78Pz17V%2FMTLSCnaBXkfFKttbLfmdXxKL51w6dBncXMmq3J1rvW%2BlDBLMxqtMlvN%2FXNMlkJdZXScSc%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}","server":"cloudflare","server-timing":"cfL4;desc=\"?proto=TCP&rtt=0&min_rtt=0&rtt_var=0&sent=0&recv=0&lost=0&retrans=0&sent_bytes=0&recv_bytes=0&delivery_rate=0&cwnd=0&unsent_bytes=0&cid=eb4294c1b3c9cfec&ts=40&x=0\"","timing-allow-origin":"*","vary":"Accept-Encoding","via":"ens-cache12.l2de3[19,19,206-0,M], ens-cache2.l2de3[386,0], ens-cache5.de10[0,0,200-0,H], ens-cache12.de10[3,0]","x-cache":"HIT TCP_MEM_HIT dirn:-2:-2 mlen:0","x-oss-cdn-auth":"success","x-oss-hash-crc64ecma":"11633186024771853813","x-oss-object-type":"Multipart","x-oss-request-id":"689C007E989F153439D3D9E1","x-oss-server-time":"16","x-oss-storage-class":"Standard","x-swift-cachetime":"31104000","x-swift-savetime":"Wed, 13 Aug 2025 03:03:26 GMT"} \ No newline at end of file diff --git a/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-c29c4da102aa03b0daa32906662c0769 b/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-c29c4da102aa03b0daa32906662c0769 new file mode 100644 index 0000000..f995e35 --- /dev/null +++ b/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-c29c4da102aa03b0daa32906662c0769 @@ -0,0 +1 @@ +{"accept-ranges":"bytes","access-control-allow-methods":"*","access-control-allow-origin":"https://xprime.tv","age":"5442571","ali-swift-global-savetime":"1749810736","alt-svc":"h3=\":443\"; ma=86400","cache-control":"public, max-age=31536000, immutable","cdn-cache-control":"public, max-age=31536000, immutable","cf-cache-status":"MISS","cf-ray":"96f7f790ed31d26c-FRA","connection":"close","content-disposition":"attachment;filename=Superman.mp4","content-length":"896638128","content-type":"video/mp4","date":"Fri, 15 Aug 2025 10:21:47 GMT","eagleid":"a3b5fea317552533071221673e","etag":"\"E273E5E2EA0F4F351EE597E014D3EDEE-3\"","last-modified":"Thu, 01 Jun 2023 12:10:55 GMT","nel":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}","report-to":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=MPOgJvCX2NGVXvLVAkL9Do%2BXxQJB6Z2j1%2FaClvju88VXQvlO21PTiMZaPtnjIorRafTOREYJ9Y8892ZJkQ38oV5%2BNFcJSUfJQo8hY0Kv3rPPrNYWZBYMFGqgQhOxIk3dsBiowMrb22BRG6cgPv3UGjW4cCxuEoc%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}","server":"cloudflare","server-timing":"cfL4;desc=\"?proto=TCP&rtt=0&min_rtt=0&rtt_var=0&sent=0&recv=0&lost=0&retrans=0&sent_bytes=0&recv_bytes=0&delivery_rate=0&cwnd=0&unsent_bytes=0&cid=503c8ba5bfeda5bc&ts=125&x=0\"","timing-allow-origin":"*","vary":"Accept-Encoding","via":"ens-cache1.l2de3[0,0,206-0,H], ens-cache5.l2de3[1,0], ens-cache13.de10[0,0,200-0,H], ens-cache15.de10[4,0]","x-cache":"HIT TCP_MEM_HIT dirn:-2:-2 mlen:0","x-oss-cdn-auth":"success","x-oss-hash-crc64ecma":"4771098201880069728","x-oss-object-type":"Multipart","x-oss-qos-delay-time":"1426548","x-oss-request-id":"684BFE2F2547D43238F66A0F","x-oss-server-time":"4","x-oss-storage-class":"Standard","x-swift-cachetime":"30538308","x-swift-savetime":"Thu, 19 Jun 2025 23:40:28 GMT"} \ No newline at end of file diff --git a/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-dd0e4b16f44d92bd4152c576686c7a20 b/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-dd0e4b16f44d92bd4152c576686c7a20 new file mode 100644 index 0000000..346ecd2 --- /dev/null +++ b/src/extractor/__fixtures__/XPrime/head-https:oca.flutch09.workers.dev-dd0e4b16f44d92bd4152c576686c7a20 @@ -0,0 +1 @@ +{"accept-ranges":"bytes","access-control-allow-methods":"*","access-control-allow-origin":"https://xprime.tv","age":"1163","ali-swift-global-savetime":"1749411183","alt-svc":"h3=\":443\"; ma=86400","cache-control":"public, max-age=31536000, immutable","cdn-cache-control":"public, max-age=31536000, immutable","cf-cache-status":"HIT","cf-ray":"96f7f7909ca9d26c-FRA","connection":"close","content-disposition":"attachment;filename=Superman.mp4","content-length":"401394599","content-type":"video/mp4","date":"Fri, 15 Aug 2025 10:21:47 GMT","eagleid":"a3b5fea617552521434468697e","etag":"\"0F8C23B2BD3CC7F6BA6379E8354B0F84\"","last-modified":"Thu, 17 Nov 2022 00:30:11 GMT","nel":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}","report-to":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=5FtQGStEmGWQDt5%2FJ9tfbv6%2FV8Zu7qy7b%2BnLU%2BdVqv7ojoP7bEtRJ%2BXY5xpTmWTFuzFVroRhqPLEb873RCU60Jhc7iZhZDhLPISYsqnek%2BDvftzT96Fv9Yk1tQQxDL2pm%2BpAlnZfAD8D4cW%2BEQ4ofLszBL1YaTs%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}","server":"cloudflare","server-timing":"cfL4;desc=\"?proto=TCP&rtt=0&min_rtt=0&rtt_var=0&sent=0&recv=0&lost=0&retrans=0&sent_bytes=0&recv_bytes=0&delivery_rate=0&cwnd=0&unsent_bytes=0&cid=2e26c3ffa922ad37&ts=31&x=0\"","timing-allow-origin":"*","vary":"Accept-Encoding","via":"ens-cache8.l2de3[0,0,206-0,H], ens-cache12.l2de3[3,0], ens-cache17.de10[0,0,200-0,H], ens-cache18.de10[7,0]","x-cache":"HIT TCP_MEM_HIT dirn:-2:-2 mlen:0","x-oss-cdn-auth":"success","x-oss-hash-crc64ecma":"4264950399079041808","x-oss-object-type":"Normal","x-oss-request-id":"6845E56FB7AA223534E03B81","x-oss-server-time":"27","x-oss-storage-class":"Standard","x-swift-cachetime":"30691545","x-swift-savetime":"Fri, 13 Jun 2025 14:07:18 GMT"} \ No newline at end of file diff --git a/src/extractor/__fixtures__/XPrime/https:backend.xprime.tvprimeboxnameAlienpercent3Apercent20Earthandyear2025andseason1andepisode1 b/src/extractor/__fixtures__/XPrime/https:backend.xprime.tvprimeboxnameAlienpercent3Apercent20Earthandyear2025andseason1andepisode1 new file mode 100644 index 0000000..4b3a645 --- /dev/null +++ b/src/extractor/__fixtures__/XPrime/https:backend.xprime.tvprimeboxnameAlienpercent3Apercent20Earthandyear2025andseason1andepisode1 @@ -0,0 +1 @@ +{"available_qualities":["1080P","480P"],"has_subtitles":true,"series_info":{"episode":1,"season":1,"title":"Alien: Earth","type":"series","year":"2025"},"status":"ok","streams":{"1080P":"https://oca.flutch09.workers.dev/?v=cenBDs9Hbnv6PuXYzNUtVR2ZZ2YtmVtQIt6JqHB1dsbz2Y%2BXC9UwPurnE%2BQNk27Yr1WeYeLOOazAnSL8cU0DvVfg4pwKsjHKWIJICiVlvv9ndXII0bR7eaIi%2B11NbAj72pFFryHZjO6MkMKEJJnF4G%2BH1BXIO1ALds7J1A7gj2vc7DbUWL8kPxwH1rMw7NAys20M5s3PsbhgSrMpguZSBm8X&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe","480P":"https://oca.flutch09.workers.dev/?v=oS2n5QbXtpa%2BWXMpIIi0SqeqadEyYEAg6AmHvpTa3jzooh6zxINciUJrR%2B6b1xLZtxbnbAM3mrGGXOa5yckYkNSC%2BKGEFSdofXw298vq3ssHpI9LBN6XLvhtxnDfmub0QoMG%2Fkvgjhb8T%2FwiCHo9NeSX%2FetW6ANppW9jhZn0Hv3hsWdmES1jqj6nfIjQ1ur53htjr2vF7mZbZSsJ&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe"},"subtitles":[{"file":"https://forwarder.kendrickl-3amar.site/?url=Re0esYNLY2had3I4aBc60z2DMpD0IseRJSZdkhpFEYfh5G0QfvxSHZmbU8JNS3%2FnWk3EvEHVE1Wws3EeOV%2FibKVTWuCifv2twB7whsJVVBC2csjy8RL5GO1LXI7ufXJD7AS07lvs9eYgSw1MAOc3kIKsASySlSBbrtfbPxx4vALxbz8EkPA6Q7muDw6x3w95o3FkAjEJh3aSaVPLzt2i6n83q4R86PvOVTPztcRHMaqKCD5hoQQXBbQEbbSvsYKK8ZAh0r05A3M2BkVULpxBDLwy%2F9zSxVrU40Q%2Bg5uMBEWm3Awc4gF6IYzgwak6h9TWNrNPtvtSOe6LMb%2B9PrioPxlliXc0jOhwAzWXnXXl1llxb3DueOkl8UWcOQZEIZo5teF%2FyBpD8nANSnKwMARf6vpBmDuJ3WJk3p%2F9aUSdvQfEZg7cb%2F2SUpI9HnXWquBbqrDK%2BZIEhDHB56QBoryRJRCPLLRA6TqIfOdyL1rlbQsqGESw%2F1f7EeSSCB0LH7CZbqVBNWwND9vi0bg2lWz9US6pbTWvhh47y8u0af2g8BeWRqhIf1VvFbPs3q4ZoO9SB0xvMY8PSaxE1xVG2j3tW%2FwHNc6%2BAh9T%2FmrOUeKsoXJyl6zA6%2Bt42DjHNT9%2FsShP2QKQZAb2vQQHTtsHIyA5pR6VefDeRRQqNQ%2Bd1izHv9szK%2Bs1X8BewfNjl1%2BXnCoJTYsV3J3rQud%2Bu2TgpC68cFfjYNo3a0nCA%2FIvjIO6qcXPZs545FTbeEvWrCV2ucKtmA6d7hx8vazpEapWTIAqPq5c6GXkzag8ckFIACqjVj0nf01OYgzJPoDNDIwd0WxHKR%2FibjRhZC8unap7nNXe7Qg96817LdBcsWXAES06ZAw4X05xD6WwctDXTdE4CA%3D%3D&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"اَلْعَرَبِيَّةُ"},{"file":"https://forwarder.kendrickl-3amar.site/?url=PXGL2hhpDxwOBt8XgGZDwLa%2BAeYxehLMFZOetzuqi4ymIQhhY36Z7yrgidhPd0P99qUXDpgasSWSGogYJ2xQOn3qz5SH%2FJpj29ObtSkpT9Kzw%2FAYqfv5HE2rpvfL9%2BwLaqq9HSlgsWsbqZnZLwinfx%2BGDM4XMygDU%2F1RvDW9Gu%2B5f2OqgP6u%2Bc27K3N9roJJVMcew45U3hH7xYT6f46O47A1pbnWhGQY8pPYcfhw1uI2OHRouxGoHO%2Fl0%2B9wPa6hUFPCbuZXiCxqR8G7mSvVN3a3rKG10PcUmUQR9evsCO675PT9z90X2pqk%2FrftfkEoq6JFGB5poLHwOsyYkTkBjT2qxHKxUSn2c6%2BH5%2BykvrcgAfcII9nyiAwdufqy%2FurRS8ZXe099EFiRRStZk%2B7cBJQM%2FEJs2lChWVvCRJZtk1gJf2Wm9FzM845LRTOfWG1svzaZKVaqgaBfZ03gK59oGN1XC4GcOXI7Cg%2BS%2F%2FtlS0PjlqaL0RH3vEMu%2Bbo6ft%2BADjrS%2Fwd5mGbTFBlyOby3rjv%2FyD5%2Byi7N298GPP7x0xZnd8ulTnUNSryeVHyeKLgt1BwHt9PbHdeT4YRl4IyftOw7nIQQwePTKPODhXSuxjFUPSnXVpYGRGnKufXnwNNE2BUsZF5yG3N97B5kRi16m78NyP%2Be7SRvyfqGYqA%2FjFuvZl3L6zwLV0vs7mpUO4ggc%2F5XtNmHotlnrQasOR879PdkR0%2Be9QBlQ70vUbhJdrqxIFn5M%2BfneDCKFZanB8SbQBw7Na7Smlu%2FcSxN%2FQPcdYCcatQXXHJS6z6h9JpkjcVIRYtxPelpg9Z%2BtIRjyYYZHRH0gq3tauNwBcs0kah3QLvjVqGZuj1DTW0vIS8znLIPCPRfYN3U&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"বাংলা"},{"file":"https://forwarder.kendrickl-3amar.site/?url=o7GqT3%2BL0WO%2B%2BPuNSSn4rzPEkq%2B%2FAqxCTtJhlvGaTeWJMRld6FHMbHBruzheV4FZVQBU5wmMdLI3Cb%2BSINsaCv5T4DiLVn168vS371g7xSTU5D5DHE%2FIOo05un9leOv9WWKvOgx6hQdWU0gQ6g1yfMGl6MGrHUyPr%2B0xL9ZdAoWHFiA6nQ8uahZY2Pi31A0kcUxTq9nYypLncbH1G0uLYqqjvezdQmCsLdi9%2BsD5h3JsMp%2BiVopx2gr%2BnJN4A%2FJk8anUZSLaLY7e6ItNECkIzcTrdLgCkEVkkQIFyHTIkWRW%2BH0WfXktpr8OYNDGFtUwIYGP4AhgaWocG1I2xKAcy%2BmCbO3CRWa%2FtLk6mNdbV8vJdPfrhqJ0Y8MPiuB0H11uK%2BoDAdRhSmQ1PUhZUfWVmfaGBl88sVypCkBk8MV6w2gUP7k%2FY6ih8YacsIpjoQCNwEZzOoiJ9Ih6ljqV8hq%2B%2BX62RhKZCTmDuSX0DKHeOR64MmoDZxqsee6hz5OPoprBGVM7wNmcpnWRNKodxjgHjoE5F%2BaALgd7LKgtxQdoPuwhElhc00qAgu3XKWzbg6nBtUbbRriN8eqoCH22jGW1Fz4EdAaJAZvXnVezywucFlocYQcqkYeIHTZxC5ZDR8gY67nlT%2B0q%2Bpr%2BxedWvPqQnrk0oUxke0kbwgCBNVridwgPuy3IMGCQOJiDfCedXgNRG64uepC%2BDT9jYUWHJBEc3cS8pAUjSk%2Fq5q46RMgtjhnLcJxhc3b6T8zKDMpogqLssF%2FHPu%2FFfYGvxn0iDQ4CbCyrUN%2B8A6cshSvCD2a7NILMhf9W3MtEGpfHLQi4oOdfOHdr8z5tjg5cnOaXAP4y08KpqnFrwESXwfHTX02yWXiThdeUjVHDgweput82Hg%3D%3D&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"English"},{"file":"https://forwarder.kendrickl-3amar.site/?url=1MpHvNdTweSFVwqn25jKRKJuBlNR9bo4RA%2BXlwddmJnfoLLpAaRBgpWxThSE%2Bo%2FPWpgXez3KG4AZ6vTB7QbYBiEJL00smKAZXL8BvviGfjzD1y%2Fux%2BMmSzANvT0EKt3H5UwEYGkULbghOfanyeauCbNzMtsNhVWurynSEfhQ24xKJsY2bDQlsQNagGQRemKB94y%2FUttByXIfuw9QOnsQlGnFgmlXAvE8KV%2BZqTSMU5qcKRCTytwmO9%2FOhhB4fowEB%2B5I4nCps524SlB0XCePQCZCXpAH06Paow%2B90jGqyi%2B3ajvnI%2FN5Jc8pwXLEYK2Efgf0rnaz4Ikl8YzEvUqlv0sqs1HtgzECfeIGDItw9%2BkYNdfmLgQIs%2FsiFKEyjd7AW6Qi32V2AOlAUJ55jnDBpkQA7luQAFH1ru2f4EZgNZkqk0Fm%2FZL1p6doJET%2FNeWVSVK%2BR4Etv89AczmiauVEs5aKVgvh981xaTzLJF4Rm0gmHpluG5WQdwoKmYSfO9Rr%2FB7KBtbJCKI0My48iK7Yw10b9X3ZiCTb3qlyHEyNSnzzxRrAQv0htqocmvalt6SmoAxNWhR%2B8lat6RmOjzA8MU89O8xo8ad%2FCHLkPgjz%2FyHvwjJnlKlJLEeKkTbtd5cug7Xr1PjxarEcYE%2FqK3FDiCMJamCJn6zAkzPv7L0SAgMfFvtolvoSpZylF8w69szTpiVLYbN%2B1KDGJU9UhhvSkI7kLDApdTpZwc4SJWOLy6z1LhXonaVzo%2FEKNnR%2FNcF%2FfFtnRi5kEQaal3bwJPBqMCDf%2BQlLz6eakWpImle0spoOyjip7unEPx9u4oqXI0x1QYiKLxjL03CzdS89dxcEmVbUBvpvhbgZ9i3F56vEDH%2BbQKtspqPS&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"Filipino"},{"file":"https://forwarder.kendrickl-3amar.site/?url=5rdVokLidPXrviS1n0%2B81Ni0kt1%2BC3G1PrPDLW31lohmJVCZZ%2B3GrBTiIbuSWeDCgpT87nD0jXVkkEeuyxzJX0lyNzrIhLnQcnPHPKzZPdtNAnJeSterMdp7sNnvtlpm%2F7PUQQF4rcafrmBgQvF18RqJ1CTCHcT3fMLsvh4WLWys6YoIysYuhymksQUPmYFlyijTLVDDff8XHTKYouiOUU2nk5OV9BBD6xQnRF2eDCUaMET18QDw9CuxtF0sJQwnp%2F%2BQezH4%2B6%2FwWF4VpPaVn4O7%2Fei6vgSLff7LxF3Pd7%2F%2B5gbCHJKtA%2B1NzMMBxwwm0a5y8ERR4%2BUn2nLVz5r8DzD8ghLSyXeXR7oLXR95JGLrvziwMckID9PkVPP9x6g3wq7%2BZch0Y5aY5a7vsHAtHG61e2OxSf8IAJ00HSsMC%2FnDxAEcxmM4SbW58c7r%2FwEWYQyXsRGaGrThTIbHeKsamSMem2GHuYyAlgo7On5F6NclDHIUnNmU9aA%2FfsdukwUUm2%2Be7XVEo9eNTyzm9PoV7E9N43sDGOptixO3qMcPYP9e2vQwS69e0TvGVYkiW%2FTwd7xDEHdSgEVUW1lEPwcH3yrG779kYxd6qT21CMj1kIE1kpO5d%2B27YabsQURvhVdpMKhLJ%2FkQ2Kj%2BgMDWJyKU8D9HDJ%2BabqlOb%2Bivem5YEwzpHBOjRnxHLBox8m4oNBYCfe2E7m%2FvoLnWCV8rOllCm8ZtzPbKBBg5Z1eLL46PtnL8C27OgbKxAn0Yc3HQyq0IwEv%2BxOOjBxksJDxA04MGIP%2BEtX1fgnLENcXYDT%2BBmkrM7AvT5GZKTDeb2TzWf6ml91fobBBKAWfoexeS4I0zZHJ9YtOjPHx5oZpAj7bv%2FKgg3581sRja&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"Français"},{"file":"https://forwarder.kendrickl-3amar.site/?url=o7DfiJ3p7Zj6KKb61WrRMmwpxf7MdNEvf5Z2zTzimDNTj2KPKdiWvtBD1z3uvIXPkbhieut9CTATmT259mD3%2FTRfQac1mT9NSjLOsHGr0UEhNY4cKh8Cs6GToW08Rg8FZKqLQ7DcDAZpHJMkIFATNzRsWmXvnJEeQNWlP8%2B%2FWRnrMW%2FxX1plvipCUtjFtbB1LnH4mviJVOfg9r0Pz6i6ijWa9FtwfBCIjwMs4eMcQvC3lolezH7sTSakVy9nIozK2rQ4rRe%2Bhw%2FA5Eb1ZOH8dEl8RMubl5%2BFP%2BbVGyaQxhKOzhtpLfhXCUbXHSqJrgwEznRoT6ImidDiqSYB4ClOhsY%2FQSlFG%2FTe300L%2FVI1nm2jXMCIUajnEDZyq3LMjKSC7siBfZfYlT8F1V3N9A5JUwsJE9iAGwDELetp%2F06POncfRszvuFyGaXk3569kmXardVvVgEHxcPI3kR6DqhGPyXymyJ5bJsYjx2tKDr3E3pQfB2qvmU2Ze531WDToMmJkK2cCFAEhnHiGyjN%2Ba0TxIHKOTNor0on7K910010ix0JQyUGk7JyVtHH8VW2qEKca3F7HjkuY4XWmb3R%2BBshDEzWVTYCXJKhmGT5nX2KRtBZZ55%2BokGYWPEXp2EJlhX%2BpBQyk76yrmNTMrq0Unhh3OKvF0nhGBiDnv8WBiZ0NEO1ciTf0K%2FsiaDIQhWJb9yd3SWlwsp%2Fr5tpTmm9cj2hNOXdQwKDPOzMASPcwRkt3cg0ptCL6ezW49Iwso9zWOlxauZjeT2GwyhBOfjuzntsLoqYzWDTrqj9OD02cmLeDmih3LNbdK3J2AQl3lAnKya8C0%2FykM5X4fDWNZERhLl1WLPdaeO9r2CKWzjeH5AjF6tr0a1Ozw8AVu7TPdD7OWw%3D%3D&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"Indonesian"},{"file":"https://forwarder.kendrickl-3amar.site/?url=ROIIYGxj%2FAIQM3LewBA8PcPIk%2FSpwoxwT11epnfeAGziu1W2kh7SALq2QO1ycTanHkdtOiilVtCfuuvab0OWrUQvP7SSrli6DSh%2FC2y8CgLpM6BtAbhXkKEePraPoP1qXX3lphj%2BJxuTME58QbYpdEzgNgSpvzxFn7m3EckwUor20pmGqyHSuXPimUbE%2FHO6lt%2FMbz2lKH2F1uV%2F3RxtVEAzIDGwObp7qz9MiBvzPT%2BDsgAUb9EeBdsLX%2F0lspYbXZbVIEn433V%2BiaptXOcD0F12kJ6iJyjW8jd%2Bxgv3TLHfIBvqWm3M0NWcLkILwkZD%2Fa9h4jiOIo56BRdCHQCzTgvrTX0lL%2FB6BzSZvaprRmGUoN7dx7FcdpyTytBFzAaLTZ%2FKoQyxOoUbXqOlTKXkze5UMkHRfMlFRQ%2FZvf4nMeyQOe8KpGVM482jXSTPulF%2FlrSHaEv6CDIL6MDRlKZJ5Ua%2BFEeULbHoNrj5BXvxp0JmV3XyfKzqXZ5PmqmfNmmWzd0Q962WaTrsWsY4ylmzoJ5YBurhhJGx7qK%2FYwaG841lj3k%2FzThHEZZMP8zVzdyTws0yyowLEpIPAq8bsVYuWBRxIYeWGlUeXCn%2BocFZzpJWJg1q8CIr0ziyb7ouMJXMwz8guPhJ7yNQEDt%2BsEJnVOk6K7v%2F2K5DqyJTsiexgDcQKkAzclXHRXsr%2BIiJhGuPBq9DgXxy1UNqvTJDeRFQLtxoprsXVtwx5%2Bp3q9KzFZSh7pRk6j7HnHtpCemIhEp%2Bh9gUeibPuk8ZrL%2BYo%2FKzRkJFswpRhkl%2Bilfx1nWiCoBx0fLnE5KOpLvmzlxL009kbBZmb1%2FFq0duWqYdQXOirZWngdMl3Zk9tvJtwpNok5KwR0JKq%2Fx4ALJ5FppTAw%3D%3D&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"Malay"},{"file":"https://forwarder.kendrickl-3amar.site/?url=Sc%2FkMnpm1TfZlrNEEhmm7SydWZikRF83ui%2For3O1xZFL4m%2FzAVjffMFiKKmMannVThUE7If%2BeHiJvsVhZ18Iy490JNzjIrf5wMyIKydoiXXlYy6rTxksYcun1LLoTYZXW9HLBQwI%2BWloUENs%2FehB7%2BDf%2BgxN%2BnknKDi10adtN6Sdki0vuAya6jD9zzEy27jY45IFB8ItruIrFyLsCR1%2FCJS%2Bhmg2SQfWW1KHiUhdPQgI4bNtJOAE9V16tmse%2F81P3PxdYHqsiaB%2F7ZCd6o3%2BxMn%2FEGW08N0y3HNBIm88HpdkkYI6GyiY%2Fef7ubmMxF%2FXhimh2rNgjL%2FQiIo%2B3dkXjjTEBz3CMIqUuNeAUw0FcNzBNLQz0ntGzW8RcxhQhIbdFCc9TAO%2Bqo44AMUWIaLN6dQi8s2eiTHHTxmx2188XmiRxIii2m%2FD4tnWaHt8tMrHvhK8n6A8Djgcs80vuqZ2LHvPlNCin%2BvdDytYXjTSVNP08LUYEl2dOJvWB%2FVv0RybPOCI1LivQCbj88s4MBW05sMXbZynqXxqSvA0eJShEjohdTuqAqjG5DYNhjIfzHMvQXsslZd4ZKta99%2FRhsDXTmszaMsXCBSFzREQyPxb3au1rH8x36sIbdCxsOTlWzvR0j2gcdAgje%2FX1l%2F8K5dNXwMbKvFsGW2gy2Z7yixBTofaud25EyBqSLVk2GMHpn8UqHTzBYhBNTTPjP7ERvM8lRdHgdh0OSDCMz5bdU%2F3A%2BXfrdq%2BnZafAlcXJDiX8em75Xl0o0azyzU5or%2BWbKatOPIkjat7iHmYQdS0DDDU6v9phBQceyXdtvbskIHOIolwuVsNxDB95GLP3%2F6nQ1wnUEJRZJwwI8TWO6Mhx4TFUbdCRCw3FxT9&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"اُردُو"}],"title":"Alien: Earth"} \ No newline at end of file diff --git a/src/extractor/__fixtures__/XPrime/https:backend.xprime.tvprimeboxnameJurassicpercent20Worldpercent20Rebirthandyear2025 b/src/extractor/__fixtures__/XPrime/https:backend.xprime.tvprimeboxnameJurassicpercent20Worldpercent20Rebirthandyear2025 new file mode 100644 index 0000000..14644be --- /dev/null +++ b/src/extractor/__fixtures__/XPrime/https:backend.xprime.tvprimeboxnameJurassicpercent20Worldpercent20Rebirthandyear2025 @@ -0,0 +1 @@ +{"available_qualities":[],"has_subtitles":false,"message":"No exact match found for Jurassic World Rebirth (2025)","status":"not_found","streams":{},"subtitles":[]} \ No newline at end of file diff --git a/src/extractor/__fixtures__/XPrime/https:backend.xprime.tvprimeboxnameSupermanandyear2025 b/src/extractor/__fixtures__/XPrime/https:backend.xprime.tvprimeboxnameSupermanandyear2025 new file mode 100644 index 0000000..acc8eb8 --- /dev/null +++ b/src/extractor/__fixtures__/XPrime/https:backend.xprime.tvprimeboxnameSupermanandyear2025 @@ -0,0 +1 @@ +{"available_qualities":["720P","480P"],"has_subtitles":true,"status":"ok","streams":{"480P":"https://oca.flutch09.workers.dev/?v=3RVZDNxcKNs6%2BqcdL1bDCgq9Yp1iPYqb6a9yToLq66vlzu08R1Hz7jiKx4OBH6YzJBcK7skuiDGDwIpro78ReVjMLtMHCfa0fBo0aJ9RYULOUMkLrZxjzSTXvo5Jss1Jiss8e9Z8pFdlC1VqwAUm6G9mx0u41dFLJ0GTJrwCesPe4zflbL8I76WkWYKBMT2MwHvDTIO4r3V0nf8BsRswsNJZ&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe","720P":"https://oca.flutch09.workers.dev/?v=gUbhHOwpFIqajH6NnoH%2BYE9AWORUUogamkdYQedBfKi5eQtyniWtxmI1%2B5Swyl1ThC6vM0qHl53s0Q7j%2BDaWFhVRJQL%2BJRxbuOL1iCz1w5xVPLDU%2FTJ3zhf9EbULPGbbee14kdNYNc5%2FlF2sNe6RiUupsvhlj%2BjcgsT8uypX%2BudVyw1jVEUVogufPnc0lSrfoE98IZlOgdjBZKE3%2Fcw3erD2&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe"},"subtitles":[{"file":"https://forwarder.kendrickl-3amar.site/?url=Z6vZlMiVEzkM25l213NT37O1ij4qX3URHa6uTTzPLNLCT6NVwZAx2ppIbl6T1XDeB9F0xAnIghfMq249%2FW2JdAcTXsucgdv3FvHi8u1dCMVqmjOeSzP9y8pRPSAKe31546FQdfg3EdgBRNmY3Ey5F5dKzBXMXBertg0sc8WINKb73eMExu5puuwj%2BRY27%2FmrgbXrFtPqqiEzj6f3s%2FVaVvGlisiEkIwsMjWj9aWlV8vDDGCn6Wlo445%2Bv7NhiwHQWwClu8a2S1DXQD9PxT093uckOpYy94vN3UrziWW9ZscYAefjlIFIA%2FPaXCm58rxYS5HxNFylxDaaTd2sr0ZjxbUv85g12fhhMtKbz8BVSdrgZsO%2BJtperDLZONaaD7KOy%2FlG%2Fj6PXhlWa7snxvCR4%2B9d1nQuGPzlAf0Dm6s%2FI5EPwPvq8yR7LzpZYkfj4r0hVanT%2FO9ROyx0WnySMmKORTrGY80I08%2FHexB3iFN%2BD9qZ%2FSQidfoQiaHC1WJf%2B0QgLrjxw7nS%2BaHbqHW%2Bzqclezg8%2FOo5Me4S1yffRr37GImPsVSI9bZBG8cw5dv%2BnIKg2di1K9HlXA7kuXNly8%2FsfCezQq74Umajv%2BwbXDM%2F%2FBkDTMqDtH7T7uhGZNF5bL7hndDwJEIiN3SwqwkOCR%2Fi7N5FejvVIokhfgg9aGnQ9nXZ%2FA5KY4th6HLYIM2L%2FAOYERSP6nJPU4f%2FlfH705Nn2WKfnHzdg37Wywl1uRn0L8LOe4Do0Ycx0IqZD7PWyVy6rieCMcOkYiKRNeCbTe84lum9FGzcguWgFCey3opPMR1QQOeTxepFTXA84p2MZ%2B5092wI%2Fo5yam02wbNzWMAFghdw6S6CbPhH012rO1h4KLe3qLcji%2F%2Bc8LUmX0VPaQ%3D%3D&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"اَلْعَرَبِيَّةُ"},{"file":"https://forwarder.kendrickl-3amar.site/?url=OlKIPl8V6CO0vtkwAuT6df2PMKFeo6DPaO4O1uuHgun2nYNo7JVkNk96q6r75Mn6dccZ%2BCCW9UErudyK7JRr4TWMsEDL16mp01XoDCfH5NiQx9AkOTMJyJdD0kP7VhRLJON2kzdRy%2BdsVJZk0wyuu4osdSZkaDD7n7u2XulsaY%2FScx0D9p49oZDOe4JxevUTGz3%2Fyl9nLLE2mwNGz4CzeVHnFWUh8Yj0AvYWDDAvJvTg7iNvOeE%2BjcAgg1Ri7rdafDM6X5RbPT%2FVFYYTkdWgashjumhxCoddvAquX4GRMOTRrLAwsO9N1kUZsGppdlj0Nl5GDLkE4jOj6hKMNDUWA31QV0MeG9FjuZgZkile0xkpo%2F%2BgpzcThAfC8SQpgR%2F4RSHy%2FeHsSycoNmEKsLRJJ%2BaamVNZQ9Mub8sWWAUG8CA%2Fy5LJ3vC7gAE9SJwc9NwNNS1Iv1j4JDQNiulsGoNH0ELU7mISKxPvKlqV6gWKTiEtloWurINztZDzgbFn5fCdwzs9qmQGPMiCj1eeFqrO8AdBjliC38SuEsM%2F3x8OP9a4ryqdzlLx0TFwbLW8mphiHHd83nOcsjWn5II13AUjHu5QnV18ODUwkouFftz7XfxzNmpnU0Oq6GBElWamhO4hm16WM5E9VdCf3T4ARrH15MEuslRPo%2FwlL54aKyxFsDGTPn%2BUycigzOjDgNPhnxAaNH42WRuJKTnj5GOez%2F6bLg93R5jLheO5AI3lSnSQNG4Q54QGVcYBU9GaFNwUeoinGahx2NglMpPTFmzHQmPTK2Rc3%2BUkEuTbhhJ7Z97N8JtMzoEW9TLuKLWM1MWZjTnpZbT3FPLpz2EI4yhFE1YKiffaUczolnm4wUlxz3cSz%2F%2BPQqbYfe4L&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"বাংলা"},{"file":"https://forwarder.kendrickl-3amar.site/?url=LmW8r1zbz1TkJxBWApM2jgPNSswrD%2B7PRfm98A0Gm9%2FDJc3IyPIcOumUR7mOuGmbCiybm5Whi%2Fz8qaS0LbdI8JZw7FqllispPtv0coNGNdhCG3bAQlCGH0IexsgV%2BT7PpcWVP1tCh%2B4IsGOOB%2BT6uJZkSGlgyobijbw%2BxWzkyid0Sxl5L5U7rmaCg%2FRYzD%2FVetluqaCC9yL8NS2gLp4MmpnS5VoZ7xyN%2BYkzffb6%2FSCTuusjzIqE60R8Ch8eMgNqVOhhh3ETqdit8dp1DrnqCvJD8izjVCa1EAwNOX0I4bkKh32JWddf3xhqLK4Vw18mSHMJ6iz6xlxHaCBXs%2BCNYapZ18q%2F7demNqjxGxu7HjQdvQ6TYV6QyNRxPhLGp2CFIP4PD9cSe5UQ%2BQwpQe6z%2BCHQ9JsvOPzI7IErKJ09fj8dmhemmK35Iy%2BflkA3Y%2Bznf73VGt%2BqUfZdjsgDgmzsLOL2HcUfBlBvwDeFujVqeQAzMZJhgsxefBpF9KTH2AM53lLBhpcbHdie%2FNC5RMNDn%2FUYgfn6mgH%2B0xEPrnXdf4Um2TOj0v0xTg4SLWEuy4yr8SfT7ygoqWID%2BsqVzkc3rF97rQRZeoHTX8JeBO25RHBbFhRx7BRqynGgNCVMgCi6ZaQ0q635PK%2Bv%2Fn%2BW4CwQ2Pkz%2FaRuz7eXjibrji6fYJ51duK6QPeQA8FFUsagWBtHoPtdjn3OTMkZwAeacMEtHEg7Tjr4noCd%2Bom4OL9I%2FVY7SpQFkIoEM9trVPmXGf6i30m3MjXJCw3G6YJfBdjUZlelUFoNJJbCjng5FMIMJiiKt%2FVoPRpAY%2FQYkIOBMIvkPvw4GVchPSvWy%2FdMmrcjLeAnciRgoDihq4OGdNOBKWxa4%2FKZNFIYOxaIzkGtsA%3D%3D&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"English"},{"file":"https://forwarder.kendrickl-3amar.site/?url=vumHJ6MM7Cvp6reEFUEl0gYgGz0zpVPRo6e81rOIy1dMiIz7WsPaSZy2krKhMu%2FboBbZPon0nENd52LXP7KRCtq%2B8si4ZsZEA1BnCssM5G3nW9m0fX4qEtPgUZfkxqUEivpSxTZzPlzc20qE0EBCe7oNPJtrk2Le3wtuibo3lqwI1fkW%2FYS0fMKggQw8uFQ94FRwMh62bo6Q98Qe3HQLi510y1HxCOf%2FAfGU4%2BE6nAwDiAVZEVqlIsG3zMzjYZ8x7ERQtmMa%2FlhllTgZzMgnWx0WDHNmmtOehmWnBdvn6a3QLvv8fCMpuXOIqgQQvHa2WByy%2FPzGu8KjeQV2xK%2FtvvXkDtvnsu80%2BbW9TPaT8LlwsgCmJIXAYtav%2BEsk1H1%2BOrp0armndwlNZK1XuOBR3v8aaUDdAJb87o%2Bpmt8pARXrR9wOdZgswCJvr8NcYwRsRYM4z6J9i2ujltVHGxUpRI%2BaNpqGUMMkR5u3NUZGW0pgOnNj5Cw1YIsFfudWlSd6E1OXXA1%2FaoAskyBSr4PliP7BFjYjm4SKrsyWjLYoPZ8m1Srtg7HRAYhUSTr%2BcHdkMwpTcun8Lp89XoanvzjcfJ%2BM56FOf53XdLJfOCddBca5Cw5WEsefTdQaxxGDBSFF%2FbjT8T%2F%2FzwdPjumRwJHQ3GTiEwCOwGSuTb7KCP02XQE%2BHJwdBAqGRTqOXGpP%2FqlbvoKqaq%2BS293cxfrss4EQlc7Xf2lSA%2FObK0%2Ba4FT9lHZa69ZHyJTlh5YxVWocKZCcdGiVlL%2FKrrHHtIupk5EorMS%2BnY%2FUT2YCxCol5ddHCyDpq2n5whrtW5b%2BNeV5QmwYQo726VJ98YLIgj12ymyzcIfu0%2BlaLTAKu0qVXwQsMQB1t3BYppXG&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"Filipino"},{"file":"https://forwarder.kendrickl-3amar.site/?url=GB58%2BnHrnE4THFbtqszTEqE0jcIW9o3gqT6DcKoDLP0qbS2WbiA6pXfqve4YYPJQbmsLhWtJrfSl6Jxo7bcIosUbvznuiTkqbKwNs0czCqpf6RnjTaBTmfPY44GaGBT1hWKCOT6dSM9eKq31UESlOdFXind3NupxXTpDuHlCivoE8OnidbyJ14e8c7hVpvCMPgHDaOEO5kw%2Bo7G95fpl3jS5xnc%2F9M1AHYo%2FbGDx%2FR3coYyYfgMqxzb7IdKwAQPBDVvQGuUrrSCrsRIEBD80Iec9JfxCYHpNpnIQLES86VRCBTntKAaGPpo%2BKFMq1k3UOeg%2BK0zT4kPSKoDX8LyBSOVBF1WAMoCxygw9utD1xOP6mLLNmgteXsZWk%2B8tQPnURX12qiQUrsJ4jR4JLZ9qt6MrxsvNBFc%2BSPfDKSPKM%2FhV9%2F%2FUgjZed6KpofSfQFPASQlwzugITUH8s682QP79RdROYihhqcXES5lHzilGfIbQGcFFbP7i5IZ67bdHo1SQ5KV5fo6mCxNv3DCIN3M4LYczuDAIOV4ZCCUj94B0Vvttg7Nc58Ar1KsqZU3UO3xdNXdaMNIOF186UdMvK9E4JN3rw9ClDUKaCZZ%2B5bnVROPu6B6Fsimc349kbsOr%2F4y%2BF7GDZfLUHTN6y0deEhd2Ogrt9ueHqrYDjQgs3Kn5QQeFDjZu1tQbFlTPYlGb6NPwQM1twYGLEEpGHy58v0vZ1xrB4vIqfAT%2BCylb0wf%2Bfn%2BAz4vd3S1ciH7sD0d0NDs6ppVlbIOTf8NLLy2HpnwNnQfXYGkkmopciKAVuFC5SaWXoGmWIsZktp7gjZYxEYuxE5ddbuV4D3sweE4sry21c8cuTkNq%2FXld3BSb0%2FnxA%2B8DHzBZvkdLvUX%2B%2FdptNQ%3D%3D&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"Français"},{"file":"https://forwarder.kendrickl-3amar.site/?url=g2PZ8iYh0EnimbIs3eICSDiEhfuqIPMzSO8PghHAV%2FgvuBOek2KFxjD4CcPmkoVfEaVH5BPHUg4sL%2BaU8ukbljZ2uxDYI45Tt9AmSv%2FFyEW3BoA213oymIZgVTZQDomifBEL3bKyPTjOc31A%2Bm1XrmtZv%2BAW9Y7NKn4jLNWcX8gGBHt2ZUKfDyJ58f3jk8jJrCXr5KIe3U4T8LBfksu139ifgc9U537u9dWYU5pM1HPEBiloI%2B33AnOUc6IOWdg%2FuK3noXe1eKfVH%2FeAvNJSHd6hBsffBQwNa%2Fh44L%2BiEZpycXTcD3d%2Bl9fSq24aMQBHFAl%2FySKGbTGruUotQPcYcro11qgCzdpNCPZBMgifqfhiyUuF5ZBoybyRTO7mOI%2FCS%2FqO1WwwjqqFlC8G8ucixnXmrUTrMe3cyn5rlUkTvSVRraHJXbPFnJNLJQL5B7%2FOTiug8D%2BWr%2FTTJExUffo2WlY3eqfHz4Md%2FkYF3U9I2GwEXUOJ5gnlSCe1di6foeQE5WhRJEfXH0i2l7%2B5TVG%2F524EWixf2%2FmAtvw0773zCi5DZ%2BAnOsBy6WGmQjRr4YbbpctjN0xnQXeGeGLmtsiWLkAE20jlqcL%2BIFj3nI0KpAVuGeswzR6xEV7e%2FnaKwnWv0Pgz%2FWonwM%2FiIDYk0vYDodUcHNBjhEpHjn33b9Rj%2BGZB%2B3ja6EcoLUeP%2FtGFgphOcOTvl3SXb7o0VrVxggN3Kr4sBDNeqShS%2FPF0dnt%2BlXnhEepBKkVcXb8zCN6vyk7AWN4MfqsdBqaNA9LSuz5FSU2zZBL7%2BEtllk5Bpy8QF3Em7tx1oQbXj0NeNhpsBdqhxn08g6K%2F2LaII1aL9ASaNI%2BqWhXGFfhMTQ3KGsvNcgoR3rnMtgdZCuXo06sOTQ%3D%3D&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"هَرْشٜن هَوْس"},{"file":"https://forwarder.kendrickl-3amar.site/?url=7V9cOp9X0JPkh7X61ESuRxoCK6dbbjgpfsUanD%2FF6DvZwW%2BMR%2BXL7YAQ4Ng3XNcvaBmIDdfy5SCnBwVYeA4u58TDDO8lcgtlHSGW0GGEzKpep9gBItY7V1Sbg0sG3YwswkZ3mZ%2B7aMH0W5p5q6iRgRAhVRRdoDizS3vbzdJ%2FyJ7DOJOpK2uRuaz67YF8zSDSG%2Fo8VXfE8wcIh6YCWC8iRpSKA1E6RIb4VuDmIVFPhNBIqrvUBIc9TTlq3W8CCTiPAxLeD4x84cffUUouWCSsrwU17FSQARV7G5Zz6g56%2FYqtwKIVKrAB7lrckIUFKybWbQHXEz62jaM%2BpWPbdfJImxQSorRknNz2STsonRdQ1RRwPigvfpsdmhNE5GNHuIh2A7sTq1xfgNypmD%2BrcXzn%2Fo3pFOcpiugdRkYrDYq%2F43cAVdBvfssdz8SnRKOIzoFQEfCxwn%2B43Ity7FW95Wua2VDaCA%2FwdzTRHHCTiStWJDfktXGdbl9YIuxKkoxqq8RapBZ0EKa0DVmjaRJNVIBiP6Ng2CEskAR7m6wXHNEKwm%2BScu%2BNwUKDU%2BApXGUqEzFVptAypoX6GGENAkgUWyWJsDdPwmGsO0pXkyXvUvp1coL9vBooY7of9%2FBaKQDG%2BJXiJunMOgTkzXdC8zbZGgpzDIt9r7R3jUKd%2F1bmPHRY7OpYp3ffuyCEzzg0i%2BK7o%2F0s8n1cn1zj%2ByHKug%2B4KyMbvTA2dlBhPOrRxoiO8Zjf0OJFFF6z9gGjTDQrdmnu0R3a9X7oZ7siWhp12FymBpDXOHVSt6WLGbMApAQJ%2BbACiLGPHhuqOxG3X6ynmdoAjtpuUmZY1D%2FGazzgeF4M6jZzM12u2GrmczLHRmjv6pNpuF9tsvESLdhJ&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"Indonesian"},{"file":"https://forwarder.kendrickl-3amar.site/?url=TKiL65v0dcGzpt60xdyU2duN6NbXZfrLPI2DohHHz77qJFKhJsDkGmtLGTuS6MigNQnqzrlUNOMHuUcEzOT6BX9Tx%2BMRtN3uO1Qw1lnRVkpjAxlBGf1DPrIajPKkTJLQFh17LeF4oi%2FmO1UIw6SmI0XqgLYOqfUvwQpOoqhdgBW3Z4%2BE4SUw8IVEkvZNaf%2Fwp4%2Fvm05mZJWf%2Fj60vsjC5QL6z79zLW%2B3A%2BIkgOLRptjHDdGqZ6eWfNgYU160PfKfaanMIX%2FHM96pqe27J6L515JHflSXuvZMWMZihZCBHMF8IotRLMAWBKYVToTDM3I1zZvqMq80JIJDbcGWukGS3AHk1k3AMkoToC15ZvSkPRkaJPQKrGWxydwc4YdT4KBywv%2BfDBE8THFqFIxqdMjKqYWuoejmNuO0QN27zZS3NyJj88MmBTmp8al6y2qU6iuis%2BqJsDL6TXwSP%2FTkgLVsvc8o9bZ%2BeM%2ByRZfD2KYiUPJvoCZbJGJArkPIPzDdi9X8OFNYFnadVgQR8lcJ%2BCC7o3kf34snsej7RmSx90hNzzs8vEn074WBAR9BaoTDnVsPy6vvD7zVjNZWF60GbbEEoyW6gbi5Wp7IAxUGyNPM7uOkYSv7onIGTJkaa2UqUQdE2Z0111bRy6SsWezdNwINv6bMUfihaa9eUbj%2FrDonbiN3UnApC6BaETx2Y3LPoshNO2CqzdF%2BuOiJ7ERiaulqpfr1AWkza9jMf5lHV%2B2Syj8ZwWaYxS%2BmZcIU9zE9vDkGn5SC5EYHW4EnILYM9pFGelgWPFDxxdX1u0Qj5H8oj6jPkYbVTET3tRIfjHZ8g708%2F91VwRMWRPHhrSYOExVkQRjQ0puANEFwjdestictdzVZi6uJvai1&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"ਪੰਜਾਬੀ"},{"file":"https://forwarder.kendrickl-3amar.site/?url=CN3%2BmaURWNPwtOsTIDgEVw%2BDy2Zhta%2FPiIEWg8%2BQ%2F6Qe7C%2BvGo1ygEpvQ3%2FwAKylaNTsUJtOViQVj5DLKhVRwtkeWtkRAirR7oAVKe47O4Y%2FECPegFyaZMCkKvchzp7xYWEo%2B0bebOntCbD9eGjw6SL%2B10QxEALqRl%2BbWQFUI7J%2B9nuj37TxnOOu9trWO9VYVRDFabfMeQlSflyWBM%2FuMY%2FzixwoT3dJaBihIZtErlqH2XzHML%2FGOSjFWpu79MFFv2jgmAHGxdEUEzf2p8NeDw%2FzhxoJ0jzSurzkyLjq2qAHBAqeNdWJtypT86DTiGBHgmYszehYhrSbJBVgCx5tr7717sJ%2BY98Ursx1vWsN1c19tZn0AahuAMCM9oj20El%2FdNjJ2LYk2rQsLq88z4xrhEYKOvgiFeLEhHrTL%2FS87k26QXPVPrwl4ZqBZOQELVMkbcHwYkGBHEQaBsD4Baer%2BlloBAf1I6EC%2FPXKgc57r%2F3X3B6BFDUj98ma%2BkV5aLj7D6UB3J%2Bc9KO0BySkA0pdjn0%2B%2BQJuodfN%2B3liMG4GwbkuwK%2FynZdfar7B4AKoA3%2Fe6pqzqg4O70VV9q9UqduJXXWg8vr98BEKFkp%2Fyh%2BsOF0iJ4kkUvk5i%2BB5ioNzltcY46%2FFxDIuf58UFXEHa3gu%2BhHq%2BRzX3Ff92GdhgzT9GcuD76ABBoJw3L2wNFhGU4vfIhV5n8aE%2BKsDyNDjNHpAa%2B8qdOpFWds%2FTsKSuY94lLDAquHV4sZZ6b5%2BGjfF8IoLZCx1XQPrldAyxHTE8tJazSVXzU2NUQu5N2KhkBIIFjoRj2j9ips8q23bOScnACii4rhErLyCYLjzm%2FFKBqdcMZnrMo3%2BRPyeD5LtCJCSLH9Sr7OmAdI4pIvJGCUU5Q%3D%3D&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"Português"},{"file":"https://forwarder.kendrickl-3amar.site/?url=KAXQxo19p6vuCqWf72jf9sZtpAyWvUX4IekrYk%2FKpt0YX4DULWbskyUEFTIqKBkRzXaFP%2FtuW%2Fh2YkhiRGkv1ANT7ZNVt2SHGLAGVTJ9wa6tV5dTT3u%2FKa6o7OK4VXwEhV9tVFjoWL78CW4Byp6mIFjGnidhe%2BaIXhVBpnpBXXKyM7%2F5MqNIqv0uF9F4WfSbdykfYA3oIgCSPH50AHY7ucxHBy6xPihexVr4LChHR%2FKA9bw0NQ7TOLtW5RAS4d3SV3K%2FzqnZZWE0clS5jsWTD65w4A%2F%2BMY%2FN92QxkUzQxEcDSR0CjjHb2O52Zj2mrZVz8WQUm%2BjyINEuiVGbrcqLGvILwgWVkyWgx6boDvlEnqZ2Bzb%2Fhqdxrchh%2ByeEWBt%2FsQ3L%2BCWXXAqz3tJZmv341fMly0xIADw1B7Lv5Nx%2BFVSL3siFMWZ5UEzM7cS2eifUU1XgbeoNpBkGljpeKLisb%2BtdzhDRHxUMga61DqMWcS2%2BRBAmCRPZ1ASUlwe3p8ywYB9SgwWUtJaY42psj%2BwLgTVsW%2BU7KTLBVlDkjDmW6QDGurMxZDKRimuIcNulNBJ5tUiqLopNNQCwSDTF1trwl3perFXrqQWK1byXtKKx1AZVp9ftCzH4IREQfi0LmHbnGWdYFLFX2AyEnRgoswmjHBU4RrWAmWV2%2F1AwVB5cvEura%2FhU%2Fjykqw3xLvQy39bMqAtkkI%2BOLxzslbEvpoQqWPYrVweihjP1hAMKITXa3QO3C6B0%2FT25JTU6YaM0uGBRi8FMAcCJfN46X6dURHK%2BOCtKyJ3OlrHSeyMA0q3Gbafmq0MOoR47U9BJVolUv9JKzjOU16H0tHMkbNZMsgGOm5LEHtATjexvybj%2B4klXcOiHIbduPaSS&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"Русский"},{"file":"https://forwarder.kendrickl-3amar.site/?url=bUjzfudyzZM6H6bXIx%2FtlJRduqvdGyBYkro5TzETmkYsNfoser63vfggXr2JrOF7T7BQpJXA3hiICszRtpBkpvFMGLVmuX4iu%2F5%2B3VMJsbdGwCcUvIViyr16P%2FYMMHNJVAPeIryTpI9jUuIsapb3EI4inPmSQqEZgxMOQn0LW%2F%2B2L6Lqb3i6uMMGt%2FDg7pIVGq5pLCIt30N%2FVJuNsqJV1GMU1ZOfit8T1F%2FWShlsY3HK8K1j3v8Qlej4gLXcsHC2WzCB6u7IR1QtzZHIU9QtB06MYdMo5tVYXf3fzbiq%2F9DQTj2Vm6xUfq73QNAPOBn%2FzncWzsu%2B4K3n5uswKpRCx8IT6qXlMujHidi3PrJ%2BMA1jmUs6FN4DLxBeaX%2FUZmGvwQdw9d9doeO%2F%2BNOfFurduLJFcGR92PooeqqgbvLH0D9rxmnEbde934mDgbYPa%2F8C4XB1wJ4qJuvnbYPPrHUxHUqbDXrD8euLH9x6epcyeVNtDAKgzvFpfHYurobm84UytH%2FRfpIUrbCz09uijs%2FsIHgxKof7x6ml3ovrYcul7UFpWP80flGv4alcCcg12B8aejMys8qSlP47IMdyGlP%2Fw1vKbFobo1RXGKTlF8B7zjvyRL4dASh7OmhNnhF5uFY7Iv15%2BSX1afXj2i%2B2zHhk2UqKUpKp64zfAyET%2FEce03tJHHk3PHJkRJVlbeFx0UQNs5SRfHxjYGtIytdjjLUvMQiP2hZ0apXMpYfWLvSiPHZflt4InSO1oEcIEbfvXsrFmaekTLOSDbDsDENQECjSqT6eKsddasiw%2BjupF0d%2FFo%2Bi528dtD0mIOgegI8BaSJ8ChSOng%2FOfmFW1oGTGqP0d2ID96gqgA5wSwBOQ3lBrMvvQeBcou%2B5hL4qTF4JxA%3D%3D&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"Kiswahili"},{"file":"https://forwarder.kendrickl-3amar.site/?url=mFQCQyZAhT2ODCZQBUaS781lFTlgUGIcAA7FNwEH%2FO4mdIvW0i89smLzeMGsBfPUgs%2FMqMnJiBozxU0nbmCafrRU8kKRaZNZAOEesYwNKoz5hO0T2vPqpA9nmi1PLgE9P%2BFzZu%2Fj41GHGuTkU1A3QFC9QgyFVdliwDyLTppjX88v3zyUELnje2ugmxlq7OFWffyKdpzW7nnVSLFwQfNq6Z8GH1V9riUrSFsy7iVtdFS%2B0%2FWZuooYQrJbHcygGHwPvaf5a6yPhTwn0P6D0ge3MBbAe6hOXC6CJgEascNXrLE%2Fxw1SjrmQhTZEH1bd0MU0ncwN4y090Yrbpfi06svEMcJQhT59LYo5ikFXtADuPISDSNwYs69XrfCNwx1kKouP0awMZYujQ1VIPdqC5V8ikEg6lPh3l%2B%2FHUEmN5EDiNcpmZsy1Iehn6%2FALUQ0TJbJZsW3YUkV3O%2Bc%2Bm%2F2GOtTaHWLEeB5%2F6ZdIjc8VgqUEg5gA7uQCrZvTcBcPpGWWYBqA0EFn4%2F1SuOvey4LANRqKfYeLm%2BG%2B7welPjnGHJrlZBKYUJQNNFik2ODT3ksMS4y1DCNJOAJhraqOYPliMgTZEpOKKk6mOpPVR%2BauUns4NQvzO3rqQQ16rJhrWq%2BKvCtTAe22Ezqt7dJZO7JQK%2FJg84N5bb2oINqTXlseaWMi1WLCAAvPNcGiaMepHUbXXrDRWZbmGL5CPXm56T7Qw2hD%2F0SRZMqxF6pQj7PCS1M45Dq58a5qS3hiuWVJINfB5YbFXlv7jbBf7iGOPV%2FcFfbjtt69bpNeKeiTh1lkSJksjk3hj2dg5y77VcVdk03mLo4OGkEuKnyYtQLw8HmsLSJ%2FfUIIr7q3cz2i3gHrw5QrZYveNrEGbfiB&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"اُردُو"},{"file":"https://forwarder.kendrickl-3amar.site/?url=fjXVEM4fEF5zEN3OaxeUh7Ju3waTBKFgTWRtMnc%2BV7SH6lKSSydp9xRjnZfAY3KSr2jA%2BdmWKpfWD90ektcQGfHEmAue39Djwg7%2F82BbNjqtjseAD5gc6pR%2F2%2B7vwVc6cp5NkxhrFFDhTa4Ay7wbtaB1Y4olgG3pOUOVOXLcFs7YiMh2B4ovrT72yNqwZYuryXQefLLpsSVEzdPNBjRuc0mcbrFvUujgz4WS4bcBPhFgZ%2FGgNwxi8WBKoj3zWn7eB5GkQn9x9OZe%2Fr9RG7HnPKh2BZxbGn0yZKLctaCQB263F2nsuL2nviwpcBY7lyqK914BQOVB00VttcJEhV%2Bpdo6ZP7Q8h7utkY0nc03Hrszqr8UbPsP6bDT2u%2FGEdcqE5fCUcRLCtCToBa3G1WTvHxD1T9QpgHAv66H%2Ful6I8v0DqqBlqubXmmTiiFm9y9CKIG2SQT6zXWd1MMr01AiCX6ElTyRYd4fRi0UIh7f5CrUJdDqG3I%2F%2Br5y4hK9FZd%2FlxtWfaTDseQkZQm%2Fjkjm%2F2Y2XtFdZ65bXBuxe2EEzQMkAZZj1rTe7w8SzeSJYc4SY86uO7Wcx54aoYPk4hlJ5U493RYFAoUkiVEUIdnaCZmf0JBxQo0j5B%2FMDDo3aafkBUu3memMH9Ov1egRZlxlnd0dx%2BEUEB6I6P2B%2F1tPlWbaHa2sm880fpW%2Bfow12ABaaxxtWsBQqE9zLxOWGSWh6erfTK8GNPvf5E8lJOvoPcfd5hl9h%2FgB%2BRTlgVnpCkVmqC%2BcPXBIx7G8YDr1WQpLMAj17Ic1b%2Fz7yZSldyET8u8ZDN14IElDTdu4EAU8uEwv7Tury1ER3qF7%2FdNSLAsP4e2%2FAAkggbk%2BHjTQr6rih%2BsYeShjP9OUg&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe&normal=","label":"中文"}],"title":"Superman"} \ No newline at end of file diff --git a/src/extractor/__snapshots__/XPrime.test.ts.snap b/src/extractor/__snapshots__/XPrime.test.ts.snap new file mode 100644 index 0000000..c7a881e --- /dev/null +++ b/src/extractor/__snapshots__/XPrime.test.ts.snap @@ -0,0 +1,87 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`XPrime primebox Alien: Earth 1`] = ` +[ + { + "format": "mp4", + "label": "XPrime Primebox", + "meta": { + "bytes": 871281904, + "countryCodes": [ + "en", + ], + "height": 1080, + "title": "Alien: Earth", + }, + "requestHeaders": { + "Referer": "https://xprime.tv", + }, + "sourceId": "xprime_en_primebox", + "ttl": 10800000, + "url": "https://oca.flutch09.workers.dev/?v=cenBDs9Hbnv6PuXYzNUtVR2ZZ2YtmVtQIt6JqHB1dsbz2Y%2BXC9UwPurnE%2BQNk27Yr1WeYeLOOazAnSL8cU0DvVfg4pwKsjHKWIJICiVlvv9ndXII0bR7eaIi%2B11NbAj72pFFryHZjO6MkMKEJJnF4G%2BH1BXIO1ALds7J1A7gj2vc7DbUWL8kPxwH1rMw7NAys20M5s3PsbhgSrMpguZSBm8X&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe", + }, + { + "format": "mp4", + "label": "XPrime Primebox", + "meta": { + "bytes": 420170402, + "countryCodes": [ + "en", + ], + "height": 480, + "title": "Alien: Earth", + }, + "requestHeaders": { + "Referer": "https://xprime.tv", + }, + "sourceId": "xprime_en_primebox", + "ttl": 10800000, + "url": "https://oca.flutch09.workers.dev/?v=oS2n5QbXtpa%2BWXMpIIi0SqeqadEyYEAg6AmHvpTa3jzooh6zxINciUJrR%2B6b1xLZtxbnbAM3mrGGXOa5yckYkNSC%2BKGEFSdofXw298vq3ssHpI9LBN6XLvhtxnDfmub0QoMG%2Fkvgjhb8T%2FwiCHo9NeSX%2FetW6ANppW9jhZn0Hv3hsWdmES1jqj6nfIjQ1ur53htjr2vF7mZbZSsJ&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe", + }, +] +`; + +exports[`XPrime primebox Superman 1`] = ` +[ + { + "format": "mp4", + "label": "XPrime Primebox", + "meta": { + "bytes": 401394599, + "countryCodes": [ + "en", + ], + "height": 480, + "title": "Superman (2025)", + }, + "requestHeaders": { + "Referer": "https://xprime.tv", + }, + "sourceId": "xprime_en_primebox", + "ttl": 10800000, + "url": "https://oca.flutch09.workers.dev/?v=3RVZDNxcKNs6%2BqcdL1bDCgq9Yp1iPYqb6a9yToLq66vlzu08R1Hz7jiKx4OBH6YzJBcK7skuiDGDwIpro78ReVjMLtMHCfa0fBo0aJ9RYULOUMkLrZxjzSTXvo5Jss1Jiss8e9Z8pFdlC1VqwAUm6G9mx0u41dFLJ0GTJrwCesPe4zflbL8I76WkWYKBMT2MwHvDTIO4r3V0nf8BsRswsNJZ&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe", + }, + { + "format": "mp4", + "label": "XPrime Primebox", + "meta": { + "bytes": 896638128, + "countryCodes": [ + "en", + ], + "height": 720, + "title": "Superman (2025)", + }, + "requestHeaders": { + "Referer": "https://xprime.tv", + }, + "sourceId": "xprime_en_primebox", + "ttl": 10800000, + "url": "https://oca.flutch09.workers.dev/?v=gUbhHOwpFIqajH6NnoH%2BYE9AWORUUogamkdYQedBfKi5eQtyniWtxmI1%2B5Swyl1ThC6vM0qHl53s0Q7j%2BDaWFhVRJQL%2BJRxbuOL1iCz1w5xVPLDU%2FTJ3zhf9EbULPGbbee14kdNYNc5%2FlF2sNe6RiUupsvhlj%2BjcgsT8uypX%2BudVyw1jVEUVogufPnc0lSrfoE98IZlOgdjBZKE3%2Fcw3erD2&headers=%7B%22origin%22%3A%22https%3A%2F%2Fmoviebox.ng%22%2C%22referer%22%3A%22https%3A%2F%2Fmoviebox.ng%22%7D&safe", + }, +] +`; + +exports[`XPrime primebox not found 1`] = `[]`; + +exports[`XPrime unknown backend is ignored 1`] = `[]`; diff --git a/src/extractor/index.ts b/src/extractor/index.ts index a10a406..a1f28c0 100644 --- a/src/extractor/index.ts +++ b/src/extractor/index.ts @@ -14,6 +14,7 @@ import { SuperVideo } from './SuperVideo'; import { Uqload } from './Uqload'; import { VidSrc } from './VidSrc'; import { VixSrc } from './VixSrc'; +import { XPrime } from './XPrime'; export * from './Extractor'; export * from './ExtractorRegistry'; @@ -32,5 +33,6 @@ export const createExtractors = (fetcher: Fetcher): Extractor[] => [ new Uqload(fetcher), new VidSrc(fetcher, ['in', 'pm', 'net', 'xyz', 'io', 'vc']), // https://vidsrc.domains/ new VixSrc(fetcher), + new XPrime(fetcher), new ExternalUrl(fetcher), // fallback extractor which must come last ]; diff --git a/src/source/XPrime.test.ts b/src/source/XPrime.test.ts new file mode 100644 index 0000000..ab13a91 --- /dev/null +++ b/src/source/XPrime.test.ts @@ -0,0 +1,23 @@ +import { createTestContext } from '../test'; +import { FetcherMock, TmdbId } from '../utils'; +import { XPrime } from './XPrime'; + +const ctx = createTestContext(); + +describe('XPrime', () => { + let handler: XPrime; + + beforeEach(() => { + handler = new XPrime(new FetcherMock(`${__dirname}/__fixtures__/XPrime`)); + }); + + test('handle alien: earth 1x1', async () => { + const streams = await handler.handle(ctx, 'series', new TmdbId(157239, 1, 1)); + expect(streams).toMatchSnapshot(); + }); + + test('handle superman', async () => { + const streams = await handler.handle(ctx, 'series', new TmdbId(1061474, undefined, undefined)); + expect(streams).toMatchSnapshot(); + }); +}); diff --git a/src/source/XPrime.ts b/src/source/XPrime.ts new file mode 100644 index 0000000..5d68815 --- /dev/null +++ b/src/source/XPrime.ts @@ -0,0 +1,42 @@ +import { ContentType } from 'stremio-addon-sdk'; +import { Context, CountryCode } from '../types'; +import { Fetcher, getTmdbId, getTmdbNameAndYear, Id } from '../utils'; +import { Source, SourceResult } from './types'; + +export class XPrime implements Source { + public readonly id = 'xprime'; + + public readonly label = 'XPrime'; + + public readonly contentTypes: ContentType[] = ['movie', 'series']; + + public readonly countryCodes: CountryCode[] = [CountryCode.en]; + + public readonly baseUrl = 'https://backend.xprime.tv'; + + private readonly fetcher: Fetcher; + + public constructor(fetcher: Fetcher) { + this.fetcher = fetcher; + } + + public async handle(ctx: Context, _type: string, id: Id): Promise { + const tmdbId = await getTmdbId(ctx, this.fetcher, id); + + const [name, year] = await getTmdbNameAndYear(ctx, this.fetcher, tmdbId); + + if (tmdbId.season) { + const title = `${name} ${tmdbId.season}x${tmdbId.episode}`; + + const urlPrimebox = new URL(`/primebox?name=${encodeURIComponent(name)}&year=${year}&season=${tmdbId.season}&episode=${tmdbId.episode}`, this.baseUrl); + + return [{ countryCode: CountryCode.en, title, url: urlPrimebox }]; + } + + const title = `${name} (${year})`; + + const urlPrimebox = new URL(`/primebox?name=${encodeURIComponent(name)}&year=${year}`, this.baseUrl); + + return [{ countryCode: CountryCode.en, title, url: urlPrimebox }]; + }; +} diff --git a/src/source/__fixtures__/XPrime/https:api.themoviedb.org3movie1061474 b/src/source/__fixtures__/XPrime/https:api.themoviedb.org3movie1061474 new file mode 100644 index 0000000..ca9fc4c --- /dev/null +++ b/src/source/__fixtures__/XPrime/https:api.themoviedb.org3movie1061474 @@ -0,0 +1 @@ +{"adult":false,"backdrop_path":"/eU7IfdWq8KQy0oNd4kKXS0QUR08.jpg","belongs_to_collection":null,"budget":225000000,"genres":[{"id":878,"name":"Science Fiction"},{"id":12,"name":"Adventure"},{"id":28,"name":"Action"}],"homepage":"https://www.superman.com","id":1061474,"imdb_id":"tt5950044","origin_country":["US"],"original_language":"en","original_title":"Superman","overview":"Superman, a journalist in Metropolis, embarks on a journey to reconcile his Kryptonian heritage with his human upbringing as Clark Kent.","popularity":168.8676,"poster_path":"/ombsmhYUqR4qqOLOxAyr5V8hbyv.jpg","production_companies":[{"id":184898,"logo_path":"/2Z2hiM1ERqFOWRxNxWoJZ8lTxhb.png","name":"DC Studios","origin_country":"US"},{"id":94218,"logo_path":"/kxuhS8wyKtVprOn5nckdHyNuSg1.png","name":"Troll Court Entertainment","origin_country":"US"},{"id":11565,"logo_path":"/odU3l6csuBmXUrzFm6araUgEUHQ.png","name":"The Safran Company","origin_country":"US"},{"id":216687,"logo_path":"/kKVYqekveOvLK1IgqdJojLjQvtu.png","name":"Domain Entertainment","origin_country":"US"}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2025-07-09","revenue":581086143,"runtime":130,"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"}],"status":"Released","tagline":"Look up.","title":"Superman","video":false,"vote_average":7.7,"vote_count":1684} \ No newline at end of file diff --git a/src/source/__fixtures__/XPrime/https:api.themoviedb.org3tv157239 b/src/source/__fixtures__/XPrime/https:api.themoviedb.org3tv157239 new file mode 100644 index 0000000..ad2f1b1 --- /dev/null +++ b/src/source/__fixtures__/XPrime/https:api.themoviedb.org3tv157239 @@ -0,0 +1 @@ +{"adult":false,"backdrop_path":"/25g7mthXoJFcNZhAKz0evk17Bsx.jpg","created_by":[{"id":202816,"credit_id":"620bdfc73e01ea002b2f90b1","name":"Noah Hawley","original_name":"Noah Hawley","gender":2,"profile_path":"/pxVP1lywEBA9y8x5Xe3kM7m4ai3.jpg"}],"episode_run_time":[],"first_air_date":"2025-08-12","genres":[{"id":10765,"name":"Sci-Fi & Fantasy"},{"id":18,"name":"Drama"}],"homepage":"https://www.fxnetworks.com/shows/alien-earth","id":157239,"in_production":true,"languages":["en"],"last_air_date":"2025-08-12","last_episode_to_air":{"id":6231083,"name":"Mr. October","overview":"Tensions rise between rival corporations, a reunion takes place, and a secret is revealed.","vote_average":8.5,"vote_count":10,"air_date":"2025-08-12","episode_number":2,"episode_type":"standard","production_code":"XWYV1002","runtime":56,"season_number":1,"show_id":157239,"still_path":"/hZclNGZx4pjOx6MNdJfTZid113f.jpg"},"name":"Alien: Earth","next_episode_to_air":{"id":6231084,"name":"Metamorphosis","overview":"The team returns home with unexpected cargo. An unsettling experiment occurs, and a new talent is discovered.","vote_average":0.0,"vote_count":0,"air_date":"2025-08-19","episode_number":3,"episode_type":"standard","production_code":"","runtime":54,"season_number":1,"show_id":157239,"still_path":null},"networks":[{"id":88,"logo_path":"/aexGjtcs42DgRtZh7zOxayiry4J.png","name":"FX","origin_country":"US"},{"id":453,"logo_path":"/pqUTCleNUiTLAVlelGxUgWn1ELh.png","name":"Hulu","origin_country":"US"}],"number_of_episodes":8,"number_of_seasons":1,"origin_country":["US"],"original_language":"en","original_name":"Alien: Earth","overview":"When the mysterious deep space research vessel USCSS Maginot crash-lands on Earth, Wendy and a ragtag group of tactical soldiers make a fateful discovery that puts them face-to-face with the planet's greatest threat.","popularity":395.6075,"poster_path":"/yueXS3q8BtoWekcHOATFHicLl3e.jpg","production_companies":[{"id":15990,"logo_path":"/5cT4zwHA66uNAr2p3CcBDLddXu2.png","name":"FX Productions","origin_country":"US"},{"id":221347,"logo_path":"/6Ry6uNBaa0IbbSs1XYIgX5DkA9r.png","name":"Scott Free Productions","origin_country":"US"},{"id":20814,"logo_path":null,"name":"26 Keys Productions","origin_country":"US"}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"seasons":[{"air_date":null,"episode_count":2,"id":469846,"name":"Specials","overview":"","poster_path":null,"season_number":0,"vote_average":0.0},{"air_date":"2025-08-12","episode_count":8,"id":243129,"name":"Season 1","overview":"As members of the crash recovery crew search for survivors among the wreckage of a mysterious crashed space vessel, they encounter mysterious predatory life forms more terrifying than they could have ever imagined.With this new threat unlocked, the search crew must fight for survival and what they choose to do with this discovery could change planet Earth as they know it.","poster_path":"/dJ7lUdzZ98AlhZ38BpfG6jy3UDa.jpg","season_number":1,"vote_average":8.3}],"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"}],"status":"Returning Series","tagline":"We were safer in space.","type":"Scripted","vote_average":8.26,"vote_count":96} \ No newline at end of file diff --git a/src/source/__snapshots__/XPrime.test.ts.snap b/src/source/__snapshots__/XPrime.test.ts.snap new file mode 100644 index 0000000..428e3a0 --- /dev/null +++ b/src/source/__snapshots__/XPrime.test.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`XPrime handle alien: earth 1x1 1`] = ` +[ + { + "countryCode": "en", + "title": "Alien: Earth 1x1", + "url": "https://backend.xprime.tv/primebox?name=Alien%3A%20Earth&year=2025&season=1&episode=1", + }, +] +`; + +exports[`XPrime handle superman 1`] = ` +[ + { + "countryCode": "en", + "title": "Superman (2025)", + "url": "https://backend.xprime.tv/primebox?name=Superman&year=2025", + }, +] +`; diff --git a/src/source/index.ts b/src/source/index.ts index af559e0..7a98753 100644 --- a/src/source/index.ts +++ b/src/source/index.ts @@ -16,6 +16,7 @@ import { Source } from './types'; import { VerHdLink } from './VerHdLink'; import { VidSrc } from './VidSrc'; import { VixSrc } from './VixSrc'; +import { XPrime } from './XPrime'; export * from './types'; @@ -26,6 +27,7 @@ export const createSources = (fetcher: Fetcher): Source[] => [ new PrimeWire(fetcher), new Soaper(fetcher), new VidSrc(fetcher), + new XPrime(fetcher), // ES / MX new CineHDPlus(fetcher), new Cuevana(fetcher), diff --git a/src/utils/__snapshots__/manifest.test.ts.snap b/src/utils/__snapshots__/manifest.test.ts.snap index 64d7977..7c9632c 100644 --- a/src/utils/__snapshots__/manifest.test.ts.snap +++ b/src/utils/__snapshots__/manifest.test.ts.snap @@ -21,7 +21,7 @@ exports[`buildManifest default manifest 1`] = ` }, { "key": "en", - "title": "English 🇺🇸 (PrimeWire, Soaper, VidSrc, VixSrc)", + "title": "English 🇺🇸 (PrimeWire, Soaper, VidSrc, VixSrc, XPrime)", "type": "checkbox", }, {