mirror of
https://github.com/movie-web/providers.git
synced 2025-09-13 14:53:24 +00:00
Merge branch 'dev' into lookmovie
This commit is contained in:
6
.docs/package-lock.json
generated
6
.docs/package-lock.json
generated
@@ -17286,9 +17286,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/vite": {
|
"node_modules/vite": {
|
||||||
"version": "4.5.0",
|
"version": "4.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz",
|
||||||
"integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==",
|
"integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.18.10",
|
"esbuild": "^0.18.10",
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@movie-web/providers",
|
"name": "@movie-web/providers",
|
||||||
"version": "1.1.2",
|
"version": "1.1.4",
|
||||||
"description": "Package that contains all the providers of movie-web",
|
"description": "Package that contains all the providers of movie-web",
|
||||||
"main": "./lib/index.umd.js",
|
"main": "./lib/index.umd.js",
|
||||||
"types": "./lib/index.d.ts",
|
"types": "./lib/index.d.ts",
|
||||||
|
@@ -74,7 +74,12 @@ export const upcloudScraper = makeEmbed({
|
|||||||
let sources: { file: string; type: string } | null = null;
|
let sources: { file: string; type: string } | null = null;
|
||||||
|
|
||||||
if (!isJSON(streamRes.sources)) {
|
if (!isJSON(streamRes.sources)) {
|
||||||
const scriptJs = await ctx.proxiedFetcher<string>(`https://rabbitstream.net/js/player/prod/e4-player.min.js`);
|
const scriptJs = await ctx.proxiedFetcher<string>(`https://rabbitstream.net/js/player/prod/e4-player.min.js`, {
|
||||||
|
query: {
|
||||||
|
// browser side caching on this endpoint is quite extreme. Add version query paramter to circumvent any caching
|
||||||
|
v: Date.now().toString(),
|
||||||
|
},
|
||||||
|
});
|
||||||
const decryptionKey = extractKey(scriptJs);
|
const decryptionKey = extractKey(scriptJs);
|
||||||
if (!decryptionKey) throw new Error('Key extraction failed');
|
if (!decryptionKey) throw new Error('Key extraction failed');
|
||||||
|
|
||||||
|
@@ -5,7 +5,6 @@ import { getFlixhqMovieSources, getFlixhqShowSources, getFlixhqSourceDetails } f
|
|||||||
import { getFlixhqId } from '@/providers/sources/flixhq/search';
|
import { getFlixhqId } from '@/providers/sources/flixhq/search';
|
||||||
import { NotFoundError } from '@/utils/errors';
|
import { NotFoundError } from '@/utils/errors';
|
||||||
|
|
||||||
// TODO tv shows are available in flixHQ, just no scraper yet
|
|
||||||
export const flixhqScraper = makeSourcerer({
|
export const flixhqScraper = makeSourcerer({
|
||||||
id: 'flixhq',
|
id: 'flixhq',
|
||||||
name: 'FlixHQ',
|
name: 'FlixHQ',
|
||||||
|
@@ -11,3 +11,4 @@ export const apiUrls = [
|
|||||||
];
|
];
|
||||||
export const appKey = atob('bW92aWVib3g=');
|
export const appKey = atob('bW92aWVib3g=');
|
||||||
export const appId = atob('Y29tLnRkby5zaG93Ym94');
|
export const appId = atob('Y29tLnRkby5zaG93Ym94');
|
||||||
|
export const captionsDomains = [atob('bWJwaW1hZ2VzLmNodWF4aW4uY29t'), atob('aW1hZ2VzLnNoZWd1Lm5ldA==')];
|
||||||
|
@@ -43,6 +43,7 @@ export const superStreamScraper = makeSourcerer({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const { qualities, fid } = await getStreamQualities(ctx, apiQuery);
|
const { qualities, fid } = await getStreamQualities(ctx, apiQuery);
|
||||||
|
if (fid === undefined) throw new NotFoundError('No streamable file found');
|
||||||
|
|
||||||
return {
|
return {
|
||||||
embeds: [],
|
embeds: [],
|
||||||
@@ -90,6 +91,7 @@ export const superStreamScraper = makeSourcerer({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const { qualities, fid } = await getStreamQualities(ctx, apiQuery);
|
const { qualities, fid } = await getStreamQualities(ctx, apiQuery);
|
||||||
|
if (fid === undefined) throw new NotFoundError('No streamable file found');
|
||||||
|
|
||||||
return {
|
return {
|
||||||
embeds: [],
|
embeds: [],
|
||||||
|
@@ -2,6 +2,8 @@ import { Caption, getCaptionTypeFromUrl, isValidLanguageCode } from '@/providers
|
|||||||
import { sendRequest } from '@/providers/sources/superstream/sendRequest';
|
import { sendRequest } from '@/providers/sources/superstream/sendRequest';
|
||||||
import { ScrapeContext } from '@/utils/context';
|
import { ScrapeContext } from '@/utils/context';
|
||||||
|
|
||||||
|
import { captionsDomains } from './common';
|
||||||
|
|
||||||
interface CaptionApiResponse {
|
interface CaptionApiResponse {
|
||||||
data: {
|
data: {
|
||||||
list: {
|
list: {
|
||||||
@@ -31,16 +33,22 @@ export async function getSubtitles(
|
|||||||
tid: type !== 'movie' ? id : undefined,
|
tid: type !== 'movie' ? id : undefined,
|
||||||
episode: episodeId?.toString(),
|
episode: episodeId?.toString(),
|
||||||
season: seasonId?.toString(),
|
season: seasonId?.toString(),
|
||||||
group: episodeId ? '' : undefined,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const subtitleList = ((await sendRequest(ctx, subtitleApiQuery)) as CaptionApiResponse).data.list;
|
const subResult = (await sendRequest(ctx, subtitleApiQuery)) as CaptionApiResponse;
|
||||||
|
const subtitleList = subResult.data.list;
|
||||||
const output: Caption[] = [];
|
const output: Caption[] = [];
|
||||||
|
|
||||||
subtitleList.forEach((sub) => {
|
subtitleList.forEach((sub) => {
|
||||||
const subtitle = sub.subtitles.sort((a, b) => b.order - a.order)[0];
|
const subtitle = sub.subtitles.sort((a, b) => b.order - a.order)[0];
|
||||||
if (!subtitle) return;
|
if (!subtitle) return;
|
||||||
const subtitleType = getCaptionTypeFromUrl(subtitle.file_path);
|
const subtitleFilePath = subtitle.file_path
|
||||||
|
.replace(captionsDomains[0], captionsDomains[1])
|
||||||
|
.replace(/\s/g, '+')
|
||||||
|
.replace(/[()]/g, (c) => {
|
||||||
|
return `%${c.charCodeAt(0).toString(16)}`;
|
||||||
|
});
|
||||||
|
const subtitleType = getCaptionTypeFromUrl(subtitleFilePath);
|
||||||
if (!subtitleType) return;
|
if (!subtitleType) return;
|
||||||
|
|
||||||
const validCode = isValidLanguageCode(subtitle.lang);
|
const validCode = isValidLanguageCode(subtitle.lang);
|
||||||
@@ -50,7 +58,7 @@ export async function getSubtitles(
|
|||||||
language: subtitle.lang,
|
language: subtitle.lang,
|
||||||
hasCorsRestrictions: true,
|
hasCorsRestrictions: true,
|
||||||
type: subtitleType,
|
type: subtitleType,
|
||||||
url: subtitle.file_path,
|
url: subtitleFilePath,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user