@media-engine/core 0.1.1 → 1.0.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/README.md +32 -6
- package/README.ru.md +32 -6
- package/dist/cache/memory.js +10 -8
- package/dist/cache/memory.js.map +1 -1
- package/dist/details/types.d.ts +6 -0
- package/dist/engine/availability.d.ts +1 -0
- package/dist/engine/availability.js +8 -0
- package/dist/engine/availability.js.map +1 -1
- package/dist/engine/circuit-breaker.d.ts +1 -0
- package/dist/engine/circuit-breaker.js +11 -0
- package/dist/engine/circuit-breaker.js.map +1 -1
- package/dist/engine/concurrency-limiter.js +2 -2
- package/dist/engine/concurrency-limiter.js.map +1 -1
- package/dist/engine/engine.d.ts +9 -4
- package/dist/engine/engine.js +277 -102
- package/dist/engine/engine.js.map +1 -1
- package/dist/engine/in-flight.d.ts +12 -1
- package/dist/engine/in-flight.js +69 -14
- package/dist/engine/in-flight.js.map +1 -1
- package/dist/engine/operation.d.ts +7 -0
- package/dist/engine/operation.js +49 -0
- package/dist/engine/operation.js.map +1 -0
- package/dist/engine/provider-calls.d.ts +10 -0
- package/dist/engine/provider-calls.js +62 -12
- package/dist/engine/provider-calls.js.map +1 -1
- package/dist/engine/query.d.ts +5 -0
- package/dist/engine/query.js +223 -34
- package/dist/engine/query.js.map +1 -1
- package/dist/engine/response-meta.d.ts +3 -1
- package/dist/engine/response-meta.js +8 -1
- package/dist/engine/response-meta.js.map +1 -1
- package/dist/engine/runtime.d.ts +2 -0
- package/dist/engine/runtime.js +19 -0
- package/dist/engine/runtime.js.map +1 -1
- package/dist/engine/search-discovery.d.ts +3 -0
- package/dist/engine/search-discovery.js +35 -0
- package/dist/engine/search-discovery.js.map +1 -0
- package/dist/engine/search-enrichment-shared.d.ts +23 -0
- package/dist/engine/search-enrichment-shared.js +68 -0
- package/dist/engine/search-enrichment-shared.js.map +1 -0
- package/dist/engine/search-enrichment.d.ts +21 -7
- package/dist/engine/search-enrichment.js +135 -75
- package/dist/engine/search-enrichment.js.map +1 -1
- package/dist/engine/search-identity-snapshot.d.ts +15 -0
- package/dist/engine/search-identity-snapshot.js +101 -0
- package/dist/engine/search-identity-snapshot.js.map +1 -0
- package/dist/engine/search-outcomes.d.ts +32 -0
- package/dist/engine/search-outcomes.js +118 -0
- package/dist/engine/search-outcomes.js.map +1 -0
- package/dist/engine/search-poster-enrichment.d.ts +31 -0
- package/dist/engine/search-poster-enrichment.js +93 -0
- package/dist/engine/search-poster-enrichment.js.map +1 -0
- package/dist/engine/search-result-freeze.d.ts +13 -0
- package/dist/engine/search-result-freeze.js +155 -0
- package/dist/engine/search-result-freeze.js.map +1 -0
- package/dist/engine/torrents.d.ts +22 -0
- package/dist/engine/torrents.js +188 -0
- package/dist/engine/torrents.js.map +1 -0
- package/dist/engine/types.d.ts +6 -1
- package/dist/errors/types.d.ts +1 -1
- package/dist/errors/types.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/media/types.d.ts +1 -1
- package/dist/merge/diversity.d.ts +15 -0
- package/dist/merge/diversity.js +52 -0
- package/dist/merge/diversity.js.map +1 -0
- package/dist/merge/priority.js +3 -1
- package/dist/merge/priority.js.map +1 -1
- package/dist/merge/scoring.d.ts +10 -0
- package/dist/merge/scoring.js +132 -28
- package/dist/merge/scoring.js.map +1 -1
- package/dist/merge/strategy.js +53 -13
- package/dist/merge/strategy.js.map +1 -1
- package/dist/providers/registry.d.ts +4 -2
- package/dist/providers/registry.js +11 -2
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/types.d.ts +3 -0
- package/dist/response/types.d.ts +20 -0
- package/dist/search/types.d.ts +34 -0
- package/dist/testing/providers.js +2 -0
- package/dist/testing/providers.js.map +1 -1
- package/dist/torrent/index.d.ts +1 -0
- package/dist/torrent/index.js +2 -0
- package/dist/torrent/index.js.map +1 -0
- package/dist/torrent/types.d.ts +132 -0
- package/dist/torrent/types.js +2 -0
- package/dist/torrent/types.js.map +1 -0
- package/package.json +8 -3
package/README.md
CHANGED
|
@@ -29,25 +29,51 @@ console.log(search.results[0]?.item);
|
|
|
29
29
|
console.log(details.details);
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Details lookup requires a namespaced external ID through `ids` or a shortcut such as `imdb`. The plain `id` field is deprecated because provider-native IDs are not globally unique.
|
|
33
|
+
|
|
34
|
+
The engine also has `getAvailability()` for optional streaming providers and a separate `discoverTorrents()` contract for torrent discovery providers.
|
|
33
35
|
|
|
34
36
|
## What comes from core
|
|
35
37
|
|
|
36
38
|
- `MediaEngine`;
|
|
37
|
-
- search, details, media, and
|
|
38
|
-
- metadata and
|
|
39
|
+
- search, details, media, streaming, and torrent-discovery types;
|
|
40
|
+
- metadata, streaming, and torrent provider contracts;
|
|
39
41
|
- merge and cache interfaces;
|
|
40
42
|
- `MemoryCache`;
|
|
41
43
|
- normalized errors and provider failure metadata;
|
|
42
44
|
- mock providers and fixtures for tests.
|
|
43
45
|
|
|
44
|
-
Provider calls run concurrently. If one source fails and another succeeds, the response keeps the useful data and lists the failure in `meta.providers.failed`.
|
|
46
|
+
Provider calls run concurrently. If one source fails and another succeeds, the response keeps the useful data and lists the failure in `meta.providers.failed`. Search failures and debug timings include an optional execution `phase`; repeated failures from one provider are represented once in the public failure list. Mandatory retryable primary/fallback degradation is not stored in the normal cache.
|
|
47
|
+
|
|
48
|
+
Title search distinguishes primary discovery from slower fallback identity sources through optional `capabilities.search.titleDiscovery`. Custom providers are primary by default. Supported multi-word typos are broadened through primary providers when no exact title exists, even if weak fuzzy noise is present. Fallback providers run when the remaining result is empty, a multi-word query has no exact identity, or exact-title identities conflict. External-ID search still calls every compatible provider immediately.
|
|
49
|
+
|
|
50
|
+
With a cache configured, the first healthy mandatory discovery whose top candidate has a strong external ID stores a separate identity snapshot for 30 minutes without refreshing it inside that window. Equivalent cache misses with another `limit` share up to 20 confirmed candidates and retain their known order even when a successful upstream response drifts. Stabilization adds `SEARCH_IDENTITY_SNAPSHOT_STABILIZED`. A retryably degraded partial search uses `SEARCH_IDENTITY_SNAPSHOT_FALLBACK` while retaining `meta.providers.failed`, `meta.cached: false`, and the no-cache policy. Neither path accepts conflicting strong IDs; non-retryable degradation does not use the snapshot, and a weak top candidate without a strong ID cannot establish one. Debug mode exposes restored/reordered counters. A first cold degraded request has no snapshot to recover from.
|
|
51
|
+
|
|
52
|
+
Providers can separately set `capabilities.searchEnrichment: false` to stay out of best-effort search-card ID/poster work. This keeps short optional enrichment deadlines from consuming the reliability budget of a mandatory fallback identity source.
|
|
53
|
+
|
|
54
|
+
Optional search ID/poster enrichment failures do not discard the base results. They produce bounded `meta.warnings`, remain cacheable with those warnings, and expose attempted/skipped/succeeded/failed counters plus phase-aware timings when debug mode is enabled. One planner limits enrichment to the bounded top discovery window, at most six additional calls, at most two calls per provider, and 1.5 seconds total. It skips providers that cannot improve a missing field and reuses matching ID-search plus cached or in-flight details outcomes for poster selection.
|
|
55
|
+
|
|
56
|
+
Mandatory discovery and eligible snapshot recovery freeze result identity, score, and order before optional enrichment. Matching enrichment may add presentation fields, non-conflicting external IDs, and source attribution, including aliases that make an unresolved candidate relevant. It never adds provider candidates as new results, changes `id`, `type`, `title`, `originalTitle`, or `year`, recalculates a score, or reranks the response. Conflicting added IDs retain the discovery value and emit `EXTERNAL_ID_CONFLICT`.
|
|
57
|
+
|
|
58
|
+
Mandatory ranking favors close multi-word title completions and external IDs that support reliable cross-catalog follow-up. Popular anime catalog identities remain competitive when their audience is established; small audience counters and ratings without vote counts do not receive full ranking weight.
|
|
59
|
+
|
|
60
|
+
The built-in strategy keeps the first result and every score unchanged, but may interleave a similarly ranked candidate inside the top ten after two results from the same normalized matched-title/media-type family. The alternative must be within `0.03` score and `0.05` title relevance, so weak noise is not promoted merely for variety. Debug mode adds optional per-result `ranking` evidence with the formula, match/title evidence, weighted signal contributions, and raw-score/diversity/final positions; normal responses omit it.
|
|
45
61
|
|
|
46
62
|
`MemoryCache` can retain metadata for a separate bounded stale window. `MediaEngine` uses it only for search and details when every selected provider fails retryably; stale streaming links are never returned. Such responses set `meta.cached` and `meta.stale` to `true`.
|
|
47
63
|
|
|
48
|
-
|
|
64
|
+
Public search, details, availability, and torrent-discovery inputs are canonicalized before provider selection and cache/coalescing keys are built: strings and IDs are trimmed, language is lowercased, top-level ID shortcuts become `ids`, torrent `alternativeTitles` are trimmed and deduplicated, and provider filters are trimmed, deduplicated, and sorted. Known IMDb/numeric ID formats and bounded field lengths and alias counts are validated. Search and torrent discovery with `limit: 0` return empty uncached responses without provider or cache work.
|
|
65
|
+
|
|
66
|
+
`MemoryCache` accepts only non-negative safe-integer TTL values. Omit `defaultTtlMs` and per-entry `ttlMs` for entries without expiration; negative values are not a no-expiry sentinel. Stale TTL values follow the same numeric validation.
|
|
67
|
+
|
|
68
|
+
`search`, `getDetails`, `getAvailability`, and `discoverTorrents` accept optional `{ signal }` operation options. Identical requests still share one provider operation, but each caller has an independent subscription: aborting one caller does not affect the others, while the shared provider signal is aborted once no active subscribers remain. Fully cancelled work is not cached, and client cancellation is not counted as an upstream circuit-breaker failure.
|
|
69
|
+
|
|
70
|
+
A streaming provider that resolves `null` is recorded as a successful no-result lookup. The engine reports an all-failed error only when every selected streaming provider actually failed. Discovered player options with an uncertain validation result remain visible with `availability: "unknown"`; the response includes `STREAM_VALIDATION_DEGRADED` and is retried instead of being stored in the normal availability cache.
|
|
71
|
+
|
|
72
|
+
The constructor also accepts streaming and torrent providers, a cache, global and per-provider timeouts, a custom merge strategy, and debug mode. Provider calls are bounded to two concurrent operations per provider by default, with a cancellable queue of 100; `providerConcurrency` can tune per-provider limits or disable the gate. Queue waiting remains inside the existing provider timeout. Core never imports concrete provider packages itself.
|
|
73
|
+
|
|
74
|
+
Torrent discovery remains independent from streaming availability. A `TorrentProvider` returns normalized candidates with source attribution and an explicit `magnet`, `torrent_file`, or `external` handoff. Optional provider `catalog` metadata supports regional/international UI grouping, and a candidate may retain a concrete meta-indexer `catalogSource`; neither field guarantees a release audio language. Core does not open that handoff, download torrent metadata, join a swarm, select files, store media, proxy traffic, or transcode video. No concrete torrent provider is bundled in core.
|
|
49
75
|
|
|
50
|
-
Exact types are available from the package exports. The short [public API guide](https://github.com/Yaneart/media-engine/blob/main/docs/public-api.md) explains the
|
|
76
|
+
Exact types are available from the package exports. The short [public API guide](https://github.com/Yaneart/media-engine/blob/main/docs/public-api.md) explains the four main operations without repeating every field.
|
|
51
77
|
|
|
52
78
|
## License
|
|
53
79
|
|
package/README.ru.md
CHANGED
|
@@ -29,25 +29,51 @@ console.log(search.results[0]?.item);
|
|
|
29
29
|
console.log(details.details);
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
Для
|
|
32
|
+
Для загрузки деталей нужен внешний ID с указанием источника — через `ids` или сокращение вроде `imdb`. Обычное поле `id` устарело, потому что внутренние ID разных провайдеров не образуют общее пространство имён.
|
|
33
|
+
|
|
34
|
+
Для опциональных стриминговых провайдеров у движка также есть `getAvailability()`, а для torrent discovery — отдельный контракт `discoverTorrents()`.
|
|
33
35
|
|
|
34
36
|
## Что экспортирует core
|
|
35
37
|
|
|
36
38
|
- `MediaEngine`;
|
|
37
|
-
- типы поиска, деталей,
|
|
38
|
-
- контракты metadata- и
|
|
39
|
+
- типы поиска, деталей, медиа, стриминга и torrent discovery;
|
|
40
|
+
- контракты metadata-, streaming- и torrent-провайдеров;
|
|
39
41
|
- интерфейсы объединения и кеша;
|
|
40
42
|
- `MemoryCache`;
|
|
41
43
|
- нормализованные ошибки и сведения о сбоях провайдеров;
|
|
42
44
|
- mock-провайдеры и примеры данных для тестов.
|
|
43
45
|
|
|
44
|
-
Провайдеры запускаются параллельно. Если один источник не сработал, а другой вернул данные, полезный ответ сохранится, а ошибка попадёт в `meta.providers.failed`.
|
|
46
|
+
Провайдеры запускаются параллельно. Если один источник не сработал, а другой вернул данные, полезный ответ сохранится, а ошибка попадёт в `meta.providers.failed`. Search-ошибки и debug timings содержат опциональную фазу выполнения `phase`; повторные ошибки одного провайдера представлены одной записью в публичном списке. Обязательная retryable-деградация primary/fallback не записывается в normal cache.
|
|
47
|
+
|
|
48
|
+
Title search разделяет основные discovery-источники и более медленные fallback identity-источники через опциональный `capabilities.search.titleDiscovery`. Пользовательские провайдеры по умолчанию считаются primary. Поддерживаемые multi-word опечатки расширяются через primary-провайдеры при отсутствии точного title, даже если присутствует weak fuzzy noise. Fallback-провайдеры запускаются при пустом результате, отсутствии точной identity у multi-word запроса или конфликтующих точных title-identity. Поиск по внешнему ID по-прежнему сразу вызывает все совместимые провайдеры.
|
|
49
|
+
|
|
50
|
+
При настроенном cache первая здоровая mandatory discovery, у top-кандидата которой есть strong external ID, отдельно сохраняет identity snapshot на 30 минут без продления этого окна. Эквивалентные cache misses с другим `limit` используют до 20 общих подтвержденных кандидатов и сохраняют их известный порядок, даже если успешный upstream-ответ меняется. Такая стабилизация добавляет `SEARCH_IDENTITY_SNAPSHOT_STABILIZED`. Retryable-деградированный частичный поиск использует `SEARCH_IDENTITY_SNAPSHOT_FALLBACK`, сохраняя `meta.providers.failed`, `meta.cached: false` и запрет обычного кеширования. Оба пути не принимают конфликтующий strong ID; при non-retryable-деградации snapshot не применяется, а слабый top-кандидат без strong ID не может создать snapshot. Debug-режим показывает счетчики restored/reordered. У первого холодного деградированного запроса snapshot для восстановления ещё нет.
|
|
51
|
+
|
|
52
|
+
Отдельный `capabilities.searchEnrichment: false` исключает провайдер из best-effort ID/poster enrichment поисковых карточек. Так короткий optional enrichment deadline не расходует reliability budget обязательного fallback identity-источника.
|
|
53
|
+
|
|
54
|
+
Ошибки опционального ID/poster enrichment не удаляют базовые результаты. Они формируют ограниченные `meta.warnings`, могут кэшироваться вместе с предупреждениями, а в debug-режиме предоставляют счетчики attempted/skipped/succeeded/failed и phase-aware timings. Единый planner ограничивает enrichment ограниченным top discovery window, максимум шестью дополнительными вызовами, двумя вызовами одного провайдера и общим временем 1,5 секунды. Он пропускает провайдеры, неспособные улучшить отсутствующее поле, и переиспользует совпадающий ID-search, а также cached или in-flight details для выбора poster.
|
|
55
|
+
|
|
56
|
+
Mandatory discovery и подходящее snapshot recovery фиксируют identity, score и порядок результатов до optional enrichment. Совпавшее enrichment может добавить presentation-поля, непротиворечивые external IDs и source attribution, включая aliases, которые делают ранее unresolved candidate релевантным. Оно не добавляет provider candidates как новые результаты, не меняет `id`, `type`, `title`, `originalTitle` или `year`, не пересчитывает score и не переставляет ответ. При конфликте добавляемого ID сохраняется discovery-значение и формируется `EXTERNAL_ID_CONFLICT`.
|
|
57
|
+
|
|
58
|
+
Mandatory ranking предпочитает близкие по длине multi-word title completions и external IDs, пригодные для надёжного cross-catalog follow-up. Популярные anime catalog identities остаются конкурентными при подтверждённой аудитории; малые audience counters и ratings без vote count не получают полный ranking weight.
|
|
59
|
+
|
|
60
|
+
Встроенная стратегия сохраняет первый результат и все score, но внутри top-10 может поднять сопоставимый кандидат после двух результатов одной normalized matched-title/media-type family. Альтернатива должна отличаться не более чем на `0.03` по score и `0.05` по title relevance, поэтому слабый шум не продвигается только ради разнообразия. В debug-режиме результат получает опциональный `ranking` с formula, match/title evidence, взвешенными signal contributions и позициями raw score/diversity/final; в обычном ответе этого поля нет.
|
|
45
61
|
|
|
46
62
|
`MemoryCache` может сохранять метаданные в отдельном ограниченном stale-окне. `MediaEngine` использует их только для поиска и деталей, когда все выбранные провайдеры завершились с retryable-ошибками; устаревшие streaming-ссылки никогда не возвращаются. В таком ответе `meta.cached` и `meta.stale` равны `true`.
|
|
47
63
|
|
|
48
|
-
|
|
64
|
+
Публичные search, details, availability и torrent-discovery запросы приводятся к canonical-виду до выбора провайдеров и построения cache/coalescing keys: строки и ID обрезаются, язык переводится в нижний регистр, top-level ID shortcuts переносятся в `ids`, torrent `alternativeTitles` обрезаются и дедуплицируются, а provider filters обрезаются, дедуплицируются и сортируются. Известные форматы IMDb/numeric ID, длины полей и количество aliases валидируются. Search и torrent discovery с `limit: 0` возвращают пустые некешированные ответы без обращений к провайдерам или cache.
|
|
65
|
+
|
|
66
|
+
`MemoryCache` принимает для TTL только неотрицательные safe integer значения. Для записей без срока истечения не задавайте `defaultTtlMs` и per-entry `ttlMs`; отрицательные значения не являются no-expiry sentinel. Для stale TTL действует та же числовая валидация.
|
|
67
|
+
|
|
68
|
+
`search`, `getDetails`, `getAvailability` и `discoverTorrents` принимают опциональные operation options `{ signal }`. Одинаковые запросы по-прежнему делят одну provider operation, но у каждого caller отдельная подписка: отмена одного caller не влияет на остальных, а общий provider signal отменяется, когда активных подписчиков не осталось. Полностью отмененная работа не кешируется, а client cancellation не считается upstream-сбоем circuit breaker.
|
|
69
|
+
|
|
70
|
+
Если streaming-провайдер возвращает `null`, это считается успешным запросом без результата. Ошибка all-failed возникает, только когда действительно завершились ошибкой все выбранные streaming-провайдеры. Найденные плееры с неопределённым результатом проверки остаются в ответе с `availability: "unknown"`; engine добавляет `STREAM_VALIDATION_DEGRADED` и повторяет lookup вместо записи такого ответа в обычный availability-кеш.
|
|
71
|
+
|
|
72
|
+
Конструктор также принимает streaming- и torrent-провайдеры, кеш, общий и индивидуальные тайм-ауты, собственную стратегию объединения и debug-режим. По умолчанию одновременно выполняются не более двух операций каждого провайдера, а отменяемая очередь ограничена 100 элементами; `providerConcurrency` позволяет настроить отдельные лимиты или отключить gate. Ожидание в очереди входит в существующий тайм-аут провайдера. Сам core никогда не импортирует пакеты с конкретными провайдерами.
|
|
73
|
+
|
|
74
|
+
Torrent discovery не смешивается со streaming availability. `TorrentProvider` возвращает нормализованные кандидаты с source attribution и явным handoff типа `magnet`, `torrent_file` или `external`. Опциональные provider `catalog` metadata позволяют UI группировать региональные и международные каталоги, а candidate может сохранять конкретный `catalogSource` meta-indexer; ни одно из этих полей не гарантирует язык аудиодорожки релиза. Core не открывает handoff, не загружает torrent metadata, не подключается к swarm, не выбирает файлы, не хранит media, не проксирует трафик и не транскодирует видео. Сам core не содержит конкретного torrent-провайдера.
|
|
49
75
|
|
|
50
|
-
Точные типы доступны через exports пакета. В коротком [описании публичного API](https://github.com/Yaneart/media-engine/blob/main/docs/public-api.md) разобраны
|
|
76
|
+
Точные типы доступны через exports пакета. В коротком [описании публичного API](https://github.com/Yaneart/media-engine/blob/main/docs/public-api.md) разобраны четыре основные операции без перечисления каждого поля.
|
|
51
77
|
|
|
52
78
|
## Лицензия
|
|
53
79
|
|
package/dist/cache/memory.js
CHANGED
|
@@ -11,10 +11,8 @@ export class MemoryCache {
|
|
|
11
11
|
(!Number.isInteger(options.maxEntries) || options.maxEntries <= 0)) {
|
|
12
12
|
throw new TypeError("MemoryCache maxEntries must be a positive integer.");
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
throw new TypeError("MemoryCache defaultStaleTtlMs must be a non-negative integer.");
|
|
17
|
-
}
|
|
14
|
+
validateTtl("defaultTtlMs", options.defaultTtlMs);
|
|
15
|
+
validateTtl("defaultStaleTtlMs", options.defaultStaleTtlMs);
|
|
18
16
|
this.now = options.now ?? Date.now;
|
|
19
17
|
this.defaultTtlMs = options.defaultTtlMs;
|
|
20
18
|
this.defaultStaleTtlMs = options.defaultStaleTtlMs;
|
|
@@ -59,10 +57,9 @@ export class MemoryCache {
|
|
|
59
57
|
set(key, value, options = {}) {
|
|
60
58
|
const ttlMs = options.ttlMs ?? this.defaultTtlMs;
|
|
61
59
|
const staleTtlMs = options.staleTtlMs ?? this.defaultStaleTtlMs;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const expiresAt = ttlMs === undefined || ttlMs < 0 ? undefined : this.now() + ttlMs;
|
|
60
|
+
validateTtl("ttlMs", ttlMs);
|
|
61
|
+
validateTtl("staleTtlMs", staleTtlMs);
|
|
62
|
+
const expiresAt = ttlMs === undefined ? undefined : this.now() + ttlMs;
|
|
66
63
|
const staleUntil = expiresAt === undefined || staleTtlMs === undefined || staleTtlMs <= 0
|
|
67
64
|
? undefined
|
|
68
65
|
: expiresAt + staleTtlMs;
|
|
@@ -118,4 +115,9 @@ export class MemoryCache {
|
|
|
118
115
|
function cloneCacheValue(value) {
|
|
119
116
|
return structuredClone(value);
|
|
120
117
|
}
|
|
118
|
+
function validateTtl(name, value) {
|
|
119
|
+
if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {
|
|
120
|
+
throw new TypeError(`MemoryCache ${name} must be a non-negative safe integer.`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
121
123
|
//# sourceMappingURL=memory.js.map
|
package/dist/cache/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/cache/memory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/cache/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/details/types.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { ExternalIds, MediaDetails, MediaType } from "../media/index.js";
|
|
2
2
|
import type { ResponseMeta } from "../response/index.js";
|
|
3
3
|
export interface DetailsQuery {
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated Provider-native IDs do not share a global namespace. Use `ids`
|
|
6
|
+
* or a named external ID shortcut such as `imdb` or `kinopoisk`.
|
|
7
|
+
* RU: внутренние ID провайдеров не имеют общего namespace; используйте `ids`
|
|
8
|
+
* или именованное сокращение внешнего ID.
|
|
9
|
+
*/
|
|
4
10
|
id?: string;
|
|
5
11
|
ids?: ExternalIds;
|
|
6
12
|
imdb?: string;
|
|
@@ -3,3 +3,4 @@ import type { MediaAvailability, StreamQuery, StreamingProvider } from "../strea
|
|
|
3
3
|
export declare function selectStreamingProviders(providers: StreamingProvider[], query: StreamQuery): StreamingProvider[];
|
|
4
4
|
export declare function mergeAvailabilityResults(query: StreamQuery, results: MediaAvailability[]): MediaAvailability;
|
|
5
5
|
export declare function createAvailabilityCacheOptions(availability: MediaAvailability): CacheSetOptions | undefined;
|
|
6
|
+
export declare function hasUnknownStreamValidation(availability: MediaAvailability): boolean;
|
|
@@ -49,6 +49,14 @@ export function createAvailabilityCacheOptions(availability) {
|
|
|
49
49
|
staleTtlMs: 0,
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
|
+
// Detects player options kept after validation could not reach a reliable conclusion.
|
|
53
|
+
// Находит player options, сохраненные после неопределенного результата validation.
|
|
54
|
+
export function hasUnknownStreamValidation(availability) {
|
|
55
|
+
return [
|
|
56
|
+
...availability.options,
|
|
57
|
+
...(availability.episodes?.flatMap((episode) => episode.options) ?? []),
|
|
58
|
+
].some((option) => option.availability === "unknown");
|
|
59
|
+
}
|
|
52
60
|
// Merges episode-level availability blocks by episode identity.
|
|
53
61
|
// Объединяет episode-level availability блоки по идентичности эпизода.
|
|
54
62
|
function mergeEpisodeAvailability(results) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"availability.js","sourceRoot":"","sources":["../../src/engine/availability.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"availability.js","sourceRoot":"","sources":["../../src/engine/availability.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ export declare class ProviderCircuitBreaker {
|
|
|
25
25
|
private readonly observations;
|
|
26
26
|
constructor(options?: CircuitBreakerOptions, now?: () => number);
|
|
27
27
|
run<T>(key: string, provider: string, operation: () => Promise<T>): Promise<T>;
|
|
28
|
+
private releaseCancelledProbe;
|
|
28
29
|
getSnapshot(key: string): CircuitBreakerSnapshot;
|
|
29
30
|
private acquire;
|
|
30
31
|
private recordFailure;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ProviderError } from "../errors/index.js";
|
|
2
|
+
import { isOperationCancelledError } from "./operation.js";
|
|
2
3
|
const DEFAULT_FAILURE_THRESHOLD = 3;
|
|
3
4
|
const DEFAULT_RECOVERY_TIMEOUT_MS = 30_000;
|
|
4
5
|
// Tracks transient provider failures and allows one recovery probe after cooldown.
|
|
@@ -24,11 +25,21 @@ export class ProviderCircuitBreaker {
|
|
|
24
25
|
return result;
|
|
25
26
|
}
|
|
26
27
|
catch (error) {
|
|
28
|
+
if (isOperationCancelledError(error)) {
|
|
29
|
+
this.releaseCancelledProbe(key);
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
27
32
|
this.recordFailure(key, error);
|
|
28
33
|
this.recordObservedFailure(key, error);
|
|
29
34
|
throw error;
|
|
30
35
|
}
|
|
31
36
|
}
|
|
37
|
+
releaseCancelledProbe(key) {
|
|
38
|
+
const state = this.states.get(key);
|
|
39
|
+
if (state?.probeInFlight) {
|
|
40
|
+
state.probeInFlight = false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
32
43
|
getSnapshot(key) {
|
|
33
44
|
const now = this.now();
|
|
34
45
|
const state = this.states.get(key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/engine/circuit-breaker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/engine/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ const DEFAULT_MAX_CONCURRENT = 2;
|
|
|
3
3
|
const DEFAULT_MAX_QUEUE_SIZE = 100;
|
|
4
4
|
const MAX_CONCURRENT_BOUND = 100;
|
|
5
5
|
const MAX_QUEUE_SIZE_BOUND = 10_000;
|
|
6
|
-
// Bounds concurrent work independently for every metadata or
|
|
7
|
-
// Ограничивает параллельную работу отдельно для
|
|
6
|
+
// Bounds concurrent work independently for every metadata, streaming, or torrent provider.
|
|
7
|
+
// Ограничивает параллельную работу отдельно для metadata, streaming и torrent-провайдеров.
|
|
8
8
|
export class ProviderConcurrencyLimiter {
|
|
9
9
|
defaultMaxConcurrent;
|
|
10
10
|
maxQueueSize;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concurrency-limiter.js","sourceRoot":"","sources":["../../src/engine/concurrency-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAgBpC,
|
|
1
|
+
{"version":3,"file":"concurrency-limiter.js","sourceRoot":"","sources":["../../src/engine/concurrency-limiter.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/engine.d.ts
CHANGED
|
@@ -4,10 +4,12 @@ import { type MergeStrategy } from "../merge/index.js";
|
|
|
4
4
|
import { ProviderRegistry, type ProviderInfo } from "../providers/index.js";
|
|
5
5
|
import type { SearchQuery, SearchResponse } from "../search/index.js";
|
|
6
6
|
import type { MediaAvailability, StreamQuery, StreamingProviderInfo } from "../streaming/index.js";
|
|
7
|
-
import type {
|
|
7
|
+
import type { TorrentDiscoveryQuery, TorrentDiscoveryResponse, TorrentProviderInfo } from "../torrent/index.js";
|
|
8
|
+
import type { MediaEngineOperationOptions, MediaEngineOptions, ProviderHealthStatus } from "./types.js";
|
|
8
9
|
export declare class MediaEngine {
|
|
9
10
|
private readonly registry;
|
|
10
11
|
private readonly streamingProviders;
|
|
12
|
+
private readonly torrentProviders;
|
|
11
13
|
private readonly cache?;
|
|
12
14
|
private readonly mergeStrategy;
|
|
13
15
|
private readonly timeoutMs?;
|
|
@@ -19,16 +21,19 @@ export declare class MediaEngine {
|
|
|
19
21
|
constructor(options?: MediaEngineOptions);
|
|
20
22
|
getProviders(): ProviderInfo[];
|
|
21
23
|
getStreamingProviders(): StreamingProviderInfo[];
|
|
24
|
+
getTorrentProviders(): TorrentProviderInfo[];
|
|
22
25
|
getProviderHealth(): ProviderHealthStatus[];
|
|
23
|
-
search(query: SearchQuery): Promise<SearchResponse>;
|
|
24
|
-
getDetails(query: DetailsQuery): Promise<DetailsResponse>;
|
|
25
|
-
getAvailability(query: StreamQuery): Promise<MediaAvailability>;
|
|
26
|
+
search(query: SearchQuery, options?: MediaEngineOperationOptions): Promise<SearchResponse>;
|
|
27
|
+
getDetails(query: DetailsQuery, options?: MediaEngineOperationOptions): Promise<DetailsResponse>;
|
|
28
|
+
getAvailability(query: StreamQuery, options?: MediaEngineOperationOptions): Promise<MediaAvailability>;
|
|
29
|
+
discoverTorrents(query: TorrentDiscoveryQuery, options?: MediaEngineOperationOptions): Promise<TorrentDiscoveryResponse>;
|
|
26
30
|
protected get providerRegistry(): ProviderRegistry;
|
|
27
31
|
protected get engineCache(): Cache | undefined;
|
|
28
32
|
protected get engineMergeStrategy(): MergeStrategy;
|
|
29
33
|
protected get engineTimeoutMs(): number | undefined;
|
|
30
34
|
private getProviderTimeoutMs;
|
|
31
35
|
private createProviderTimeoutBudget;
|
|
36
|
+
private loadReusableDetails;
|
|
32
37
|
private createProviderHealthStatus;
|
|
33
38
|
protected get engineDebug(): boolean;
|
|
34
39
|
}
|