@media-engine/providers 0.1.1 → 1.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 +21 -21
- package/README.md +85 -25
- package/README.ru.md +90 -26
- 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 +8 -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 +37 -12
- 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/filmix-streaming/client.d.ts +36 -0
- package/dist/filmix-streaming/client.js +241 -0
- package/dist/filmix-streaming/client.js.map +1 -0
- package/dist/filmix-streaming/config.d.ts +42 -0
- package/dist/filmix-streaming/config.js +93 -0
- package/dist/filmix-streaming/config.js.map +1 -0
- package/dist/filmix-streaming/index.d.ts +4 -0
- package/dist/filmix-streaming/index.js +48 -0
- package/dist/filmix-streaming/index.js.map +1 -0
- package/dist/filmix-streaming/mapping.d.ts +3 -0
- package/dist/filmix-streaming/mapping.js +109 -0
- package/dist/filmix-streaming/mapping.js.map +1 -0
- package/dist/filmix-streaming/matching.d.ts +4 -0
- package/dist/filmix-streaming/matching.js +41 -0
- package/dist/filmix-streaming/matching.js.map +1 -0
- 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 +58 -104
- package/dist/flixhq-streaming/index.js.map +1 -1
- package/dist/imdb-dataset/index.d.ts +20 -5
- package/dist/imdb-dataset/index.js +82 -184
- 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 +301 -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 +11 -0
- package/dist/index.js +11 -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 +5 -6
- package/dist/kinobd/index.js.map +1 -1
- package/dist/kinobd-streaming/availability.js +52 -29
- package/dist/kinobd-streaming/availability.js.map +1 -1
- package/dist/kinobd-streaming/candidates.d.ts +3 -2
- package/dist/kinobd-streaming/candidates.js +89 -37
- package/dist/kinobd-streaming/candidates.js.map +1 -1
- package/dist/kinobd-streaming/config.d.ts +15 -0
- package/dist/kinobd-streaming/config.js +21 -17
- package/dist/kinobd-streaming/config.js.map +1 -1
- package/dist/kinobd-streaming/index.d.ts +1 -1
- package/dist/kinobd-streaming/index.js.map +1 -1
- package/dist/kinobd-streaming/players.d.ts +2 -1
- package/dist/kinobd-streaming/players.js +7 -7
- package/dist/kinobd-streaming/players.js.map +1 -1
- 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 +5 -3
- package/dist/kinobd-streaming/validation.js +78 -49
- package/dist/kinobd-streaming/validation.js.map +1 -1
- 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/rutube-streaming/client.d.ts +18 -0
- package/dist/rutube-streaming/client.js +106 -0
- package/dist/rutube-streaming/client.js.map +1 -0
- package/dist/rutube-streaming/config.d.ts +26 -0
- package/dist/rutube-streaming/config.js +57 -0
- package/dist/rutube-streaming/config.js.map +1 -0
- package/dist/rutube-streaming/index.d.ts +4 -0
- package/dist/rutube-streaming/index.js +38 -0
- package/dist/rutube-streaming/index.js.map +1 -0
- package/dist/rutube-streaming/mapping.d.ts +4 -0
- package/dist/rutube-streaming/mapping.js +32 -0
- package/dist/rutube-streaming/mapping.js.map +1 -0
- package/dist/rutube-streaming/matching.d.ts +2 -0
- package/dist/rutube-streaming/matching.js +37 -0
- package/dist/rutube-streaming/matching.js.map +1 -0
- package/dist/shared/abort.d.ts +1 -0
- package/dist/shared/abort.js +22 -0
- package/dist/shared/abort.js.map +1 -1
- package/dist/shared/http.d.ts +8 -2
- package/dist/shared/http.js +37 -67
- package/dist/shared/http.js.map +1 -1
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +1 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/mapping.js +3 -1
- package/dist/shared/mapping.js.map +1 -1
- 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.js +2 -18
- package/dist/shared/rate-limit.js.map +1 -1
- 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/safe-fetch.d.ts +16 -0
- package/dist/shared/safe-fetch.js +300 -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 +4 -7
- 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/veoveo-streaming/client.d.ts +28 -0
- package/dist/veoveo-streaming/client.js +212 -0
- package/dist/veoveo-streaming/client.js.map +1 -0
- package/dist/veoveo-streaming/config.d.ts +32 -0
- package/dist/veoveo-streaming/config.js +67 -0
- package/dist/veoveo-streaming/config.js.map +1 -0
- package/dist/veoveo-streaming/index.d.ts +4 -0
- package/dist/veoveo-streaming/index.js +46 -0
- package/dist/veoveo-streaming/index.js.map +1 -0
- package/dist/veoveo-streaming/mapping.d.ts +3 -0
- package/dist/veoveo-streaming/mapping.js +121 -0
- package/dist/veoveo-streaming/mapping.js.map +1 -0
- package/dist/videohub-streaming/client.d.ts +33 -0
- package/dist/videohub-streaming/client.js +208 -0
- package/dist/videohub-streaming/client.js.map +1 -0
- package/dist/videohub-streaming/config.d.ts +34 -0
- package/dist/videohub-streaming/config.js +73 -0
- package/dist/videohub-streaming/config.js.map +1 -0
- package/dist/videohub-streaming/index.d.ts +4 -0
- package/dist/videohub-streaming/index.js +53 -0
- package/dist/videohub-streaming/index.js.map +1 -0
- package/dist/videohub-streaming/mapping.d.ts +3 -0
- package/dist/videohub-streaming/mapping.js +84 -0
- package/dist/videohub-streaming/mapping.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 +30 -104
- 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 -5
package/LICENSE
CHANGED
|
@@ -1,21 +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.
|
|
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
CHANGED
|
@@ -2,58 +2,66 @@
|
|
|
2
2
|
|
|
3
3
|
**English** | [Русский](https://github.com/Yaneart/media-engine/blob/main/packages/providers/README.ru.md)
|
|
4
4
|
|
|
5
|
-
Ready-to-use data sources for Media Engine.
|
|
5
|
+
Ready-to-use data sources for Media Engine. Install this package when you want to search real public
|
|
6
|
+
catalogs without writing provider adapters yourself.
|
|
6
7
|
|
|
7
|
-
Install
|
|
8
|
+
## Install
|
|
8
9
|
|
|
9
10
|
```bash
|
|
10
11
|
npm install @media-engine/core @media-engine/providers
|
|
11
12
|
```
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
The built-in providers do not need your API keys.
|
|
15
|
+
|
|
16
|
+
## Search metadata
|
|
14
17
|
|
|
15
18
|
```ts
|
|
16
19
|
import { MediaEngine } from "@media-engine/core";
|
|
17
20
|
import {
|
|
18
21
|
aniListProvider,
|
|
19
|
-
|
|
22
|
+
cinemetaProvider,
|
|
20
23
|
kinobdProvider,
|
|
21
|
-
kinobdStreamingProvider,
|
|
22
24
|
shikimoriProvider,
|
|
23
25
|
} from "@media-engine/providers";
|
|
24
26
|
|
|
25
27
|
const media = new MediaEngine({
|
|
26
|
-
providers: [
|
|
28
|
+
providers: [
|
|
29
|
+
kinobdProvider(),
|
|
30
|
+
cinemetaProvider(),
|
|
31
|
+
shikimoriProvider(),
|
|
32
|
+
aniListProvider(),
|
|
33
|
+
],
|
|
27
34
|
});
|
|
28
35
|
|
|
29
36
|
const result = await media.search({ title: "One Piece" });
|
|
30
37
|
```
|
|
31
38
|
|
|
32
|
-
|
|
39
|
+
Connect only the sources your application needs. The engine calls suitable providers and merges
|
|
40
|
+
matching results for you.
|
|
33
41
|
|
|
34
|
-
|
|
42
|
+
Available metadata providers:
|
|
35
43
|
|
|
36
|
-
- `kinobdProvider()`
|
|
37
|
-
- `
|
|
38
|
-
- `
|
|
39
|
-
- `
|
|
40
|
-
- `wikidataProvider()` — open structured enrichment;
|
|
41
|
-
- `imdbDatasetProvider()` — local IMDb TSV datasets supplied by your application.
|
|
44
|
+
- `kinobdProvider()` and `cinemetaProvider()` for movies and series;
|
|
45
|
+
- `shikimoriProvider()` and `aniListProvider()` for anime;
|
|
46
|
+
- `tvMazeProvider()` and `wikidataProvider()` as additional identity sources;
|
|
47
|
+
- `imdbDatasetProvider()` for an IMDb dataset managed by your application.
|
|
42
48
|
|
|
43
|
-
|
|
49
|
+
TVmaze data requires attribution. Keep and display the TVmaze source link included in a result. See
|
|
50
|
+
the [TVmaze API license](https://www.tvmaze.com/api#licensing).
|
|
44
51
|
|
|
45
|
-
|
|
52
|
+
The optional SQLite-backed IMDb dataset tools need Node.js 22.13 or newer. Everything else in the
|
|
53
|
+
package keeps the normal Node.js 20 baseline.
|
|
46
54
|
|
|
47
|
-
|
|
48
|
-
- `flixHqStreamingProvider()` — international movie and selected series-episode options;
|
|
49
|
-
- `experimentalStreamingProvider()` — data configured by your own application, useful in tests and UI work.
|
|
55
|
+
## Find player options
|
|
50
56
|
|
|
51
57
|
```ts
|
|
58
|
+
import {
|
|
59
|
+
flixHqStreamingProvider,
|
|
60
|
+
kinobdStreamingProvider,
|
|
61
|
+
} from "@media-engine/providers";
|
|
62
|
+
|
|
52
63
|
const media = new MediaEngine({
|
|
53
|
-
streamingProviders: [
|
|
54
|
-
kinobdStreamingProvider(),
|
|
55
|
-
flixHqStreamingProvider(),
|
|
56
|
-
],
|
|
64
|
+
streamingProviders: [kinobdStreamingProvider(), flixHqStreamingProvider()],
|
|
57
65
|
});
|
|
58
66
|
|
|
59
67
|
const result = await media.getAvailability({
|
|
@@ -64,9 +72,61 @@ const result = await media.getAvailability({
|
|
|
64
72
|
});
|
|
65
73
|
```
|
|
66
74
|
|
|
67
|
-
|
|
75
|
+
The package also exports `ddbbStreamingProvider()`, `aniLibertyStreamingProvider()`,
|
|
76
|
+
`filmixStreamingProvider()`, `veoVeoStreamingProvider()`, `videoHubStreamingProvider()`,
|
|
77
|
+
`rutubeStreamingProvider()`, and
|
|
78
|
+
`experimentalStreamingProvider()`.
|
|
79
|
+
Add them explicitly when they fit your application. Filmix guest mode is capped at 480p and filters
|
|
80
|
+
known copyright/service placeholder videos. A user-owned device token raises the cap to 720p.
|
|
81
|
+
Authenticated mode requires an HTTPS `baseUrl` unless the application explicitly enables
|
|
82
|
+
`allowInsecureHttpToken` for a local compatibility test. That override sends the token without TLS
|
|
83
|
+
and must not be used in a public deployment. Returned CDN video URLs use HTTPS. VeoVeo uses DDBB only to resolve its
|
|
84
|
+
public content ID, discards the iframe token, and returns direct signed HTTPS HLS. VideoHUB uses a Kinopoisk ID and returns
|
|
85
|
+
short-lived direct MP4 qualities for movies or one exact series episode. Its links are bound to the
|
|
86
|
+
playback User-Agent and may also be bound to the requesting public IP. Pass the playback client's
|
|
87
|
+
exact User-Agent as `MediaEngineOperationOptions.playbackUserAgent`; the required value is retained
|
|
88
|
+
in each option's `access.headers` for non-browser clients.
|
|
89
|
+
Rutube performs a bounded exact title/year movie search and returns only Rutube's documented public
|
|
90
|
+
embed player. It does not expose or proxy Rutube media URLs and intentionally skips series.
|
|
91
|
+
|
|
92
|
+
These providers return third-party links or streams. Media Engine does not host the video, and an
|
|
93
|
+
external player may be unavailable in some countries, networks, or browsers.
|
|
94
|
+
|
|
95
|
+
## Discover torrent releases
|
|
96
|
+
|
|
97
|
+
Torrent providers are always opt-in:
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
import {
|
|
101
|
+
bitsearchTorrentProvider,
|
|
102
|
+
jacRedTorrentProvider,
|
|
103
|
+
magnetzTorrentProvider,
|
|
104
|
+
ytsTorrentProvider,
|
|
105
|
+
} from "@media-engine/providers";
|
|
106
|
+
|
|
107
|
+
const media = new MediaEngine({
|
|
108
|
+
torrentProviders: [
|
|
109
|
+
ytsTorrentProvider(),
|
|
110
|
+
jacRedTorrentProvider(),
|
|
111
|
+
bitsearchTorrentProvider(),
|
|
112
|
+
magnetzTorrentProvider(),
|
|
113
|
+
],
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
const result = await media.discoverTorrents({
|
|
117
|
+
type: "movie",
|
|
118
|
+
title: "Inception",
|
|
119
|
+
year: 2010,
|
|
120
|
+
ids: { imdb: "tt1375666" },
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Discovery only returns normalized candidates and their handoff data. It does not download torrent
|
|
125
|
+
metadata, contact trackers, join a swarm, or play a file.
|
|
68
126
|
|
|
69
|
-
|
|
127
|
+
Public sources can change, rate-limit requests, or go offline. Keep engine caching enabled and
|
|
128
|
+
expect occasional partial results. Provider-specific settings and safety boundaries are described in
|
|
129
|
+
the [provider guide](https://github.com/Yaneart/media-engine/blob/main/docs/providers.md).
|
|
70
130
|
|
|
71
131
|
## License
|
|
72
132
|
|
package/README.ru.md
CHANGED
|
@@ -2,71 +2,135 @@
|
|
|
2
2
|
|
|
3
3
|
[English](https://github.com/Yaneart/media-engine/blob/main/packages/providers/README.md) | **Русский**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Это готовые источники данных для Media Engine. Установите пакет, если хотите искать в реальных
|
|
6
|
+
публичных каталогах и не писать адаптеры самостоятельно.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
## Установка
|
|
8
9
|
|
|
9
10
|
```bash
|
|
10
11
|
npm install @media-engine/core @media-engine/providers
|
|
11
12
|
```
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
Для встроенных провайдеров ваши API-ключи не нужны.
|
|
15
|
+
|
|
16
|
+
## Поиск метаданных
|
|
14
17
|
|
|
15
18
|
```ts
|
|
16
19
|
import { MediaEngine } from "@media-engine/core";
|
|
17
20
|
import {
|
|
18
21
|
aniListProvider,
|
|
19
|
-
|
|
22
|
+
cinemetaProvider,
|
|
20
23
|
kinobdProvider,
|
|
21
|
-
kinobdStreamingProvider,
|
|
22
24
|
shikimoriProvider,
|
|
23
25
|
} from "@media-engine/providers";
|
|
24
26
|
|
|
25
27
|
const media = new MediaEngine({
|
|
26
|
-
providers: [
|
|
28
|
+
providers: [
|
|
29
|
+
kinobdProvider(),
|
|
30
|
+
cinemetaProvider(),
|
|
31
|
+
shikimoriProvider(),
|
|
32
|
+
aniListProvider(),
|
|
33
|
+
],
|
|
27
34
|
});
|
|
28
35
|
|
|
29
36
|
const result = await media.search({ title: "Ван-Пис" });
|
|
30
37
|
```
|
|
31
38
|
|
|
32
|
-
Подключайте только те
|
|
39
|
+
Подключайте только те источники, которые нужны вашему приложению. Движок сам вызовет подходящие
|
|
40
|
+
провайдеры и объединит совпадающие результаты.
|
|
33
41
|
|
|
34
|
-
|
|
42
|
+
Готовые провайдеры метаданных:
|
|
35
43
|
|
|
36
|
-
- `kinobdProvider()`
|
|
37
|
-
- `
|
|
38
|
-
- `
|
|
39
|
-
- `
|
|
40
|
-
- `wikidataProvider()` — обогащение открытыми структурированными данными;
|
|
41
|
-
- `imdbDatasetProvider()` — локальные TSV-датасеты IMDb, переданные приложением.
|
|
44
|
+
- `kinobdProvider()` и `cinemetaProvider()` для фильмов и сериалов;
|
|
45
|
+
- `shikimoriProvider()` и `aniListProvider()` для аниме;
|
|
46
|
+
- `tvMazeProvider()` и `wikidataProvider()` как дополнительные источники идентичности;
|
|
47
|
+
- `imdbDatasetProvider()` для IMDb-датасета, которым управляет ваше приложение.
|
|
42
48
|
|
|
43
|
-
|
|
49
|
+
Данные TVmaze требуют указания источника. Сохраняйте и показывайте ссылку TVmaze, которая приходит
|
|
50
|
+
в результате. Подробности есть в [лицензии API TVmaze](https://www.tvmaze.com/api#licensing).
|
|
44
51
|
|
|
45
|
-
|
|
52
|
+
Опциональные инструменты для SQLite-индекса IMDb требуют Node.js 22.13 или новее. Для остального
|
|
53
|
+
пакета достаточно Node.js 20.
|
|
46
54
|
|
|
47
|
-
|
|
48
|
-
- `flixHqStreamingProvider()` — международные варианты для фильмов и выбранных эпизодов сериалов;
|
|
49
|
-
- `experimentalStreamingProvider()` — данные, настроенные вашим приложением для тестов и разработки интерфейса.
|
|
55
|
+
## Поиск вариантов просмотра
|
|
50
56
|
|
|
51
57
|
```ts
|
|
58
|
+
import {
|
|
59
|
+
flixHqStreamingProvider,
|
|
60
|
+
kinobdStreamingProvider,
|
|
61
|
+
} from "@media-engine/providers";
|
|
62
|
+
|
|
52
63
|
const media = new MediaEngine({
|
|
53
|
-
streamingProviders: [
|
|
54
|
-
kinobdStreamingProvider(),
|
|
55
|
-
flixHqStreamingProvider(),
|
|
56
|
-
],
|
|
64
|
+
streamingProviders: [kinobdStreamingProvider(), flixHqStreamingProvider()],
|
|
57
65
|
});
|
|
58
66
|
|
|
59
67
|
const result = await media.getAvailability({
|
|
60
68
|
type: "series",
|
|
61
|
-
title: "
|
|
69
|
+
title: "Игра престолов",
|
|
62
70
|
seasonNumber: 1,
|
|
63
71
|
episodeNumber: 1,
|
|
64
72
|
});
|
|
65
73
|
```
|
|
66
74
|
|
|
67
|
-
|
|
75
|
+
Пакет также экспортирует `ddbbStreamingProvider()`, `aniLibertyStreamingProvider()`,
|
|
76
|
+
`filmixStreamingProvider()`, `veoVeoStreamingProvider()`, `videoHubStreamingProvider()`,
|
|
77
|
+
`rutubeStreamingProvider()` и
|
|
78
|
+
`experimentalStreamingProvider()`.
|
|
79
|
+
Подключайте их явно, если они
|
|
80
|
+
подходят вашему приложению. Гостевой режим Filmix ограничен 480p и отбрасывает известные заглушки о
|
|
81
|
+
блокировке и служебные видео. Собственный device token повышает предел до 720p. Для авторизации
|
|
82
|
+
обязателен HTTPS `baseUrl`, если приложение явно не включило `allowInsecureHttpToken` для локальной
|
|
83
|
+
проверки совместимости. Этот режим отправляет токен без TLS и не должен использоваться в публичном
|
|
84
|
+
развёртывании. Ссылки на видео CDN используют HTTPS. VeoVeo использует DDBB только для получения публичного
|
|
85
|
+
content ID, отбрасывает iframe-токен и возвращает прямой подписанный HTTPS HLS.
|
|
86
|
+
VideoHUB ищет по ID Кинопоиска, а для сериала требует точный сезон и серию. Он возвращает
|
|
87
|
+
короткоживущие прямые MP4 в нескольких качествах. Ссылки привязаны к User-Agent проигрывающего
|
|
88
|
+
клиента и могут быть привязаны к внешнему IP. Передавайте точный User-Agent клиента через
|
|
89
|
+
`MediaEngineOperationOptions.playbackUserAgent`; для небраузерных клиентов нужное значение также
|
|
90
|
+
сохраняется в `access.headers` каждого варианта.
|
|
91
|
+
Rutube выполняет ограниченный точный поиск фильма по названию и году и возвращает только
|
|
92
|
+
официальный публичный embed-плеер Rutube. Прямые media-URL не извлекаются и не проксируются;
|
|
93
|
+
сериалы намеренно не поддерживаются.
|
|
94
|
+
|
|
95
|
+
Эти провайдеры возвращают сторонние ссылки или потоки. Media Engine не хранит видео, а внешний
|
|
96
|
+
плеер может быть недоступен в конкретной стране, сети или браузере.
|
|
97
|
+
|
|
98
|
+
## Поиск torrent-раздач
|
|
99
|
+
|
|
100
|
+
Torrent-провайдеры всегда подключаются явно:
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
import {
|
|
104
|
+
bitsearchTorrentProvider,
|
|
105
|
+
jacRedTorrentProvider,
|
|
106
|
+
magnetzTorrentProvider,
|
|
107
|
+
ytsTorrentProvider,
|
|
108
|
+
} from "@media-engine/providers";
|
|
109
|
+
|
|
110
|
+
const media = new MediaEngine({
|
|
111
|
+
torrentProviders: [
|
|
112
|
+
ytsTorrentProvider(),
|
|
113
|
+
jacRedTorrentProvider(),
|
|
114
|
+
bitsearchTorrentProvider(),
|
|
115
|
+
magnetzTorrentProvider(),
|
|
116
|
+
],
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const result = await media.discoverTorrents({
|
|
120
|
+
type: "movie",
|
|
121
|
+
title: "Начало",
|
|
122
|
+
year: 2010,
|
|
123
|
+
ids: { imdb: "tt1375666" },
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Поиск только возвращает список кандидатов и данные для дальнейшей передачи. Он не загружает
|
|
128
|
+
torrent metadata, не обращается к trackers, не подключается к раздаче и не воспроизводит файл.
|
|
68
129
|
|
|
69
|
-
|
|
130
|
+
Публичные источники могут меняться, ограничивать запросы или временно не работать. Оставляйте кэш
|
|
131
|
+
движка включённым и будьте готовы к частичным результатам. Настройки и границы безопасности каждого
|
|
132
|
+
источника описаны в
|
|
133
|
+
[документации провайдеров](https://github.com/Yaneart/media-engine/blob/main/docs/providers.md).
|
|
70
134
|
|
|
71
135
|
## Лицензия
|
|
72
136
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type ProviderContext } from "@media-engine/core";
|
|
2
|
+
import type { AniLibertyStreamingConfig } from "./config.js";
|
|
3
|
+
export interface AniLibertyReleaseName {
|
|
4
|
+
main?: string;
|
|
5
|
+
english?: string;
|
|
6
|
+
alternative?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface AniLibertyReleaseSummary {
|
|
9
|
+
id: number;
|
|
10
|
+
year: number;
|
|
11
|
+
name: AniLibertyReleaseName;
|
|
12
|
+
alias?: string;
|
|
13
|
+
blockedByGeo: boolean;
|
|
14
|
+
blockedByCopyrights: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface AniLibertyEpisode {
|
|
17
|
+
id: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
ordinal: number;
|
|
20
|
+
hls480?: string;
|
|
21
|
+
hls720?: string;
|
|
22
|
+
hls1080?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface AniLibertyRelease extends AniLibertyReleaseSummary {
|
|
25
|
+
episodes: AniLibertyEpisode[];
|
|
26
|
+
}
|
|
27
|
+
export declare function searchAniLibertyReleases(config: AniLibertyStreamingConfig, title: string, context: ProviderContext): Promise<AniLibertyReleaseSummary[]>;
|
|
28
|
+
export declare function loadAniLibertyRelease(config: AniLibertyStreamingConfig, releaseId: number, context: ProviderContext): Promise<{
|
|
29
|
+
release: AniLibertyRelease;
|
|
30
|
+
sourceUrl: string;
|
|
31
|
+
} | null>;
|
|
32
|
+
export declare function parseAniLibertySearchResponse(provider: string, value: unknown, limit: number): AniLibertyReleaseSummary[];
|
|
33
|
+
export declare function parseAniLibertyRelease(provider: string, value: unknown, episodeLimit: number): AniLibertyRelease;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { ProviderError } from "@media-engine/core";
|
|
2
|
+
import { fetchJson, getProviderHttpStatus } from "../shared/index.js";
|
|
3
|
+
const SEARCH_INCLUDE = [
|
|
4
|
+
"id",
|
|
5
|
+
"year",
|
|
6
|
+
"name",
|
|
7
|
+
"alias",
|
|
8
|
+
"is_blocked_by_geo",
|
|
9
|
+
"is_blocked_by_copyrights",
|
|
10
|
+
].join(",");
|
|
11
|
+
const RELEASE_INCLUDE = [
|
|
12
|
+
SEARCH_INCLUDE,
|
|
13
|
+
"episodes.id",
|
|
14
|
+
"episodes.name",
|
|
15
|
+
"episodes.ordinal",
|
|
16
|
+
"episodes.hls_480",
|
|
17
|
+
"episodes.hls_720",
|
|
18
|
+
"episodes.hls_1080",
|
|
19
|
+
].join(",");
|
|
20
|
+
export async function searchAniLibertyReleases(config, title, context) {
|
|
21
|
+
const url = new URL("/api/v1/app/search/releases", `${config.baseUrl}/`);
|
|
22
|
+
url.searchParams.set("query", title);
|
|
23
|
+
url.searchParams.set("include", SEARCH_INCLUDE);
|
|
24
|
+
const payload = await fetchJson({
|
|
25
|
+
provider: config.name,
|
|
26
|
+
url,
|
|
27
|
+
context,
|
|
28
|
+
fetch: config.fetch,
|
|
29
|
+
rateLimitGate: config.rateLimitGate,
|
|
30
|
+
maxResponseBytes: config.maxResponseBytes,
|
|
31
|
+
init: { headers: createHeaders(config) },
|
|
32
|
+
});
|
|
33
|
+
return parseAniLibertySearchResponse(config.name, payload, config.searchResultLimit);
|
|
34
|
+
}
|
|
35
|
+
export async function loadAniLibertyRelease(config, releaseId, context) {
|
|
36
|
+
const sourceUrl = new URL(`/api/v1/anime/releases/${releaseId}`, `${config.baseUrl}/`);
|
|
37
|
+
const requestUrl = new URL(sourceUrl);
|
|
38
|
+
requestUrl.searchParams.set("include", RELEASE_INCLUDE);
|
|
39
|
+
try {
|
|
40
|
+
const payload = await fetchJson({
|
|
41
|
+
provider: config.name,
|
|
42
|
+
url: requestUrl,
|
|
43
|
+
context,
|
|
44
|
+
fetch: config.fetch,
|
|
45
|
+
rateLimitGate: config.rateLimitGate,
|
|
46
|
+
maxResponseBytes: config.maxResponseBytes,
|
|
47
|
+
init: { headers: createHeaders(config) },
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
release: parseAniLibertyRelease(config.name, payload, config.episodeLimit),
|
|
51
|
+
sourceUrl: sourceUrl.href,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (getProviderHttpStatus(error) === 404)
|
|
56
|
+
return null;
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function parseAniLibertySearchResponse(provider, value, limit) {
|
|
61
|
+
if (!Array.isArray(value)) {
|
|
62
|
+
throw invalidResponse(provider);
|
|
63
|
+
}
|
|
64
|
+
const releases = value.slice(0, limit).flatMap((entry) => {
|
|
65
|
+
const release = parseReleaseSummary(entry);
|
|
66
|
+
return release ? [release] : [];
|
|
67
|
+
});
|
|
68
|
+
if (value.length > 0 && releases.length === 0) {
|
|
69
|
+
throw invalidResponse(provider);
|
|
70
|
+
}
|
|
71
|
+
return releases;
|
|
72
|
+
}
|
|
73
|
+
export function parseAniLibertyRelease(provider, value, episodeLimit) {
|
|
74
|
+
const summary = parseReleaseSummary(value);
|
|
75
|
+
if (!summary || !isRecord(value) || !Array.isArray(value.episodes)) {
|
|
76
|
+
throw invalidResponse(provider);
|
|
77
|
+
}
|
|
78
|
+
const episodes = value.episodes.slice(0, episodeLimit).flatMap((entry) => {
|
|
79
|
+
const episode = parseEpisode(entry);
|
|
80
|
+
return episode ? [episode] : [];
|
|
81
|
+
});
|
|
82
|
+
if (value.episodes.length > 0 && episodes.length === 0) {
|
|
83
|
+
throw invalidResponse(provider);
|
|
84
|
+
}
|
|
85
|
+
return { ...summary, episodes };
|
|
86
|
+
}
|
|
87
|
+
function parseReleaseSummary(value) {
|
|
88
|
+
if (!isRecord(value) || !isRecord(value.name))
|
|
89
|
+
return undefined;
|
|
90
|
+
const id = readInteger(value.id, 1, Number.MAX_SAFE_INTEGER);
|
|
91
|
+
const year = readInteger(value.year, 1_800, 3_000);
|
|
92
|
+
const main = readNullableString(value.name.main, 500);
|
|
93
|
+
const english = readNullableString(value.name.english, 500);
|
|
94
|
+
const alternative = readNullableString(value.name.alternative, 2_000);
|
|
95
|
+
const alias = readNullableString(value.alias, 500);
|
|
96
|
+
const blockedByGeo = readOptionalBoolean(value.is_blocked_by_geo);
|
|
97
|
+
const blockedByCopyrights = readOptionalBoolean(value.is_blocked_by_copyrights);
|
|
98
|
+
if (id === undefined ||
|
|
99
|
+
year === undefined ||
|
|
100
|
+
main === false ||
|
|
101
|
+
english === false ||
|
|
102
|
+
alternative === false ||
|
|
103
|
+
alias === false ||
|
|
104
|
+
blockedByGeo === undefined ||
|
|
105
|
+
blockedByCopyrights === undefined ||
|
|
106
|
+
(!main && !english)) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
id,
|
|
111
|
+
year,
|
|
112
|
+
name: {
|
|
113
|
+
...(main ? { main } : {}),
|
|
114
|
+
...(english ? { english } : {}),
|
|
115
|
+
...(alternative ? { alternative } : {}),
|
|
116
|
+
},
|
|
117
|
+
...(alias ? { alias } : {}),
|
|
118
|
+
blockedByGeo,
|
|
119
|
+
blockedByCopyrights,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function parseEpisode(value) {
|
|
123
|
+
if (!isRecord(value))
|
|
124
|
+
return undefined;
|
|
125
|
+
const id = readRequiredString(value.id, 200);
|
|
126
|
+
const ordinal = readFiniteNumber(value.ordinal, 0, 100_000);
|
|
127
|
+
const name = readNullableString(value.name, 500);
|
|
128
|
+
const hls480 = readNullableString(value.hls_480, 8_192);
|
|
129
|
+
const hls720 = readNullableString(value.hls_720, 8_192);
|
|
130
|
+
const hls1080 = readNullableString(value.hls_1080, 8_192);
|
|
131
|
+
if (!id ||
|
|
132
|
+
ordinal === undefined ||
|
|
133
|
+
name === false ||
|
|
134
|
+
hls480 === false ||
|
|
135
|
+
hls720 === false ||
|
|
136
|
+
hls1080 === false) {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
id,
|
|
141
|
+
ordinal,
|
|
142
|
+
...(name ? { name } : {}),
|
|
143
|
+
...(hls480 ? { hls480 } : {}),
|
|
144
|
+
...(hls720 ? { hls720 } : {}),
|
|
145
|
+
...(hls1080 ? { hls1080 } : {}),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function createHeaders(config) {
|
|
149
|
+
return {
|
|
150
|
+
Accept: "application/json",
|
|
151
|
+
"User-Agent": config.userAgent,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function readInteger(value, min, max) {
|
|
155
|
+
return Number.isSafeInteger(value) && Number(value) >= min && Number(value) <= max
|
|
156
|
+
? Number(value)
|
|
157
|
+
: undefined;
|
|
158
|
+
}
|
|
159
|
+
function readFiniteNumber(value, min, max) {
|
|
160
|
+
return typeof value === "number" && Number.isFinite(value) && value >= min && value <= max
|
|
161
|
+
? value
|
|
162
|
+
: undefined;
|
|
163
|
+
}
|
|
164
|
+
function readRequiredString(value, maxLength) {
|
|
165
|
+
return typeof value === "string" ? value.trim().slice(0, maxLength) || undefined : undefined;
|
|
166
|
+
}
|
|
167
|
+
function readNullableString(value, maxLength) {
|
|
168
|
+
if (value === null || value === undefined)
|
|
169
|
+
return undefined;
|
|
170
|
+
return typeof value === "string" ? value.trim().slice(0, maxLength) || undefined : false;
|
|
171
|
+
}
|
|
172
|
+
function readOptionalBoolean(value) {
|
|
173
|
+
if (value === null || value === undefined)
|
|
174
|
+
return false;
|
|
175
|
+
return typeof value === "boolean" ? value : undefined;
|
|
176
|
+
}
|
|
177
|
+
function isRecord(value) {
|
|
178
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
179
|
+
}
|
|
180
|
+
function invalidResponse(provider) {
|
|
181
|
+
return new ProviderError({
|
|
182
|
+
provider,
|
|
183
|
+
code: "PROVIDER_INVALID_RESPONSE",
|
|
184
|
+
message: `Provider "${provider}" returned an invalid AniLiberty response.`,
|
|
185
|
+
retryable: false,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/aniliberty-streaming/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { StreamingProviderCapabilities } from "@media-engine/core";
|
|
2
|
+
import { ProviderRateLimitGate, type ProviderFetch } from "../shared/index.js";
|
|
3
|
+
export interface AniLibertyStreamingProviderOptions {
|
|
4
|
+
name?: string;
|
|
5
|
+
version?: string;
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
fetch?: ProviderFetch;
|
|
8
|
+
maxResponseBytes?: number;
|
|
9
|
+
searchResultLimit?: number;
|
|
10
|
+
episodeLimit?: number;
|
|
11
|
+
userAgent?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface AniLibertyStreamingConfig {
|
|
14
|
+
name: string;
|
|
15
|
+
baseUrl: string;
|
|
16
|
+
fetch: ProviderFetch;
|
|
17
|
+
rateLimitGate: ProviderRateLimitGate;
|
|
18
|
+
maxResponseBytes: number;
|
|
19
|
+
searchResultLimit: number;
|
|
20
|
+
episodeLimit: number;
|
|
21
|
+
userAgent: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function createAniLibertyConfig(options: AniLibertyStreamingProviderOptions): AniLibertyStreamingConfig;
|
|
24
|
+
export declare function createAniLibertyCapabilities(): StreamingProviderCapabilities;
|