@media-engine/providers 0.1.0 → 0.1.1
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/README.md +40 -262
- package/README.ru.md +73 -0
- package/dist/anilist/index.js +4 -1
- package/dist/anilist/index.js.map +1 -1
- package/dist/cinemeta/index.js +20 -27
- package/dist/cinemeta/index.js.map +1 -1
- package/dist/flixhq-streaming/index.js +13 -6
- package/dist/flixhq-streaming/index.js.map +1 -1
- package/dist/imdb-dataset/index.js +4 -16
- package/dist/imdb-dataset/index.js.map +1 -1
- package/dist/kinobd/index.js +11 -28
- package/dist/kinobd/index.js.map +1 -1
- package/dist/kinobd-streaming/availability.d.ts +3 -0
- package/dist/kinobd-streaming/availability.js +156 -0
- package/dist/kinobd-streaming/availability.js.map +1 -0
- package/dist/kinobd-streaming/candidates.d.ts +31 -0
- package/dist/kinobd-streaming/candidates.js +230 -0
- package/dist/kinobd-streaming/candidates.js.map +1 -0
- package/dist/kinobd-streaming/config.d.ts +49 -0
- package/dist/kinobd-streaming/config.js +125 -0
- package/dist/kinobd-streaming/config.js.map +1 -0
- package/dist/kinobd-streaming/index.d.ts +3 -30
- package/dist/kinobd-streaming/index.js +2 -904
- package/dist/kinobd-streaming/index.js.map +1 -1
- package/dist/kinobd-streaming/players.d.ts +23 -0
- package/dist/kinobd-streaming/players.js +270 -0
- package/dist/kinobd-streaming/players.js.map +1 -0
- package/dist/kinobd-streaming/validation.d.ts +9 -0
- package/dist/kinobd-streaming/validation.js +141 -0
- package/dist/kinobd-streaming/validation.js.map +1 -0
- package/dist/shared/abort.d.ts +2 -0
- package/dist/shared/abort.js +8 -0
- package/dist/shared/abort.js.map +1 -0
- package/dist/shared/http.d.ts +5 -0
- package/dist/shared/http.js +41 -9
- package/dist/shared/http.js.map +1 -1
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +1 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/mapping.d.ts +5 -0
- package/dist/shared/mapping.js +30 -0
- package/dist/shared/mapping.js.map +1 -0
- package/dist/shared/options.d.ts +1 -0
- package/dist/shared/options.js +10 -0
- package/dist/shared/options.js.map +1 -0
- package/dist/shared/rate-limit.d.ts +11 -0
- package/dist/shared/rate-limit.js +68 -0
- package/dist/shared/rate-limit.js.map +1 -0
- package/dist/shared/retry.d.ts +10 -0
- package/dist/shared/retry.js +31 -0
- package/dist/shared/retry.js.map +1 -0
- package/dist/shikimori/index.js +16 -5
- package/dist/shikimori/index.js.map +1 -1
- package/dist/wikidata/index.js +7 -10
- package/dist/wikidata/index.js.map +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ExternalIds, MediaAvailability, ProviderContext } from "@media-engine/core";
|
|
2
|
+
import type { KinoBdStreamingConfig } from "./config.js";
|
|
3
|
+
export interface PlayerCandidate {
|
|
4
|
+
id?: string | number | null;
|
|
5
|
+
inid?: string | number | null;
|
|
6
|
+
kp_id?: string | number | null;
|
|
7
|
+
kinopoisk_id?: string | number | null;
|
|
8
|
+
imdb_id?: string | null;
|
|
9
|
+
title?: string | null;
|
|
10
|
+
name_russian?: string | null;
|
|
11
|
+
name_original?: string | null;
|
|
12
|
+
year?: string | number | null;
|
|
13
|
+
year_start?: string | number | null;
|
|
14
|
+
year_end?: string | number | null;
|
|
15
|
+
rating_kp?: string | number | null;
|
|
16
|
+
rating_kp_count?: string | number | null;
|
|
17
|
+
rating_imdb?: string | number | null;
|
|
18
|
+
rating_imdb_count?: string | number | null;
|
|
19
|
+
type?: string | null;
|
|
20
|
+
popular_rate?: string | number | null;
|
|
21
|
+
popularity?: {
|
|
22
|
+
popular_rate?: string | number | null;
|
|
23
|
+
} | null;
|
|
24
|
+
iframe?: string | null;
|
|
25
|
+
}
|
|
26
|
+
export declare function createAnimeTitleFallbackQuery(config: KinoBdStreamingConfig, query: MediaAvailability["query"], context: ProviderContext): Promise<MediaAvailability["query"]>;
|
|
27
|
+
export declare function searchPlayerCandidates(config: KinoBdStreamingConfig, query: MediaAvailability["query"], context: ProviderContext): Promise<PlayerCandidate[]>;
|
|
28
|
+
export declare function selectBestPlayerCandidate(candidates: PlayerCandidate[], query: MediaAvailability["query"]): PlayerCandidate | undefined;
|
|
29
|
+
export declare function collectCandidateIds(candidate: PlayerCandidate | undefined): ExternalIds | undefined;
|
|
30
|
+
export declare function getCandidateStartYear(candidate: PlayerCandidate): number | undefined;
|
|
31
|
+
export declare function normalizeSearchText(value: string): string;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { rethrowIfProviderAborted } from "../shared/abort.js";
|
|
2
|
+
import { fetchJson } from "../shared/index.js";
|
|
3
|
+
import { mapKinoBdMediaType as mapCandidateMediaType } from "../shared/mapping.js";
|
|
4
|
+
// Builds an anime fallback query that KinoBD player search can understand.
|
|
5
|
+
// Собирает anime fallback query, который понимает KinoBD player search.
|
|
6
|
+
export async function createAnimeTitleFallbackQuery(config, query, context) {
|
|
7
|
+
if (query.title) {
|
|
8
|
+
return query;
|
|
9
|
+
}
|
|
10
|
+
if (!query.ids?.shikimori) {
|
|
11
|
+
return query;
|
|
12
|
+
}
|
|
13
|
+
const lookup = await tryLookupShikimoriAnime(config, query.ids.shikimori, context);
|
|
14
|
+
const title = lookup?.russian?.trim() ||
|
|
15
|
+
lookup?.name?.trim() ||
|
|
16
|
+
lookup?.english?.find((value) => value.trim())?.trim();
|
|
17
|
+
return {
|
|
18
|
+
...query,
|
|
19
|
+
title,
|
|
20
|
+
year: query.year ?? parseYear(lookup?.aired_on),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// Searches KinoBD player candidates by Kinopoisk ID or title.
|
|
24
|
+
// Ищет KinoBD player candidates по Kinopoisk ID или title.
|
|
25
|
+
export async function searchPlayerCandidates(config, query, context) {
|
|
26
|
+
const search = createCandidateSearch(query);
|
|
27
|
+
if (!search) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
const url = new URL("/api/player/search", `${config.baseUrl}/`);
|
|
31
|
+
url.searchParams.set("q", search.value);
|
|
32
|
+
url.searchParams.set("type", search.type);
|
|
33
|
+
url.searchParams.set("page", "1");
|
|
34
|
+
const response = await fetchJson({
|
|
35
|
+
provider: config.name,
|
|
36
|
+
url,
|
|
37
|
+
context,
|
|
38
|
+
fetch: config.fetch,
|
|
39
|
+
rateLimitGate: config.rateLimitGate,
|
|
40
|
+
init: {
|
|
41
|
+
headers: {
|
|
42
|
+
accept: "application/json",
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
return (response.data ?? []).slice(0, config.searchLimit);
|
|
47
|
+
}
|
|
48
|
+
// Chooses the most likely KinoBD record instead of trusting upstream result order.
|
|
49
|
+
// Выбирает наиболее вероятную KinoBD-запись вместо доверия порядку upstream results.
|
|
50
|
+
export function selectBestPlayerCandidate(candidates, query) {
|
|
51
|
+
if (candidates.length === 0) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
if (query.ids?.kinopoisk || query.ids?.imdb) {
|
|
55
|
+
const exact = candidates.find((candidate) => hasExactCandidateId(candidate, query.ids));
|
|
56
|
+
if (exact) {
|
|
57
|
+
return exact;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const normalizedTitle = normalizeSearchText(query.title ?? "");
|
|
61
|
+
return candidates
|
|
62
|
+
.map((candidate, index) => ({
|
|
63
|
+
candidate,
|
|
64
|
+
index,
|
|
65
|
+
score: scorePlayerCandidate(candidate, query, normalizedTitle),
|
|
66
|
+
}))
|
|
67
|
+
.filter((entry) => entry.score > Number.NEGATIVE_INFINITY)
|
|
68
|
+
.sort((left, right) => right.score - left.score || left.index - right.index)[0]?.candidate;
|
|
69
|
+
}
|
|
70
|
+
// Collects known external IDs from a player candidate.
|
|
71
|
+
// Собирает известные external IDs из player candidate.
|
|
72
|
+
export function collectCandidateIds(candidate) {
|
|
73
|
+
if (!candidate) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
const ids = {};
|
|
77
|
+
const kinopoiskId = candidate.kinopoisk_id ?? candidate.kp_id;
|
|
78
|
+
if (kinopoiskId !== undefined && kinopoiskId !== null) {
|
|
79
|
+
ids.kinopoisk = String(kinopoiskId);
|
|
80
|
+
}
|
|
81
|
+
if (candidate.imdb_id) {
|
|
82
|
+
ids.imdb = candidate.imdb_id;
|
|
83
|
+
}
|
|
84
|
+
return Object.keys(ids).length > 0 ? ids : undefined;
|
|
85
|
+
}
|
|
86
|
+
export function getCandidateStartYear(candidate) {
|
|
87
|
+
return parseOptionalInteger(candidate.year ?? candidate.year_start);
|
|
88
|
+
}
|
|
89
|
+
function scorePlayerCandidate(candidate, query, normalizedTitle) {
|
|
90
|
+
const candidateType = mapCandidateMediaType(candidate.type);
|
|
91
|
+
const queryType = query.type === "movie" || query.type === "series" ? query.type : undefined;
|
|
92
|
+
if (queryType && candidateType && candidateType !== queryType) {
|
|
93
|
+
return Number.NEGATIVE_INFINITY;
|
|
94
|
+
}
|
|
95
|
+
const startYear = getCandidateStartYear(candidate);
|
|
96
|
+
const endYear = parseOptionalInteger(candidate.year_end);
|
|
97
|
+
if (query.year !== undefined) {
|
|
98
|
+
if (startYear === undefined) {
|
|
99
|
+
return Number.NEGATIVE_INFINITY;
|
|
100
|
+
}
|
|
101
|
+
if (queryType === "series") {
|
|
102
|
+
const lastYear = endYear ?? startYear;
|
|
103
|
+
if (query.year < startYear || query.year > lastYear) {
|
|
104
|
+
return Number.NEGATIVE_INFINITY;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (startYear !== query.year) {
|
|
108
|
+
return Number.NEGATIVE_INFINITY;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const original = normalizeSearchText(candidate.name_original ?? "");
|
|
112
|
+
const russian = normalizeSearchText(candidate.name_russian ?? candidate.title ?? "");
|
|
113
|
+
const popularity = parseOptionalInteger(candidate.popular_rate ?? candidate.popularity?.popular_rate) ?? 0;
|
|
114
|
+
const votes = parseOptionalInteger(candidate.rating_kp_count) ??
|
|
115
|
+
parseOptionalInteger(candidate.rating_imdb_count) ??
|
|
116
|
+
0;
|
|
117
|
+
const rating = parseOptionalInteger(candidate.rating_kp) ?? parseOptionalInteger(candidate.rating_imdb) ?? 0;
|
|
118
|
+
let score = 10;
|
|
119
|
+
if (queryType && candidateType === queryType) {
|
|
120
|
+
score += 40;
|
|
121
|
+
}
|
|
122
|
+
if (normalizedTitle && (original === normalizedTitle || russian === normalizedTitle)) {
|
|
123
|
+
score += 80;
|
|
124
|
+
}
|
|
125
|
+
else if (normalizedTitle &&
|
|
126
|
+
(original.includes(normalizedTitle) || russian.includes(normalizedTitle))) {
|
|
127
|
+
score += 25;
|
|
128
|
+
}
|
|
129
|
+
if (query.year !== undefined && startYear !== undefined) {
|
|
130
|
+
score += startYear === query.year ? 35 : 15;
|
|
131
|
+
}
|
|
132
|
+
if (candidate.imdb_id) {
|
|
133
|
+
score += 5;
|
|
134
|
+
}
|
|
135
|
+
if (candidate.kinopoisk_id ?? candidate.kp_id) {
|
|
136
|
+
score += 5;
|
|
137
|
+
}
|
|
138
|
+
score += Math.min(8, rating);
|
|
139
|
+
score += Math.min(10, Math.log10(votes + 1) * 2);
|
|
140
|
+
score += Math.min(12, Math.log10(popularity + 1) * 2);
|
|
141
|
+
return score;
|
|
142
|
+
}
|
|
143
|
+
function hasExactCandidateId(candidate, ids) {
|
|
144
|
+
const candidateIds = collectCandidateIds(candidate);
|
|
145
|
+
return Boolean((ids?.kinopoisk && candidateIds?.kinopoisk === ids.kinopoisk) ||
|
|
146
|
+
(ids?.imdb && candidateIds?.imdb === ids.imdb));
|
|
147
|
+
}
|
|
148
|
+
// Creates the best supported player search input from a stream query.
|
|
149
|
+
// Создает лучший поддерживаемый input поиска player из stream query.
|
|
150
|
+
function createCandidateSearch(query) {
|
|
151
|
+
if (query.ids?.kinopoisk) {
|
|
152
|
+
return {
|
|
153
|
+
type: "kp_id",
|
|
154
|
+
value: query.ids.kinopoisk,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
if (query.title) {
|
|
158
|
+
return {
|
|
159
|
+
type: "title",
|
|
160
|
+
value: query.title,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
// Resolves Shikimori ID into title metadata without requiring user secrets.
|
|
166
|
+
// Резолвит Shikimori ID в title metadata без пользовательских секретов.
|
|
167
|
+
async function tryLookupShikimoriAnime(config, shikimoriId, context) {
|
|
168
|
+
const url = new URL(`/api/animes/${encodeURIComponent(shikimoriId)}`, `${config.shikimoriBaseUrl}/`);
|
|
169
|
+
const headers = {
|
|
170
|
+
accept: "application/json",
|
|
171
|
+
};
|
|
172
|
+
if (config.userAgent) {
|
|
173
|
+
headers["user-agent"] = config.userAgent;
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
return await fetchJson({
|
|
177
|
+
provider: config.name,
|
|
178
|
+
url,
|
|
179
|
+
context: {
|
|
180
|
+
...context,
|
|
181
|
+
timeoutMs: getBoundedTimeoutMs(context.timeoutMs, config.shikimoriLookupTimeoutMs),
|
|
182
|
+
},
|
|
183
|
+
fetch: config.fetch,
|
|
184
|
+
rateLimitGate: config.rateLimitGate,
|
|
185
|
+
maxRetries: 0,
|
|
186
|
+
init: {
|
|
187
|
+
headers,
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
rethrowIfProviderAborted(context, error);
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Keeps helper lookups inside the remaining provider budget when one exists.
|
|
197
|
+
// Удерживает вспомогательные lookup-запросы внутри общего бюджета провайдера, если он задан.
|
|
198
|
+
function getBoundedTimeoutMs(contextTimeoutMs, fallbackTimeoutMs) {
|
|
199
|
+
return contextTimeoutMs === undefined
|
|
200
|
+
? fallbackTimeoutMs
|
|
201
|
+
: Math.min(contextTimeoutMs, fallbackTimeoutMs);
|
|
202
|
+
}
|
|
203
|
+
// Parses optional integer-like values.
|
|
204
|
+
// Парсит опциональные integer-like значения.
|
|
205
|
+
function parseOptionalInteger(value) {
|
|
206
|
+
if (value === undefined || value === null) {
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
const parsed = typeof value === "number" ? value : Number.parseInt(value, 10);
|
|
210
|
+
return Number.isInteger(parsed) ? parsed : undefined;
|
|
211
|
+
}
|
|
212
|
+
// Parses a year from date-like values such as 2002-10-03.
|
|
213
|
+
// Парсит год из date-like значений вроде 2002-10-03.
|
|
214
|
+
function parseYear(value) {
|
|
215
|
+
if (!value) {
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
const year = Number.parseInt(value.slice(0, 4), 10);
|
|
219
|
+
return Number.isInteger(year) ? year : undefined;
|
|
220
|
+
}
|
|
221
|
+
export function normalizeSearchText(value) {
|
|
222
|
+
return value
|
|
223
|
+
.trim()
|
|
224
|
+
.toLowerCase()
|
|
225
|
+
.replace(/ё/g, "е")
|
|
226
|
+
.replace(/[^\p{L}\p{N}]+/gu, " ")
|
|
227
|
+
.replace(/\s+/g, " ")
|
|
228
|
+
.trim();
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=candidates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"candidates.js","sourceRoot":"","sources":["../../src/kinobd-streaming/candidates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { MediaAvailability, StreamingProviderCapabilities } from "@media-engine/core";
|
|
2
|
+
import { ProviderRateLimitGate, type ProviderFetch } from "../shared/index.js";
|
|
3
|
+
export interface KinoBdStreamingProviderOptions {
|
|
4
|
+
name?: string;
|
|
5
|
+
version?: string;
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
animeCacheBaseUrl?: string;
|
|
8
|
+
shikimoriBaseUrl?: string;
|
|
9
|
+
fetch?: ProviderFetch;
|
|
10
|
+
searchLimit?: number;
|
|
11
|
+
shikimoriLookupTimeoutMs?: number;
|
|
12
|
+
playerValidationLimit?: number;
|
|
13
|
+
playerValidationTimeoutMs?: number;
|
|
14
|
+
playerProviders?: string;
|
|
15
|
+
fast?: number;
|
|
16
|
+
userAgent?: string;
|
|
17
|
+
onPlayerAudit?: (audit: KinoBdPlayerAudit) => void;
|
|
18
|
+
}
|
|
19
|
+
export type KinoBdPlayerFilterReason = "provider_not_allowed" | "missing_iframe" | "known_broken_url" | "player_validation_failed";
|
|
20
|
+
export interface KinoBdFilteredPlayerAuditEntry {
|
|
21
|
+
player: string;
|
|
22
|
+
reason: KinoBdPlayerFilterReason;
|
|
23
|
+
url?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface KinoBdPlayerAudit {
|
|
26
|
+
query: MediaAvailability["query"];
|
|
27
|
+
discovered: string[];
|
|
28
|
+
shown: string[];
|
|
29
|
+
filtered: KinoBdFilteredPlayerAuditEntry[];
|
|
30
|
+
}
|
|
31
|
+
export interface KinoBdStreamingConfig {
|
|
32
|
+
name: string;
|
|
33
|
+
baseUrl: string;
|
|
34
|
+
animeCacheBaseUrl?: string;
|
|
35
|
+
shikimoriBaseUrl: string;
|
|
36
|
+
fetch?: ProviderFetch;
|
|
37
|
+
rateLimitGate: ProviderRateLimitGate;
|
|
38
|
+
searchLimit: number;
|
|
39
|
+
shikimoriLookupTimeoutMs: number;
|
|
40
|
+
playerValidationLimit: number;
|
|
41
|
+
playerValidationTimeoutMs: number;
|
|
42
|
+
playerProviders: string;
|
|
43
|
+
allowedPlayerProviders: ReadonlySet<string>;
|
|
44
|
+
fast: number;
|
|
45
|
+
userAgent?: string;
|
|
46
|
+
onPlayerAudit?: (audit: KinoBdPlayerAudit) => void;
|
|
47
|
+
}
|
|
48
|
+
export declare function createConfig(options: KinoBdStreamingProviderOptions): KinoBdStreamingConfig;
|
|
49
|
+
export declare function createCapabilities(): StreamingProviderCapabilities;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { ProviderRateLimitGate } from "../shared/index.js";
|
|
2
|
+
const PROVIDER_NAME = "kinobd-streaming";
|
|
3
|
+
const DEFAULT_BASE_URL = "https://kinobd.net";
|
|
4
|
+
const DEFAULT_SHIKIMORI_BASE_URL = "https://shikimori.io";
|
|
5
|
+
const DEFAULT_SEARCH_LIMIT = 10;
|
|
6
|
+
const DEFAULT_PLAYER_VALIDATION_LIMIT = 8;
|
|
7
|
+
const DEFAULT_SHIKIMORI_LOOKUP_TIMEOUT_MS = 2_500;
|
|
8
|
+
const PLAYER_VALIDATION_TIMEOUT_MS = 2_500;
|
|
9
|
+
const DEFAULT_PLAYER_PROVIDERS = [
|
|
10
|
+
"collaps",
|
|
11
|
+
"vibix",
|
|
12
|
+
"alloha",
|
|
13
|
+
"kodik",
|
|
14
|
+
"kinotochka",
|
|
15
|
+
"flixcdn",
|
|
16
|
+
"ashdi",
|
|
17
|
+
"turbo",
|
|
18
|
+
"videocdn",
|
|
19
|
+
"bazon",
|
|
20
|
+
"ustore",
|
|
21
|
+
"pleer",
|
|
22
|
+
"videospider",
|
|
23
|
+
"iframe",
|
|
24
|
+
"moonwalk",
|
|
25
|
+
"hdvb",
|
|
26
|
+
"cdnmovies",
|
|
27
|
+
"lookbase",
|
|
28
|
+
"kholobok",
|
|
29
|
+
"videoapi",
|
|
30
|
+
"voidboost",
|
|
31
|
+
"videoseed",
|
|
32
|
+
"vk",
|
|
33
|
+
].join(",");
|
|
34
|
+
const BLOCKED_PLAYER_PROVIDERS = new Set([
|
|
35
|
+
"ext",
|
|
36
|
+
"ia",
|
|
37
|
+
"netflix",
|
|
38
|
+
"nf",
|
|
39
|
+
"torrent",
|
|
40
|
+
"trailer",
|
|
41
|
+
"trailer_local",
|
|
42
|
+
"youtube",
|
|
43
|
+
]);
|
|
44
|
+
// Builds provider config with ReYohoho-compatible defaults.
|
|
45
|
+
// Собирает provider config с ReYohoho-compatible defaults.
|
|
46
|
+
export function createConfig(options) {
|
|
47
|
+
const searchLimit = options.searchLimit ?? DEFAULT_SEARCH_LIMIT;
|
|
48
|
+
const shikimoriLookupTimeoutMs = options.shikimoriLookupTimeoutMs ?? DEFAULT_SHIKIMORI_LOOKUP_TIMEOUT_MS;
|
|
49
|
+
const playerValidationLimit = options.playerValidationLimit ?? DEFAULT_PLAYER_VALIDATION_LIMIT;
|
|
50
|
+
const playerValidationTimeoutMs = options.playerValidationTimeoutMs ?? PLAYER_VALIDATION_TIMEOUT_MS;
|
|
51
|
+
const fast = options.fast ?? 1;
|
|
52
|
+
const allowedPlayerProviders = parsePlayerProviderKeys(options.playerProviders ?? DEFAULT_PLAYER_PROVIDERS);
|
|
53
|
+
if (!Number.isInteger(searchLimit) || searchLimit <= 0) {
|
|
54
|
+
throw new TypeError("KinoBD streaming searchLimit must be a positive integer.");
|
|
55
|
+
}
|
|
56
|
+
if (!Number.isInteger(shikimoriLookupTimeoutMs) || shikimoriLookupTimeoutMs <= 0) {
|
|
57
|
+
throw new TypeError("KinoBD streaming shikimoriLookupTimeoutMs must be a positive integer.");
|
|
58
|
+
}
|
|
59
|
+
if (!Number.isInteger(playerValidationLimit) || playerValidationLimit < 0) {
|
|
60
|
+
throw new TypeError("KinoBD streaming playerValidationLimit must be a non-negative integer.");
|
|
61
|
+
}
|
|
62
|
+
if (!Number.isInteger(playerValidationTimeoutMs) || playerValidationTimeoutMs <= 0) {
|
|
63
|
+
throw new TypeError("KinoBD streaming playerValidationTimeoutMs must be a positive integer.");
|
|
64
|
+
}
|
|
65
|
+
if (!Number.isInteger(fast) || fast < 0) {
|
|
66
|
+
throw new TypeError("KinoBD streaming fast must be a non-negative integer.");
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
name: normalizeProviderName(options.name ?? PROVIDER_NAME),
|
|
70
|
+
baseUrl: trimTrailingSlash(options.baseUrl ?? DEFAULT_BASE_URL),
|
|
71
|
+
animeCacheBaseUrl: options.animeCacheBaseUrl === undefined
|
|
72
|
+
? undefined
|
|
73
|
+
: trimTrailingSlash(options.animeCacheBaseUrl),
|
|
74
|
+
shikimoriBaseUrl: trimTrailingSlash(options.shikimoriBaseUrl ?? DEFAULT_SHIKIMORI_BASE_URL),
|
|
75
|
+
fetch: options.fetch,
|
|
76
|
+
rateLimitGate: new ProviderRateLimitGate(),
|
|
77
|
+
searchLimit,
|
|
78
|
+
shikimoriLookupTimeoutMs,
|
|
79
|
+
playerValidationLimit,
|
|
80
|
+
playerValidationTimeoutMs,
|
|
81
|
+
playerProviders: [...allowedPlayerProviders].join(","),
|
|
82
|
+
allowedPlayerProviders,
|
|
83
|
+
fast,
|
|
84
|
+
userAgent: options.userAgent,
|
|
85
|
+
onPlayerAudit: options.onPlayerAudit,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Builds safe capabilities for the public engine/API.
|
|
89
|
+
// Собирает безопасные capabilities для публичного engine/API.
|
|
90
|
+
export function createCapabilities() {
|
|
91
|
+
return {
|
|
92
|
+
mediaTypes: ["movie", "series", "anime"],
|
|
93
|
+
lookup: {
|
|
94
|
+
byTitle: true,
|
|
95
|
+
byExternalIds: ["kinopoisk", "shikimori"],
|
|
96
|
+
byEpisode: true,
|
|
97
|
+
},
|
|
98
|
+
features: ["embed", "translations", "qualities", "episode_mapping"],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function parsePlayerProviderKeys(playerProviders) {
|
|
102
|
+
return new Set(playerProviders
|
|
103
|
+
.split(",")
|
|
104
|
+
.map((provider) => provider.trim().toLowerCase())
|
|
105
|
+
.filter((provider) => provider && !BLOCKED_PLAYER_PROVIDERS.has(provider)));
|
|
106
|
+
}
|
|
107
|
+
// Validates and normalizes provider name.
|
|
108
|
+
// Проверяет и нормализует имя provider.
|
|
109
|
+
function normalizeProviderName(name) {
|
|
110
|
+
const normalized = name.trim();
|
|
111
|
+
if (!normalized) {
|
|
112
|
+
throw new TypeError("KinoBD streaming provider name is required.");
|
|
113
|
+
}
|
|
114
|
+
return normalized;
|
|
115
|
+
}
|
|
116
|
+
// Removes trailing slashes from base URLs.
|
|
117
|
+
// Убирает trailing slashes из base URLs.
|
|
118
|
+
function trimTrailingSlash(value) {
|
|
119
|
+
const trimmed = value.trim();
|
|
120
|
+
if (!trimmed) {
|
|
121
|
+
throw new TypeError("KinoBD streaming baseUrl is required.");
|
|
122
|
+
}
|
|
123
|
+
return trimmed.replace(/\/+$/, "");
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/kinobd-streaming/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import { type
|
|
3
|
-
export
|
|
4
|
-
name?: string;
|
|
5
|
-
version?: string;
|
|
6
|
-
baseUrl?: string;
|
|
7
|
-
animeCacheBaseUrl?: string;
|
|
8
|
-
shikimoriBaseUrl?: string;
|
|
9
|
-
fetch?: ProviderFetch;
|
|
10
|
-
searchLimit?: number;
|
|
11
|
-
shikimoriLookupTimeoutMs?: number;
|
|
12
|
-
playerValidationLimit?: number;
|
|
13
|
-
playerValidationTimeoutMs?: number;
|
|
14
|
-
playerProviders?: string;
|
|
15
|
-
fast?: number;
|
|
16
|
-
userAgent?: string;
|
|
17
|
-
onPlayerAudit?: (audit: KinoBdPlayerAudit) => void;
|
|
18
|
-
}
|
|
19
|
-
export type KinoBdPlayerFilterReason = "provider_not_allowed" | "missing_iframe" | "known_broken_url" | "player_validation_failed";
|
|
20
|
-
export interface KinoBdFilteredPlayerAuditEntry {
|
|
21
|
-
player: string;
|
|
22
|
-
reason: KinoBdPlayerFilterReason;
|
|
23
|
-
url?: string;
|
|
24
|
-
}
|
|
25
|
-
export interface KinoBdPlayerAudit {
|
|
26
|
-
query: MediaAvailability["query"];
|
|
27
|
-
discovered: string[];
|
|
28
|
-
shown: string[];
|
|
29
|
-
filtered: KinoBdFilteredPlayerAuditEntry[];
|
|
30
|
-
}
|
|
1
|
+
import type { StreamingProvider } from "@media-engine/core";
|
|
2
|
+
import { type KinoBdStreamingProviderOptions } from "./config.js";
|
|
3
|
+
export type { KinoBdFilteredPlayerAuditEntry, KinoBdPlayerAudit, KinoBdPlayerFilterReason, KinoBdStreamingProviderOptions, } from "./config.js";
|
|
31
4
|
export declare function kinobdStreamingProvider(options?: KinoBdStreamingProviderOptions): StreamingProvider;
|