@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.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +295 -0
  3. package/dist/anilist/index.d.ts +9 -0
  4. package/dist/anilist/index.js +279 -0
  5. package/dist/anilist/index.js.map +1 -0
  6. package/dist/cinemeta/index.d.ts +12 -0
  7. package/dist/cinemeta/index.js +379 -0
  8. package/dist/cinemeta/index.js.map +1 -0
  9. package/dist/experimental-streaming/index.d.ts +24 -0
  10. package/dist/experimental-streaming/index.js +199 -0
  11. package/dist/experimental-streaming/index.js.map +1 -0
  12. package/dist/flixhq-streaming/index.d.ts +30 -0
  13. package/dist/flixhq-streaming/index.js +625 -0
  14. package/dist/flixhq-streaming/index.js.map +1 -0
  15. package/dist/imdb-dataset/index.d.ts +9 -0
  16. package/dist/imdb-dataset/index.js +307 -0
  17. package/dist/imdb-dataset/index.js.map +1 -0
  18. package/dist/index.d.ts +10 -0
  19. package/dist/index.js +11 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/kinobd/index.d.ts +11 -0
  22. package/dist/kinobd/index.js +405 -0
  23. package/dist/kinobd/index.js.map +1 -0
  24. package/dist/kinobd-streaming/index.d.ts +31 -0
  25. package/dist/kinobd-streaming/index.js +919 -0
  26. package/dist/kinobd-streaming/index.js.map +1 -0
  27. package/dist/shared/http.d.ts +17 -0
  28. package/dist/shared/http.js +264 -0
  29. package/dist/shared/http.js.map +1 -0
  30. package/dist/shared/index.d.ts +1 -0
  31. package/dist/shared/index.js +2 -0
  32. package/dist/shared/index.js.map +1 -0
  33. package/dist/shikimori/index.d.ts +12 -0
  34. package/dist/shikimori/index.js +457 -0
  35. package/dist/shikimori/index.js.map +1 -0
  36. package/dist/wikidata/index.d.ts +12 -0
  37. package/dist/wikidata/index.js +356 -0
  38. package/dist/wikidata/index.js.map +1 -0
  39. package/package.json +62 -0
