diff --git a/src/extractor/DoodStream.ts b/src/extractor/DoodStream.ts index 918972e..1724148 100644 --- a/src/extractor/DoodStream.ts +++ b/src/extractor/DoodStream.ts @@ -57,7 +57,7 @@ export class DoodStream extends Extractor { sourceId: `${this.id}_${countryCode}`, ttl: this.ttl, meta: { - countryCode, + countryCodes: [countryCode], title, ...(mp4Head['content-length'] && { bytes: parseInt(mp4Head['content-length'] as string) }), ...(height && { height }), diff --git a/src/extractor/Dropload.ts b/src/extractor/Dropload.ts index 32b49c9..7bff338 100644 --- a/src/extractor/Dropload.ts +++ b/src/extractor/Dropload.ts @@ -47,7 +47,7 @@ export class Dropload extends Extractor { ttl: this.ttl, meta: { bytes: bytes.parse(sizeMatch[1] as string) as number, - countryCode, + countryCodes: [countryCode], height: parseInt(heightMatch[1] as string) as number, title, }, diff --git a/src/extractor/ExternalUrl.ts b/src/extractor/ExternalUrl.ts index 9483a92..5550629 100644 --- a/src/extractor/ExternalUrl.ts +++ b/src/extractor/ExternalUrl.ts @@ -38,7 +38,7 @@ export class ExternalUrl extends Extractor { sourceId: `${this.id}_${countryCode}`, ttl: this.ttl, meta: { - countryCode, + countryCodes: [countryCode], ...(title && { title }), }, }, diff --git a/src/extractor/Extractor.ts b/src/extractor/Extractor.ts index a9bbd13..e87fd1e 100644 --- a/src/extractor/Extractor.ts +++ b/src/extractor/Extractor.ts @@ -33,7 +33,7 @@ export abstract class Extractor { label: this.label, sourceId: `${this.id}`, meta: { - countryCode, + countryCodes: [countryCode], ...(title && { title }), }, }, diff --git a/src/extractor/Fsst.ts b/src/extractor/Fsst.ts index afbf293..7ed843f 100644 --- a/src/extractor/Fsst.ts +++ b/src/extractor/Fsst.ts @@ -39,7 +39,7 @@ export class Fsst extends Extractor { label: this.label, sourceId: `${this.id}_${countryCode}_${index}`, meta: { - countryCode, + countryCodes: [countryCode], height: parseInt(heightAndUrlMatch[1] || heightFromFileHrefMatch[1] as string), title, }, diff --git a/src/extractor/KinoGer.ts b/src/extractor/KinoGer.ts index c29f853..6369ffa 100644 --- a/src/extractor/KinoGer.ts +++ b/src/extractor/KinoGer.ts @@ -46,7 +46,7 @@ export class KinoGer extends Extractor { sourceId: `${this.id}_${countryCode}`, ttl: this.ttl, meta: { - countryCode, + countryCodes: [countryCode], title, ...(height && { height }), }, diff --git a/src/extractor/Mixdrop.ts b/src/extractor/Mixdrop.ts index 4975e4c..af9cb58 100644 --- a/src/extractor/Mixdrop.ts +++ b/src/extractor/Mixdrop.ts @@ -45,7 +45,7 @@ export class Mixdrop extends Extractor { sourceId: `${this.id}_${countryCode}`, ttl: this.ttl, meta: { - countryCode, + countryCodes: [countryCode], title, ...(sizeMatch && { bytes: bytes.parse((sizeMatch[1] as string).replace(',', '')) as number, diff --git a/src/extractor/Soaper.ts b/src/extractor/Soaper.ts index 71518a2..acd558e 100644 --- a/src/extractor/Soaper.ts +++ b/src/extractor/Soaper.ts @@ -58,7 +58,7 @@ export class Soaper extends Extractor { sourceId: `${this.id}_${countryCode}`, ttl: this.ttl, meta: { - countryCode, + countryCodes: [countryCode], title: `${title}`, ...(height && { height }), }, diff --git a/src/extractor/SuperVideo.ts b/src/extractor/SuperVideo.ts index cc27125..b70d4a6 100644 --- a/src/extractor/SuperVideo.ts +++ b/src/extractor/SuperVideo.ts @@ -50,7 +50,7 @@ export class SuperVideo extends Extractor { sourceId: `${this.id}_${countryCode}`, ttl: this.ttl, meta: { - countryCode, + countryCodes: [countryCode], title, ...(heightAndSizeMatch && { bytes: bytes.parse(heightAndSizeMatch[2] as string) as number, diff --git a/src/extractor/Uqload.ts b/src/extractor/Uqload.ts index 34a3b9b..8e7a7ae 100644 --- a/src/extractor/Uqload.ts +++ b/src/extractor/Uqload.ts @@ -42,7 +42,7 @@ export class Uqload extends Extractor { sourceId: `${this.id}_${countryCode}`, ttl: this.ttl, meta: { - countryCode, + countryCodes: [countryCode], title, ...(heightMatch && { height: parseInt(heightMatch[1] as string) as number, diff --git a/src/extractor/VidSrc.ts b/src/extractor/VidSrc.ts index 78a9615..6f2f79a 100644 --- a/src/extractor/VidSrc.ts +++ b/src/extractor/VidSrc.ts @@ -55,7 +55,7 @@ export class VidSrc extends Extractor { sourceId: `${this.id}_${slugify(serverName)}_${countryCode}`, ttl: this.ttl, meta: { - countryCode, + countryCodes: [countryCode], title, ...(height && { height }), }, diff --git a/src/extractor/VixSrc.ts b/src/extractor/VixSrc.ts index 4a29417..027e749 100644 --- a/src/extractor/VixSrc.ts +++ b/src/extractor/VixSrc.ts @@ -37,7 +37,7 @@ export class VixSrc extends Extractor { sourceId: `${this.id}_${countryCode}`, ttl: this.ttl, meta: { - countryCode, + countryCodes: [countryCode], ...(filenameMatch && { title: filenameMatch[1] }), ...(sizeMatch && { bytes: bytes.parse(`${sizeMatch[1]} kb`) as number }), ...(qualityMatch && { height: parseInt(qualityMatch[1] as string) }), diff --git a/src/extractor/__snapshots__/DoodStream.test.ts.snap b/src/extractor/__snapshots__/DoodStream.test.ts.snap index 65eef59..056b69b 100644 --- a/src/extractor/__snapshots__/DoodStream.test.ts.snap +++ b/src/extractor/__snapshots__/DoodStream.test.ts.snap @@ -6,7 +6,9 @@ exports[`DoodStream can guess height from title 1`] = ` "format": "mp4", "label": "DoodStream", "meta": { - "countryCode": "fr", + "countryCodes": [ + "fr", + ], "height": 720, "title": "Black Mirror S04E02 FRENCH 720p WEB x264-RiPiT", }, @@ -27,7 +29,9 @@ exports[`DoodStream dood.to 1`] = ` "label": "DoodStream", "meta": { "bytes": 791702409, - "countryCode": "de", + "countryCodes": [ + "de", + ], "title": "des-teufels-bad-2024", }, "requestHeaders": { @@ -46,7 +50,9 @@ exports[`DoodStream doodster 1`] = ` "format": "mp4", "label": "DoodStream", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "title": "Brokeback Mountain 2005", }, "requestHeaders": { diff --git a/src/extractor/__snapshots__/Dropload.test.ts.snap b/src/extractor/__snapshots__/Dropload.test.ts.snap index f15118a..c1432ed 100644 --- a/src/extractor/__snapshots__/Dropload.test.ts.snap +++ b/src/extractor/__snapshots__/Dropload.test.ts.snap @@ -7,7 +7,9 @@ exports[`Dropload dropload.io 1`] = ` "label": "Dropload", "meta": { "bytes": 1395864371, - "countryCode": "de", + "countryCodes": [ + "de", + ], "height": 1080, "title": "des-teufels-bad-2024", }, diff --git a/src/extractor/__snapshots__/ExternalUrl.test.ts.snap b/src/extractor/__snapshots__/ExternalUrl.test.ts.snap index d230895..6e351a6 100644 --- a/src/extractor/__snapshots__/ExternalUrl.test.ts.snap +++ b/src/extractor/__snapshots__/ExternalUrl.test.ts.snap @@ -9,7 +9,9 @@ exports[`ExternalUrl johnalwayssame.com with title 1`] = ` "isExternal": true, "label": "johnalwayssame.com", "meta": { - "countryCode": "fr", + "countryCodes": [ + "fr", + ], "title": "Black Mirror 4x2", }, "sourceId": "external_fr", @@ -26,7 +28,9 @@ exports[`ExternalUrl netu.fanstream.us 1`] = ` "isExternal": true, "label": "netu.fanstream.us", "meta": { - "countryCode": "fr", + "countryCodes": [ + "fr", + ], }, "sourceId": "external_fr", "ttl": 3600000, diff --git a/src/extractor/__snapshots__/ExtractorRegistry.test.ts.snap b/src/extractor/__snapshots__/ExtractorRegistry.test.ts.snap index f762115..5f2fbd9 100644 --- a/src/extractor/__snapshots__/ExtractorRegistry.test.ts.snap +++ b/src/extractor/__snapshots__/ExtractorRegistry.test.ts.snap @@ -9,7 +9,9 @@ exports[`ExtractorRegistry returns external URLs if enabled by config 1`] = ` "isExternal": true, "label": "mixdrop.ag", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], }, "sourceId": "external_de", "ttl": 3600000, @@ -27,7 +29,9 @@ exports[`ExtractorRegistry returns external url for error 1`] = ` "isExternal": true, "label": "Dropload", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], }, "sourceId": "dropload", "url": "https://dropload.io/mocked-blocked.html", @@ -44,7 +48,9 @@ exports[`ExtractorRegistry returns external url for error with title 1`] = ` "isExternal": true, "label": "Dropload", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "title": "a title!", }, "sourceId": "dropload", diff --git a/src/extractor/__snapshots__/Fsst.test.ts.snap b/src/extractor/__snapshots__/Fsst.test.ts.snap index c1013ae..5f2f9de 100644 --- a/src/extractor/__snapshots__/Fsst.test.ts.snap +++ b/src/extractor/__snapshots__/Fsst.test.ts.snap @@ -6,7 +6,9 @@ exports[`Fsst Blood & Sinners 1`] = ` "format": "mp4", "label": "Fsst", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "height": 360, "title": "Blood.and.Sinners.2025.mkv", }, @@ -17,7 +19,9 @@ exports[`Fsst Blood & Sinners 1`] = ` "format": "mp4", "label": "Fsst", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "height": 720, "title": "Blood.and.Sinners.2025.mkv", }, @@ -28,7 +32,9 @@ exports[`Fsst Blood & Sinners 1`] = ` "format": "mp4", "label": "Fsst", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "height": 1080, "title": "Blood.and.Sinners.2025.mkv", }, @@ -44,7 +50,9 @@ exports[`Fsst Dead City 1`] = ` "format": "mp4", "label": "Fsst", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "height": 360, "title": "the.walking.dead.dead.city.s02e06.german.dl.1080p.web.x264-wvf.mkv", }, @@ -55,7 +63,9 @@ exports[`Fsst Dead City 1`] = ` "format": "mp4", "label": "Fsst", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "height": 720, "title": "the.walking.dead.dead.city.s02e06.german.dl.1080p.web.x264-wvf.mkv", }, @@ -66,7 +76,9 @@ exports[`Fsst Dead City 1`] = ` "format": "mp4", "label": "Fsst", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "height": 1080, "title": "the.walking.dead.dead.city.s02e06.german.dl.1080p.web.x264-wvf.mkv", }, @@ -82,7 +94,9 @@ exports[`Fsst How to Train Your Dragon 1`] = ` "format": "mp4", "label": "Fsst", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "height": 360, "title": "How To Train Your Dragon 2025.mp4", }, diff --git a/src/extractor/__snapshots__/KinoGer.test.ts.snap b/src/extractor/__snapshots__/KinoGer.test.ts.snap index 63fafd8..23064be 100644 --- a/src/extractor/__snapshots__/KinoGer.test.ts.snap +++ b/src/extractor/__snapshots__/KinoGer.test.ts.snap @@ -6,7 +6,9 @@ exports[`KinoGer Blood & Sinners 1`] = ` "format": "hls", "label": "KinoGer", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "title": "Blood.and.Sinners.2025.mkv", }, "requestHeaders": { @@ -25,7 +27,9 @@ exports[`KinoGer Dead City 1`] = ` "format": "hls", "label": "KinoGer", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "height": 1080, "title": "the.walking.dead.dead.city.s02e05.german.dl.1080p.web.x264-wvf.mkv", }, diff --git a/src/extractor/__snapshots__/Mixdrop.test.ts.snap b/src/extractor/__snapshots__/Mixdrop.test.ts.snap index dea1bd7..9b56c9d 100644 --- a/src/extractor/__snapshots__/Mixdrop.test.ts.snap +++ b/src/extractor/__snapshots__/Mixdrop.test.ts.snap @@ -9,7 +9,9 @@ exports[`Mixdrop mixdrop.my /e/ 1`] = ` "label": "Mixdrop (via MediaFlow Proxy)", "meta": { "bytes": 1059806248, - "countryCode": "de", + "countryCodes": [ + "de", + ], "title": "28_giorni_dopo_2002_HD_-_Altadefinizione01.mp4", }, "sourceId": "mixdrop_de", diff --git a/src/extractor/__snapshots__/Soaper.test.ts.snap b/src/extractor/__snapshots__/Soaper.test.ts.snap index 992ef3a..ee85732 100644 --- a/src/extractor/__snapshots__/Soaper.test.ts.snap +++ b/src/extractor/__snapshots__/Soaper.test.ts.snap @@ -6,7 +6,9 @@ exports[`Soaper Black Mirror 1`] = ` "format": "hls", "label": "Soaper", "meta": { - "countryCode": "en", + "countryCodes": [ + "en", + ], "height": 720, "title": "Black Mirror 4x2", }, @@ -23,7 +25,9 @@ exports[`Soaper Full Metal Jacket 1`] = ` "format": "hls", "label": "Soaper", "meta": { - "countryCode": "en", + "countryCodes": [ + "en", + ], "height": 1080, "title": "Full Metal Jacket (1987)", }, @@ -40,7 +44,9 @@ exports[`Soaper last of us s2e3 1`] = ` "format": "hls", "label": "Soaper", "meta": { - "countryCode": "de", + "countryCodes": [ + "de", + ], "title": "The Last of Us 2x3", }, "sourceId": "soaper_de", diff --git a/src/extractor/__snapshots__/SuperVideo.test.ts.snap b/src/extractor/__snapshots__/SuperVideo.test.ts.snap index 28608e3..f95dbad 100644 --- a/src/extractor/__snapshots__/SuperVideo.test.ts.snap +++ b/src/extractor/__snapshots__/SuperVideo.test.ts.snap @@ -8,7 +8,9 @@ exports[`SuperVideo embed only 1`] = ` "format": "hls", "label": "SuperVideo", "meta": { - "countryCode": "it", + "countryCodes": [ + "it", + ], "title": "", }, "sourceId": "supervideo_it", @@ -25,7 +27,9 @@ exports[`SuperVideo supervideo.cc /e/ 1`] = ` "label": "SuperVideo", "meta": { "bytes": 1073741824, - "countryCode": "de", + "countryCodes": [ + "de", + ], "height": 720, "title": "des-teufels-bad-2024", }, @@ -43,7 +47,9 @@ exports[`SuperVideo supervideo.tv /embed-/ 1`] = ` "label": "SuperVideo", "meta": { "bytes": 219571814, - "countryCode": "it", + "countryCodes": [ + "it", + ], "height": 344, "title": "Babylon 5 2x3", }, diff --git a/src/extractor/__snapshots__/Uqload.test.ts.snap b/src/extractor/__snapshots__/Uqload.test.ts.snap index 08e1941..3af216a 100644 --- a/src/extractor/__snapshots__/Uqload.test.ts.snap +++ b/src/extractor/__snapshots__/Uqload.test.ts.snap @@ -6,7 +6,9 @@ exports[`Uqload uqload.net / 1`] = ` "format": "mp4", "label": "Uqload (via MediaFlow Proxy)", "meta": { - "countryCode": "fr", + "countryCodes": [ + "fr", + ], "height": 360, "title": "Black Mirror S07E06 MULTI VFF 1080p WEBrip EAC3 5 1 x265-TyHD", }, @@ -23,7 +25,9 @@ exports[`Uqload uqload.net /embed- 1`] = ` "format": "mp4", "label": "Uqload (via MediaFlow Proxy)", "meta": { - "countryCode": "fr", + "countryCodes": [ + "fr", + ], "height": 360, "title": "Black Mirror S07E06 MULTI VFF 1080p WEBrip EAC3 5 1 x265-TyHD", }, diff --git a/src/extractor/__snapshots__/VidSrc.test.ts.snap b/src/extractor/__snapshots__/VidSrc.test.ts.snap index 61a4166..e838c6d 100644 --- a/src/extractor/__snapshots__/VidSrc.test.ts.snap +++ b/src/extractor/__snapshots__/VidSrc.test.ts.snap @@ -6,7 +6,9 @@ exports[`VidSrc Black Mirror 1`] = ` "format": "hls", "label": "VidSrc (CloudStream Pro)", "meta": { - "countryCode": "en", + "countryCodes": [ + "en", + ], "height": 1040, "title": "Black Mirror (2011) S04E02", }, @@ -23,7 +25,9 @@ exports[`VidSrc Full Metal Jacket 1`] = ` "format": "hls", "label": "VidSrc (CloudStream Pro)", "meta": { - "countryCode": "en", + "countryCodes": [ + "en", + ], "height": 714, "title": "Full Metal Jacket (1987)", }, diff --git a/src/extractor/__snapshots__/VixSrc.test.ts.snap b/src/extractor/__snapshots__/VixSrc.test.ts.snap index 5699a42..e9f1b37 100644 --- a/src/extractor/__snapshots__/VixSrc.test.ts.snap +++ b/src/extractor/__snapshots__/VixSrc.test.ts.snap @@ -7,7 +7,9 @@ exports[`VixSrc Black Mirror 1`] = ` "label": "VixSrc (via MediaFlow Proxy)", "meta": { "bytes": 2389338112, - "countryCode": "it", + "countryCodes": [ + "it", + ], "height": 1080, "title": "Black.Mirror.S04E02.Arkangel.1080p.NF.WEB-DL.ITA.ENG.DDP5.1.H.264.mkv", }, @@ -25,7 +27,9 @@ exports[`VixSrc Full Metal Jacket 1`] = ` "label": "VixSrc (via MediaFlow Proxy)", "meta": { "bytes": 8544718848, - "countryCode": "it", + "countryCodes": [ + "it", + ], "height": 1080, "title": "Full.metal.jacket.1987.1080p.x264.AC3.ITA.AAC.ENG.Subs.mkv", }, diff --git a/src/types.ts b/src/types.ts index c8870f9..8f31347 100644 --- a/src/types.ts +++ b/src/types.ts @@ -27,9 +27,11 @@ export enum BlockedReason { unknown = 'unknown', } +type NonEmptyArray = [T, ...T[]]; + export interface Meta { bytes?: number; - countryCode: CountryCode; + countryCodes: NonEmptyArray; height?: number; title?: string; } diff --git a/src/utils/StreamResolver.test.ts b/src/utils/StreamResolver.test.ts index b84ef00..fc29578 100644 --- a/src/utils/StreamResolver.test.ts +++ b/src/utils/StreamResolver.test.ts @@ -98,7 +98,7 @@ describe('resolve', () => { label: 'hoster.com', sourceId: '', meta: { - countryCode: CountryCode.de, + countryCodes: [CountryCode.de], }, }, { @@ -109,7 +109,7 @@ describe('resolve', () => { label: 'hoster.com', sourceId: '', meta: { - countryCode: CountryCode.de, + countryCodes: [CountryCode.de], }, }, { @@ -120,7 +120,7 @@ describe('resolve', () => { label: 'hoster.com', sourceId: '', meta: { - countryCode: CountryCode.de, + countryCodes: [CountryCode.de], }, }, { @@ -131,7 +131,7 @@ describe('resolve', () => { label: 'hoster.com', sourceId: '', meta: { - countryCode: CountryCode.de, + countryCodes: [CountryCode.de], }, }, { @@ -142,7 +142,7 @@ describe('resolve', () => { label: 'hoster.com', sourceId: '', meta: { - countryCode: CountryCode.de, + countryCodes: [CountryCode.de], }, }, { @@ -153,7 +153,7 @@ describe('resolve', () => { label: 'hoster.com', sourceId: '', meta: { - countryCode: CountryCode.de, + countryCodes: [CountryCode.de], }, }, { @@ -164,7 +164,7 @@ describe('resolve', () => { label: 'hoster.com', sourceId: '', meta: { - countryCode: CountryCode.de, + countryCodes: [CountryCode.de], }, }, { @@ -175,7 +175,7 @@ describe('resolve', () => { label: 'hoster.com', sourceId: '', meta: { - countryCode: CountryCode.de, + countryCodes: [CountryCode.de], }, }, { @@ -186,7 +186,7 @@ describe('resolve', () => { label: 'hoster.com', sourceId: '', meta: { - countryCode: CountryCode.de, + countryCodes: [CountryCode.de], }, }, ]; diff --git a/src/utils/StreamResolver.ts b/src/utils/StreamResolver.ts index 504bdb5..2edbd09 100644 --- a/src/utils/StreamResolver.ts +++ b/src/utils/StreamResolver.ts @@ -152,7 +152,9 @@ export class StreamResolver { private buildName(ctx: Context, urlResult: UrlResult): string { let name = envGetAppName(); - name += ` ${flagFromCountryCode(urlResult.meta.countryCode)}`; + urlResult.meta.countryCodes.forEach((countryCode) => { + name += ` ${flagFromCountryCode(countryCode)}`; + }); if (urlResult.meta.height) { name += ` ${urlResult.meta.height}p`;