@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.
Files changed (259) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +85 -25
  3. package/README.ru.md +90 -26
  4. package/dist/aniliberty-streaming/client.d.ts +33 -0
  5. package/dist/aniliberty-streaming/client.js +188 -0
  6. package/dist/aniliberty-streaming/client.js.map +1 -0
  7. package/dist/aniliberty-streaming/config.d.ts +24 -0
  8. package/dist/aniliberty-streaming/config.js +61 -0
  9. package/dist/aniliberty-streaming/config.js.map +1 -0
  10. package/dist/aniliberty-streaming/index.d.ts +4 -0
  11. package/dist/aniliberty-streaming/index.js +45 -0
  12. package/dist/aniliberty-streaming/index.js.map +1 -0
  13. package/dist/aniliberty-streaming/mapping.d.ts +3 -0
  14. package/dist/aniliberty-streaming/mapping.js +87 -0
  15. package/dist/aniliberty-streaming/mapping.js.map +1 -0
  16. package/dist/aniliberty-streaming/matching.d.ts +4 -0
  17. package/dist/aniliberty-streaming/matching.js +44 -0
  18. package/dist/aniliberty-streaming/matching.js.map +1 -0
  19. package/dist/anilist/graphql.d.ts +2 -0
  20. package/dist/anilist/graphql.js +135 -0
  21. package/dist/anilist/graphql.js.map +1 -0
  22. package/dist/anilist/index.js +8 -6
  23. package/dist/anilist/index.js.map +1 -1
  24. package/dist/bitsearch-torrent/client.d.ts +19 -0
  25. package/dist/bitsearch-torrent/client.js +181 -0
  26. package/dist/bitsearch-torrent/client.js.map +1 -0
  27. package/dist/bitsearch-torrent/config.d.ts +26 -0
  28. package/dist/bitsearch-torrent/config.js +74 -0
  29. package/dist/bitsearch-torrent/config.js.map +1 -0
  30. package/dist/bitsearch-torrent/index.d.ts +4 -0
  31. package/dist/bitsearch-torrent/index.js +35 -0
  32. package/dist/bitsearch-torrent/index.js.map +1 -0
  33. package/dist/bitsearch-torrent/mapping.d.ts +3 -0
  34. package/dist/bitsearch-torrent/mapping.js +53 -0
  35. package/dist/bitsearch-torrent/mapping.js.map +1 -0
  36. package/dist/bitsearch-torrent/matching.d.ts +3 -0
  37. package/dist/bitsearch-torrent/matching.js +13 -0
  38. package/dist/bitsearch-torrent/matching.js.map +1 -0
  39. package/dist/bitsearch-torrent/quota.d.ts +9 -0
  40. package/dist/bitsearch-torrent/quota.js +53 -0
  41. package/dist/bitsearch-torrent/quota.js.map +1 -0
  42. package/dist/cinemeta/index.js +37 -12
  43. package/dist/cinemeta/index.js.map +1 -1
  44. package/dist/ddbb-streaming/client.d.ts +24 -0
  45. package/dist/ddbb-streaming/client.js +98 -0
  46. package/dist/ddbb-streaming/client.js.map +1 -0
  47. package/dist/ddbb-streaming/config.d.ts +31 -0
  48. package/dist/ddbb-streaming/config.js +67 -0
  49. package/dist/ddbb-streaming/config.js.map +1 -0
  50. package/dist/ddbb-streaming/index.d.ts +4 -0
  51. package/dist/ddbb-streaming/index.js +53 -0
  52. package/dist/ddbb-streaming/index.js.map +1 -0
  53. package/dist/ddbb-streaming/mapping.d.ts +8 -0
  54. package/dist/ddbb-streaming/mapping.js +164 -0
  55. package/dist/ddbb-streaming/mapping.js.map +1 -0
  56. package/dist/ddbb-streaming/validation.d.ts +3 -0
  57. package/dist/ddbb-streaming/validation.js +84 -0
  58. package/dist/ddbb-streaming/validation.js.map +1 -0
  59. package/dist/experimental-streaming/index.js +55 -0
  60. package/dist/experimental-streaming/index.js.map +1 -1
  61. package/dist/filmix-streaming/client.d.ts +36 -0
  62. package/dist/filmix-streaming/client.js +241 -0
  63. package/dist/filmix-streaming/client.js.map +1 -0
  64. package/dist/filmix-streaming/config.d.ts +42 -0
  65. package/dist/filmix-streaming/config.js +93 -0
  66. package/dist/filmix-streaming/config.js.map +1 -0
  67. package/dist/filmix-streaming/index.d.ts +4 -0
  68. package/dist/filmix-streaming/index.js +48 -0
  69. package/dist/filmix-streaming/index.js.map +1 -0
  70. package/dist/filmix-streaming/mapping.d.ts +3 -0
  71. package/dist/filmix-streaming/mapping.js +109 -0
  72. package/dist/filmix-streaming/mapping.js.map +1 -0
  73. package/dist/filmix-streaming/matching.d.ts +4 -0
  74. package/dist/filmix-streaming/matching.js +41 -0
  75. package/dist/filmix-streaming/matching.js.map +1 -0
  76. package/dist/flixhq-streaming/client.d.ts +12 -0
  77. package/dist/flixhq-streaming/client.js +103 -0
  78. package/dist/flixhq-streaming/client.js.map +1 -0
  79. package/dist/flixhq-streaming/index.d.ts +2 -2
  80. package/dist/flixhq-streaming/index.js +58 -104
  81. package/dist/flixhq-streaming/index.js.map +1 -1
  82. package/dist/imdb-dataset/index.d.ts +20 -5
  83. package/dist/imdb-dataset/index.js +82 -184
  84. package/dist/imdb-dataset/index.js.map +1 -1
  85. package/dist/imdb-dataset/memory-storage.d.ts +7 -0
  86. package/dist/imdb-dataset/memory-storage.js +168 -0
  87. package/dist/imdb-dataset/memory-storage.js.map +1 -0
  88. package/dist/imdb-dataset/sqlite-import.d.ts +24 -0
  89. package/dist/imdb-dataset/sqlite-import.js +301 -0
  90. package/dist/imdb-dataset/sqlite-import.js.map +1 -0
  91. package/dist/imdb-dataset/sqlite-runtime.d.ts +3 -0
  92. package/dist/imdb-dataset/sqlite-runtime.js +11 -0
  93. package/dist/imdb-dataset/sqlite-runtime.js.map +1 -0
  94. package/dist/imdb-dataset/sqlite-schema.d.ts +6 -0
  95. package/dist/imdb-dataset/sqlite-schema.js +88 -0
  96. package/dist/imdb-dataset/sqlite-schema.js.map +1 -0
  97. package/dist/imdb-dataset/sqlite-storage.d.ts +12 -0
  98. package/dist/imdb-dataset/sqlite-storage.js +208 -0
  99. package/dist/imdb-dataset/sqlite-storage.js.map +1 -0
  100. package/dist/imdb-dataset/storage.d.ts +33 -0
  101. package/dist/imdb-dataset/storage.js +2 -0
  102. package/dist/imdb-dataset/storage.js.map +1 -0
  103. package/dist/index.d.ts +11 -0
  104. package/dist/index.js +11 -0
  105. package/dist/index.js.map +1 -1
  106. package/dist/jacred-torrent/client.d.ts +24 -0
  107. package/dist/jacred-torrent/client.js +254 -0
  108. package/dist/jacred-torrent/client.js.map +1 -0
  109. package/dist/jacred-torrent/config.d.ts +24 -0
  110. package/dist/jacred-torrent/config.js +70 -0
  111. package/dist/jacred-torrent/config.js.map +1 -0
  112. package/dist/jacred-torrent/index.d.ts +4 -0
  113. package/dist/jacred-torrent/index.js +45 -0
  114. package/dist/jacred-torrent/index.js.map +1 -0
  115. package/dist/jacred-torrent/mapping.d.ts +3 -0
  116. package/dist/jacred-torrent/mapping.js +129 -0
  117. package/dist/jacred-torrent/mapping.js.map +1 -0
  118. package/dist/jacred-torrent/matching.d.ts +3 -0
  119. package/dist/jacred-torrent/matching.js +19 -0
  120. package/dist/jacred-torrent/matching.js.map +1 -0
  121. package/dist/kinobd/index.js +5 -6
  122. package/dist/kinobd/index.js.map +1 -1
  123. package/dist/kinobd-streaming/availability.js +52 -29
  124. package/dist/kinobd-streaming/availability.js.map +1 -1
  125. package/dist/kinobd-streaming/candidates.d.ts +3 -2
  126. package/dist/kinobd-streaming/candidates.js +89 -37
  127. package/dist/kinobd-streaming/candidates.js.map +1 -1
  128. package/dist/kinobd-streaming/config.d.ts +15 -0
  129. package/dist/kinobd-streaming/config.js +21 -17
  130. package/dist/kinobd-streaming/config.js.map +1 -1
  131. package/dist/kinobd-streaming/index.d.ts +1 -1
  132. package/dist/kinobd-streaming/index.js.map +1 -1
  133. package/dist/kinobd-streaming/players.d.ts +2 -1
  134. package/dist/kinobd-streaming/players.js +7 -7
  135. package/dist/kinobd-streaming/players.js.map +1 -1
  136. package/dist/kinobd-streaming/request-budget.d.ts +15 -0
  137. package/dist/kinobd-streaming/request-budget.js +61 -0
  138. package/dist/kinobd-streaming/request-budget.js.map +1 -0
  139. package/dist/kinobd-streaming/validation.d.ts +5 -3
  140. package/dist/kinobd-streaming/validation.js +78 -49
  141. package/dist/kinobd-streaming/validation.js.map +1 -1
  142. package/dist/magnetz-torrent/client.d.ts +16 -0
  143. package/dist/magnetz-torrent/client.js +235 -0
  144. package/dist/magnetz-torrent/client.js.map +1 -0
  145. package/dist/magnetz-torrent/config.d.ts +27 -0
  146. package/dist/magnetz-torrent/config.js +73 -0
  147. package/dist/magnetz-torrent/config.js.map +1 -0
  148. package/dist/magnetz-torrent/index.d.ts +4 -0
  149. package/dist/magnetz-torrent/index.js +35 -0
  150. package/dist/magnetz-torrent/index.js.map +1 -0
  151. package/dist/magnetz-torrent/mapping.d.ts +3 -0
  152. package/dist/magnetz-torrent/mapping.js +52 -0
  153. package/dist/magnetz-torrent/mapping.js.map +1 -0
  154. package/dist/magnetz-torrent/matching.d.ts +3 -0
  155. package/dist/magnetz-torrent/matching.js +5 -0
  156. package/dist/magnetz-torrent/matching.js.map +1 -0
  157. package/dist/magnetz-torrent/request-gate.d.ts +9 -0
  158. package/dist/magnetz-torrent/request-gate.js +48 -0
  159. package/dist/magnetz-torrent/request-gate.js.map +1 -0
  160. package/dist/package-version.d.ts +2 -0
  161. package/dist/package-version.js +5 -0
  162. package/dist/package-version.js.map +1 -0
  163. package/dist/rutube-streaming/client.d.ts +18 -0
  164. package/dist/rutube-streaming/client.js +106 -0
  165. package/dist/rutube-streaming/client.js.map +1 -0
  166. package/dist/rutube-streaming/config.d.ts +26 -0
  167. package/dist/rutube-streaming/config.js +57 -0
  168. package/dist/rutube-streaming/config.js.map +1 -0
  169. package/dist/rutube-streaming/index.d.ts +4 -0
  170. package/dist/rutube-streaming/index.js +38 -0
  171. package/dist/rutube-streaming/index.js.map +1 -0
  172. package/dist/rutube-streaming/mapping.d.ts +4 -0
  173. package/dist/rutube-streaming/mapping.js +32 -0
  174. package/dist/rutube-streaming/mapping.js.map +1 -0
  175. package/dist/rutube-streaming/matching.d.ts +2 -0
  176. package/dist/rutube-streaming/matching.js +37 -0
  177. package/dist/rutube-streaming/matching.js.map +1 -0
  178. package/dist/shared/abort.d.ts +1 -0
  179. package/dist/shared/abort.js +22 -0
  180. package/dist/shared/abort.js.map +1 -1
  181. package/dist/shared/http.d.ts +8 -2
  182. package/dist/shared/http.js +37 -67
  183. package/dist/shared/http.js.map +1 -1
  184. package/dist/shared/index.d.ts +1 -0
  185. package/dist/shared/index.js +1 -0
  186. package/dist/shared/index.js.map +1 -1
  187. package/dist/shared/mapping.js +3 -1
  188. package/dist/shared/mapping.js.map +1 -1
  189. package/dist/shared/output-url.d.ts +2 -0
  190. package/dist/shared/output-url.js +50 -0
  191. package/dist/shared/output-url.js.map +1 -0
  192. package/dist/shared/rate-limit.js +2 -18
  193. package/dist/shared/rate-limit.js.map +1 -1
  194. package/dist/shared/response-body.d.ts +6 -0
  195. package/dist/shared/response-body.js +109 -0
  196. package/dist/shared/response-body.js.map +1 -0
  197. package/dist/shared/safe-fetch.d.ts +16 -0
  198. package/dist/shared/safe-fetch.js +300 -0
  199. package/dist/shared/safe-fetch.js.map +1 -0
  200. package/dist/shared/torrent-release-matching.d.ts +7 -0
  201. package/dist/shared/torrent-release-matching.js +143 -0
  202. package/dist/shared/torrent-release-matching.js.map +1 -0
  203. package/dist/shared/torrent-release-metadata.d.ts +4 -0
  204. package/dist/shared/torrent-release-metadata.js +95 -0
  205. package/dist/shared/torrent-release-metadata.js.map +1 -0
  206. package/dist/shikimori/index.js +4 -7
  207. package/dist/shikimori/index.js.map +1 -1
  208. package/dist/tvmaze/index.d.ts +11 -0
  209. package/dist/tvmaze/index.js +274 -0
  210. package/dist/tvmaze/index.js.map +1 -0
  211. package/dist/veoveo-streaming/client.d.ts +28 -0
  212. package/dist/veoveo-streaming/client.js +212 -0
  213. package/dist/veoveo-streaming/client.js.map +1 -0
  214. package/dist/veoveo-streaming/config.d.ts +32 -0
  215. package/dist/veoveo-streaming/config.js +67 -0
  216. package/dist/veoveo-streaming/config.js.map +1 -0
  217. package/dist/veoveo-streaming/index.d.ts +4 -0
  218. package/dist/veoveo-streaming/index.js +46 -0
  219. package/dist/veoveo-streaming/index.js.map +1 -0
  220. package/dist/veoveo-streaming/mapping.d.ts +3 -0
  221. package/dist/veoveo-streaming/mapping.js +121 -0
  222. package/dist/veoveo-streaming/mapping.js.map +1 -0
  223. package/dist/videohub-streaming/client.d.ts +33 -0
  224. package/dist/videohub-streaming/client.js +208 -0
  225. package/dist/videohub-streaming/client.js.map +1 -0
  226. package/dist/videohub-streaming/config.d.ts +34 -0
  227. package/dist/videohub-streaming/config.js +73 -0
  228. package/dist/videohub-streaming/config.js.map +1 -0
  229. package/dist/videohub-streaming/index.d.ts +4 -0
  230. package/dist/videohub-streaming/index.js +53 -0
  231. package/dist/videohub-streaming/index.js.map +1 -0
  232. package/dist/videohub-streaming/mapping.d.ts +3 -0
  233. package/dist/videohub-streaming/mapping.js +84 -0
  234. package/dist/videohub-streaming/mapping.js.map +1 -0
  235. package/dist/wikidata/cache.d.ts +11 -0
  236. package/dist/wikidata/cache.js +30 -0
  237. package/dist/wikidata/cache.js.map +1 -0
  238. package/dist/wikidata/candidates.d.ts +12 -0
  239. package/dist/wikidata/candidates.js +67 -0
  240. package/dist/wikidata/candidates.js.map +1 -0
  241. package/dist/wikidata/client.d.ts +40 -0
  242. package/dist/wikidata/client.js +224 -0
  243. package/dist/wikidata/client.js.map +1 -0
  244. package/dist/wikidata/index.d.ts +3 -0
  245. package/dist/wikidata/index.js +30 -104
  246. package/dist/wikidata/index.js.map +1 -1
  247. package/dist/yts-torrent/client.d.ts +25 -0
  248. package/dist/yts-torrent/client.js +163 -0
  249. package/dist/yts-torrent/client.js.map +1 -0
  250. package/dist/yts-torrent/config.d.ts +22 -0
  251. package/dist/yts-torrent/config.js +57 -0
  252. package/dist/yts-torrent/config.js.map +1 -0
  253. package/dist/yts-torrent/index.d.ts +4 -0
  254. package/dist/yts-torrent/index.js +42 -0
  255. package/dist/yts-torrent/index.js.map +1 -0
  256. package/dist/yts-torrent/mapping.d.ts +4 -0
  257. package/dist/yts-torrent/mapping.js +107 -0
  258. package/dist/yts-torrent/mapping.js.map +1 -0
  259. 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 this package when you do not want to write your own provider adapters.
