From f7c61653140067471589e337dc63a35f4ebe0e8f Mon Sep 17 00:00:00 2001 From: TPN Date: Sun, 16 Jun 2024 19:12:14 +0530 Subject: [PATCH 1/4] Add convertPlaylistsToDataUrls util --- src/utils/playlist.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/utils/playlist.ts diff --git a/src/utils/playlist.ts b/src/utils/playlist.ts new file mode 100644 index 0000000..c315d52 --- /dev/null +++ b/src/utils/playlist.ts @@ -0,0 +1,23 @@ +import { parse, stringify } from 'hls-parser'; +import { MasterPlaylist } from 'hls-parser/types'; + +import { UseableFetcher } from '@/fetchers/types'; + +export async function convertPlaylistsToDataUrls( + fetcher: UseableFetcher, + playlistUrl: string, + headers?: Record, +) { + const playlistData = await fetcher(playlistUrl, { headers }); + const playlist = parse(playlistData); + + if (playlist.isMasterPlaylist) { + for (const variant of (playlist as MasterPlaylist).variants) { + const variantPlaylistData = await fetcher(variant.uri, { headers }); + const variantPlaylist = parse(variantPlaylistData); + variant.uri = `data:application/vnd.apple.mpegurl;base64,${btoa(stringify(variantPlaylist))}`; + } + } + + return `data:application/vnd.apple.mpegurl;base64,${btoa(stringify(playlist))}`; +} From 7564c01da7daa6640281aa29eb9ff8639644c364 Mon Sep 17 00:00:00 2001 From: TPN Date: Sun, 16 Jun 2024 19:13:30 +0530 Subject: [PATCH 2/4] Update dependencies --- package.json | 1 + pnpm-lock.yaml | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/package.json b/package.json index c329891..69c8dc6 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "cookie": "^0.6.0", "crypto-js": "^4.2.0", "form-data": "^4.0.0", + "hls-parser": "^0.13.2", "iso-639-1": "^3.1.2", "nanoid": "^3.3.7", "node-fetch": "^3.3.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7646766..20f733c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ dependencies: form-data: specifier: ^4.0.0 version: 4.0.0 + hls-parser: + specifier: ^0.13.2 + version: 0.13.2 iso-639-1: specifier: ^3.1.2 version: 3.1.2 @@ -2531,6 +2534,10 @@ packages: hasBin: true dev: true + /hls-parser@0.13.2: + resolution: {integrity: sha512-lKZitdq8Awcsb271BkbUCzXgBBZEhnMNcyAqre/cns2hItCV8nF3ucleT2QS37Ck+eUv7LwAD1t+F/1D/Vxkgg==} + dev: false + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true From b8a48b040853ef21f4146c05b4cc50e271e73456 Mon Sep 17 00:00:00 2001 From: TPN Date: Sun, 16 Jun 2024 19:24:51 +0530 Subject: [PATCH 3/4] Make m4ufree a non-extention source --- src/providers/embeds/playm4u/nm.ts | 6 ++++-- src/providers/sources/m4ufree.ts | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/providers/embeds/playm4u/nm.ts b/src/providers/embeds/playm4u/nm.ts index 32429fb..3a06732 100644 --- a/src/providers/embeds/playm4u/nm.ts +++ b/src/providers/embeds/playm4u/nm.ts @@ -1,7 +1,9 @@ import { load } from 'cheerio'; import crypto from 'crypto-js'; +import { flags } from '@/entrypoint/utils/targets'; import { makeEmbed } from '@/providers/base'; +import { convertPlaylistsToDataUrls } from '@/utils/playlist'; const { AES, MD5 } = crypto; @@ -113,9 +115,9 @@ export const playm4uNMScraper = makeEmbed({ { id: 'primary', type: 'hls', - playlist: apiRes.data, + playlist: await convertPlaylistsToDataUrls(ctx.proxiedFetcher, apiRes.data), captions: [], - flags: [], + flags: [flags.CORS_ALLOWED], }, ], }; diff --git a/src/providers/sources/m4ufree.ts b/src/providers/sources/m4ufree.ts index 6cbb2bc..0617481 100644 --- a/src/providers/sources/m4ufree.ts +++ b/src/providers/sources/m4ufree.ts @@ -2,6 +2,7 @@ // thanks Paradox_77 import { load } from 'cheerio'; +import { flags } from '@/entrypoint/utils/targets'; import { SourcererEmbed, makeSourcerer } from '@/providers/base'; import { compareMedia } from '@/utils/compare'; import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; @@ -150,7 +151,7 @@ export const m4uScraper = makeSourcerer({ id: 'm4ufree', name: 'M4UFree', rank: 125, - flags: [], + flags: [flags.CORS_ALLOWED], scrapeMovie: universalScraper, scrapeShow: universalScraper, }); From fac745b6a5ebd631167e38f76bc9302381721e9f Mon Sep 17 00:00:00 2001 From: TPN Date: Sun, 16 Jun 2024 19:25:34 +0530 Subject: [PATCH 4/4] Make soaperTv a non-extension source --- src/providers/sources/soapertv/index.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/providers/sources/soapertv/index.ts b/src/providers/sources/soapertv/index.ts index feee555..ba5e0ef 100644 --- a/src/providers/sources/soapertv/index.ts +++ b/src/providers/sources/soapertv/index.ts @@ -4,6 +4,7 @@ import { flags } from '@/entrypoint/utils/targets'; import { Caption, labelToLanguageCode } from '@/providers/captions'; import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; import { NotFoundError } from '@/utils/errors'; +import { convertPlaylistsToDataUrls } from '@/utils/playlist'; import { InfoResponse } from './types'; import { SourcererOutput, makeSourcerer } from '../../base'; @@ -90,18 +91,18 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext): Pr stream: [ { id: 'primary', - playlist: streamResJson.val, + playlist: await convertPlaylistsToDataUrls(ctx.proxiedFetcher, streamResJson.val), type: 'hls', - flags: [flags.IP_LOCKED], + flags: [flags.CORS_ALLOWED], captions, }, ...(streamResJson.val_bak ? [ { id: 'backup', - playlist: streamResJson.val_bak, + playlist: await convertPlaylistsToDataUrls(ctx.proxiedFetcher, streamResJson.val_bak), type: 'hls' as const, - flags: [flags.IP_LOCKED], + flags: [flags.CORS_ALLOWED], captions, }, ]