@media-engine/providers 1.0.0 → 1.2.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 (68) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +67 -135
  3. package/README.ru.md +73 -139
  4. package/dist/filmix-streaming/client.d.ts +36 -0
  5. package/dist/filmix-streaming/client.js +241 -0
  6. package/dist/filmix-streaming/client.js.map +1 -0
  7. package/dist/filmix-streaming/config.d.ts +42 -0
  8. package/dist/filmix-streaming/config.js +93 -0
  9. package/dist/filmix-streaming/config.js.map +1 -0
  10. package/dist/filmix-streaming/index.d.ts +4 -0
  11. package/dist/filmix-streaming/index.js +48 -0
  12. package/dist/filmix-streaming/index.js.map +1 -0
  13. package/dist/filmix-streaming/mapping.d.ts +3 -0
  14. package/dist/filmix-streaming/mapping.js +109 -0
  15. package/dist/filmix-streaming/mapping.js.map +1 -0
  16. package/dist/filmix-streaming/matching.d.ts +4 -0
  17. package/dist/filmix-streaming/matching.js +41 -0
  18. package/dist/filmix-streaming/matching.js.map +1 -0
  19. package/dist/imdb-dataset/sqlite-import.js +5 -2
  20. package/dist/imdb-dataset/sqlite-import.js.map +1 -1
  21. package/dist/index.d.ts +4 -0
  22. package/dist/index.js +4 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/package-version.d.ts +2 -2
  25. package/dist/package-version.js +1 -1
  26. package/dist/rutube-streaming/client.d.ts +18 -0
  27. package/dist/rutube-streaming/client.js +106 -0
  28. package/dist/rutube-streaming/client.js.map +1 -0
  29. package/dist/rutube-streaming/config.d.ts +26 -0
  30. package/dist/rutube-streaming/config.js +57 -0
  31. package/dist/rutube-streaming/config.js.map +1 -0
  32. package/dist/rutube-streaming/index.d.ts +4 -0
  33. package/dist/rutube-streaming/index.js +38 -0
  34. package/dist/rutube-streaming/index.js.map +1 -0
  35. package/dist/rutube-streaming/mapping.d.ts +4 -0
  36. package/dist/rutube-streaming/mapping.js +32 -0
  37. package/dist/rutube-streaming/mapping.js.map +1 -0
  38. package/dist/rutube-streaming/matching.d.ts +2 -0
  39. package/dist/rutube-streaming/matching.js +37 -0
  40. package/dist/rutube-streaming/matching.js.map +1 -0
  41. package/dist/shared/safe-fetch.d.ts +2 -0
  42. package/dist/shared/safe-fetch.js +29 -3
  43. package/dist/shared/safe-fetch.js.map +1 -1
  44. package/dist/veoveo-streaming/client.d.ts +28 -0
  45. package/dist/veoveo-streaming/client.js +212 -0
  46. package/dist/veoveo-streaming/client.js.map +1 -0
  47. package/dist/veoveo-streaming/config.d.ts +32 -0
  48. package/dist/veoveo-streaming/config.js +67 -0
  49. package/dist/veoveo-streaming/config.js.map +1 -0
  50. package/dist/veoveo-streaming/index.d.ts +4 -0
  51. package/dist/veoveo-streaming/index.js +46 -0
  52. package/dist/veoveo-streaming/index.js.map +1 -0
  53. package/dist/veoveo-streaming/mapping.d.ts +3 -0
  54. package/dist/veoveo-streaming/mapping.js +121 -0
  55. package/dist/veoveo-streaming/mapping.js.map +1 -0
  56. package/dist/videohub-streaming/client.d.ts +35 -0
  57. package/dist/videohub-streaming/client.js +239 -0
  58. package/dist/videohub-streaming/client.js.map +1 -0
  59. package/dist/videohub-streaming/config.d.ts +34 -0
  60. package/dist/videohub-streaming/config.js +73 -0
  61. package/dist/videohub-streaming/config.js.map +1 -0
  62. package/dist/videohub-streaming/index.d.ts +4 -0
  63. package/dist/videohub-streaming/index.js +59 -0
  64. package/dist/videohub-streaming/index.js.map +1 -0
  65. package/dist/videohub-streaming/mapping.d.ts +3 -0
  66. package/dist/videohub-streaming/mapping.js +100 -0
  67. package/dist/videohub-streaming/mapping.js.map +1 -0
  68. package/package.json +7 -2
