@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
@@ -0,0 +1,208 @@
1
+ import { resolve } from "node:path";
2
+ import { createImdbSqliteDatabase } from "./sqlite-runtime.js";
3
+ import { IMDB_DATASET_SQLITE_SCHEMA_VERSION as SQLITE_SCHEMA_VERSION, validateImdbDatasetSqliteSchema, } from "./sqlite-schema.js";
4
+ export const IMDB_DATASET_SQLITE_SCHEMA_VERSION = SQLITE_SCHEMA_VERSION;
5
+ const DEFAULT_BUSY_TIMEOUT_MS = 1_000;
6
+ const MAX_BUSY_TIMEOUT_MS = 60_000;
7
+ const SELECT_COLUMNS = `
8
+ t.imdb_id,
9
+ t.media_type,
10
+ t.primary_title,
11
+ t.original_title,
12
+ t.start_year,
13
+ t.end_year,
14
+ t.runtime_minutes,
15
+ t.genres,
16
+ t.normalized_primary_title,
17
+ t.normalized_original_title,
18
+ r.average_rating,
19
+ r.num_votes
20
+ `;
21
+ const LOOKUP_SQL = `
22
+ SELECT ${SELECT_COLUMNS}
23
+ FROM titles AS t
24
+ LEFT JOIN ratings AS r ON r.imdb_id = t.imdb_id
25
+ WHERE t.imdb_id = ?
26
+ `;
27
+ const SEARCH_SQL = `
28
+ SELECT ${SELECT_COLUMNS}
29
+ FROM title_search
30
+ JOIN titles AS t ON t.id = title_search.rowid
31
+ LEFT JOIN ratings AS r ON r.imdb_id = t.imdb_id
32
+ WHERE title_search MATCH ?
33
+ AND (? IS NULL OR t.media_type = ?)
34
+ AND (? IS NULL OR t.start_year = ?)
35
+ ORDER BY
36
+ CASE
37
+ WHEN t.normalized_primary_title = ? OR t.normalized_original_title = ? THEN 0
38
+ ELSE 1
39
+ END,
40
+ COALESCE(t.start_year, 0) DESC,
41
+ t.imdb_id ASC
42
+ LIMIT ?
43
+ `;
44
+ const PREFIX_SEARCH_SQL = `
45
+ SELECT ${SELECT_COLUMNS}
46
+ FROM titles AS t
47
+ LEFT JOIN ratings AS r ON r.imdb_id = t.imdb_id
48
+ WHERE (
49
+ t.normalized_primary_title GLOB ?
50
+ OR t.normalized_original_title GLOB ?
51
+ )
52
+ AND (? IS NULL OR t.media_type = ?)
53
+ AND (? IS NULL OR t.start_year = ?)
54
+ ORDER BY
55
+ CASE
56
+ WHEN t.normalized_primary_title = ? OR t.normalized_original_title = ? THEN 0
57
+ ELSE 1
58
+ END,
59
+ COALESCE(t.start_year, 0) DESC,
60
+ t.imdb_id ASC
61
+ LIMIT ?
62
+ `;
63
+ // Opens a read-only persisted IMDb index without affecting the legacy TSV path.
64
+ // Открывает read-only постоянный IMDb index, не затрагивая прежний TSV-путь.
65
+ export async function openImdbDatasetSqliteStorage(options) {
66
+ const path = resolveRequiredPath(options.path, "IMDb SQLite index path");
67
+ const timeout = resolveBusyTimeout(options.busyTimeoutMs);
68
+ const database = await createImdbSqliteDatabase(path, {
69
+ readOnly: true,
70
+ enableForeignKeyConstraints: true,
71
+ enableDoubleQuotedStringLiterals: false,
72
+ allowExtension: false,
73
+ });
74
+ try {
75
+ validateImdbDatasetSqliteSchema(database);
76
+ database.exec(`PRAGMA query_only = ON; PRAGMA busy_timeout = ${timeout}; PRAGMA cache_size = -8192; PRAGMA trusted_schema = OFF;`);
77
+ return new SqliteStorage(database, path);
78
+ }
79
+ catch (error) {
80
+ database.close();
81
+ throw error;
82
+ }
83
+ }
84
+ class SqliteStorage {
85
+ schemaVersion = SQLITE_SCHEMA_VERSION;
86
+ path;
87
+ database;
88
+ lookupStatement;
89
+ searchStatement;
90
+ prefixSearchStatement;
91
+ closed = false;
92
+ constructor(database, path) {
93
+ this.database = database;
94
+ this.path = path;
95
+ this.lookupStatement = database.prepare(LOOKUP_SQL);
96
+ this.searchStatement = database.prepare(SEARCH_SQL);
97
+ this.prefixSearchStatement = database.prepare(PREFIX_SEARCH_SQL);
98
+ }
99
+ getTitleById(imdbId, options) {
100
+ this.assertOpen();
101
+ options?.signal?.throwIfAborted();
102
+ const row = this.lookupStatement.get(imdbId);
103
+ options?.signal?.throwIfAborted();
104
+ return row ? mapRow(row) : undefined;
105
+ }
106
+ searchTitles(query) {
107
+ this.assertOpen();
108
+ query.signal?.throwIfAborted();
109
+ const prefixRows = this.prefixSearchStatement.all(`${query.normalizedTitle}*`, `${query.normalizedTitle}*`, query.type ?? null, query.type ?? null, query.year ?? null, query.year ?? null, query.normalizedTitle, query.normalizedTitle, query.limit);
110
+ const hasExactMatch = prefixRows.some((row) => isExactRow(row, query.normalizedTitle));
111
+ let rows = prefixRows;
112
+ if (!hasExactMatch &&
113
+ prefixRows.length < query.limit &&
114
+ [...query.normalizedTitle].length >= 3) {
115
+ const substringRows = this.searchStatement.all(quoteFtsPhrase(query.normalizedTitle), query.type ?? null, query.type ?? null, query.year ?? null, query.year ?? null, query.normalizedTitle, query.normalizedTitle, query.limit);
116
+ rows = mergeSearchRows(prefixRows, substringRows, query.limit);
117
+ }
118
+ query.signal?.throwIfAborted();
119
+ return rows.map((row) => ({
120
+ record: mapRow(row),
121
+ confidence: isExactRow(row, query.normalizedTitle) ? 1 : 0.75,
122
+ }));
123
+ }
124
+ close() {
125
+ if (this.closed) {
126
+ return;
127
+ }
128
+ this.database.close();
129
+ this.closed = true;
130
+ }
131
+ assertOpen() {
132
+ if (this.closed) {
133
+ throw new Error("IMDb SQLite storage is closed");
134
+ }
135
+ }
136
+ }
137
+ function mergeSearchRows(prefixRows, substringRows, limit) {
138
+ const merged = new Map();
139
+ for (const row of [...prefixRows, ...substringRows]) {
140
+ const imdbId = readRequiredString(row.imdb_id, "imdb_id");
141
+ if (!merged.has(imdbId)) {
142
+ merged.set(imdbId, row);
143
+ }
144
+ }
145
+ return [...merged.values()]
146
+ .sort((left, right) => (readOptionalNumber(right.start_year) ?? 0) - (readOptionalNumber(left.start_year) ?? 0) ||
147
+ readRequiredString(left.imdb_id, "imdb_id").localeCompare(readRequiredString(right.imdb_id, "imdb_id")))
148
+ .slice(0, limit);
149
+ }
150
+ function isExactRow(row, normalizedTitle) {
151
+ return (row.normalized_primary_title === normalizedTitle ||
152
+ row.normalized_original_title === normalizedTitle);
153
+ }
154
+ function mapRow(row) {
155
+ const imdbId = readRequiredString(row.imdb_id, "imdb_id");
156
+ const mediaType = readRequiredString(row.media_type, "media_type");
157
+ const primaryTitle = readRequiredString(row.primary_title, "primary_title");
158
+ if (mediaType !== "movie" && mediaType !== "series") {
159
+ throw new Error(`Invalid IMDb SQLite media type for ${imdbId}`);
160
+ }
161
+ const rating = readOptionalNumber(row.average_rating);
162
+ const genres = readOptionalString(row.genres);
163
+ return {
164
+ imdbId,
165
+ type: mediaType,
166
+ primaryTitle,
167
+ originalTitle: readOptionalString(row.original_title),
168
+ startYear: readOptionalNumber(row.start_year),
169
+ endYear: readOptionalNumber(row.end_year),
170
+ runtimeMinutes: readOptionalNumber(row.runtime_minutes),
171
+ genres: genres?.split(",").filter(Boolean),
172
+ rating: rating === undefined
173
+ ? undefined
174
+ : {
175
+ averageRating: rating,
176
+ numVotes: readOptionalNumber(row.num_votes),
177
+ },
178
+ };
179
+ }
180
+ function quoteFtsPhrase(value) {
181
+ return `"${value.replaceAll('"', '""')}"`;
182
+ }
183
+ function readRequiredString(value, column) {
184
+ if (typeof value !== "string" || !value) {
185
+ throw new Error(`Invalid IMDb SQLite ${column} value`);
186
+ }
187
+ return value;
188
+ }
189
+ function readOptionalString(value) {
190
+ return typeof value === "string" && value ? value : undefined;
191
+ }
192
+ function readOptionalNumber(value) {
193
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
194
+ }
195
+ function resolveRequiredPath(value, name) {
196
+ if (typeof value !== "string" || !value.trim()) {
197
+ throw new TypeError(`${name} must be a non-empty string`);
198
+ }
199
+ return resolve(value);
200
+ }
201
+ function resolveBusyTimeout(value) {
202
+ const resolved = value ?? DEFAULT_BUSY_TIMEOUT_MS;
203
+ if (!Number.isSafeInteger(resolved) || resolved < 0 || resolved > MAX_BUSY_TIMEOUT_MS) {
204
+ throw new RangeError(`IMDb SQLite busyTimeoutMs must be between 0 and ${MAX_BUSY_TIMEOUT_MS}`);
205
+ }
206
+ return resolved;
207
+ }
208
+ //# sourceMappingURL=sqlite-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-storage.js","sourceRoot":"","sources":["../../src/imdb-dataset/sqlite-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface ImdbDatasetRatingRecord {
2
+ readonly averageRating: number;
3
+ readonly numVotes?: number;
4
+ }
5
+ export interface ImdbDatasetTitleRecord {
6
+ readonly imdbId: string;
7
+ readonly type: "movie" | "series";
8
+ readonly primaryTitle: string;
9
+ readonly originalTitle?: string;
10
+ readonly startYear?: number;
11
+ readonly endYear?: number;
12
+ readonly runtimeMinutes?: number;
13
+ readonly genres?: readonly string[];
14
+ readonly rating?: ImdbDatasetRatingRecord;
15
+ }
16
+ export interface ImdbDatasetStorageLookupOptions {
17
+ readonly signal?: AbortSignal;
18
+ }
19
+ export interface ImdbDatasetStorageSearchQuery {
20
+ readonly normalizedTitle: string;
21
+ readonly type?: "movie" | "series";
22
+ readonly year?: number;
23
+ readonly limit: number;
24
+ readonly signal?: AbortSignal;
25
+ }
26
+ export interface ImdbDatasetStorageSearchResult {
27
+ readonly record: ImdbDatasetTitleRecord;
28
+ readonly confidence: number;
29
+ }
30
+ export interface ImdbDatasetStorage {
31
+ getTitleById(imdbId: string, options?: ImdbDatasetStorageLookupOptions): ImdbDatasetTitleRecord | undefined | Promise<ImdbDatasetTitleRecord | undefined>;
32
+ searchTitles(query: ImdbDatasetStorageSearchQuery): readonly ImdbDatasetStorageSearchResult[] | Promise<readonly ImdbDatasetStorageSearchResult[]>;
33
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/imdb-dataset/storage.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -4,7 +4,18 @@ export * from "./cinemeta/index.js";
4
4
  export * from "./shikimori/index.js";
5
5
  export * from "./anilist/index.js";
6
6
  export * from "./wikidata/index.js";
7
+ export * from "./tvmaze/index.js";
7
8
  export * from "./imdb-dataset/index.js";
8
9
  export * from "./experimental-streaming/index.js";
9
10
  export * from "./kinobd-streaming/index.js";
10
11
  export * from "./flixhq-streaming/index.js";
12
+ export * from "./ddbb-streaming/index.js";
13
+ export * from "./aniliberty-streaming/index.js";
14
+ export * from "./filmix-streaming/index.js";
15
+ export * from "./veoveo-streaming/index.js";
16
+ export * from "./videohub-streaming/index.js";
17
+ export * from "./rutube-streaming/index.js";
18
+ export * from "./yts-torrent/index.js";
19
+ export * from "./jacred-torrent/index.js";
20
+ export * from "./bitsearch-torrent/index.js";
21
+ export * from "./magnetz-torrent/index.js";
package/dist/index.js CHANGED
@@ -4,8 +4,19 @@ export * from "./cinemeta/index.js";
4
4
  export * from "./shikimori/index.js";
5
5
  export * from "./anilist/index.js";
6
6
  export * from "./wikidata/index.js";
7
+ export * from "./tvmaze/index.js";
7
8
  export * from "./imdb-dataset/index.js";
8
9
  export * from "./experimental-streaming/index.js";
9
10
  export * from "./kinobd-streaming/index.js";
10
11
  export * from "./flixhq-streaming/index.js";
12
+ export * from "./ddbb-streaming/index.js";
13
+ export * from "./aniliberty-streaming/index.js";
14
+ export * from "./filmix-streaming/index.js";
15
+ export * from "./veoveo-streaming/index.js";
16
+ export * from "./videohub-streaming/index.js";
17
+ export * from "./rutube-streaming/index.js";
18
+ export * from "./yts-torrent/index.js";
19
+ export * from "./jacred-torrent/index.js";
20
+ export * from "./bitsearch-torrent/index.js";
21
+ export * from "./magnetz-torrent/index.js";
11
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type ProviderContext, type TorrentDiscoveryQuery } from "@media-engine/core";
2
+ import type { JacRedTorrentConfig } from "./config.js";
3
+ export interface JacRedTorrentRelease {
4
+ title: string;
5
+ tracker: string;
6
+ name: string;
7
+ originalName?: string;
8
+ year: number;
9
+ categories: string[];
10
+ seasons: number[];
11
+ quality?: number;
12
+ qualityLabel?: string;
13
+ videoType?: string;
14
+ sizeBytes?: number;
15
+ seeders?: number;
16
+ peers?: number;
17
+ createdAt?: string;
18
+ infoHash: string;
19
+ sourceUrl?: string;
20
+ }
21
+ export declare function searchJacRedTorrents(config: JacRedTorrentConfig, query: TorrentDiscoveryQuery, context: ProviderContext): Promise<JacRedTorrentRelease[]>;
22
+ export declare function createJacRedTorrentSearchUrl(config: Pick<JacRedTorrentConfig, "baseUrl" | "searchPath" | "resultLimit">, query: TorrentDiscoveryQuery): URL;
23
+ export declare function selectJacRedTorrentSearchTitle(query: TorrentDiscoveryQuery): string;
24
+ export declare function parseJacRedTorrentResponse(provider: string, value: unknown, resultLimit: number): JacRedTorrentRelease[];
@@ -0,0 +1,254 @@
1
+ import { ProviderError, } from "@media-engine/core";
2
+ import { fetchJson, normalizeProviderOutputUrl } from "../shared/index.js";
3
+ const INFO_HASH = /^[a-f\d]{40}$/iu;
4
+ const CONTROL_CHARACTERS = /[\u0000-\u001f\u007f]/u;
5
+ const MAX_MAGNET_LENGTH = 16_384;
6
+ export async function searchJacRedTorrents(config, query, context) {
7
+ const url = createJacRedTorrentSearchUrl(config, query);
8
+ const payload = await fetchJson({
9
+ provider: config.name,
10
+ url,
11
+ context,
12
+ fetch: config.fetch,
13
+ rateLimitGate: config.rateLimitGate,
14
+ maxResponseBytes: config.maxResponseBytes,
15
+ init: {
16
+ headers: {
17
+ Accept: "application/json",
18
+ "User-Agent": config.userAgent,
19
+ },
20
+ },
21
+ });
22
+ return parseJacRedTorrentResponse(config.name, payload, config.resultLimit);
23
+ }
24
+ export function createJacRedTorrentSearchUrl(config, query) {
25
+ const url = new URL(config.searchPath, `${config.baseUrl}/`);
26
+ url.searchParams.set("query", selectJacRedTorrentSearchTitle(query));
27
+ url.searchParams.set("year", String(query.year));
28
+ url.searchParams.set("exact", "true");
29
+ url.searchParams.set("sort", "sid");
30
+ url.searchParams.set("category", mapQueryCategory(query.type));
31
+ url.searchParams.set("limit", String(config.resultLimit));
32
+ if (query.seasonNumber !== undefined) {
33
+ url.searchParams.set("season", String(query.seasonNumber));
34
+ }
35
+ return url;
36
+ }
37
+ // JacRed is a Russian-language catalog, so prefer a known Cyrillic alias while retaining the
38
+ // canonical title in the query for other torrent providers and exact session rediscovery.
39
+ export function selectJacRedTorrentSearchTitle(query) {
40
+ const titles = [query.title, ...(query.alternativeTitles ?? [])]
41
+ .map((title) => title?.trim())
42
+ .filter((title) => Boolean(title));
43
+ return titles.find((title) => /[а-яё]/iu.test(title)) ?? titles[0];
44
+ }
45
+ export function parseJacRedTorrentResponse(provider, value, resultLimit) {
46
+ if (!isRecord(value))
47
+ throw invalidResponse(provider);
48
+ const query = readString(value.query, 500);
49
+ const total = readInteger(value.total, 0, Number.MAX_SAFE_INTEGER);
50
+ const loaded = readInteger(value.loaded, 0, Number.MAX_SAFE_INTEGER);
51
+ const limit = readInteger(value.limit, 1, 10_000);
52
+ const rawResults = value.results;
53
+ if (!query ||
54
+ total === undefined ||
55
+ loaded === undefined ||
56
+ limit === undefined ||
57
+ typeof value.open !== "boolean" ||
58
+ !Array.isArray(rawResults)) {
59
+ throw invalidResponse(provider);
60
+ }
61
+ if (!value.open) {
62
+ throw new ProviderError({
63
+ provider,
64
+ code: "PROVIDER_UNAVAILABLE",
65
+ message: `Provider "${provider}" public JacRed search is closed.`,
66
+ retryable: true,
67
+ });
68
+ }
69
+ if (total > 0 && rawResults.length === 0)
70
+ throw invalidResponse(provider);
71
+ let validRecords = 0;
72
+ const releases = [];
73
+ for (const rawResult of rawResults.slice(0, resultLimit)) {
74
+ const parsed = parseRelease(rawResult);
75
+ if (parsed !== false) {
76
+ validRecords += 1;
77
+ if (parsed)
78
+ releases.push(parsed);
79
+ }
80
+ }
81
+ if (rawResults.length > 0 && validRecords === 0)
82
+ throw invalidResponse(provider);
83
+ return releases;
84
+ }
85
+ function parseRelease(value) {
86
+ if (!isRecord(value))
87
+ return false;
88
+ const id = readString(value.id, 100);
89
+ const title = readString(value.title, 2_000);
90
+ const tracker = readString(value.tracker, 100);
91
+ const name = readString(value.name, 500);
92
+ const originalName = readOptionalString(value.original_name, 500);
93
+ const year = readInteger(value.year, 1_800, 3_000);
94
+ const categories = readStringArray(value.categories, 20, 80);
95
+ const seasons = readIntegerArray(value.seasons, 100, 0, 10_000);
96
+ const quality = readOptionalQuality(value.quality);
97
+ const qualityLabel = readOptionalString(value.quality_label, 80);
98
+ const videoType = readOptionalString(value.video_type, 80);
99
+ const voices = readOptionalStringArray(value.voices, 50, 120);
100
+ const sizeBytes = readOptionalInteger(value.size, 0, Number.MAX_SAFE_INTEGER);
101
+ const seeders = readOptionalInteger(value.seeders, 0, Number.MAX_SAFE_INTEGER);
102
+ const peers = readOptionalInteger(value.peers, 0, Number.MAX_SAFE_INTEGER);
103
+ const createdAt = readOptionalDate(value.created_at);
104
+ const updatedAt = readOptionalDate(value.updated_at);
105
+ const sourceUrl = readOptionalUrl(value.source_url);
106
+ if (!id ||
107
+ !title ||
108
+ !tracker ||
109
+ !/^[a-z\d][a-z\d_-]{0,99}$/iu.test(tracker) ||
110
+ !name ||
111
+ originalName === false ||
112
+ year === undefined ||
113
+ categories === false ||
114
+ seasons === false ||
115
+ quality === false ||
116
+ qualityLabel === false ||
117
+ videoType === false ||
118
+ voices === false ||
119
+ sizeBytes === false ||
120
+ seeders === false ||
121
+ peers === false ||
122
+ createdAt === false ||
123
+ updatedAt === false ||
124
+ sourceUrl === false ||
125
+ typeof value.magnet_available !== "boolean") {
126
+ return false;
127
+ }
128
+ if (!value.magnet_available)
129
+ return undefined;
130
+ const magnet = readString(value.magnet, MAX_MAGNET_LENGTH);
131
+ const infoHash = magnet ? extractMagnetInfoHash(magnet) : undefined;
132
+ if (!infoHash)
133
+ return false;
134
+ return {
135
+ title,
136
+ tracker: tracker.toLowerCase(),
137
+ name,
138
+ ...(originalName ? { originalName } : {}),
139
+ year,
140
+ categories,
141
+ seasons,
142
+ ...(quality !== undefined ? { quality } : {}),
143
+ ...(qualityLabel ? { qualityLabel } : {}),
144
+ ...(videoType ? { videoType } : {}),
145
+ ...(sizeBytes !== undefined ? { sizeBytes } : {}),
146
+ ...(seeders !== undefined ? { seeders } : {}),
147
+ ...(peers !== undefined ? { peers } : {}),
148
+ ...(createdAt ? { createdAt } : {}),
149
+ infoHash,
150
+ ...(sourceUrl ? { sourceUrl } : {}),
151
+ };
152
+ }
153
+ function extractMagnetInfoHash(value) {
154
+ if (CONTROL_CHARACTERS.test(value))
155
+ return undefined;
156
+ try {
157
+ const url = new URL(value);
158
+ if (url.protocol !== "magnet:")
159
+ return undefined;
160
+ const hashes = url.searchParams
161
+ .getAll("xt")
162
+ .flatMap((entry) => {
163
+ const match = /^urn:btih:([a-f\d]{40})$/iu.exec(entry);
164
+ return match?.[1] ? [match[1].toUpperCase()] : [];
165
+ })
166
+ .filter((hash, index, values) => values.indexOf(hash) === index);
167
+ return hashes.length === 1 && INFO_HASH.test(hashes[0]) ? hashes[0] : undefined;
168
+ }
169
+ catch {
170
+ return undefined;
171
+ }
172
+ }
173
+ function mapQueryCategory(type) {
174
+ if (type === "movie")
175
+ return "movie";
176
+ if (type === "series")
177
+ return "serial";
178
+ return "anime";
179
+ }
180
+ function readString(value, maxLength) {
181
+ return typeof value === "string" && !CONTROL_CHARACTERS.test(value)
182
+ ? value.trim().slice(0, maxLength) || undefined
183
+ : undefined;
184
+ }
185
+ function readOptionalString(value, maxLength) {
186
+ if (value === null || value === undefined)
187
+ return undefined;
188
+ if (typeof value !== "string" || CONTROL_CHARACTERS.test(value))
189
+ return false;
190
+ return value.trim().slice(0, maxLength) || undefined;
191
+ }
192
+ function readStringArray(value, maxItems, maxLength) {
193
+ if (!Array.isArray(value) || value.length > maxItems)
194
+ return false;
195
+ const strings = value.map((entry) => readString(entry, maxLength));
196
+ return strings.some((entry) => entry === undefined) ? false : strings;
197
+ }
198
+ function readOptionalStringArray(value, maxItems, maxLength) {
199
+ if (value === null || value === undefined)
200
+ return [];
201
+ return readStringArray(value, maxItems, maxLength);
202
+ }
203
+ function readIntegerArray(value, maxItems, min, max) {
204
+ if (!Array.isArray(value) || value.length > maxItems)
205
+ return false;
206
+ const integers = value.map((entry) => readInteger(entry, min, max));
207
+ return integers.some((entry) => entry === undefined) ? false : integers;
208
+ }
209
+ function readInteger(value, min, max) {
210
+ return Number.isSafeInteger(value) && Number(value) >= min && Number(value) <= max
211
+ ? Number(value)
212
+ : undefined;
213
+ }
214
+ function readOptionalInteger(value, min, max) {
215
+ if (value === null || value === undefined)
216
+ return undefined;
217
+ return readInteger(value, min, max) ?? false;
218
+ }
219
+ function readOptionalQuality(value) {
220
+ const quality = readOptionalInteger(value, 0, 4_320);
221
+ return quality === 0 ? undefined : quality;
222
+ }
223
+ function readOptionalDate(value) {
224
+ const raw = readOptionalString(value, 40);
225
+ if (raw === false || raw === undefined)
226
+ return raw;
227
+ if (!/^\d{4}-\d{2}-\d{2}(?:T.*)?$/u.test(raw))
228
+ return false;
229
+ const timestamp = Date.parse(raw);
230
+ if (!Number.isFinite(timestamp))
231
+ return false;
232
+ const date = new Date(timestamp);
233
+ const year = date.getUTCFullYear();
234
+ return year >= 1_800 && year <= 3_000 ? date.toISOString() : false;
235
+ }
236
+ function readOptionalUrl(value) {
237
+ if (value === null || value === undefined)
238
+ return undefined;
239
+ if (typeof value !== "string")
240
+ return false;
241
+ return normalizeProviderOutputUrl(value) ?? false;
242
+ }
243
+ function isRecord(value) {
244
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
245
+ }
246
+ function invalidResponse(provider) {
247
+ return new ProviderError({
248
+ provider,
249
+ code: "PROVIDER_INVALID_RESPONSE",
250
+ message: `Provider "${provider}" returned an invalid JacRed response.`,
251
+ retryable: false,
252
+ });
253
+ }
254
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/jacred-torrent/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { TorrentProviderCapabilities } from "@media-engine/core";
2
+ import { ProviderRateLimitGate, type ProviderFetch } from "../shared/index.js";
3
+ export interface JacRedTorrentProviderOptions {
4
+ name?: string;
5
+ version?: string;
6
+ baseUrl?: string;
7
+ searchPath?: string;
8
+ fetch?: ProviderFetch;
9
+ maxResponseBytes?: number;
10
+ resultLimit?: number;
11
+ userAgent?: string;
12
+ }
13
+ export interface JacRedTorrentConfig {
14
+ name: string;
15
+ baseUrl: string;
16
+ searchPath: string;
17
+ fetch: ProviderFetch;
18
+ rateLimitGate: ProviderRateLimitGate;
19
+ maxResponseBytes: number;
20
+ resultLimit: number;
21
+ userAgent: string;
22
+ }
23
+ export declare function createJacRedTorrentConfig(options: JacRedTorrentProviderOptions): JacRedTorrentConfig;
24
+ export declare function createJacRedTorrentCapabilities(): TorrentProviderCapabilities;