@media-engine/providers 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +295 -0
- package/dist/anilist/index.d.ts +9 -0
- package/dist/anilist/index.js +279 -0
- package/dist/anilist/index.js.map +1 -0
- package/dist/cinemeta/index.d.ts +12 -0
- package/dist/cinemeta/index.js +379 -0
- package/dist/cinemeta/index.js.map +1 -0
- package/dist/experimental-streaming/index.d.ts +24 -0
- package/dist/experimental-streaming/index.js +199 -0
- package/dist/experimental-streaming/index.js.map +1 -0
- package/dist/flixhq-streaming/index.d.ts +30 -0
- package/dist/flixhq-streaming/index.js +625 -0
- package/dist/flixhq-streaming/index.js.map +1 -0
- package/dist/imdb-dataset/index.d.ts +9 -0
- package/dist/imdb-dataset/index.js +307 -0
- package/dist/imdb-dataset/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/kinobd/index.d.ts +11 -0
- package/dist/kinobd/index.js +405 -0
- package/dist/kinobd/index.js.map +1 -0
- package/dist/kinobd-streaming/index.d.ts +31 -0
- package/dist/kinobd-streaming/index.js +919 -0
- package/dist/kinobd-streaming/index.js.map +1 -0
- package/dist/shared/http.d.ts +17 -0
- package/dist/shared/http.js +264 -0
- package/dist/shared/http.js.map +1 -0
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shikimori/index.d.ts +12 -0
- package/dist/shikimori/index.js +457 -0
- package/dist/shikimori/index.js.map +1 -0
- package/dist/wikidata/index.d.ts +12 -0
- package/dist/wikidata/index.js +356 -0
- package/dist/wikidata/index.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,625 @@
|
|
|
1
|
+
import { mapProviderHttpError, normalizePublicHttpUrl, } from "../shared/index.js";
|
|
2
|
+
const DEFAULT_BASE_URL = "https://flixhq.one";
|
|
3
|
+
const DEFAULT_PROVIDER_NAME = "flixhq-streaming";
|
|
4
|
+
const DEFAULT_MAX_HTML_BYTES = 1024 * 1024;
|
|
5
|
+
const DEFAULT_PLAYER_LIMIT = 8;
|
|
6
|
+
const DEFAULT_PLAYER_VALIDATION_CONCURRENCY = 3;
|
|
7
|
+
const DEFAULT_PLAYER_VALIDATION_TIMEOUT_MS = 2_500;
|
|
8
|
+
const DEFAULT_PLAYER_VALIDATION_MAX_BYTES = 256 * 1024;
|
|
9
|
+
const DEFAULT_SUBTITLE_INFO_MAX_BYTES = 256 * 1024;
|
|
10
|
+
const SUBTITLE_TRACK_LIMIT = 64;
|
|
11
|
+
export function flixHqStreamingProvider(options = {}) {
|
|
12
|
+
const config = createConfig(options);
|
|
13
|
+
return {
|
|
14
|
+
name: config.name,
|
|
15
|
+
version: options.version,
|
|
16
|
+
kind: "streaming",
|
|
17
|
+
capabilities: createCapabilities(),
|
|
18
|
+
async getAvailability(query, context) {
|
|
19
|
+
return getFlixHqAvailability(config, query, context);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function createConfig(options) {
|
|
24
|
+
const maxHtmlBytes = options.maxHtmlBytes ?? DEFAULT_MAX_HTML_BYTES;
|
|
25
|
+
const playerLimit = options.playerLimit ?? DEFAULT_PLAYER_LIMIT;
|
|
26
|
+
const playerValidationConcurrency = options.playerValidationConcurrency ?? DEFAULT_PLAYER_VALIDATION_CONCURRENCY;
|
|
27
|
+
const playerValidationTimeoutMs = options.playerValidationTimeoutMs ?? DEFAULT_PLAYER_VALIDATION_TIMEOUT_MS;
|
|
28
|
+
const playerValidationMaxBytes = options.playerValidationMaxBytes ?? DEFAULT_PLAYER_VALIDATION_MAX_BYTES;
|
|
29
|
+
const subtitleInfoMaxBytes = options.subtitleInfoMaxBytes ?? DEFAULT_SUBTITLE_INFO_MAX_BYTES;
|
|
30
|
+
if (!Number.isInteger(maxHtmlBytes) || maxHtmlBytes <= 0) {
|
|
31
|
+
throw new TypeError("FlixHQ streaming maxHtmlBytes must be a positive integer.");
|
|
32
|
+
}
|
|
33
|
+
if (!Number.isInteger(playerLimit) || playerLimit <= 0) {
|
|
34
|
+
throw new TypeError("FlixHQ streaming playerLimit must be a positive integer.");
|
|
35
|
+
}
|
|
36
|
+
if (!Number.isInteger(playerValidationConcurrency) || playerValidationConcurrency <= 0) {
|
|
37
|
+
throw new TypeError("FlixHQ streaming playerValidationConcurrency must be a positive integer.");
|
|
38
|
+
}
|
|
39
|
+
if (!Number.isInteger(playerValidationTimeoutMs) || playerValidationTimeoutMs <= 0) {
|
|
40
|
+
throw new TypeError("FlixHQ streaming playerValidationTimeoutMs must be a positive integer.");
|
|
41
|
+
}
|
|
42
|
+
if (!Number.isInteger(playerValidationMaxBytes) || playerValidationMaxBytes <= 0) {
|
|
43
|
+
throw new TypeError("FlixHQ streaming playerValidationMaxBytes must be a positive integer.");
|
|
44
|
+
}
|
|
45
|
+
if (!Number.isInteger(subtitleInfoMaxBytes) || subtitleInfoMaxBytes <= 0) {
|
|
46
|
+
throw new TypeError("FlixHQ streaming subtitleInfoMaxBytes must be a positive integer.");
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
baseUrl: normalizeBaseUrl(options.baseUrl ?? DEFAULT_BASE_URL),
|
|
50
|
+
name: normalizeProviderName(options.name ?? DEFAULT_PROVIDER_NAME),
|
|
51
|
+
fetch: options.fetch,
|
|
52
|
+
maxHtmlBytes,
|
|
53
|
+
playerLimit,
|
|
54
|
+
playerValidationConcurrency,
|
|
55
|
+
playerValidationTimeoutMs,
|
|
56
|
+
playerValidationMaxBytes,
|
|
57
|
+
subtitleInfoMaxBytes,
|
|
58
|
+
userAgent: options.userAgent?.trim() || "MediaEngine/0.0 (+https://github.com/Yaneart/media-engine)",
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function createCapabilities() {
|
|
62
|
+
return {
|
|
63
|
+
mediaTypes: ["movie", "series"],
|
|
64
|
+
lookup: {
|
|
65
|
+
byTitle: true,
|
|
66
|
+
byExternalIds: [],
|
|
67
|
+
byEpisode: true,
|
|
68
|
+
},
|
|
69
|
+
features: [
|
|
70
|
+
"embed",
|
|
71
|
+
"hls",
|
|
72
|
+
"mp4",
|
|
73
|
+
"translations",
|
|
74
|
+
"subtitles",
|
|
75
|
+
"qualities",
|
|
76
|
+
"episode_mapping",
|
|
77
|
+
"headers",
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async function getFlixHqAvailability(config, query, context) {
|
|
82
|
+
if (query.providers && !query.providers.includes(config.name)) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
if (query.type === "anime" || !query.title?.trim()) {
|
|
86
|
+
return emptyAvailability(query);
|
|
87
|
+
}
|
|
88
|
+
if (query.type === "series" &&
|
|
89
|
+
(query.seasonNumber === undefined || query.episodeNumber === undefined)) {
|
|
90
|
+
return emptyAvailability(query);
|
|
91
|
+
}
|
|
92
|
+
const searchUrl = new URL("/search", config.baseUrl);
|
|
93
|
+
searchUrl.searchParams.set("keyword", query.title.trim());
|
|
94
|
+
const searchHtml = await fetchText(config, searchUrl, context);
|
|
95
|
+
const candidate = selectBestCandidate(parseSearchCandidates(searchHtml), query);
|
|
96
|
+
if (!candidate) {
|
|
97
|
+
return emptyAvailability(query);
|
|
98
|
+
}
|
|
99
|
+
const mediaHtml = await fetchText(config, new URL(candidate.mediaUrl), context);
|
|
100
|
+
const episode = candidate.type === "movie"
|
|
101
|
+
? { url: candidate.mediaUrl, title: candidate.title }
|
|
102
|
+
: selectEpisode(parseEpisodes(mediaHtml), query.seasonNumber ?? 1, query.episodeNumber ?? 1);
|
|
103
|
+
if (!episode) {
|
|
104
|
+
return emptyAvailability(query);
|
|
105
|
+
}
|
|
106
|
+
const playerHtml = episode.url === candidate.mediaUrl
|
|
107
|
+
? mediaHtml
|
|
108
|
+
: await fetchText(config, new URL(episode.url), context);
|
|
109
|
+
const token = findPlayerToken(playerHtml, candidate.type);
|
|
110
|
+
if (!token) {
|
|
111
|
+
return emptyAvailability(query);
|
|
112
|
+
}
|
|
113
|
+
const players = await fetchPlayers(config, token, candidate.type, context);
|
|
114
|
+
const mappedOptions = players
|
|
115
|
+
.slice(0, config.playerLimit)
|
|
116
|
+
.map((player, index) => mapPlayer(config, player, episode, index))
|
|
117
|
+
.filter((option) => option !== null);
|
|
118
|
+
const availableOptions = await filterUnavailablePlayers(config, mappedOptions, context);
|
|
119
|
+
const options = await mapWithConcurrency(availableOptions, config.playerValidationConcurrency, async (option) => enrichPlayerOption(config, option, context));
|
|
120
|
+
return {
|
|
121
|
+
query,
|
|
122
|
+
item: {
|
|
123
|
+
type: query.type,
|
|
124
|
+
title: candidate.title,
|
|
125
|
+
year: candidate.year ?? query.year,
|
|
126
|
+
ids: query.ids,
|
|
127
|
+
},
|
|
128
|
+
options,
|
|
129
|
+
episodes: [{ ...episode, options }],
|
|
130
|
+
sourceProviders: [{ provider: config.name, url: candidate.mediaUrl, ids: query.ids }],
|
|
131
|
+
checkedAt: new Date().toISOString(),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
async function filterUnavailablePlayers(config, options, context) {
|
|
135
|
+
const results = await mapWithConcurrency(options, config.playerValidationConcurrency, async (option) => ({
|
|
136
|
+
option,
|
|
137
|
+
unavailable: await isPlayerUnavailable(config, option, context),
|
|
138
|
+
}));
|
|
139
|
+
return results.filter((result) => !result.unavailable).map((result) => result.option);
|
|
140
|
+
}
|
|
141
|
+
async function isPlayerUnavailable(config, option, context) {
|
|
142
|
+
const fetchImpl = config.fetch ?? fetch;
|
|
143
|
+
const controller = new AbortController();
|
|
144
|
+
const timeout = setTimeout(() => controller.abort(), config.playerValidationTimeoutMs);
|
|
145
|
+
const signal = context.signal
|
|
146
|
+
? AbortSignal.any([context.signal, controller.signal])
|
|
147
|
+
: controller.signal;
|
|
148
|
+
try {
|
|
149
|
+
if (context.signal?.aborted)
|
|
150
|
+
return false;
|
|
151
|
+
const isDirect = option.player.kind === "hls" || option.player.kind === "mp4";
|
|
152
|
+
const response = await fetchImpl(option.access.url, {
|
|
153
|
+
headers: {
|
|
154
|
+
Accept: isDirect
|
|
155
|
+
? "application/vnd.apple.mpegurl,video/mp4,*/*;q=0.8"
|
|
156
|
+
: "text/html,application/xhtml+xml",
|
|
157
|
+
"User-Agent": config.userAgent,
|
|
158
|
+
Referer: `${config.baseUrl}/`,
|
|
159
|
+
...(isDirect ? { Range: "bytes=0-0" } : {}),
|
|
160
|
+
},
|
|
161
|
+
signal,
|
|
162
|
+
});
|
|
163
|
+
if (response.status === 404 || response.status === 410 || response.status >= 500) {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
if (!response.ok && response.status !== 206)
|
|
167
|
+
return false;
|
|
168
|
+
if (isDirect) {
|
|
169
|
+
await response.body?.cancel();
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
const html = await readBoundedResponseText(response, config.playerValidationMaxBytes);
|
|
173
|
+
return hasUnavailableMarker(html);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// A validation timeout or transient network failure must not hide a discovered player.
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
clearTimeout(timeout);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async function enrichPlayerOption(config, option, context) {
|
|
184
|
+
const subtitleInfoUrl = findSubtitleInfoUrl(option.access.url);
|
|
185
|
+
if (!subtitleInfoUrl)
|
|
186
|
+
return option;
|
|
187
|
+
try {
|
|
188
|
+
const response = await (config.fetch ?? fetch)(subtitleInfoUrl, {
|
|
189
|
+
headers: {
|
|
190
|
+
Accept: "application/json",
|
|
191
|
+
"User-Agent": config.userAgent,
|
|
192
|
+
Referer: option.access.url,
|
|
193
|
+
},
|
|
194
|
+
signal: context.signal,
|
|
195
|
+
});
|
|
196
|
+
if (!response.ok)
|
|
197
|
+
return option;
|
|
198
|
+
const declaredLength = Number(response.headers.get("content-length"));
|
|
199
|
+
if (Number.isFinite(declaredLength) && declaredLength > config.subtitleInfoMaxBytes) {
|
|
200
|
+
await response.body?.cancel();
|
|
201
|
+
return option;
|
|
202
|
+
}
|
|
203
|
+
const text = await readBoundedResponseText(response, config.subtitleInfoMaxBytes);
|
|
204
|
+
const subtitles = parseSubtitleInfo(text);
|
|
205
|
+
return subtitles.length > 0 ? { ...option, subtitles } : option;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Subtitle metadata is optional and must never hide an otherwise working player.
|
|
209
|
+
return option;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async function mapWithConcurrency(values, concurrency, mapper) {
|
|
213
|
+
const results = new Array(values.length);
|
|
214
|
+
let nextIndex = 0;
|
|
215
|
+
async function worker() {
|
|
216
|
+
while (nextIndex < values.length) {
|
|
217
|
+
const index = nextIndex;
|
|
218
|
+
nextIndex += 1;
|
|
219
|
+
results[index] = await mapper(values[index]);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, values.length) }, async () => worker()));
|
|
223
|
+
return results;
|
|
224
|
+
}
|
|
225
|
+
async function readBoundedResponseText(response, maxBytes) {
|
|
226
|
+
if (!response.body)
|
|
227
|
+
return "";
|
|
228
|
+
const reader = response.body.getReader();
|
|
229
|
+
const chunks = [];
|
|
230
|
+
let totalBytes = 0;
|
|
231
|
+
try {
|
|
232
|
+
while (totalBytes <= maxBytes) {
|
|
233
|
+
const { done, value } = await reader.read();
|
|
234
|
+
if (done)
|
|
235
|
+
break;
|
|
236
|
+
totalBytes += value.byteLength;
|
|
237
|
+
if (totalBytes > maxBytes) {
|
|
238
|
+
await reader.cancel();
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
chunks.push(value);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
finally {
|
|
245
|
+
reader.releaseLock();
|
|
246
|
+
}
|
|
247
|
+
const body = new Uint8Array(chunks.reduce((size, chunk) => size + chunk.byteLength, 0));
|
|
248
|
+
let offset = 0;
|
|
249
|
+
for (const chunk of chunks) {
|
|
250
|
+
body.set(chunk, offset);
|
|
251
|
+
offset += chunk.byteLength;
|
|
252
|
+
}
|
|
253
|
+
return new TextDecoder().decode(body);
|
|
254
|
+
}
|
|
255
|
+
function hasUnavailableMarker(html) {
|
|
256
|
+
const normalized = normalizeTitle(html);
|
|
257
|
+
return (normalized.includes("video not found") ||
|
|
258
|
+
normalized.includes("file was deleted") ||
|
|
259
|
+
normalized.includes("file has been deleted") ||
|
|
260
|
+
normalized.includes("video is unavailable") ||
|
|
261
|
+
normalized.includes("404 not found"));
|
|
262
|
+
}
|
|
263
|
+
async function fetchPlayers(config, token, type, context) {
|
|
264
|
+
const body = new URLSearchParams();
|
|
265
|
+
body.set(type === "movie" ? "players" : "players_show", token);
|
|
266
|
+
const responseText = await fetchText(config, new URL("/ajax/ajax.php", config.baseUrl), context, {
|
|
267
|
+
method: "POST",
|
|
268
|
+
headers: {
|
|
269
|
+
...createHeaders(config),
|
|
270
|
+
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
|
|
271
|
+
},
|
|
272
|
+
body: body.toString(),
|
|
273
|
+
});
|
|
274
|
+
try {
|
|
275
|
+
const parsed = JSON.parse(responseText);
|
|
276
|
+
const values = Array.isArray(parsed) ? parsed : parsed ? [parsed] : [];
|
|
277
|
+
return values.filter(isPlayerResponse);
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
throw mapProviderHttpError(config.name, error);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
function mapPlayer(config, player, episode, index) {
|
|
284
|
+
const url = normalizeHttpUrl(player.link);
|
|
285
|
+
if (!url)
|
|
286
|
+
return null;
|
|
287
|
+
const label = decodeHtml(player.name ?? "").trim() || `Server ${index + 1}`;
|
|
288
|
+
const kind = inferPlayerKind(url);
|
|
289
|
+
const quality = inferQuality(label, url);
|
|
290
|
+
const expiresAt = inferExpiresAt(url);
|
|
291
|
+
return {
|
|
292
|
+
id: `${config.name}:${episode.seasonNumber ?? 0}:${episode.episodeNumber ?? 0}:${index + 1}`,
|
|
293
|
+
provider: config.name,
|
|
294
|
+
player: { kind, label },
|
|
295
|
+
translation: {
|
|
296
|
+
title: "Original / subtitles",
|
|
297
|
+
type: "unknown",
|
|
298
|
+
},
|
|
299
|
+
episode: {
|
|
300
|
+
seasonNumber: episode.seasonNumber,
|
|
301
|
+
episodeNumber: episode.episodeNumber,
|
|
302
|
+
},
|
|
303
|
+
access: {
|
|
304
|
+
url,
|
|
305
|
+
referer: `${config.baseUrl}/`,
|
|
306
|
+
headers: { Referer: `${config.baseUrl}/` },
|
|
307
|
+
},
|
|
308
|
+
availability: "available",
|
|
309
|
+
...(quality ? { quality } : {}),
|
|
310
|
+
...(expiresAt ? { expiresAt } : {}),
|
|
311
|
+
sourceUrl: episode.url,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
export function parseSubtitleInfo(value) {
|
|
315
|
+
let parsed;
|
|
316
|
+
try {
|
|
317
|
+
parsed = JSON.parse(value);
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return [];
|
|
321
|
+
}
|
|
322
|
+
const entries = Array.isArray(parsed) ? parsed : [parsed];
|
|
323
|
+
const tracks = [];
|
|
324
|
+
const seen = new Set();
|
|
325
|
+
for (const rawEntry of entries) {
|
|
326
|
+
if (tracks.length >= SUBTITLE_TRACK_LIMIT)
|
|
327
|
+
break;
|
|
328
|
+
if (!rawEntry || typeof rawEntry !== "object")
|
|
329
|
+
continue;
|
|
330
|
+
const entry = rawEntry;
|
|
331
|
+
const url = typeof entry.file === "string" ? normalizeHttpUrl(entry.file) : undefined;
|
|
332
|
+
if (!url || seen.has(url))
|
|
333
|
+
continue;
|
|
334
|
+
const label = typeof entry.label === "string" ? decodeHtml(entry.label).trim() : "";
|
|
335
|
+
const language = inferSubtitleLanguage(label);
|
|
336
|
+
seen.add(url);
|
|
337
|
+
tracks.push({
|
|
338
|
+
...(language ? { language } : {}),
|
|
339
|
+
...(label ? { label: entry.default === true ? `${label} (default)` : label } : {}),
|
|
340
|
+
format: inferSubtitleFormat(url),
|
|
341
|
+
url,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
return tracks;
|
|
345
|
+
}
|
|
346
|
+
export function parseSearchCandidates(html) {
|
|
347
|
+
const candidates = [];
|
|
348
|
+
const seen = new Set();
|
|
349
|
+
for (const anchor of parseAnchors(html)) {
|
|
350
|
+
const href = normalizeHttpUrl(getAttribute(anchor.attributes, "href"));
|
|
351
|
+
const type = href?.includes("/watch-movie/")
|
|
352
|
+
? "movie"
|
|
353
|
+
: href?.includes("/watch-series/")
|
|
354
|
+
? "series"
|
|
355
|
+
: undefined;
|
|
356
|
+
if (!href || !type || seen.has(href))
|
|
357
|
+
continue;
|
|
358
|
+
const rawTitle = getAttribute(anchor.attributes, "title") ?? stripTags(anchor.content);
|
|
359
|
+
const title = cleanSearchTitle(decodeHtml(rawTitle));
|
|
360
|
+
if (!title)
|
|
361
|
+
continue;
|
|
362
|
+
const year = parseYear(href) ?? parseYear(html.slice(anchor.index, anchor.index + 600));
|
|
363
|
+
seen.add(href);
|
|
364
|
+
candidates.push({ mediaUrl: href, title, year, type });
|
|
365
|
+
}
|
|
366
|
+
return candidates;
|
|
367
|
+
}
|
|
368
|
+
export function parseEpisodes(html) {
|
|
369
|
+
return parseAnchors(html).flatMap((anchor) => {
|
|
370
|
+
const href = normalizeHttpUrl(getAttribute(anchor.attributes, "href"));
|
|
371
|
+
const match = href?.match(/\/s(\d+)-e(\d+)\/?$/i);
|
|
372
|
+
if (!href || !match)
|
|
373
|
+
return [];
|
|
374
|
+
const title = decodeHtml(getAttribute(anchor.attributes, "title") ?? stripTags(anchor.content)).trim();
|
|
375
|
+
return [
|
|
376
|
+
{
|
|
377
|
+
url: href,
|
|
378
|
+
title: title || undefined,
|
|
379
|
+
seasonNumber: Number(match[1]),
|
|
380
|
+
episodeNumber: Number(match[2]),
|
|
381
|
+
},
|
|
382
|
+
];
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
function selectBestCandidate(candidates, query) {
|
|
386
|
+
const type = query.type === "movie" ? "movie" : "series";
|
|
387
|
+
const title = normalizeTitle(query.title ?? "");
|
|
388
|
+
return candidates
|
|
389
|
+
.filter((candidate) => candidate.type === type)
|
|
390
|
+
.map((candidate, index) => ({
|
|
391
|
+
candidate,
|
|
392
|
+
score: titleScore(normalizeTitle(candidate.title), title) +
|
|
393
|
+
(query.year && candidate.year === query.year ? 30 : 0) -
|
|
394
|
+
(query.year && candidate.year && candidate.year !== query.year ? 20 : 0) -
|
|
395
|
+
index / 100,
|
|
396
|
+
}))
|
|
397
|
+
.sort((left, right) => right.score - left.score)[0]?.candidate;
|
|
398
|
+
}
|
|
399
|
+
function selectEpisode(episodes, seasonNumber, episodeNumber) {
|
|
400
|
+
return episodes.find((episode) => episode.seasonNumber === seasonNumber && episode.episodeNumber === episodeNumber);
|
|
401
|
+
}
|
|
402
|
+
function findPlayerToken(html, type) {
|
|
403
|
+
const requiredClass = type === "movie" ? "page-detail" : "w_b-player";
|
|
404
|
+
for (const tag of html.matchAll(/<[^>]+>/g)) {
|
|
405
|
+
const attributes = tag[0];
|
|
406
|
+
const classes = getAttribute(attributes, "class")?.split(/\s+/) ?? [];
|
|
407
|
+
const id = getAttribute(attributes, "id");
|
|
408
|
+
if (classes.includes(requiredClass) || (type === "series" && id === "series-player")) {
|
|
409
|
+
const token = getAttribute(attributes, "data-token")?.trim();
|
|
410
|
+
if (token)
|
|
411
|
+
return token;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return undefined;
|
|
415
|
+
}
|
|
416
|
+
function parseAnchors(html) {
|
|
417
|
+
return [...html.matchAll(/<a\b([^>]*)>([\s\S]*?)<\/a>/gi)].map((match) => ({
|
|
418
|
+
attributes: match[1] ?? "",
|
|
419
|
+
content: match[2] ?? "",
|
|
420
|
+
index: match.index,
|
|
421
|
+
}));
|
|
422
|
+
}
|
|
423
|
+
function getAttribute(attributes, name) {
|
|
424
|
+
const escapedName = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
425
|
+
const expression = new RegExp(`(?:^|\\s)${escapedName}\\s*=\\s*(["'])(.*?)\\1`, "i");
|
|
426
|
+
return attributes.match(expression)?.[2];
|
|
427
|
+
}
|
|
428
|
+
async function fetchText(config, url, context, init = {}) {
|
|
429
|
+
const fetchImpl = config.fetch ?? fetch;
|
|
430
|
+
try {
|
|
431
|
+
const response = await fetchImpl(url, {
|
|
432
|
+
...init,
|
|
433
|
+
headers: init.headers ?? createHeaders(config),
|
|
434
|
+
signal: context.signal,
|
|
435
|
+
});
|
|
436
|
+
if (!response.ok) {
|
|
437
|
+
throw new Error(`Provider "${config.name}" returned HTTP ${response.status}.`);
|
|
438
|
+
}
|
|
439
|
+
const declaredLength = Number(response.headers.get("content-length"));
|
|
440
|
+
if (Number.isFinite(declaredLength) && declaredLength > config.maxHtmlBytes) {
|
|
441
|
+
throw new Error(`Provider "${config.name}" returned an oversized response.`);
|
|
442
|
+
}
|
|
443
|
+
const body = await response.arrayBuffer();
|
|
444
|
+
if (body.byteLength > config.maxHtmlBytes) {
|
|
445
|
+
throw new Error(`Provider "${config.name}" returned an oversized response.`);
|
|
446
|
+
}
|
|
447
|
+
return new TextDecoder().decode(body);
|
|
448
|
+
}
|
|
449
|
+
catch (error) {
|
|
450
|
+
throw mapProviderHttpError(config.name, error);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
function createHeaders(config) {
|
|
454
|
+
return {
|
|
455
|
+
Accept: "text/html,application/json;q=0.9,*/*;q=0.8",
|
|
456
|
+
"User-Agent": config.userAgent,
|
|
457
|
+
Referer: `${config.baseUrl}/`,
|
|
458
|
+
"X-Requested-With": "XMLHttpRequest",
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
function isPlayerResponse(value) {
|
|
462
|
+
return typeof value === "object" && value !== null;
|
|
463
|
+
}
|
|
464
|
+
function normalizeBaseUrl(value) {
|
|
465
|
+
const url = new URL(value);
|
|
466
|
+
if (url.protocol !== "https:" && url.protocol !== "http:") {
|
|
467
|
+
throw new TypeError("FlixHQ streaming baseUrl must use HTTP or HTTPS.");
|
|
468
|
+
}
|
|
469
|
+
return url.href.replace(/\/$/, "");
|
|
470
|
+
}
|
|
471
|
+
function normalizeProviderName(value) {
|
|
472
|
+
const name = value.trim();
|
|
473
|
+
if (!name)
|
|
474
|
+
throw new TypeError("FlixHQ streaming provider name is required.");
|
|
475
|
+
return name;
|
|
476
|
+
}
|
|
477
|
+
function normalizeHttpUrl(value) {
|
|
478
|
+
return normalizePublicHttpUrl(value);
|
|
479
|
+
}
|
|
480
|
+
function findSubtitleInfoUrl(playerUrl) {
|
|
481
|
+
try {
|
|
482
|
+
const value = new URL(playerUrl).searchParams.get("sub.info");
|
|
483
|
+
return normalizeHttpUrl(value);
|
|
484
|
+
}
|
|
485
|
+
catch {
|
|
486
|
+
return undefined;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
function inferPlayerKind(url) {
|
|
490
|
+
try {
|
|
491
|
+
const pathname = new URL(url).pathname.toLowerCase();
|
|
492
|
+
if (pathname.endsWith(".m3u8"))
|
|
493
|
+
return "hls";
|
|
494
|
+
if (pathname.endsWith(".mp4"))
|
|
495
|
+
return "mp4";
|
|
496
|
+
}
|
|
497
|
+
catch {
|
|
498
|
+
// The URL was already normalized, so this is only a defensive fallback.
|
|
499
|
+
}
|
|
500
|
+
return "embed";
|
|
501
|
+
}
|
|
502
|
+
function inferQuality(label, url) {
|
|
503
|
+
const match = `${label} ${url}`.match(/(?:^|[^\d])(2160|1440|1080|720|576|480|360|240)p?(?:[^\d]|$)/i);
|
|
504
|
+
if (!match)
|
|
505
|
+
return undefined;
|
|
506
|
+
const height = Number(match[1]);
|
|
507
|
+
return { label: `${height}p`, height };
|
|
508
|
+
}
|
|
509
|
+
function inferExpiresAt(value) {
|
|
510
|
+
let url;
|
|
511
|
+
try {
|
|
512
|
+
url = new URL(value);
|
|
513
|
+
}
|
|
514
|
+
catch {
|
|
515
|
+
return undefined;
|
|
516
|
+
}
|
|
517
|
+
for (const name of ["expires", "expire", "exp"]) {
|
|
518
|
+
const rawValue = url.searchParams.get(name)?.trim();
|
|
519
|
+
if (!rawValue)
|
|
520
|
+
continue;
|
|
521
|
+
const numeric = Number(rawValue);
|
|
522
|
+
const date = Number.isFinite(numeric)
|
|
523
|
+
? new Date(numeric > 10_000_000_000 ? numeric : numeric * 1_000)
|
|
524
|
+
: new Date(rawValue);
|
|
525
|
+
if (!Number.isNaN(date.getTime()) && date.getUTCFullYear() >= 2000)
|
|
526
|
+
return date.toISOString();
|
|
527
|
+
}
|
|
528
|
+
return undefined;
|
|
529
|
+
}
|
|
530
|
+
function inferSubtitleFormat(url) {
|
|
531
|
+
try {
|
|
532
|
+
const extension = new URL(url).pathname.toLowerCase().match(/\.([a-z0-9]+)$/)?.[1];
|
|
533
|
+
if (extension === "vtt" || extension === "srt" || extension === "ass")
|
|
534
|
+
return extension;
|
|
535
|
+
}
|
|
536
|
+
catch {
|
|
537
|
+
// The URL was already normalized, so this is only a defensive fallback.
|
|
538
|
+
}
|
|
539
|
+
return "unknown";
|
|
540
|
+
}
|
|
541
|
+
function inferSubtitleLanguage(label) {
|
|
542
|
+
const normalized = normalizeTitle(label);
|
|
543
|
+
const mappings = [
|
|
544
|
+
[/\b(bulgarian|bul)\b/, "bg"],
|
|
545
|
+
[/\b(czech|ces|cze)\b/, "cs"],
|
|
546
|
+
[/\b(danish|dan)\b/, "da"],
|
|
547
|
+
[/\b(dutch|nld|dut)\b/, "nl"],
|
|
548
|
+
[/\b(english|eng)\b/, "en"],
|
|
549
|
+
[/\b(estonian|est)\b/, "et"],
|
|
550
|
+
[/\b(finnish|fin)\b/, "fi"],
|
|
551
|
+
[/\b(spanish|espanol|spa)\b/, "es"],
|
|
552
|
+
[/\b(french|francais|fre|fra)\b/, "fr"],
|
|
553
|
+
[/\b(german|deutsch|ger|deu)\b/, "de"],
|
|
554
|
+
[/\b(greek|ell|gre)\b/, "el"],
|
|
555
|
+
[/\b(hebrew|heb)\b/, "he"],
|
|
556
|
+
[/\b(croatian|hrv)\b/, "hr"],
|
|
557
|
+
[/\b(hungarian|hun)\b/, "hu"],
|
|
558
|
+
[/\b(icelandic|isl|ice)\b/, "is"],
|
|
559
|
+
[/\b(indonesian|ind)\b/, "id"],
|
|
560
|
+
[/\b(italian|italiano|ita)\b/, "it"],
|
|
561
|
+
[/\b(latvian|lav)\b/, "lv"],
|
|
562
|
+
[/\b(lithuanian|lit)\b/, "lt"],
|
|
563
|
+
[/\b(macedonian|mkd|mac)\b/, "mk"],
|
|
564
|
+
[/\b(malay|msa|may)\b/, "ms"],
|
|
565
|
+
[/\b(norwegian|nob)\b/, "nb"],
|
|
566
|
+
[/\b(polish|pol)\b/, "pl"],
|
|
567
|
+
[/\b(pob)\b/, "pt-BR"],
|
|
568
|
+
[/\b(portuguese|portugues|por)\b/, "pt"],
|
|
569
|
+
[/\b(romanian|ron|rum)\b/, "ro"],
|
|
570
|
+
[/\b(serbian|srp)\b/, "sr"],
|
|
571
|
+
[/\b(sinhala|sinhalese|sin)\b/, "si"],
|
|
572
|
+
[/\b(slovak|slk|slo)\b/, "sk"],
|
|
573
|
+
[/\b(slovenian|slv)\b/, "sl"],
|
|
574
|
+
[/\b(swedish|swe)\b/, "sv"],
|
|
575
|
+
[/\b(thai|tha)\b/, "th"],
|
|
576
|
+
[/\b(japanese|jpn|jap)\b/, "ja"],
|
|
577
|
+
[/\b(korean|kor)\b/, "ko"],
|
|
578
|
+
[/\b(chinese|chi|zho)\b/, "zh"],
|
|
579
|
+
[/\b(arabic|ara)\b/, "ar"],
|
|
580
|
+
[/\b(hindi|hin)\b/, "hi"],
|
|
581
|
+
[/\b(turkish|tur)\b/, "tr"],
|
|
582
|
+
[/\b(russian|rus)\b|русск/, "ru"],
|
|
583
|
+
[/\b(ukrainian|ukr)\b|україн|украин/, "uk"],
|
|
584
|
+
];
|
|
585
|
+
return mappings.find(([pattern]) => pattern.test(normalized))?.[1];
|
|
586
|
+
}
|
|
587
|
+
function cleanSearchTitle(value) {
|
|
588
|
+
return value.replace(/\s*(?:watch online|flixhq).*$/i, "").trim();
|
|
589
|
+
}
|
|
590
|
+
function normalizeTitle(value) {
|
|
591
|
+
return value
|
|
592
|
+
.normalize("NFKD")
|
|
593
|
+
.toLowerCase()
|
|
594
|
+
.replace(/[^\p{L}\p{N}]+/gu, " ")
|
|
595
|
+
.trim();
|
|
596
|
+
}
|
|
597
|
+
function titleScore(candidate, query) {
|
|
598
|
+
if (candidate === query)
|
|
599
|
+
return 100;
|
|
600
|
+
if (candidate.includes(query) || query.includes(candidate))
|
|
601
|
+
return 70;
|
|
602
|
+
const tokens = new Set(query.split(" ").filter(Boolean));
|
|
603
|
+
const candidateTokens = new Set(candidate.split(" ").filter(Boolean));
|
|
604
|
+
const shared = [...tokens].filter((token) => candidateTokens.has(token)).length;
|
|
605
|
+
return tokens.size === 0 ? 0 : (shared / tokens.size) * 60;
|
|
606
|
+
}
|
|
607
|
+
function parseYear(value) {
|
|
608
|
+
const match = stripTags(value).match(/\b(19\d{2}|20\d{2})\b/);
|
|
609
|
+
return match ? Number(match[1]) : undefined;
|
|
610
|
+
}
|
|
611
|
+
function stripTags(value) {
|
|
612
|
+
return value.replace(/<[^>]*>/g, " ").replace(/\s+/g, " ");
|
|
613
|
+
}
|
|
614
|
+
function decodeHtml(value) {
|
|
615
|
+
return value
|
|
616
|
+
.replace(/&/gi, "&")
|
|
617
|
+
.replace(/"/gi, '"')
|
|
618
|
+
.replace(/�*39;|'/gi, "'")
|
|
619
|
+
.replace(/</gi, "<")
|
|
620
|
+
.replace(/>/gi, ">");
|
|
621
|
+
}
|
|
622
|
+
function emptyAvailability(query) {
|
|
623
|
+
return { query, options: [], sourceProviders: [], checkedAt: new Date().toISOString() };
|
|
624
|
+
}
|
|
625
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/flixhq-streaming/index.ts"],"names":[],"mappings":"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"}
|