@@ -0,0 +1,41 @@
1
+ import { normalizeProviderSearchText } from "../shared/mapping.js";
2
+ export function selectFilmixPost(posts, query) {
3
+ const title = query.title?.trim();
4
+ if (!title || !Number.isInteger(query.year))
5
+ return undefined;
6
+ const normalizedTitle = normalizeProviderSearchText(title);
7
+ if (!normalizedTitle)
8
+ return undefined;
9
+ const sameIdentity = uniqueById(posts.filter((post) => post.year === query.year && post.type === query.type));
10
+ const exact = sameIdentity.filter((post) => hasExactTitle(post, normalizedTitle));
11
+ if (exact.length === 1)
12
+ return exact[0];
13
+ if (exact.length > 1)
14
+ return undefined;
15
+ // Filmix search can return a localized title that differs from the catalog title.
16
+ // A fallback is safe only when search itself yields one year/type identity.
17
+ return sameIdentity.length === 1 ? sameIdentity[0] : undefined;
18
+ }
19
+ export function matchesSelectedFilmixPost(post, selected) {
20
+ if (post.id !== selected.id ||
21
+ post.year !== selected.year ||
22
+ post.section !== selected.section ||
23
+ post.type !== selected.type) {
24
+ return false;
25
+ }
26
+ const selectedTitles = normalizedTitles(selected);
27
+ return normalizedTitles(post).some((title) => selectedTitles.includes(title));
28
+ }
29
+ function hasExactTitle(post, normalizedTitle) {
30
+ return normalizedTitles(post).includes(normalizedTitle);
31
+ }
32
+ function normalizedTitles(post) {
33
+ return [post.title, post.originalTitle]
34
+ .filter((title) => Boolean(title))
35
+ .map(normalizeProviderSearchText)
36
+ .filter(Boolean);
37
+ }
38
+ function uniqueById(posts) {
39
+ return [...new Map(posts.map((post) => [post.id, post])).values()];
40
+ }
41
+ //# sourceMappingURL=matching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matching.js","sourceRoot":"","sources":["../../src/filmix-streaming/matching.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAGnE,MAAM,UAAU,gBAAgB,CAC9B,KAA0B,EAC1B,KAAiC;IAEjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAE9D,MAAM,eAAe,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,eAAe;QAAE,OAAO,SAAS,CAAC;IAEvC,MAAM,YAAY,GAAG,UAAU,CAC7B,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAC7E,CAAC;IACF,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IAElF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAEvC,kFAAkF;IAClF,4EAA4E;IAC5E,OAAO,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAgB,EAAE,QAA2B;IACrF,IACE,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE;QACvB,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;QAC3B,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;QACjC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAC3B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,cAAc,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,aAAa,CAAC,IAAuB,EAAE,eAAuB;IACrE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAuB;IAC/C,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC;SACpC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAClD,GAAG,CAAC,2BAA2B,CAAC;SAChC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,UAAU,CAAC,KAA0B;IAC5C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACrE,CAAC"}
@@ -264,7 +264,10 @@ function resolveRequiredPath(value, name) {
264
264
  return resolve(value);
265
265
  }