@@ -0,0 +1,405 @@
1
+ import { fetchJson } from "../shared/index.js";
2
+ const PROVIDER_NAME = "kinobd";
3
+ const DEFAULT_BASE_URL = "https://kinobd.net";
4
+ const DEFAULT_SEARCH_LIMIT = 10;
5
+ const DEFAULT_IMAGE_LIMIT = 20;
6
+ const DEFAULT_PERSON_LIMIT = 30;
7
+ // Creates a movie and series provider backed by the public KinoBD API used by ReYohoho.
8
+ // Создает provider фильмов и сериалов на публичном KinoBD API, который использует ReYohoho.
9
+ export function kinobdProvider(options = {}) {
10
+ const config = createKinoBdConfig(options);
11
+ return {
12
+ name: PROVIDER_NAME,
13
+ version: options.version,
14
+ kind: "metadata",
15
+ capabilities: {
16
+ mediaTypes: ["movie", "series"],
17
+ search: {
18
+ byTitle: true,
19
+ byExternalIds: ["imdb", "kinopoisk"],
20
+ },
21
+ details: {
22
+ byExternalIds: ["imdb", "kinopoisk"],
23
+ },
24
+ features: ["posters", "ratings", "genres", "persons"],
25
+ },
26
+ async search(query, context) {
27
+ return searchKinoBd(config, query, context);
28
+ },
29
+ async getDetails(query, context) {
30
+ return getKinoBdDetails(config, query, context);
31
+ },
32
+ };
33
+ }
34
+ // Builds provider config with conservative defaults for the public KinoBD API.
35
+ // Собирает конфигурацию с консервативными defaults для публичного KinoBD API.
36
+ function createKinoBdConfig(options) {
37
+ return {
38
+ baseUrl: trimTrailingSlash(options.baseUrl ?? DEFAULT_BASE_URL),
39
+ fetch: options.fetch,
40
+ searchLimit: options.searchLimit ?? DEFAULT_SEARCH_LIMIT,
41
+ imageLimit: options.imageLimit ?? DEFAULT_IMAGE_LIMIT,
42
+ personLimit: options.personLimit ?? DEFAULT_PERSON_LIMIT,
43
+ };
44
+ }
45
+ // Runs title, IMDb ID, or Kinopoisk ID search through KinoBD.
46
+ // Выполняет поиск по названию, IMDb ID или Kinopoisk ID через KinoBD.
47
+ async function searchKinoBd(config, query, context) {
48
+ if (query.type === "anime") {
49
+ return [];
50
+ }
51
+ const titles = await loadKinoBdTitles(config, query, context, false);
52
+ const normalizedTitle = normalizeSearchText(query.title ?? "");
53
+ return titles
54
+ .map((title) => ({
55
+ title,
56
+ item: mapTitleToItem(title),
57
+ score: scoreTitle(title, query, normalizedTitle),
58
+ }))
59
+ .filter((entry) => Boolean(entry.item))
60
+ .filter((entry) => query.year === undefined || entry.item.year === query.year)
61
+ .filter((entry) => matchesType(entry.item.type, query.type))
62
+ .sort((left, right) => right.score - left.score)
63
+ .slice(0, query.limit ?? config.searchLimit)
64
+ .map((entry) => createSearchResult(entry.item, entry.title, context.debug, entry.score));
65
+ }
66
+ // Loads details by strong external IDs.
67
+ // Загружает details по сильным внешним ID.
68
+ async function getKinoBdDetails(config, query, context) {
69
+ if (!query.ids?.kinopoisk && !query.ids?.imdb) {
70
+ return null;
71
+ }
72
+ const [title] = await loadKinoBdTitles(config, query, context, true);
73
+ const details = title ? mapTitleToDetails(config, title) : null;
74
+ return details
75
+ ? {
76
+ provider: PROVIDER_NAME,
77
+ details,
78
+ source: createProviderSource(details.ids),
79
+ raw: context.debug ? title : undefined,
80
+ confidence: 1,
81
+ }
82
+ : null;
83
+ }
84
+ // Loads KinoBD records from the matching search endpoint.
85
+ // Загружает records KinoBD из подходящего search endpoint.
86
+ async function loadKinoBdTitles(config, query, context, includeRelations) {
87
+ const imdbId = query.ids?.imdb;
88
+ const kinopoiskId = query.ids?.kinopoisk;
89
+ if (imdbId) {
90
+ return requestSearch(config, "imdb_id", imdbId, context, includeRelations);
91
+ }
92
+ if (kinopoiskId) {
93
+ return requestSearch(config, "kp_id", kinopoiskId, context, includeRelations);
94
+ }
95
+ if ("title" in query && query.title?.trim()) {
96
+ return requestSearch(config, "title", query.title, context, includeRelations);
97
+ }
98
+ return [];
99
+ }
100
+ // Requests one KinoBD search endpoint and returns the data array.
101
+ // Запрашивает один KinoBD search endpoint и возвращает data array.
102
+ async function requestSearch(config, mode, value, context, includeRelations) {
103
+ const url = new URL(`${config.baseUrl}/api/films/search/${mode}`);
104
+ url.searchParams.set("q", value);
105
+ url.searchParams.set("page", "1");
106
+ if (includeRelations) {
107
+ url.searchParams.set("with", "persons,genres,countries,popularity,images");
108
+ }
109
+ const response = await fetchJson({
110
+ provider: PROVIDER_NAME,
111
+ url,
112
+ context,
113
+ fetch: config.fetch,
114
+ init: {
115
+ headers: {
116
+ accept: "application/json",
117
+ },
118
+ },
119
+ });
120
+ return response.data ?? [];
121
+ }
122
+ // Maps a KinoBD record into a compact MediaItem.
123
+ // Мапит KinoBD record в compact MediaItem.
124
+ function mapTitleToItem(title) {
125
+ const type = mapMediaType(title.type);
126
+ const displayTitle = title.name_russian ?? title.name_original;
127
+ if (!type || !displayTitle || !title.id) {
128
+ return undefined;
129
+ }
130
+ return {
131
+ id: `${PROVIDER_NAME}-${title.id}`,
132
+ type,
133
+ title: displayTitle,
134
+ originalTitle: title.name_original ?? undefined,
135
+ alternativeTitles: mapAlternativeTitles(title),
136
+ year: parseNumber(title.year ?? title.year_start),
137
+ releaseDate: title.premiere_ru ?? title.premiere_world ?? undefined,
138
+ description: title.description ?? undefined,
139
+ poster: createImage(title.big_poster ?? title.small_poster, "poster"),
140
+ genres: mapGenres(title.genres),
141
+ ratings: mapRatings(title),
142
+ ids: createIds(title),
143
+ };
144
+ }
145
+ // Converts a KinoBD record into detailed movie or series metadata.
146
+ // Преобразует KinoBD record в detailed metadata фильма или сериала.
147
+ function mapTitleToDetails(config, title) {
148
+ const item = mapTitleToItem(title);
149
+ if (!item) {
150
+ return null;
151
+ }
152
+ const detailsBase = {
153
+ ...item,
154
+ runtimeMinutes: parseNumber(title.time_minutes),
155
+ countries: mapCountries(title),
156
+ images: mapImages(title, config.imageLimit),
157
+ persons: mapPersons(title.persons, config.personLimit),
158
+ sourceProviders: [createProviderSource(item.ids)],
159
+ };
160
+ return item.type === "series"
161
+ ? { ...detailsBase, type: "series" }
162
+ : { ...detailsBase, type: "movie" };
163
+ }
164
+ // Creates a provider search result with confidence derived from score.
165
+ // Создает provider search result с confidence, полученным из score.
166
+ function createSearchResult(item, title, debug, score) {
167
+ return {
168
+ provider: PROVIDER_NAME,
169
+ item,
170
+ source: createProviderSource(item.ids),
171
+ raw: debug ? title : undefined,
172
+ confidence: Math.min(1, Math.max(0.2, score / 100)),
173
+ };
174
+ }
175
+ // Scores KinoBD records so exact popular movie matches beat loose title noise.
176
+ // Оценивает KinoBD records, чтобы точные популярные фильмы были выше шумных совпадений.
177
+ function scoreTitle(title, query, normalizedTitle) {
178
+ if (query.ids?.imdb || query.ids?.kinopoisk) {
179
+ return 100;
180
+ }
181
+ const original = normalizeSearchText(title.name_original ?? "");
182
+ const russian = normalizeSearchText(title.name_russian ?? "");
183
+ const popularity = parseNumber(title.popular_rate ?? title.popularity?.popular_rate) ?? 0;
184
+ const votes = parseNumber(title.rating_kp_count) ?? parseNumber(title.rating_imdb_count) ?? 0;
185
+ const rating = parseNumber(title.rating_kp) ?? parseNumber(title.rating_imdb) ?? 0;
186
+ let score = 10;
187
+ if (normalizedTitle && (original === normalizedTitle || russian === normalizedTitle)) {
188
+ score += 65;
189
+ }
190
+ else if (normalizedTitle &&
191
+ (original.includes(normalizedTitle) || russian.includes(normalizedTitle))) {
192
+ score += 30;
193
+ }
194
+ if (title.imdb_id) {
195
+ score += 5;
196
+ }
197
+ if (title.kinopoisk_id) {
198
+ score += 5;
199
+ }
200
+ score += Math.min(10, rating);
201
+ score += Math.min(12, Math.log10(votes + 1) * 2);
202
+ score += Math.min(12, Math.log10(popularity + 1) * 2);
203
+ return score;
204
+ }
205
+ // Maps KinoBD type strings into Media Engine media types.
206
+ // Мапит type strings KinoBD в Media Engine media types.
207
+ function mapMediaType(type) {
208
+ if (type === "film") {
209
+ return "movie";
210
+ }
211
+ if (type === "serial" || type === "series") {
212
+ return "series";
213
+ }
214
+ return undefined;
215
+ }
216
+ // Checks whether a mapped type satisfies an optional query type.
217
+ // Проверяет, подходит ли mapped type под optional query type.
218
+ function matchesType(itemType, queryType) {
219
+ return queryType === undefined || itemType === queryType;
220
+ }
221
+ // Creates normalized external IDs from KinoBD fields.
222
+ // Создает normalized external IDs из полей KinoBD.
223
+ function createIds(title) {
224
+ return {
225
+ imdb: title.imdb_id ?? undefined,
226
+ tmdb: title.tmdb_id ? String(title.tmdb_id) : undefined,
227
+ kinopoisk: title.kinopoisk_id ? String(title.kinopoisk_id) : undefined,
228
+ };
229
+ }
230
+ // Creates source attribution for KinoBD records.
231
+ // Создает source attribution для KinoBD records.
232
+ function createProviderSource(ids) {
233
+ return {
234
+ provider: PROVIDER_NAME,
235
+ ids,
236
+ url: ids?.kinopoisk ? `https://www.kinopoisk.ru/film/${ids.kinopoisk}/` : undefined,
237
+ };
238
+ }
239
+ // Maps KinoBD ratings into normalized rating values.
240
+ // Мапит KinoBD ratings в normalized rating values.
241
+ function mapRatings(title) {
242
+ const ratings = [
243
+ createRating("kinopoisk", title.rating_kp, title.rating_kp_count),
244
+ createRating("imdb", title.rating_imdb, title.rating_imdb_count),
245
+ ].filter((rating) => Boolean(rating));
246
+ return ratings.length ? ratings : undefined;
247
+ }
248
+ // Creates one normalized rating if the value is valid.
249
+ // Создает один normalized rating, если значение валидно.
250
+ function createRating(source, value, votes) {
251
+ const parsedValue = parseNumber(value);
252
+ return parsedValue === undefined
253
+ ? undefined
254
+ : {
255
+ source,
256
+ value: parsedValue,
257
+ max: 10,
258
+ votes: parseNumber(votes),
259
+ };
260
+ }
261
+ // Maps KinoBD genre records into normalized genres.
262
+ // Мапит KinoBD genre records в normalized genres.
263
+ function mapGenres(genres) {
264
+ const mapped = genres
265
+ ?.map((genre) => genre.name_ru
266
+ ? {
267
+ id: genre.id ? String(genre.id) : undefined,
268
+ name: genre.name_ru,
269
+ source: PROVIDER_NAME,
270
+ }
271
+ : undefined)
272
+ .filter((genre) => Boolean(genre));
273
+ return mapped?.length ? mapped : undefined;
274
+ }
275
+ // Maps country relation records or fallback comma-separated country text.
276
+ // Мапит country relation records или fallback comma-separated country text.
277
+ function mapCountries(title) {
278
+ const countries = title.countries?.map((country) => country.name_ru).filter(isStringValue);
279
+ return countries?.length ? countries : parseList(title.country_ru);
280
+ }
281
+ // Maps KinoBD image records and poster fallbacks into normalized images.
282
+ // Мапит KinoBD image records и poster fallbacks в normalized images.
283
+ function mapImages(title, limit) {
284
+ const images = [
285
+ createImage(title.big_poster, "poster"),
286
+ ...(title.images ?? []).map(mapKinoBdImage),
287
+ ]
288
+ .filter((image) => Boolean(image))
289
+ .slice(0, limit);
290
+ return images.length ? images : undefined;
291
+ }
292
+ // Maps one KinoBD image relation into normalized image metadata.
293
+ // Мапит одну KinoBD image relation в normalized image metadata.
294
+ function mapKinoBdImage(image) {
295
+ const type = image.type?.startsWith("kadr") ? "still" : image.type === "logo" ? "logo" : "poster";
296
+ return image.src
297
+ ? {
298
+ url: image.src,
299
+ type,
300
+ width: image.width ?? undefined,
301
+ height: image.height ?? undefined,
302
+ source: PROVIDER_NAME,
303
+ }
304
+ : undefined;
305
+ }
306
+ // Maps KinoBD persons and profession IDs into normalized media persons.
307
+ // Мапит KinoBD persons и profession IDs в normalized media persons.
308
+ function mapPersons(persons, limit) {
309
+ const mapped = persons
310
+ ?.map((person, order) => {
311
+ const name = person.name_russian ?? person.name_english;
312
+ const role = mapPersonRole(person.profession?.profession_id);
313
+ return name
314
+ ? {
315
+ person: {
316
+ id: person.id ? String(person.id) : undefined,
317
+ name,
318
+ originalName: person.name_english ?? undefined,
319
+ ids: {
320
+ kinopoisk: person.kinopoisk_id ? String(person.kinopoisk_id) : undefined,
321
+ },
322
+ },
323
+ roles: [role],
324
+ order,
325
+ }
326
+ : undefined;
327
+ })
328
+ .filter((person) => Boolean(person))
329
+ .slice(0, limit);
330
+ return mapped?.length ? mapped : undefined;
331
+ }
332
+ // Maps KinoBD profession identifiers into Media Engine roles.
333
+ // Мапит KinoBD profession identifiers в Media Engine roles.
334
+ function mapPersonRole(profession) {
335
+ if (profession === "actor") {
336
+ return "actor";
337
+ }
338
+ if (profession === "director") {
339
+ return "director";
340
+ }
341
+ if (profession === "producer") {
342
+ return "producer";
343
+ }
344
+ if (profession === "writer") {
345
+ return "writer";
346
+ }
347
+ return "unknown";
348
+ }
349
+ // Creates a normalized image from a direct URL.
350
+ // Создает normalized image из direct URL.
351
+ function createImage(url, type) {
352
+ return url
353
+ ? {
354
+ url,
355
+ type,
356
+ source: PROVIDER_NAME,
357
+ }
358
+ : undefined;
359
+ }
360
+ // Adds original and localized titles when they differ.
361
+ // Добавляет original и localized titles, когда они отличаются.
362
+ function mapAlternativeTitles(title) {
363
+ const displayTitle = title.name_russian ?? title.name_original;
364
+ const titles = [title.name_original, title.name_russian]
365
+ .filter(isStringValue)
366
+ .filter((value, index, values) => value !== displayTitle && values.indexOf(value) === index);
367
+ return titles.length > 0 ? titles : undefined;
368
+ }
369
+ // Parses numbers from KinoBD string or number fields.
370
+ // Парсит числа из string или number полей KinoBD.
371
+ function parseNumber(value) {
372
+ if (typeof value === "number") {
373
+ return Number.isFinite(value) ? value : undefined;
374
+ }
375
+ if (typeof value !== "string" || value.trim() === "") {
376
+ return undefined;
377
+ }
378
+ const parsed = Number(value);
379
+ return Number.isFinite(parsed) ? parsed : undefined;
380
+ }
381
+ // Splits comma-separated strings into clean values.
382
+ // Разбивает comma-separated strings в чистые значения.
383
+ function parseList(value) {
384
+ const list = value
385
+ ?.split(",")
386
+ .map((entry) => entry.trim())
387
+ .filter(Boolean);
388
+ return list?.length ? list : undefined;
389
+ }
390
+ // Normalizes search text for simple title scoring.
391
+ // Нормализует search text для простого title scoring.
392
+ function normalizeSearchText(value) {
393
+ return value.trim().toLocaleLowerCase().replace(/\s+/g, " ");
394
+ }
395
+ // Checks whether a value is a non-empty string.
396
+ // Проверяет, является ли значение непустой строкой.
397
+ function isStringValue(value) {
398
+ return typeof value === "string" && value.length > 0;
399
+ }
400
+ // Removes trailing slashes so URL paths are built consistently.
401
+ // Убирает trailing slashes, чтобы URL paths собирались одинаково.
402
+ function trimTrailingSlash(value) {
403
+ return value.replace(/\/+$/, "");
404
+ }
405
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/kinobd/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { MediaAvailability, StreamingProvider } from "@media-engine/core";
2
+ import { 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 declare function kinobdStreamingProvider(options?: KinoBdStreamingProviderOptions): StreamingProvider;