8
+ ## Install
8
9
 
9
10
  ```bash
10
11
  npm install @media-engine/core @media-engine/providers
11
12
  ```
12
13
 
13
- ## A small setup
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
- flixHqStreamingProvider,
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: [kinobdProvider(), shikimoriProvider(), aniListProvider()],
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
- Add only the providers that make sense for your application. Media Engine will call compatible ones and merge matching answers.
39
+ Connect only the sources your application needs. The engine calls suitable providers and merges
40
+ matching results for you.
33
41
 
34
- ## Available metadata sources
42
+ Available metadata providers:
35
43
 
36
- - `kinobdProvider()` localized movie and series data;
37
- - `cinemetaProvider()` IMDb-linked movie and series data;
38
- - `shikimoriProvider()` anime search and details;
39
- - `aniListProvider()` international anime titles, popularity, and artwork;
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
- None of these built-in providers needs your API key. TMDB IDs may appear in results, but this package does not call the TMDB API.
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
- ## Player sources
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
- - `kinobdStreamingProvider()` — movie, series, and anime player options;
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
- These are third-party player targets, not videos hosted by Media Engine. Availability depends on the upstream source and the user's environment.
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
- Provider options, limitations, and safety rules are summarized in the [provider guide](https://github.com/Yaneart/media-engine/blob/main/docs/providers.md).
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
- Готовые источники данных для Media Engine.
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
- flixHqStreamingProvider,
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: [kinobdProvider(), shikimoriProvider(), aniListProvider()],
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
- Подключайте только те провайдеры, которые нужны вашему приложению. Media Engine сам вызовет подходящие и объединит совпадающие ответы.
39
+ Подключайте только те источники, которые нужны вашему приложению. Движок сам вызовет подходящие
40
+ провайдеры и объединит совпадающие результаты.
33
41
 
34
- ## Провайдеры метаданных
42
+ Готовые провайдеры метаданных:
35
43
 
36
- - `kinobdProvider()` локализованные данные фильмов и сериалов;
37
- - `cinemetaProvider()` — данные фильмов и сериалов, связанные с IMDb;
38
- - `shikimoriProvider()` поиск и детали аниме;
39
- - `aniListProvider()` международные названия аниме, популярность и изображения;
40
- - `wikidataProvider()` — обогащение открытыми структурированными данными;
41
- - `imdbDatasetProvider()` — локальные TSV-датасеты IMDb, переданные приложением.
44
+ - `kinobdProvider()` и `cinemetaProvider()` для фильмов и сериалов;
45
+ - `shikimoriProvider()` и `aniListProvider()` для аниме;
46
+ - `tvMazeProvider()` и `wikidataProvider()` как дополнительные источники идентичности;
47
+ - `imdbDatasetProvider()` для IMDb-датасета, которым управляет ваше приложение.
42
48
 
43
- Для встроенных провайдеров не нужен ваш API-ключ. TMDB ID может встретиться в результате, но сам пакет не обращается к TMDB API.
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
- - `kinobdStreamingProvider()` варианты плееров для фильмов, сериалов и аниме;
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: "Game of Thrones",
69
+ title: "Игра престолов",
62
70
  seasonNumber: 1,
63
71
  episodeNumber: 1,
64
72
  });
65
73
  ```
66
74
 
67
- Это ссылки на сторонние плееры, а не видео, размещённые Media Engine. Доступность зависит от внешнего источника и окружения пользователя.
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
- Настройки, ограничения и правила безопасности кратко описаны в [документации провайдеров](https://github.com/Yaneart/media-engine/blob/main/docs/providers.md).
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;