@media-engine/providers 0.1.0 → 1.0.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/README.md +149 -242
- package/README.ru.md +204 -0
- package/dist/aniliberty-streaming/client.d.ts +33 -0
- package/dist/aniliberty-streaming/client.js +188 -0
- package/dist/aniliberty-streaming/client.js.map +1 -0
- package/dist/aniliberty-streaming/config.d.ts +24 -0
- package/dist/aniliberty-streaming/config.js +61 -0
- package/dist/aniliberty-streaming/config.js.map +1 -0
- package/dist/aniliberty-streaming/index.d.ts +4 -0
- package/dist/aniliberty-streaming/index.js +45 -0
- package/dist/aniliberty-streaming/index.js.map +1 -0
- package/dist/aniliberty-streaming/mapping.d.ts +3 -0
- package/dist/aniliberty-streaming/mapping.js +87 -0
- package/dist/aniliberty-streaming/mapping.js.map +1 -0
- package/dist/aniliberty-streaming/matching.d.ts +4 -0
- package/dist/aniliberty-streaming/matching.js +44 -0
- package/dist/aniliberty-streaming/matching.js.map +1 -0
- package/dist/anilist/graphql.d.ts +2 -0
- package/dist/anilist/graphql.js +135 -0
- package/dist/anilist/graphql.js.map +1 -0
- package/dist/anilist/index.js +11 -6
- package/dist/anilist/index.js.map +1 -1
- package/dist/bitsearch-torrent/client.d.ts +19 -0
- package/dist/bitsearch-torrent/client.js +181 -0
- package/dist/bitsearch-torrent/client.js.map +1 -0
- package/dist/bitsearch-torrent/config.d.ts +26 -0
- package/dist/bitsearch-torrent/config.js +74 -0
- package/dist/bitsearch-torrent/config.js.map +1 -0
- package/dist/bitsearch-torrent/index.d.ts +4 -0
- package/dist/bitsearch-torrent/index.js +35 -0
- package/dist/bitsearch-torrent/index.js.map +1 -0
- package/dist/bitsearch-torrent/mapping.d.ts +3 -0
- package/dist/bitsearch-torrent/mapping.js +53 -0
- package/dist/bitsearch-torrent/mapping.js.map +1 -0
- package/dist/bitsearch-torrent/matching.d.ts +3 -0
- package/dist/bitsearch-torrent/matching.js +13 -0
- package/dist/bitsearch-torrent/matching.js.map +1 -0
- package/dist/bitsearch-torrent/quota.d.ts +9 -0
- package/dist/bitsearch-torrent/quota.js +53 -0
- package/dist/bitsearch-torrent/quota.js.map +1 -0
- package/dist/cinemeta/index.js +53 -35
- package/dist/cinemeta/index.js.map +1 -1
- package/dist/ddbb-streaming/client.d.ts +24 -0
- package/dist/ddbb-streaming/client.js +98 -0
- package/dist/ddbb-streaming/client.js.map +1 -0
- package/dist/ddbb-streaming/config.d.ts +31 -0
- package/dist/ddbb-streaming/config.js +67 -0
- package/dist/ddbb-streaming/config.js.map +1 -0
- package/dist/ddbb-streaming/index.d.ts +4 -0
- package/dist/ddbb-streaming/index.js +53 -0
- package/dist/ddbb-streaming/index.js.map +1 -0
- package/dist/ddbb-streaming/mapping.d.ts +8 -0
- package/dist/ddbb-streaming/mapping.js +164 -0
- package/dist/ddbb-streaming/mapping.js.map +1 -0
- package/dist/ddbb-streaming/validation.d.ts +3 -0
- package/dist/ddbb-streaming/validation.js +84 -0
- package/dist/ddbb-streaming/validation.js.map +1 -0
- package/dist/experimental-streaming/index.js +55 -0
- package/dist/experimental-streaming/index.js.map +1 -1
- package/dist/flixhq-streaming/client.d.ts +12 -0
- package/dist/flixhq-streaming/client.js +103 -0
- package/dist/flixhq-streaming/client.js.map +1 -0
- package/dist/flixhq-streaming/index.d.ts +2 -2
- package/dist/flixhq-streaming/index.js +67 -106
- package/dist/flixhq-streaming/index.js.map +1 -1
- package/dist/imdb-dataset/index.d.ts +20 -5
- package/dist/imdb-dataset/index.js +83 -197
- package/dist/imdb-dataset/index.js.map +1 -1
- package/dist/imdb-dataset/memory-storage.d.ts +7 -0
- package/dist/imdb-dataset/memory-storage.js +168 -0
- package/dist/imdb-dataset/memory-storage.js.map +1 -0
- package/dist/imdb-dataset/sqlite-import.d.ts +24 -0
- package/dist/imdb-dataset/sqlite-import.js +298 -0
- package/dist/imdb-dataset/sqlite-import.js.map +1 -0
- package/dist/imdb-dataset/sqlite-runtime.d.ts +3 -0
- package/dist/imdb-dataset/sqlite-runtime.js +11 -0
- package/dist/imdb-dataset/sqlite-runtime.js.map +1 -0
- package/dist/imdb-dataset/sqlite-schema.d.ts +6 -0
- package/dist/imdb-dataset/sqlite-schema.js +88 -0
- package/dist/imdb-dataset/sqlite-schema.js.map +1 -0
- package/dist/imdb-dataset/sqlite-storage.d.ts +12 -0
- package/dist/imdb-dataset/sqlite-storage.js +208 -0
- package/dist/imdb-dataset/sqlite-storage.js.map +1 -0
- package/dist/imdb-dataset/storage.d.ts +33 -0
- package/dist/imdb-dataset/storage.js +2 -0
- package/dist/imdb-dataset/storage.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/jacred-torrent/client.d.ts +24 -0
- package/dist/jacred-torrent/client.js +254 -0
- package/dist/jacred-torrent/client.js.map +1 -0
- package/dist/jacred-torrent/config.d.ts +24 -0
- package/dist/jacred-torrent/config.js +70 -0
- package/dist/jacred-torrent/config.js.map +1 -0
- package/dist/jacred-torrent/index.d.ts +4 -0
- package/dist/jacred-torrent/index.js +45 -0
- package/dist/jacred-torrent/index.js.map +1 -0
- package/dist/jacred-torrent/mapping.d.ts +3 -0
- package/dist/jacred-torrent/mapping.js +129 -0
- package/dist/jacred-torrent/mapping.js.map +1 -0
- package/dist/jacred-torrent/matching.d.ts +3 -0
- package/dist/jacred-torrent/matching.js +19 -0
- package/dist/jacred-torrent/matching.js.map +1 -0
- package/dist/kinobd/index.js +15 -33
- package/dist/kinobd/index.js.map +1 -1
- package/dist/kinobd-streaming/availability.d.ts +3 -0
- package/dist/kinobd-streaming/availability.js +179 -0
- package/dist/kinobd-streaming/availability.js.map +1 -0
- package/dist/kinobd-streaming/candidates.d.ts +32 -0
- package/dist/kinobd-streaming/candidates.js +282 -0
- package/dist/kinobd-streaming/candidates.js.map +1 -0
- package/dist/kinobd-streaming/config.d.ts +64 -0
- package/dist/kinobd-streaming/config.js +129 -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 +24 -0
- package/dist/kinobd-streaming/players.js +270 -0
- package/dist/kinobd-streaming/players.js.map +1 -0
- package/dist/kinobd-streaming/request-budget.d.ts +15 -0
- package/dist/kinobd-streaming/request-budget.js +61 -0
- package/dist/kinobd-streaming/request-budget.js.map +1 -0
- package/dist/kinobd-streaming/validation.d.ts +11 -0
- package/dist/kinobd-streaming/validation.js +170 -0
- package/dist/kinobd-streaming/validation.js.map +1 -0
- package/dist/magnetz-torrent/client.d.ts +16 -0
- package/dist/magnetz-torrent/client.js +235 -0
- package/dist/magnetz-torrent/client.js.map +1 -0
- package/dist/magnetz-torrent/config.d.ts +27 -0
- package/dist/magnetz-torrent/config.js +73 -0
- package/dist/magnetz-torrent/config.js.map +1 -0
- package/dist/magnetz-torrent/index.d.ts +4 -0
- package/dist/magnetz-torrent/index.js +35 -0
- package/dist/magnetz-torrent/index.js.map +1 -0
- package/dist/magnetz-torrent/mapping.d.ts +3 -0
- package/dist/magnetz-torrent/mapping.js +52 -0
- package/dist/magnetz-torrent/mapping.js.map +1 -0
- package/dist/magnetz-torrent/matching.d.ts +3 -0
- package/dist/magnetz-torrent/matching.js +5 -0
- package/dist/magnetz-torrent/matching.js.map +1 -0
- package/dist/magnetz-torrent/request-gate.d.ts +9 -0
- package/dist/magnetz-torrent/request-gate.js +48 -0
- package/dist/magnetz-torrent/request-gate.js.map +1 -0
- package/dist/package-version.d.ts +2 -0
- package/dist/package-version.js +5 -0
- package/dist/package-version.js.map +1 -0
- package/dist/shared/abort.d.ts +3 -0
- package/dist/shared/abort.js +30 -0
- package/dist/shared/abort.js.map +1 -0
- package/dist/shared/http.d.ts +13 -2
- package/dist/shared/http.js +77 -75
- package/dist/shared/http.js.map +1 -1
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/mapping.d.ts +5 -0
- package/dist/shared/mapping.js +32 -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/output-url.d.ts +2 -0
- package/dist/shared/output-url.js +50 -0
- package/dist/shared/output-url.js.map +1 -0
- package/dist/shared/rate-limit.d.ts +11 -0
- package/dist/shared/rate-limit.js +52 -0
- package/dist/shared/rate-limit.js.map +1 -0
- package/dist/shared/response-body.d.ts +6 -0
- package/dist/shared/response-body.js +109 -0
- package/dist/shared/response-body.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/shared/safe-fetch.d.ts +14 -0
- package/dist/shared/safe-fetch.js +274 -0
- package/dist/shared/safe-fetch.js.map +1 -0
- package/dist/shared/torrent-release-matching.d.ts +7 -0
- package/dist/shared/torrent-release-matching.js +143 -0
- package/dist/shared/torrent-release-matching.js.map +1 -0
- package/dist/shared/torrent-release-metadata.d.ts +4 -0
- package/dist/shared/torrent-release-metadata.js +95 -0
- package/dist/shared/torrent-release-metadata.js.map +1 -0
- package/dist/shikimori/index.js +19 -11
- package/dist/shikimori/index.js.map +1 -1
- package/dist/tvmaze/index.d.ts +11 -0
- package/dist/tvmaze/index.js +274 -0
- package/dist/tvmaze/index.js.map +1 -0
- package/dist/wikidata/cache.d.ts +11 -0
- package/dist/wikidata/cache.js +30 -0
- package/dist/wikidata/cache.js.map +1 -0
- package/dist/wikidata/candidates.d.ts +12 -0
- package/dist/wikidata/candidates.js +67 -0
- package/dist/wikidata/candidates.js.map +1 -0
- package/dist/wikidata/client.d.ts +40 -0
- package/dist/wikidata/client.js +224 -0
- package/dist/wikidata/client.js.map +1 -0
- package/dist/wikidata/index.d.ts +3 -0
- package/dist/wikidata/index.js +34 -111
- package/dist/wikidata/index.js.map +1 -1
- package/dist/yts-torrent/client.d.ts +25 -0
- package/dist/yts-torrent/client.js +163 -0
- package/dist/yts-torrent/client.js.map +1 -0
- package/dist/yts-torrent/config.d.ts +22 -0
- package/dist/yts-torrent/config.js +57 -0
- package/dist/yts-torrent/config.js.map +1 -0
- package/dist/yts-torrent/index.d.ts +4 -0
- package/dist/yts-torrent/index.js +42 -0
- package/dist/yts-torrent/index.js.map +1 -0
- package/dist/yts-torrent/mapping.d.ts +4 -0
- package/dist/yts-torrent/mapping.js +107 -0
- package/dist/yts-torrent/mapping.js.map +1 -0
- package/package.json +23 -6
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { rethrowIfProviderAborted } from "../shared/abort.js";
|
|
2
|
+
import { fetchJson } from "../shared/index.js";
|
|
3
|
+
import { mapKinoBdMediaType as mapCandidateMediaType } from "../shared/mapping.js";
|
|
4
|
+
const MAX_ANIME_TITLE_FALLBACKS = 3;
|
|
5
|
+
// Builds bounded anime title fallbacks that KinoBD player search can understand.
|
|
6
|
+
// Собирает ограниченные anime title fallbacks, которые понимает KinoBD player search.
|
|
7
|
+
export async function createAnimeTitleFallbackQueries(config, query, context, budget) {
|
|
8
|
+
const lookup = query.ids?.shikimori
|
|
9
|
+
? await tryLookupShikimoriAnime(config, query.ids.shikimori, context, budget)
|
|
10
|
+
: undefined;
|
|
11
|
+
const lookupTitles = [lookup?.russian, lookup?.name, ...(lookup?.english ?? [])];
|
|
12
|
+
const candidates = query.title
|
|
13
|
+
? [
|
|
14
|
+
...createBroaderAnimeTitles(query.title),
|
|
15
|
+
...lookupTitles.flatMap((title) => createBroaderAnimeTitles(title)),
|
|
16
|
+
...lookupTitles,
|
|
17
|
+
]
|
|
18
|
+
: lookupTitles.flatMap((title) => [title, ...createBroaderAnimeTitles(title)]);
|
|
19
|
+
const seen = new Set(query.title ? [normalizeSearchText(query.title)] : []);
|
|
20
|
+
const fallbacks = [];
|
|
21
|
+
for (const candidate of candidates) {
|
|
22
|
+
const title = candidate?.trim();
|
|
23
|
+
const normalized = normalizeSearchText(title ?? "");
|
|
24
|
+
if (!title || !normalized || seen.has(normalized)) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
seen.add(normalized);
|
|
28
|
+
fallbacks.push({
|
|
29
|
+
...query,
|
|
30
|
+
title,
|
|
31
|
+
year: query.year ?? parseYear(lookup?.aired_on),
|
|
32
|
+
});
|
|
33
|
+
if (fallbacks.length === MAX_ANIME_TITLE_FALLBACKS) {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return fallbacks;
|
|
38
|
+
}
|
|
39
|
+
// Searches KinoBD player candidates by Kinopoisk ID or title.
|
|
40
|
+
// Ищет KinoBD player candidates по Kinopoisk ID или title.
|
|
41
|
+
export async function searchPlayerCandidates(config, query, context, budget) {
|
|
42
|
+
const search = createCandidateSearch(query);
|
|
43
|
+
if (!search) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
const url = new URL("/api/player/search", `${config.baseUrl}/`);
|
|
47
|
+
url.searchParams.set("q", search.value);
|
|
48
|
+
url.searchParams.set("type", search.type);
|
|
49
|
+
url.searchParams.set("page", "1");
|
|
50
|
+
const response = await fetchJson({
|
|
51
|
+
provider: config.name,
|
|
52
|
+
url,
|
|
53
|
+
context: budget.createContext(context),
|
|
54
|
+
fetch: budget.createFetch(config.name, config.fetch),
|
|
55
|
+
rateLimitGate: config.rateLimitGate,
|
|
56
|
+
init: {
|
|
57
|
+
headers: {
|
|
58
|
+
accept: "application/json",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
return (response.data ?? []).slice(0, config.searchLimit);
|
|
63
|
+
}
|
|
64
|
+
// Chooses the most likely KinoBD record instead of trusting upstream result order.
|
|
65
|
+
// Выбирает наиболее вероятную KinoBD-запись вместо доверия порядку upstream results.
|
|
66
|
+
export function selectBestPlayerCandidate(candidates, query) {
|
|
67
|
+
if (candidates.length === 0) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
if (query.ids?.kinopoisk || query.ids?.imdb) {
|
|
71
|
+
const exact = candidates.find((candidate) => hasExactCandidateId(candidate, query.ids));
|
|
72
|
+
if (exact) {
|
|
73
|
+
return exact;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const normalizedTitle = normalizeSearchText(query.title ?? "");
|
|
77
|
+
return candidates
|
|
78
|
+
.map((candidate, index) => ({
|
|
79
|
+
candidate,
|
|
80
|
+
index,
|
|
81
|
+
score: scorePlayerCandidate(candidate, query, normalizedTitle),
|
|
82
|
+
}))
|
|
83
|
+
.filter((entry) => entry.score > Number.NEGATIVE_INFINITY)
|
|
84
|
+
.sort((left, right) => right.score - left.score || left.index - right.index)[0]?.candidate;
|
|
85
|
+
}
|
|
86
|
+
// Collects known external IDs from a player candidate.
|
|
87
|
+
// Собирает известные external IDs из player candidate.
|
|
88
|
+
export function collectCandidateIds(candidate) {
|
|
89
|
+
if (!candidate) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
const ids = {};
|
|
93
|
+
const kinopoiskId = candidate.kinopoisk_id ?? candidate.kp_id;
|
|
94
|
+
if (kinopoiskId !== undefined && kinopoiskId !== null) {
|
|
95
|
+
ids.kinopoisk = String(kinopoiskId);
|
|
96
|
+
}
|
|
97
|
+
if (candidate.imdb_id) {
|
|
98
|
+
ids.imdb = candidate.imdb_id;
|
|
99
|
+
}
|
|
100
|
+
return Object.keys(ids).length > 0 ? ids : undefined;
|
|
101
|
+
}
|
|
102
|
+
export function getCandidateStartYear(candidate) {
|
|
103
|
+
return parseOptionalInteger(candidate.year ?? candidate.year_start);
|
|
104
|
+
}
|
|
105
|
+
function scorePlayerCandidate(candidate, query, normalizedTitle) {
|
|
106
|
+
const candidateType = mapCandidateMediaType(candidate.type);
|
|
107
|
+
const queryType = query.type === "anime"
|
|
108
|
+
? "series"
|
|
109
|
+
: query.type === "movie" || query.type === "series"
|
|
110
|
+
? query.type
|
|
111
|
+
: undefined;
|
|
112
|
+
if (queryType && candidateType && candidateType !== queryType) {
|
|
113
|
+
return Number.NEGATIVE_INFINITY;
|
|
114
|
+
}
|
|
115
|
+
const startYear = getCandidateStartYear(candidate);
|
|
116
|
+
const endYear = parseOptionalInteger(candidate.year_end);
|
|
117
|
+
if (query.year !== undefined) {
|
|
118
|
+
if (startYear === undefined) {
|
|
119
|
+
return Number.NEGATIVE_INFINITY;
|
|
120
|
+
}
|
|
121
|
+
if (queryType === "series") {
|
|
122
|
+
const outsideKnownRange = endYear !== undefined
|
|
123
|
+
? query.year < startYear || query.year > endYear
|
|
124
|
+
: isOpenEndedYear(candidate.year_end)
|
|
125
|
+
? query.year < startYear
|
|
126
|
+
: query.year !== startYear;
|
|
127
|
+
if (outsideKnownRange) {
|
|
128
|
+
return Number.NEGATIVE_INFINITY;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else if (startYear !== query.year) {
|
|
132
|
+
return Number.NEGATIVE_INFINITY;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const original = normalizeSearchText(candidate.name_original ?? "");
|
|
136
|
+
const russian = normalizeSearchText(candidate.name_russian ?? candidate.title ?? "");
|
|
137
|
+
const popularity = parseOptionalInteger(candidate.popular_rate ?? candidate.popularity?.popular_rate) ?? 0;
|
|
138
|
+
const votes = parseOptionalInteger(candidate.rating_kp_count) ??
|
|
139
|
+
parseOptionalInteger(candidate.rating_imdb_count) ??
|
|
140
|
+
0;
|
|
141
|
+
const rating = parseOptionalInteger(candidate.rating_kp) ?? parseOptionalInteger(candidate.rating_imdb) ?? 0;
|
|
142
|
+
let score = 10;
|
|
143
|
+
if (queryType && candidateType === queryType) {
|
|
144
|
+
score += 40;
|
|
145
|
+
}
|
|
146
|
+
if (normalizedTitle && (original === normalizedTitle || russian === normalizedTitle)) {
|
|
147
|
+
score += 80;
|
|
148
|
+
}
|
|
149
|
+
else if (normalizedTitle &&
|
|
150
|
+
(original.includes(normalizedTitle) || russian.includes(normalizedTitle))) {
|
|
151
|
+
score += 25;
|
|
152
|
+
}
|
|
153
|
+
if (query.year !== undefined && startYear !== undefined) {
|
|
154
|
+
score += startYear === query.year ? 35 : 15;
|
|
155
|
+
}
|
|
156
|
+
if (candidate.imdb_id) {
|
|
157
|
+
score += 5;
|
|
158
|
+
}
|
|
159
|
+
if (candidate.kinopoisk_id ?? candidate.kp_id) {
|
|
160
|
+
score += 5;
|
|
161
|
+
}
|
|
162
|
+
score += Math.min(8, rating);
|
|
163
|
+
score += Math.min(10, Math.log10(votes + 1) * 2);
|
|
164
|
+
score += Math.min(12, Math.log10(popularity + 1) * 2);
|
|
165
|
+
return score;
|
|
166
|
+
}
|
|
167
|
+
function hasExactCandidateId(candidate, ids) {
|
|
168
|
+
const candidateIds = collectCandidateIds(candidate);
|
|
169
|
+
return Boolean((ids?.kinopoisk && candidateIds?.kinopoisk === ids.kinopoisk) ||
|
|
170
|
+
(ids?.imdb && candidateIds?.imdb === ids.imdb));
|
|
171
|
+
}
|
|
172
|
+
// Creates the best supported player search input from a stream query.
|
|
173
|
+
// Создает лучший поддерживаемый input поиска player из stream query.
|
|
174
|
+
function createCandidateSearch(query) {
|
|
175
|
+
if (query.ids?.kinopoisk) {
|
|
176
|
+
return {
|
|
177
|
+
type: "kp_id",
|
|
178
|
+
value: query.ids.kinopoisk,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (query.title) {
|
|
182
|
+
return {
|
|
183
|
+
type: "title",
|
|
184
|
+
value: query.title,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
// Resolves Shikimori ID into title metadata without requiring user secrets.
|
|
190
|
+
// Резолвит Shikimori ID в title metadata без пользовательских секретов.
|
|
191
|
+
async function tryLookupShikimoriAnime(config, shikimoriId, context, budget) {
|
|
192
|
+
const url = new URL(`/api/animes/${encodeURIComponent(shikimoriId)}`, `${config.shikimoriBaseUrl}/`);
|
|
193
|
+
const headers = {
|
|
194
|
+
accept: "application/json",
|
|
195
|
+
};
|
|
196
|
+
if (config.userAgent) {
|
|
197
|
+
headers["user-agent"] = config.userAgent;
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
return await fetchJson({
|
|
201
|
+
provider: config.name,
|
|
202
|
+
url,
|
|
203
|
+
context: budget.createContext(context, config.shikimoriLookupTimeoutMs),
|
|
204
|
+
fetch: budget.createFetch(config.name, config.fetch),
|
|
205
|
+
rateLimitGate: config.rateLimitGate,
|
|
206
|
+
maxRetries: 0,
|
|
207
|
+
init: {
|
|
208
|
+
headers,
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
rethrowIfProviderAborted(context, error);
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Parses optional integer-like values.
|
|
218
|
+
// Парсит опциональные integer-like значения.
|
|
219
|
+
function parseOptionalInteger(value) {
|
|
220
|
+
if (value === undefined || value === null) {
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
const parsed = typeof value === "number" ? value : Number.parseInt(value, 10);
|
|
224
|
+
return Number.isInteger(parsed) ? parsed : undefined;
|
|
225
|
+
}
|
|
226
|
+
// Parses a year from date-like values such as 2002-10-03.
|
|
227
|
+
// Парсит год из date-like значений вроде 2002-10-03.
|
|
228
|
+
function parseYear(value) {
|
|
229
|
+
if (!value) {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
const year = Number.parseInt(value.slice(0, 4), 10);
|
|
233
|
+
return Number.isInteger(year) ? year : undefined;
|
|
234
|
+
}
|
|
235
|
+
// Produces conservative franchise/base-title variants for separately catalogued anime seasons.
|
|
236
|
+
// Создает консервативные варианты франшизы/base title для отдельно каталогизированных сезонов anime.
|
|
237
|
+
function createBroaderAnimeTitles(value) {
|
|
238
|
+
const title = value?.trim();
|
|
239
|
+
if (!title) {
|
|
240
|
+
return [];
|
|
241
|
+
}
|
|
242
|
+
const variants = [];
|
|
243
|
+
const franchisePrefix = title.split(/\.\s+|\s+[-–—]\s*/u, 1)[0]?.trim();
|
|
244
|
+
if (franchisePrefix &&
|
|
245
|
+
franchisePrefix.length >= 5 &&
|
|
246
|
+
franchisePrefix.length <= 48 &&
|
|
247
|
+
/[:!?]/u.test(franchisePrefix) &&
|
|
248
|
+
normalizeSearchText(franchisePrefix) !== normalizeSearchText(title)) {
|
|
249
|
+
variants.push(franchisePrefix);
|
|
250
|
+
}
|
|
251
|
+
const withoutEnglishSeason = title
|
|
252
|
+
.replace(/\s+(?:(?:\d+(?:st|nd|rd|th)\s+season)|(?:season\s+\d+))(?:\s+(?:part|cour)\s+\d+)?\s*$/iu, "")
|
|
253
|
+
.trim();
|
|
254
|
+
const withoutRussianSeason = withoutEnglishSeason
|
|
255
|
+
.replace(/\s+\d+(?:-?[а-я]+)?\s+сезон\s*$/iu, "")
|
|
256
|
+
.trim();
|
|
257
|
+
const withoutTrailingSeasonNumber = withoutRussianSeason.split(/\s+/u).length >= 5
|
|
258
|
+
? withoutRussianSeason.replace(/\s+\d+\s*$/u, "").trim()
|
|
259
|
+
: withoutRussianSeason;
|
|
260
|
+
if (normalizeSearchText(withoutTrailingSeasonNumber) !== normalizeSearchText(title)) {
|
|
261
|
+
variants.push(withoutTrailingSeasonNumber);
|
|
262
|
+
}
|
|
263
|
+
return variants;
|
|
264
|
+
}
|
|
265
|
+
// Distinguishes an explicitly ongoing range from a record that only has one known year.
|
|
266
|
+
// Отличает явно продолжающийся диапазон от записи, у которой известен только один год.
|
|
267
|
+
function isOpenEndedYear(value) {
|
|
268
|
+
if (typeof value !== "string") {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
return /^(?:\.{3}|…|present|ongoing|now|н\.?\s*в\.?)$/iu.test(value.trim());
|
|
272
|
+
}
|
|
273
|
+
export function normalizeSearchText(value) {
|
|
274
|
+
return value
|
|
275
|
+
.trim()
|
|
276
|
+
.toLowerCase()
|
|
277
|
+
.replace(/ё/g, "е")
|
|
278
|
+
.replace(/[^\p{L}\p{N}]+/gu, " ")
|
|
279
|
+
.replace(/\s+/g, " ")
|
|
280
|
+
.trim();
|
|
281
|
+
}
|
|
282
|
+
//# 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,64 @@
|
|
|
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
|
+
playerValidationConcurrency?: number;
|
|
14
|
+
playerValidationTimeoutMs?: number;
|
|
15
|
+
childRequestLimit?: number;
|
|
16
|
+
playerProviders?: string;
|
|
17
|
+
fast?: number;
|
|
18
|
+
userAgent?: string;
|
|
19
|
+
onPlayerAudit?: (audit: KinoBdPlayerAudit) => void;
|
|
20
|
+
}
|
|
21
|
+
export type KinoBdPlayerFilterReason = "provider_not_allowed" | "missing_iframe" | "known_broken_url" | "player_validation_failed";
|
|
22
|
+
export interface KinoBdFilteredPlayerAuditEntry {
|
|
23
|
+
player: string;
|
|
24
|
+
reason: KinoBdPlayerFilterReason;
|
|
25
|
+
url?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface KinoBdPlayerAudit {
|
|
28
|
+
query: MediaAvailability["query"];
|
|
29
|
+
discovered: string[];
|
|
30
|
+
shown: string[];
|
|
31
|
+
filtered: KinoBdFilteredPlayerAuditEntry[];
|
|
32
|
+
metrics?: KinoBdPlayerAuditMetrics;
|
|
33
|
+
}
|
|
34
|
+
export interface KinoBdPlayerAuditMetrics {
|
|
35
|
+
discovered: number;
|
|
36
|
+
validated: number;
|
|
37
|
+
skippedByLimit: number;
|
|
38
|
+
skippedByBudget: number;
|
|
39
|
+
transientUnknown: number;
|
|
40
|
+
removedConfirmed: number;
|
|
41
|
+
childRequests: number;
|
|
42
|
+
}
|
|
43
|
+
export interface KinoBdStreamingConfig {
|
|
44
|
+
name: string;
|
|
45
|
+
baseUrl: string;
|
|
46
|
+
animeCacheBaseUrl?: string;
|
|
47
|
+
shikimoriBaseUrl: string;
|
|
48
|
+
fetch?: ProviderFetch;
|
|
49
|
+
externalFetch: ProviderFetch;
|
|
50
|
+
rateLimitGate: ProviderRateLimitGate;
|
|
51
|
+
searchLimit: number;
|
|
52
|
+
shikimoriLookupTimeoutMs: number;
|
|
53
|
+
playerValidationLimit: number;
|
|
54
|
+
playerValidationConcurrency: number;
|
|
55
|
+
playerValidationTimeoutMs: number;
|
|
56
|
+
childRequestLimit: number;
|
|
57
|
+
playerProviders: string;
|
|
58
|
+
allowedPlayerProviders: ReadonlySet<string>;
|
|
59
|
+
fast: number;
|
|
60
|
+
userAgent?: string;
|
|
61
|
+
onPlayerAudit?: (audit: KinoBdPlayerAudit) => void;
|
|
62
|
+
}
|
|
63
|
+
export declare function createConfig(options: KinoBdStreamingProviderOptions): KinoBdStreamingConfig;
|
|
64
|
+
export declare function createCapabilities(): StreamingProviderCapabilities;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { ProviderRateLimitGate } from "../shared/index.js";
|
|
2
|
+
import { resolveBoundedIntegerOption } from "../shared/options.js";
|
|
3
|
+
import { createHardenedProviderFetch } from "../shared/safe-fetch.js";
|
|
4
|
+
const PROVIDER_NAME = "kinobd-streaming";
|
|
5
|
+
const DEFAULT_BASE_URL = "https://kinobd.net";
|
|
6
|
+
const DEFAULT_SHIKIMORI_BASE_URL = "https://shikimori.io";
|
|
7
|
+
const DEFAULT_SEARCH_LIMIT = 10;
|
|
8
|
+
const DEFAULT_PLAYER_VALIDATION_LIMIT = 8;
|
|
9
|
+
const DEFAULT_PLAYER_VALIDATION_CONCURRENCY = 3;
|
|
10
|
+
const DEFAULT_CHILD_REQUEST_LIMIT = 24;
|
|
11
|
+
const DEFAULT_SHIKIMORI_LOOKUP_TIMEOUT_MS = 2_500;
|
|
12
|
+
const PLAYER_VALIDATION_TIMEOUT_MS = 2_500;
|
|
13
|
+
const MAX_SEARCH_LIMIT = 50;
|
|
14
|
+
const MAX_PLAYER_VALIDATION_LIMIT = 16;
|
|
15
|
+
const MAX_PLAYER_VALIDATION_CONCURRENCY = 4;
|
|
16
|
+
const MAX_CHILD_REQUEST_LIMIT = 64;
|
|
17
|
+
const MAX_SHIKIMORI_LOOKUP_TIMEOUT_MS = 10_000;
|
|
18
|
+
const MAX_PLAYER_VALIDATION_TIMEOUT_MS = 10_000;
|
|
19
|
+
const DEFAULT_PLAYER_PROVIDERS = [
|
|
20
|
+
"collaps",
|
|
21
|
+
"vibix",
|
|
22
|
+
"alloha",
|
|
23
|
+
"kodik",
|
|
24
|
+
"kinotochka",
|
|
25
|
+
"flixcdn",
|
|
26
|
+
"ashdi",
|
|
27
|
+
"turbo",
|
|
28
|
+
"videocdn",
|
|
29
|
+
"bazon",
|
|
30
|
+
"ustore",
|
|
31
|
+
"pleer",
|
|
32
|
+
"videospider",
|
|
33
|
+
"iframe",
|
|
34
|
+
"moonwalk",
|
|
35
|
+
"hdvb",
|
|
36
|
+
"cdnmovies",
|
|
37
|
+
"lookbase",
|
|
38
|
+
"kholobok",
|
|
39
|
+
"videoapi",
|
|
40
|
+
"voidboost",
|
|
41
|
+
"videoseed",
|
|
42
|
+
"vk",
|
|
43
|
+
].join(",");
|
|
44
|
+
const BLOCKED_PLAYER_PROVIDERS = new Set([
|
|
45
|
+
"ext",
|
|
46
|
+
"ia",
|
|
47
|
+
"netflix",
|
|
48
|
+
"nf",
|
|
49
|
+
"torrent",
|
|
50
|
+
"trailer",
|
|
51
|
+
"trailer_local",
|
|
52
|
+
"youtube",
|
|
53
|
+
]);
|
|
54
|
+
// Builds provider config with ReYohoho-compatible defaults.
|
|
55
|
+
// Собирает provider config с ReYohoho-compatible defaults.
|
|
56
|
+
export function createConfig(options) {
|
|
57
|
+
const name = normalizeProviderName(options.name ?? PROVIDER_NAME);
|
|
58
|
+
const searchLimit = resolveBoundedIntegerOption(options.searchLimit, DEFAULT_SEARCH_LIMIT, "KinoBD streaming searchLimit", 1, MAX_SEARCH_LIMIT);
|
|
59
|
+
const shikimoriLookupTimeoutMs = resolveBoundedIntegerOption(options.shikimoriLookupTimeoutMs, DEFAULT_SHIKIMORI_LOOKUP_TIMEOUT_MS, "KinoBD streaming shikimoriLookupTimeoutMs", 1, MAX_SHIKIMORI_LOOKUP_TIMEOUT_MS);
|
|
60
|
+
const playerValidationLimit = resolveBoundedIntegerOption(options.playerValidationLimit, DEFAULT_PLAYER_VALIDATION_LIMIT, "KinoBD streaming playerValidationLimit", 0, MAX_PLAYER_VALIDATION_LIMIT);
|
|
61
|
+
const playerValidationConcurrency = resolveBoundedIntegerOption(options.playerValidationConcurrency, DEFAULT_PLAYER_VALIDATION_CONCURRENCY, "KinoBD streaming playerValidationConcurrency", 1, MAX_PLAYER_VALIDATION_CONCURRENCY);
|
|
62
|
+
const playerValidationTimeoutMs = resolveBoundedIntegerOption(options.playerValidationTimeoutMs, PLAYER_VALIDATION_TIMEOUT_MS, "KinoBD streaming playerValidationTimeoutMs", 1, MAX_PLAYER_VALIDATION_TIMEOUT_MS);
|
|
63
|
+
const childRequestLimit = resolveBoundedIntegerOption(options.childRequestLimit, DEFAULT_CHILD_REQUEST_LIMIT, "KinoBD streaming childRequestLimit", 1, MAX_CHILD_REQUEST_LIMIT);
|
|
64
|
+
const fast = options.fast ?? 1;
|
|
65
|
+
const allowedPlayerProviders = parsePlayerProviderKeys(options.playerProviders ?? DEFAULT_PLAYER_PROVIDERS);
|
|
66
|
+
if (!Number.isInteger(fast) || fast < 0) {
|
|
67
|
+
throw new TypeError("KinoBD streaming fast must be a non-negative integer.");
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
name,
|
|
71
|
+
baseUrl: trimTrailingSlash(options.baseUrl ?? DEFAULT_BASE_URL),
|
|
72
|
+
animeCacheBaseUrl: options.animeCacheBaseUrl === undefined
|
|
73
|
+
? undefined
|
|
74
|
+
: trimTrailingSlash(options.animeCacheBaseUrl),
|
|
75
|
+
shikimoriBaseUrl: trimTrailingSlash(options.shikimoriBaseUrl ?? DEFAULT_SHIKIMORI_BASE_URL),
|
|
76
|
+
fetch: options.fetch,
|
|
77
|
+
externalFetch: options.fetch ?? createHardenedProviderFetch({ provider: name }),
|
|
78
|
+
rateLimitGate: new ProviderRateLimitGate(),
|
|
79
|
+
searchLimit,
|
|
80
|
+
shikimoriLookupTimeoutMs,
|
|
81
|
+
playerValidationLimit,
|
|
82
|
+
playerValidationConcurrency,
|
|
83
|
+
playerValidationTimeoutMs,
|
|
84
|
+
childRequestLimit,
|
|
85
|
+
playerProviders: [...allowedPlayerProviders].join(","),
|
|
86
|
+
allowedPlayerProviders,
|
|
87
|
+
fast,
|
|
88
|
+
userAgent: options.userAgent,
|
|
89
|
+
onPlayerAudit: options.onPlayerAudit,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Builds safe capabilities for the public engine/API.
|
|
93
|
+
// Собирает безопасные capabilities для публичного engine/API.
|
|
94
|
+
export function createCapabilities() {
|
|
95
|
+
return {
|
|
96
|
+
mediaTypes: ["movie", "series", "anime"],
|
|
97
|
+
lookup: {
|
|
98
|
+
byTitle: true,
|
|
99
|
+
byExternalIds: ["kinopoisk", "shikimori"],
|
|
100
|
+
byEpisode: true,
|
|
101
|
+
},
|
|
102
|
+
features: ["embed", "translations", "qualities", "episode_mapping"],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function parsePlayerProviderKeys(playerProviders) {
|
|
106
|
+
return new Set(playerProviders
|
|
107
|
+
.split(",")
|
|
108
|
+
.map((provider) => provider.trim().toLowerCase())
|
|
109
|
+
.filter((provider) => provider && !BLOCKED_PLAYER_PROVIDERS.has(provider)));
|
|
110
|
+
}
|
|
111
|
+
// Validates and normalizes provider name.
|
|
112
|
+
// Проверяет и нормализует имя provider.
|
|
113
|
+
function normalizeProviderName(name) {
|
|
114
|
+
const normalized = name.trim();
|
|
115
|
+
if (!normalized) {
|
|
116
|
+
throw new TypeError("KinoBD streaming provider name is required.");
|
|
117
|
+
}
|
|
118
|
+
return normalized;
|
|
119
|
+
}
|
|
120
|
+
// Removes trailing slashes from base URLs.
|
|
121
|
+
// Убирает trailing slashes из base URLs.
|
|
122
|
+
function trimTrailingSlash(value) {
|
|
123
|
+
const trimmed = value.trim();
|
|
124
|
+
if (!trimmed) {
|
|
125
|
+
throw new TypeError("KinoBD streaming baseUrl is required.");
|
|
126
|
+
}
|
|
127
|
+
return trimmed.replace(/\/+$/, "");
|
|
128
|
+
}
|
|
129
|
+
//# 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, KinoBdPlayerAuditMetrics, KinoBdPlayerFilterReason, KinoBdStreamingProviderOptions, } from "./config.js";
|
|
31
4
|
export declare function kinobdStreamingProvider(options?: KinoBdStreamingProviderOptions): StreamingProvider;
|