266
266
  async function syncFile(path) {
267
- const file = await open(path, "r");
267
+ await syncPath(path, "r+");
268
+ }
269
+ async function syncPath(path, flags) {
270
+ const file = await open(path, flags);
268
271
  try {
269
272
  await file.sync();
270
273
  }
@@ -274,7 +277,7 @@ async function syncFile(path) {
274
277
  }
275
278
  async function syncDirectory(path) {
276
279
  try {
277
- await syncFile(path);
280
+ await syncPath(path, "r");
278
281
  }
279
282
  catch (error) {
280
283
  const code = error.code;
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-import.js","sourceRoot":"","sources":["../../src/imdb-dataset/sqlite-import.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlite-import.js","sourceRoot":"","sources":["../../src/imdb-dataset/sqlite-import.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,6 +11,10 @@ export * from "./kinobd-streaming/index.js";
11
11
  export * from "./flixhq-streaming/index.js";
12
12
  export * from "./ddbb-streaming/index.js";
13
13
  export * from "./aniliberty-streaming/index.js";
14
+ export * from "./filmix-streaming/index.js";
15
+ export * from "./veoveo-streaming/index.js";
16
+ export * from "./videohub-streaming/index.js";
17
+ export * from "./rutube-streaming/index.js";
14
18
  export * from "./yts-torrent/index.js";
15
19
  export * from "./jacred-torrent/index.js";
16
20
  export * from "./bitsearch-torrent/index.js";
package/dist/index.js CHANGED
@@ -11,6 +11,10 @@ export * from "./kinobd-streaming/index.js";
11
11
  export * from "./flixhq-streaming/index.js";
12
12
  export * from "./ddbb-streaming/index.js";
13
13
  export * from "./aniliberty-streaming/index.js";
14
+ export * from "./filmix-streaming/index.js";
15
+ export * from "./veoveo-streaming/index.js";
16
+ export * from "./videohub-streaming/index.js";
17
+ export * from "./rutube-streaming/index.js";
14
18
  export * from "./yts-torrent/index.js";
15
19
  export * from "./jacred-torrent/index.js";
16
20
  export * from "./bitsearch-torrent/index.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const MEDIA_ENGINE_PROVIDERS_VERSION = "1.0.0";
2
- export declare const MEDIA_ENGINE_DEFAULT_USER_AGENT = "MediaEngine/1.0.0 (https://github.com/Yaneart/media-engine)";
1
+ export declare const MEDIA_ENGINE_PROVIDERS_VERSION = "1.2.0";
2
+ export declare const MEDIA_ENGINE_DEFAULT_USER_AGENT = "MediaEngine/1.2.0 (https://github.com/Yaneart/media-engine)";
@@ -1,5 +1,5 @@
1
1
  // Keep this runtime value aligned with packages/providers/package.json.
2
2
  // scripts/check-release-consistency.mjs enforces the manifest/runtime contract.
3
- export const MEDIA_ENGINE_PROVIDERS_VERSION = "1.0.0";
3
+ export const MEDIA_ENGINE_PROVIDERS_VERSION = "1.2.0";
4
4
  export const MEDIA_ENGINE_DEFAULT_USER_AGENT = `MediaEngine/${MEDIA_ENGINE_PROVIDERS_VERSION} (https://github.com/Yaneart/media-engine)`;
5
5
  //# sourceMappingURL=package-version.js.map
@@ -0,0 +1,18 @@
1
+ import { type ProviderContext } from "@media-engine/core";
2
+ import type { RutubeStreamingConfig } from "./config.js";
3
+ export interface RutubeMovieCandidate {
4
+ id: string;
5
+ title: string;
6
+ durationSeconds: number;
7
+ categoryId: number;
8
+ hidden: boolean;
9
+ deleted: boolean;
10
+ adult: boolean;
11
+ locked: boolean;
12
+ audio: boolean;
13
+ paid: boolean;
14
+ livestream: boolean;
15
+ }
16
+ export declare function searchRutubeMovies(config: RutubeStreamingConfig, title: string, year: number, context: ProviderContext): Promise<RutubeMovieCandidate[]>;
17
+ export declare function createRutubeSearchUrl(config: Pick<RutubeStreamingConfig, "baseUrl" | "searchResultLimit">, title: string, year: number): URL;
18
+ export declare function parseRutubeSearchResponse(provider: string, value: unknown, limit: number): RutubeMovieCandidate[];
@@ -0,0 +1,106 @@
1
+ import { ProviderError } from "@media-engine/core";
2
+ import { fetchJson } from "../shared/index.js";
3
+ const MAX_TITLE_LENGTH = 500;
4
+ const MAX_DURATION_SECONDS = 24 * 60 * 60;
5
+ const RUTUBE_VIDEO_ID = /^[a-f0-9]{32}$/iu;
6
+ export async function searchRutubeMovies(config, title, year, context) {
7
+ const url = createRutubeSearchUrl(config, title, year);
8
+ const payload = await fetchJson({
9
+ provider: config.name,
10
+ url,
11
+ context,
12
+ fetch: config.fetch,
13
+ rateLimitGate: config.rateLimitGate,
14
+ maxResponseBytes: config.maxResponseBytes,
15
+ init: {
16
+ headers: {
17
+ Accept: "application/json",
18
+ "User-Agent": config.userAgent,
19
+ },
20
+ },
21
+ });
22
+ return parseRutubeSearchResponse(config.name, payload, config.searchResultLimit);
23
+ }
24
+ export function createRutubeSearchUrl(config, title, year) {
25
+ const url = new URL("/api/search/video/", `${config.baseUrl}/`);
26
+ url.searchParams.set("content_type", "video");
27
+ url.searchParams.set("duration", "movie");
28
+ url.searchParams.set("limit", String(config.searchResultLimit));
29
+ url.searchParams.set("query", `${title.trim()} ${year}`);
30
+ return url;
31
+ }
32
+ export function parseRutubeSearchResponse(provider, value, limit) {
33
+ if (!isRecord(value) || !Array.isArray(value.results))
34
+ throw invalidResponse(provider);
35
+ const candidates = value.results.slice(0, limit).flatMap((entry) => {
36
+ const candidate = parseCandidate(entry);
37
+ return candidate ? [candidate] : [];
38
+ });
39
+ if (value.results.length > 0 && candidates.length === 0)
40
+ throw invalidResponse(provider);
41
+ return candidates;
42
+ }
43
+ function parseCandidate(value) {
44
+ if (!isRecord(value) || !isRecord(value.category))
45
+ return undefined;
46
+ const id = readVideoId(value.id);
47
+ const title = readString(value.title, MAX_TITLE_LENGTH);
48
+ const durationSeconds = readInteger(value.duration, 0, MAX_DURATION_SECONDS);
49
+ const categoryId = readInteger(value.category.id, 0, 10_000);
50
+ const flags = [
51
+ value.is_hidden,
52
+ value.is_deleted,
53
+ value.is_adult,
54
+ value.is_locked,
55
+ value.is_audio,
56
+ value.is_paid,
57
+ value.is_livestream,
58
+ ];
59
+ if (!id ||
60
+ !title ||
61
+ durationSeconds === undefined ||
62
+ categoryId === undefined ||
63
+ flags.some((flag) => typeof flag !== "boolean")) {
64
+ return undefined;
65
+ }
66
+ const [hidden, deleted, adult, locked, audio, paid, livestream] = flags;
67
+ return {
68
+ id,
69
+ title,
70
+ durationSeconds,
71
+ categoryId,
72
+ hidden: hidden,
73
+ deleted: deleted,
74
+ adult: adult,
75
+ locked: locked,
76
+ audio: audio,
77
+ paid: paid,
78
+ livestream: livestream,
79
+ };
80
+ }
81
+ function readVideoId(value) {
82
+ if (typeof value !== "string")
83
+ return undefined;
84
+ const id = value.trim().toLowerCase();
85
+ return RUTUBE_VIDEO_ID.test(id) ? id : undefined;
86
+ }
87
+ function readString(value, maxLength) {
88
+ return typeof value === "string" ? value.trim().slice(0, maxLength) || undefined : undefined;
89
+ }
90
+ function readInteger(value, min, max) {
91
+ return Number.isSafeInteger(value) && Number(value) >= min && Number(value) <= max
92
+ ? Number(value)
93
+ : undefined;
94
+ }
95
+ function isRecord(value) {
96
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
97
+ }
98
+ function invalidResponse(provider) {
99
+ return new ProviderError({
100
+ provider,
101
+ code: "PROVIDER_INVALID_RESPONSE",
102
+ message: `Provider "${provider}" returned an invalid Rutube search response.`,
103
+ retryable: false,
104
+ });
105
+ }
106
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rutube-streaming/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { StreamingProviderCapabilities } from "@media-engine/core";
2
+ import { ProviderRateLimitGate, type ProviderFetch } from "../shared/index.js";
3
+ export interface RutubeStreamingProviderOptions {
4
+ name?: string;
5
+ version?: string;
6
+ baseUrl?: string;
7
+ fetch?: ProviderFetch;
8
+ maxResponseBytes?: number;
9
+ searchResultLimit?: number;
10
+ minDurationSeconds?: number;
11
+ userAgent?: string;
12
+ now?: () => number;
13
+ }
14
+ export interface RutubeStreamingConfig {
15
+ name: string;
16
+ baseUrl: string;
17
+ fetch: ProviderFetch;
18
+ rateLimitGate: ProviderRateLimitGate;
19
+ maxResponseBytes: number;
20
+ searchResultLimit: number;
21
+ minDurationSeconds: number;
22
+ userAgent: string;
23
+ now: () => number;
24
+ }
25
+ export declare function createRutubeConfig(options: RutubeStreamingProviderOptions): RutubeStreamingConfig;
26
+ export declare function createRutubeCapabilities(): StreamingProviderCapabilities;
@@ -0,0 +1,57 @@
1
+ import { MEDIA_ENGINE_DEFAULT_USER_AGENT } from "../package-version.js";
2
+ import { ProviderRateLimitGate } from "../shared/index.js";
3
+ import { resolveBoundedIntegerOption } from "../shared/options.js";
4
+ import { createHardenedProviderFetch } from "../shared/safe-fetch.js";
5
+ const DEFAULT_PROVIDER_NAME = "rutube-streaming";
6
+ const DEFAULT_BASE_URL = "https://rutube.ru";
7
+ const DEFAULT_MAX_RESPONSE_BYTES = 2 * 1024 * 1024;
8
+ const DEFAULT_SEARCH_RESULT_LIMIT = 20;
9
+ const DEFAULT_MIN_DURATION_SECONDS = 3_000;
10
+ export function createRutubeConfig(options) {
11
+ const name = normalizeProviderName(options.name ?? DEFAULT_PROVIDER_NAME);
12
+ return {
13
+ name,
14
+ baseUrl: normalizeBaseUrl(options.baseUrl ?? DEFAULT_BASE_URL),
15
+ fetch: options.fetch ?? createHardenedProviderFetch({ provider: name, maxRedirects: 2 }),
16
+ rateLimitGate: new ProviderRateLimitGate(),
17
+ maxResponseBytes: resolveBoundedIntegerOption(options.maxResponseBytes, DEFAULT_MAX_RESPONSE_BYTES, "Rutube streaming maxResponseBytes", 1_024, 8 * 1024 * 1024),
18
+ searchResultLimit: resolveBoundedIntegerOption(options.searchResultLimit, DEFAULT_SEARCH_RESULT_LIMIT, "Rutube streaming searchResultLimit", 1, 50),
19
+ minDurationSeconds: resolveBoundedIntegerOption(options.minDurationSeconds, DEFAULT_MIN_DURATION_SECONDS, "Rutube streaming minDurationSeconds", 60, 12 * 60 * 60),
20
+ userAgent: options.userAgent?.trim() || MEDIA_ENGINE_DEFAULT_USER_AGENT,
21
+ now: options.now ?? Date.now,
22
+ };
23
+ }
24
+ export function createRutubeCapabilities() {
25
+ return {
26
+ mediaTypes: ["movie"],
27
+ lookup: {
28
+ byTitle: true,
29
+ byExternalIds: [],
30
+ byEpisode: false,
31
+ },
32
+ features: ["embed"],
33
+ };
34
+ }
35
+ function normalizeProviderName(value) {
36
+ const name = value.trim();
37
+ if (!name)
38
+ throw new TypeError("Rutube streaming provider name is required.");
39
+ return name;
40
+ }
41
+ function normalizeBaseUrl(value) {
42
+ let url;
43
+ try {
44
+ url = new URL(value.trim());
45
+ }
46
+ catch (error) {
47
+ throw new TypeError("Rutube streaming baseUrl must be a valid HTTPS URL.", { cause: error });
48
+ }
49
+ if (url.protocol !== "https:" || url.username !== "" || url.password !== "") {
50
+ throw new TypeError("Rutube streaming baseUrl must be a credential-free HTTPS URL.");
51
+ }
52
+ url.pathname = "/";
53
+ url.search = "";
54
+ url.hash = "";
55
+ return url.href.replace(/\/$/u, "");
56
+ }
57
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/rutube-streaming/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { StreamingProvider } from "@media-engine/core";
2
+ import { type RutubeStreamingProviderOptions } from "./config.js";
3
+ export type { RutubeStreamingProviderOptions } from "./config.js";
4
+ export declare function rutubeStreamingProvider(options?: RutubeStreamingProviderOptions): StreamingProvider;
@@ -0,0 +1,38 @@
1
+ import { rethrowIfProviderAborted } from "../shared/abort.js";
2
+ import { searchRutubeMovies } from "./client.js";
3
+ import { createRutubeCapabilities, createRutubeConfig, } from "./config.js";
4
+ import { mapRutubeAvailability } from "./mapping.js";
5
+ import { selectRutubeMovie } from "./matching.js";
6
+ export function rutubeStreamingProvider(options = {}) {
7
+ const config = createRutubeConfig(options);
8
+ return {
9
+ name: config.name,
10
+ version: options.version,
11
+ kind: "streaming",
12
+ capabilities: createRutubeCapabilities(),
13
+ async getAvailability(query, context) {
14
+ if (query.providers && !query.providers.includes(config.name))
15
+ return null;
16
+ if (!canResolveQuery(query))
17
+ return null;
18
+ try {
19
+ const candidates = await searchRutubeMovies(config, query.title, query.year, context);
20
+ const candidate = selectRutubeMovie(candidates, query.title, query.year, config.minDurationSeconds);
21
+ return candidate ? mapRutubeAvailability(config, candidate, query) : null;
22
+ }
23
+ catch (error) {
24
+ rethrowIfProviderAborted(context, error);
25
+ throw error;
26
+ }
27
+ },
28
+ };
29
+ }
30
+ function canResolveQuery(query) {
31
+ return (query.type === "movie" &&
32
+ Boolean(query.title?.trim()) &&
33
+ Number.isInteger(query.year) &&
34
+ query.seasonNumber === undefined &&
35
+ query.episodeNumber === undefined &&
36
+ query.absoluteEpisodeNumber === undefined);
37
+ }
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rutube-streaming/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,wBAAwB,EACxB,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAIlD,MAAM,UAAU,uBAAuB,CACrC,UAA0C,EAAE;IAE5C,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE3C,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,WAAW;QACjB,YAAY,EAAE,wBAAwB,EAAE;QACxC,KAAK,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO;YAClC,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3E,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAEzC,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,KAAM,EAAE,KAAK,CAAC,IAAK,EAAE,OAAO,CAAC,CAAC;gBACxF,MAAM,SAAS,GAAG,iBAAiB,CACjC,UAAU,EACV,KAAK,CAAC,KAAM,EACZ,KAAK,CAAC,IAAK,EACX,MAAM,CAAC,kBAAkB,CAC1B,CAAC;gBACF,OAAO,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAA0D;IACjF,OAAO,CACL,KAAK,CAAC,IAAI,KAAK,OAAO;QACtB,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QAC5B,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,KAAK,CAAC,YAAY,KAAK,SAAS;QAChC,KAAK,CAAC,aAAa,KAAK,SAAS;QACjC,KAAK,CAAC,qBAAqB,KAAK,SAAS,CAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { MediaAvailability } from "@media-engine/core";
2
+ import type { RutubeMovieCandidate } from "./client.js";
3
+ import type { RutubeStreamingConfig } from "./config.js";
4
+ export declare function mapRutubeAvailability(config: Pick<RutubeStreamingConfig, "name" | "baseUrl" | "now">, candidate: RutubeMovieCandidate, query: MediaAvailability["query"]): MediaAvailability | null;
@@ -0,0 +1,32 @@
1
+ import { normalizeProviderOutputUrl } from "../shared/index.js";
2
+ export function mapRutubeAvailability(config, candidate, query) {
3
+ const embedUrl = normalizeProviderOutputUrl(new URL(`/play/embed/${candidate.id}`, `${config.baseUrl}/`).href);
4
+ const sourceUrl = normalizeProviderOutputUrl(new URL(`/video/${candidate.id}/`, `${config.baseUrl}/`).href);
5
+ if (!embedUrl || !sourceUrl)
6
+ return null;
7
+ return {
8
+ query,
9
+ item: {
10
+ type: "movie",
11
+ title: query.title,
12
+ year: query.year,
13
+ },
14
+ options: [
15
+ {
16
+ id: `${config.name}:${candidate.id}`,
17
+ provider: config.name,
18
+ player: {
19
+ kind: "embed",
20
+ label: "Rutube",
21
+ providerPlayerId: candidate.id,
22
+ },
23
+ access: { url: embedUrl },
24
+ availability: "available",
25
+ sourceUrl,
26
+ },
27
+ ],
28
+ sourceProviders: [{ provider: config.name, url: sourceUrl }],
29
+ checkedAt: new Date(config.now()).toISOString(),
30
+ };
31
+ }
32
+ //# sourceMappingURL=mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../src/rutube-streaming/mapping.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAIhE,MAAM,UAAU,qBAAqB,CACnC,MAA+D,EAC/D,SAA+B,EAC/B,KAAiC;IAEjC,MAAM,QAAQ,GAAG,0BAA0B,CACzC,IAAI,GAAG,CAAC,eAAe,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAClE,CAAC;IACF,MAAM,SAAS,GAAG,0BAA0B,CAC1C,IAAI,GAAG,CAAC,UAAU,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAC9D,CAAC;IACF,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAEzC,OAAO;QACL,KAAK;QACL,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB;QACD,OAAO,EAAE;YACP;gBACE,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,EAAE;gBACpC,QAAQ,EAAE,MAAM,CAAC,IAAI;gBACrB,MAAM,EAAE;oBACN,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,QAAQ;oBACf,gBAAgB,EAAE,SAAS,CAAC,EAAE;iBAC/B;gBACD,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE;gBACzB,YAAY,EAAE,WAAW;gBACzB,SAAS;aACV;SACF;QACD,eAAe,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QAC5D,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;KAChD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { RutubeMovieCandidate } from "./client.js";
2
+ export declare function selectRutubeMovie(candidates: RutubeMovieCandidate[], title: string, year: number, minDurationSeconds: number): RutubeMovieCandidate | undefined;
@@ -0,0 +1,37 @@
1
+ import { normalizeProviderSearchText } from "../shared/mapping.js";
2
+ const MOVIE_CATEGORY_ID = 4;
3
+ const GENERIC_MOVIE_WORDS = new Set(["film", "movie", "фильм", "кино"]);
4
+ export function selectRutubeMovie(candidates, title, year, minDurationSeconds) {
5
+ const normalizedTitle = normalizeProviderSearchText(title);
6
+ if (!normalizedTitle)
7
+ return undefined;
8
+ return candidates.find((candidate) => isPublicMovie(candidate, minDurationSeconds) &&
9
+ hasExactYear(candidate.title, year) &&
10
+ normalizeCandidateTitle(candidate.title, year) === normalizedTitle);
11
+ }
12
+ function isPublicMovie(candidate, minDurationSeconds) {
13
+ return (candidate.categoryId === MOVIE_CATEGORY_ID &&
14
+ candidate.durationSeconds >= minDurationSeconds &&
15
+ !candidate.hidden &&
16
+ !candidate.deleted &&
17
+ !candidate.adult &&
18
+ !candidate.locked &&
19
+ !candidate.audio &&
20
+ !candidate.paid &&
21
+ !candidate.livestream);
22
+ }
23
+ function hasExactYear(value, year) {
24
+ return new RegExp(`(?:^|\\D)${year}(?:\\D|$)`, "u").test(value);
25
+ }
26
+ function normalizeCandidateTitle(value, year) {
27
+ const words = normalizeProviderSearchText(value)
28
+ .split(" ")
29
+ .filter(Boolean)
30
+ .filter((word) => word !== String(year));
31
+ while (words.length > 0 && GENERIC_MOVIE_WORDS.has(words[0]))
32
+ words.shift();
33
+ while (words.length > 0 && GENERIC_MOVIE_WORDS.has(words.at(-1)))
34
+ words.pop();
35
+ return words.join(" ");
36
+ }
37
+ //# sourceMappingURL=matching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matching.js","sourceRoot":"","sources":["../../src/rutube-streaming/matching.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAExE,MAAM,UAAU,iBAAiB,CAC/B,UAAkC,EAClC,KAAa,EACb,IAAY,EACZ,kBAA0B;IAE1B,MAAM,eAAe,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,eAAe;QAAE,OAAO,SAAS,CAAC;IAEvC,OAAO,UAAU,CAAC,IAAI,CACpB,CAAC,SAAS,EAAE,EAAE,CACZ,aAAa,CAAC,SAAS,EAAE,kBAAkB,CAAC;QAC5C,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC;QACnC,uBAAuB,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,eAAe,CACrE,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,SAA+B,EAAE,kBAA0B;IAChF,OAAO,CACL,SAAS,CAAC,UAAU,KAAK,iBAAiB;QAC1C,SAAS,CAAC,eAAe,IAAI,kBAAkB;QAC/C,CAAC,SAAS,CAAC,MAAM;QACjB,CAAC,SAAS,CAAC,OAAO;QAClB,CAAC,SAAS,CAAC,KAAK;QAChB,CAAC,SAAS,CAAC,MAAM;QACjB,CAAC,SAAS,CAAC,KAAK;QAChB,CAAC,SAAS,CAAC,IAAI;QACf,CAAC,SAAS,CAAC,UAAU,CACtB,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,IAAY;IAC/C,OAAO,IAAI,MAAM,CAAC,YAAY,IAAI,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa,EAAE,IAAY;IAC1D,MAAM,KAAK,GAAG,2BAA2B,CAAC,KAAK,CAAC;SAC7C,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3C,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAC7E,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -7,8 +7,10 @@ export type PinnedHttpTransport = (url: URL, init: RequestInit, address: Resolve
7
7
  export interface HardenedProviderFetchOptions {
8
8
  provider: string;
9
9
  maxRedirects?: number;
10
+ addressAttemptTimeoutMs?: number;
10
11
  resolver?: HostnameResolver;
11
12
  transport?: PinnedHttpTransport;
12
13
  }
13
14
  export declare function createHardenedProviderFetch(options: HardenedProviderFetchOptions): (input: string | URL, init?: RequestInit) => Promise<Response>;
15
+ export declare function getHardenedProviderResponseUrl(response: Response): string | undefined;
14
16
  export declare function isPublicIpAddress(address: string): boolean;
@@ -6,6 +6,7 @@ import { Readable } from "node:stream";
6
6
  import { ProviderError } from "@media-engine/core";
7
7
  const DEFAULT_MAX_REDIRECTS = 3;
8
8
  const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
9
+ const finalResponseUrls = new WeakMap();
9
10
  // Creates a GET/HEAD fetch that validates every DNS answer and redirect, then pins the connection.
10
11
  // Создает GET/HEAD fetch с проверкой каждого DNS-ответа/redirect и закреплением соединения.
11
12
  export function createHardenedProviderFetch(options) {
@@ -15,6 +16,10 @@ export function createHardenedProviderFetch(options) {
15
16
  if (!Number.isSafeInteger(maxRedirects) || maxRedirects < 0) {
16
17
  throw new TypeError("Hardened provider fetch maxRedirects must be a non-negative safe integer.");
17
18
  }
19
+ if (options.addressAttemptTimeoutMs !== undefined &&
20
+ (!Number.isSafeInteger(options.addressAttemptTimeoutMs) || options.addressAttemptTimeoutMs <= 0)) {
21
+ throw new TypeError("Hardened provider fetch addressAttemptTimeoutMs must be a positive safe integer.");
22
+ }
18
23
  return async (input, init = {}) => {
19
24
  assertSupportedRequest(init);
20
25
  let url = normalizeExternalUrl(options.provider, input);
@@ -25,11 +30,12 @@ export function createHardenedProviderFetch(options) {
25
30
  }
26
31
  visited.add(url.href);
27
32
  const addresses = await resolveAndValidate(options.provider, url, resolver);
28
- const response = await requestResolvedAddresses(url, { ...init, redirect: "manual" }, preferIpv4(addresses), transport);
33
+ const response = await requestResolvedAddresses(url, { ...init, redirect: "manual" }, preferIpv4(addresses), transport, options.addressAttemptTimeoutMs);
29
34
  const location = REDIRECT_STATUSES.has(response.status)
30
35
  ? response.headers.get("location")
31
36
  : null;
32
37
  if (!location) {
38
+ finalResponseUrls.set(response, url.href);
33
39
  return response;
34
40
  }
35
41
  await cancelResponse(response);
@@ -40,6 +46,10 @@ export function createHardenedProviderFetch(options) {
40
46
  }
41
47
  };
42
48
  }
49
+ // Returns the validated final URL after hardened redirects without exposing it as a response header.
50
+ export function getHardenedProviderResponseUrl(response) {
51
+ return finalResponseUrls.get(response) ?? (response.url || undefined);
52
+ }
43
53
  // Returns true only for globally routable IPv4/IPv6 unicast addresses.
44
54
  // Возвращает true только для глобально маршрутизируемых unicast IPv4/IPv6 адресов.
45
55
  export function isPublicIpAddress(address) {
@@ -163,20 +173,36 @@ function requestPinned(url, init, address) {
163
173
  request.end();
164
174
  });
165
175
  }
166
- async function requestResolvedAddresses(url, init, addresses, transport) {
176
+ async function requestResolvedAddresses(url, init, addresses, transport, addressAttemptTimeoutMs) {
167
177
  let lastError;
168
178
  for (const address of addresses) {
179
+ const attempt = createAddressAttempt(init.signal, addressAttemptTimeoutMs);
169
180
  try {
170
- return await transport(url, init, address);
181
+ return await transport(url, { ...init, signal: attempt.signal }, address);
171
182
  }
172
183
  catch (error) {
173
184
  if (init.signal?.aborted)
174
185
  throw error;
175
186
  lastError = error;
176
187
  }
188
+ finally {
189
+ attempt.clear();
190
+ }
177
191
  }
178
192
  throw lastError ?? new Error("No validated provider address was available.");
179
193
  }
194
+ function createAddressAttempt(signal, timeoutMs) {
195
+ if (timeoutMs === undefined)
196
+ return { signal, clear: () => undefined };
197
+ const controller = new AbortController();
198
+ const timeout = setTimeout(() => {
199
+ controller.abort(new DOMException("Provider address attempt timed out.", "AbortError"));
200
+ }, timeoutMs);
201
+ return {
202
+ signal: signal ? AbortSignal.any([signal, controller.signal]) : controller.signal,
203
+ clear: () => clearTimeout(timeout),
204
+ };
205
+ }
180
206
  function preferIpv4(addresses) {
181
207
  return [...addresses].sort((left, right) => left.family - right.family);
182
208
  }