@media-engine/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Media Engine contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # @media-engine/sdk
2
+
3
+ Typed HTTP SDK for applications that call the Media Engine REST API.
4
+
5
+ The SDK is framework-independent. It does not depend on React, NestJS, Express, or provider packages.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @media-engine/sdk
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```ts
16
+ import { MediaEngineClient } from "@media-engine/sdk";
17
+
18
+ const client = new MediaEngineClient({
19
+ baseUrl: "http://127.0.0.1:3000",
20
+ });
21
+
22
+ const search = await client.search({
23
+ title: "Interstellar",
24
+ type: "movie",
25
+ });
26
+
27
+ const details = await client.getDetails({
28
+ imdb: "tt0816692",
29
+ type: "movie",
30
+ });
31
+
32
+ const availability = await client.getAvailability({
33
+ kinopoisk: "258687",
34
+ type: "movie",
35
+ });
36
+
37
+ const providers = await client.getProviders();
38
+ const streamingProviders = await client.getStreamingProviders();
39
+ const health = await client.getHealth();
40
+ ```
41
+
42
+ ## Methods
43
+
44
+ - `search(query)` calls `GET /media/search`.
45
+ - `getDetails(query)` calls `GET /media/details`.
46
+ - `getAvailability(query)` calls `GET /media/availability`.
47
+ - `getProviders()` calls `GET /providers`.
48
+ - `getStreamingProviders()` calls `GET /providers/streaming`.
49
+ - `getHealth()` calls `GET /health`.
50
+
51
+ Search, details, and availability methods accept the query types from `@media-engine/core`. External IDs can be sent either as top-level shortcuts such as `imdb`, `kinopoisk`, and `shikimori`, or through `ids`.
52
+
53
+ ## Availability
54
+
55
+ `getAvailability` returns normalized player options from the API's configured streaming providers:
56
+
57
+ ```ts
58
+ const episode = await client.getAvailability({
59
+ type: "anime",
60
+ shikimori: "20",
61
+ absoluteEpisodeNumber: 1,
62
+ });
63
+
64
+ for (const option of episode.options) {
65
+ console.log(option.player.label, option.translation?.title, option.access.url);
66
+ }
67
+ ```
68
+
69
+ The SDK does not render players and does not know provider secrets. It only serializes query parameters, calls the API, and returns the typed response.
70
+
71
+ Failed HTTP responses and invalid JSON payloads throw `MediaEngineApiError`.
@@ -0,0 +1,50 @@
1
+ import type { DetailsResponse } from "@media-engine/core";
2
+ import type { DetailsQuery } from "@media-engine/core";
3
+ import type { MediaAvailability } from "@media-engine/core";
4
+ import type { ProviderInfo } from "@media-engine/core";
5
+ import type { SearchResponse } from "@media-engine/core";
6
+ import type { SearchQuery } from "@media-engine/core";
7
+ import type { StreamQuery } from "@media-engine/core";
8
+ import type { StreamingProviderInfo } from "@media-engine/core";
9
+ export type MediaEngineFetch = (input: URL | string, init?: RequestInit) => Promise<Response>;
10
+ export interface MediaEngineClientOptions {
11
+ baseUrl: string;
12
+ fetch?: MediaEngineFetch;
13
+ headers?: HeadersInit;
14
+ }
15
+ export interface MediaEngineRequestOptions {
16
+ signal?: AbortSignal;
17
+ headers?: HeadersInit;
18
+ }
19
+ export interface MediaEngineHealthResponse {
20
+ status: "ok";
21
+ service: "media-engine-api";
22
+ }
23
+ export declare class MediaEngineApiError extends Error {
24
+ readonly status: number;
25
+ readonly body: unknown;
26
+ constructor(message: string, options: {
27
+ status: number;
28
+ body?: unknown;
29
+ });
30
+ }
31
+ export declare class MediaEngineClient {
32
+ readonly baseUrl: string;
33
+ private readonly fetchImpl;
34
+ private readonly headers?;
35
+ constructor(options: MediaEngineClientOptions);
36
+ search(query: SearchQuery, options?: MediaEngineRequestOptions): Promise<SearchResponse>;
37
+ getDetails(query: DetailsQuery, options?: MediaEngineRequestOptions): Promise<DetailsResponse>;
38
+ getAvailability(query: StreamQuery, options?: MediaEngineRequestOptions): Promise<MediaAvailability>;
39
+ getProviders(options?: MediaEngineRequestOptions): Promise<ProviderInfo[]>;
40
+ getStreamingProviders(options?: MediaEngineRequestOptions): Promise<StreamingProviderInfo[]>;
41
+ getHealth(options?: MediaEngineRequestOptions): Promise<MediaEngineHealthResponse>;
42
+ protected createUrl(path: string): URL;
43
+ protected request(input: URL, init?: RequestInit): Promise<Response>;
44
+ private requestJson;
45
+ }
46
+ export type MediaEngineSearchResponse = SearchResponse;
47
+ export type MediaEngineDetailsResponse = DetailsResponse;
48
+ export type MediaEngineAvailabilityResponse = MediaAvailability;
49
+ export type MediaEngineProviderInfo = ProviderInfo;
50
+ export type MediaEngineStreamingProviderInfo = StreamingProviderInfo;
package/dist/client.js ADDED
@@ -0,0 +1,205 @@
1
+ // EN: Error thrown by the SDK for failed API responses or invalid payloads.
2
+ // RU: Ошибка, которую SDK бросает для неуспешных API responses или неверных payload.
3
+ export class MediaEngineApiError extends Error {
4
+ status;
5
+ body;
6
+ // EN: Preserve HTTP status and parsed response body for application-level handling.
7
+ // RU: Сохраняем HTTP status и распарсенное тело ответа для обработки на уровне приложения.
8
+ constructor(message, options) {
9
+ super(message);
10
+ this.name = "MediaEngineApiError";
11
+ this.status = options.status;
12
+ this.body = options.body;
13
+ }
14
+ }
15
+ const EXTERNAL_ID_KEYS = [
16
+ "imdb",
17
+ "tmdb",
18
+ "kinopoisk",
19
+ "shikimori",
20
+ "myAnimeList",
21
+ "aniList",
22
+ ];
23
+ const NESTED_EXTERNAL_ID_KEYS = [...EXTERNAL_ID_KEYS, "worldArt"];
24
+ // EN: Typed HTTP client entry point for applications using Media Engine API.
25
+ // RU: Типизированная точка входа HTTP client для приложений, использующих Media Engine API.
26
+ export class MediaEngineClient {
27
+ baseUrl;
28
+ fetchImpl;
29
+ headers;
30
+ // EN: Store normalized client options without depending on any app framework.
31
+ // RU: Сохраняем нормализованные опции client без зависимости от app framework.
32
+ constructor(options) {
33
+ const baseUrl = options.baseUrl.trim();
34
+ if (!baseUrl) {
35
+ throw new Error("MediaEngineClient baseUrl must not be empty.");
36
+ }
37
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
38
+ this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);
39
+ this.headers = options.headers;
40
+ }
41
+ // EN: Search media metadata through GET /media/search.
42
+ // RU: Ищет media metadata через GET /media/search.
43
+ search(query, options) {
44
+ return this.requestJson("/media/search", query, options);
45
+ }
46
+ // EN: Load merged media details through GET /media/details.
47
+ // RU: Загружает объединенные media details через GET /media/details.
48
+ getDetails(query, options) {
49
+ return this.requestJson("/media/details", query, options);
50
+ }
51
+ // EN: Load normalized player and stream availability through GET /media/availability.
52
+ // RU: Загружает нормализованную доступность player и stream через GET /media/availability.
53
+ getAvailability(query, options) {
54
+ return this.requestJson("/media/availability", query, options);
55
+ }
56
+ // EN: List safe provider metadata through GET /providers.
57
+ // RU: Получает безопасные provider metadata через GET /providers.
58
+ getProviders(options) {
59
+ return this.requestJson("/providers", undefined, options);
60
+ }
61
+ // EN: List safe streaming provider metadata through GET /providers/streaming.
62
+ // RU: Получает безопасные metadata streaming-провайдеров через GET /providers/streaming.
63
+ getStreamingProviders(options) {
64
+ return this.requestJson("/providers/streaming", undefined, options);
65
+ }
66
+ // EN: Check API readiness through GET /health.
67
+ // RU: Проверяет готовность API через GET /health.
68
+ getHealth(options) {
69
+ return this.requestJson("/health", undefined, options);
70
+ }
71
+ // EN: Build an absolute API URL from a relative endpoint path.
72
+ // RU: Собирает абсолютный API URL из относительного endpoint path.
73
+ createUrl(path) {
74
+ return new URL(path.replace(/^\/+/, ""), `${this.baseUrl}/`);
75
+ }
76
+ // EN: Execute fetch with JSON defaults and configured client headers.
77
+ // RU: Выполняет fetch с JSON defaults и настроенными headers клиента.
78
+ request(input, init) {
79
+ const headers = new Headers(this.headers);
80
+ const initHeaders = new Headers(init?.headers);
81
+ if (!headers.has("Accept")) {
82
+ headers.set("Accept", "application/json");
83
+ }
84
+ initHeaders.forEach((value, key) => {
85
+ headers.set(key, value);
86
+ });
87
+ return this.fetchImpl(input, {
88
+ ...init,
89
+ headers,
90
+ });
91
+ }
92
+ // EN: Run a GET request and parse its JSON response as the expected SDK type.
93
+ // RU: Выполняет GET request и парсит JSON response как ожидаемый SDK type.
94
+ async requestJson(path, query, options) {
95
+ const url = this.createUrl(path);
96
+ if (query) {
97
+ appendQuery(url, query);
98
+ }
99
+ const response = await this.request(url, {
100
+ method: "GET",
101
+ signal: options?.signal,
102
+ headers: options?.headers,
103
+ });
104
+ return parseJsonResponse(response);
105
+ }
106
+ }
107
+ // EN: Append core search/details/streaming query fields to API URL search params.
108
+ // RU: Добавляет поля core search/details/streaming query в API URL search params.
109
+ function appendQuery(url, query) {
110
+ appendParam(url, "title", "title" in query ? query.title : undefined);
111
+ appendParam(url, "type", query.type);
112
+ appendParam(url, "year", "year" in query ? query.year : undefined);
113
+ appendParam(url, "limit", "limit" in query ? query.limit : undefined);
114
+ appendParam(url, "language", query.language);
115
+ appendParam(url, "id", "id" in query ? query.id : undefined);
116
+ appendParam(url, "seasonNumber", "seasonNumber" in query ? query.seasonNumber : undefined);
117
+ appendParam(url, "episodeNumber", "episodeNumber" in query ? query.episodeNumber : undefined);
118
+ appendParam(url, "absoluteEpisodeNumber", "absoluteEpisodeNumber" in query ? query.absoluteEpisodeNumber : undefined);
119
+ appendArrayParam(url, "providers", "providers" in query ? query.providers : undefined);
120
+ for (const key of EXTERNAL_ID_KEYS) {
121
+ appendParam(url, key, query[key]);
122
+ }
123
+ for (const key of NESTED_EXTERNAL_ID_KEYS) {
124
+ appendParam(url, `ids.${key}`, query.ids?.[key]);
125
+ }
126
+ }
127
+ // EN: Append one non-empty primitive query value.
128
+ // RU: Добавляет одно непустое primitive query значение.
129
+ function appendParam(url, key, value) {
130
+ if (value === undefined) {
131
+ return;
132
+ }
133
+ const serialized = String(value).trim();
134
+ if (serialized.length > 0) {
135
+ url.searchParams.set(key, serialized);
136
+ }
137
+ }
138
+ // EN: Append repeated query parameters for list values.
139
+ // RU: Добавляет повторяющиеся query параметры для списочных значений.
140
+ function appendArrayParam(url, key, values) {
141
+ if (!values) {
142
+ return;
143
+ }
144
+ for (const value of values) {
145
+ const serialized = value.trim();
146
+ if (serialized.length > 0) {
147
+ url.searchParams.append(key, serialized);
148
+ }
149
+ }
150
+ }
151
+ // EN: Parse JSON responses and normalize HTTP or payload failures into typed SDK errors.
152
+ // RU: Парсит JSON responses и нормализует HTTP или payload failures в typed SDK errors.
153
+ async function parseJsonResponse(response) {
154
+ const { body, invalidJson } = await readResponseBody(response);
155
+ if (!response.ok) {
156
+ throw new MediaEngineApiError(readErrorMessage(response, body), {
157
+ status: response.status,
158
+ body,
159
+ });
160
+ }
161
+ if (invalidJson) {
162
+ throw new MediaEngineApiError("Media Engine API returned invalid JSON.", {
163
+ status: response.status,
164
+ body,
165
+ });
166
+ }
167
+ if (body === undefined) {
168
+ throw new MediaEngineApiError("Media Engine API returned an empty response body.", {
169
+ status: response.status,
170
+ });
171
+ }
172
+ return body;
173
+ }
174
+ // EN: Read JSON when possible without hiding malformed payloads.
175
+ // RU: Читает JSON когда возможно, не скрывая поврежденные payload.
176
+ async function readResponseBody(response) {
177
+ const text = await response.text();
178
+ if (text.trim().length === 0) {
179
+ return { body: undefined, invalidJson: false };
180
+ }
181
+ try {
182
+ return { body: JSON.parse(text), invalidJson: false };
183
+ }
184
+ catch {
185
+ return { body: text, invalidJson: true };
186
+ }
187
+ }
188
+ // EN: Prefer structured API error messages when the server provides them.
189
+ // RU: Предпочитаем структурированные API error messages, если server их возвращает.
190
+ function readErrorMessage(response, body) {
191
+ if (isErrorBody(body)) {
192
+ return body.message;
193
+ }
194
+ return `Media Engine API request failed with HTTP ${response.status}.`;
195
+ }
196
+ // EN: Detect the common NestJS error response shape.
197
+ // RU: Определяет распространенную форму NestJS error response.
198
+ function isErrorBody(body) {
199
+ if (!body || typeof body !== "object") {
200
+ return false;
201
+ }
202
+ const value = body;
203
+ return typeof value.message === "string";
204
+ }
205
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from "./client.js";
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./client.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@media-engine/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Typed HTTP SDK for Media Engine API clients.",
5
+ "license": "MIT",
6
+ "homepage": "https://github.com/Yaneart/media-engine#readme",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+ssh://git@github.com:Yaneart/media-engine.git",
10
+ "directory": "packages/sdk"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/Yaneart/media-engine/issues"
14
+ },
15
+ "keywords": [
16
+ "media",
17
+ "metadata",
18
+ "movies",
19
+ "series",
20
+ "anime",
21
+ "sdk",
22
+ "api-client"
23
+ ],
24
+ "type": "module",
25
+ "engines": {
26
+ "node": ">=20"
27
+ },
28
+ "sideEffects": false,
29
+ "main": "./dist/index.js",
30
+ "types": "./dist/index.d.ts",
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js"
35
+ }
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "!dist/**/*.test.d.ts",
40
+ "!dist/**/*.test.js",
41
+ "!dist/**/*.test.js.map",
42
+ "README.md"
43
+ ],
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "dependencies": {
48
+ "@media-engine/core": "0.1.0"
49
+ },
50
+ "scripts": {
51
+ "build": "tsc -p tsconfig.json",
52
+ "typecheck": "tsc -p tsconfig.json --noEmit",
53
+ "test": "pnpm build && node --test dist/client.test.js"
54
+ }
55
+ }