@zivue/zuuid 0.2.0 → 0.2.1
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/CHANGELOG.md +6 -0
- package/README.md +98 -5
- package/dist/providers/common.d.ts +1 -0
- package/dist/providers/common.d.ts.map +1 -1
- package/dist/providers/common.js +8 -0
- package/dist/providers/gamesdb/game.d.ts.map +1 -1
- package/dist/providers/gamesdb/game.js +4 -2
- package/dist/providers/jikan/transform.d.ts.map +1 -1
- package/dist/providers/jikan/transform.js +4 -2
- package/dist/providers/openlibrary/book.d.ts.map +1 -1
- package/dist/providers/openlibrary/book.js +2 -1
- package/dist/providers/openstreetmap/place.d.ts.map +1 -1
- package/dist/providers/openstreetmap/place.js +4 -2
- package/dist/providers/tmdb/movie.d.ts.map +1 -1
- package/dist/providers/tmdb/movie.js +9 -22
- package/dist/providers/tmdb/tv.d.ts.map +1 -1
- package/dist/providers/tmdb/tv.js +4 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.1 - 2026-05-24
|
|
4
|
+
|
|
5
|
+
- Normalized provider ratings to a shared `0-5` scale while preserving native provider scores in `provider_rating` details.
|
|
6
|
+
- Trimmed TMDB movie certification details and stopped emitting full `release_dates` detail payloads.
|
|
7
|
+
- Added README documentation for raw source records, transformed output, transformer-only providers, and normalized ratings.
|
|
8
|
+
|
|
3
9
|
## 0.2.0 - 2026-05-24
|
|
4
10
|
|
|
5
11
|
- Added Open Library provider support for books and authors.
|
package/README.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# @zivue/zuuid
|
|
2
2
|
|
|
3
|
-
Search, fetch, and normalize media metadata from external providers into a shared
|
|
3
|
+
Search, fetch, and normalize media metadata from external providers into a shared Zuuid data shape.
|
|
4
4
|
|
|
5
|
-
This package is meant to be used by apps that need provider-backed lookup and transformation, but do not want provider-specific response shapes leaking through the app.
|
|
5
|
+
This package is meant to be used by apps that need provider-backed lookup and transformation, but do not want provider-specific response shapes leaking through the app.
|
|
6
|
+
|
|
7
|
+
TMDB and Open Library include live search/fetch clients. Additional providers currently expose source-record transformers: you provide the raw provider payload, and this package normalizes it into `ZuuidData`.
|
|
6
8
|
|
|
7
9
|
Storage, caching, indexing, review state, object-store keys, and persistence belong in a layer outside this package.
|
|
8
10
|
|
|
@@ -59,7 +61,7 @@ console.log(movies?.results[0]);
|
|
|
59
61
|
// title: "Fight Club",
|
|
60
62
|
// date: "1999-10-15",
|
|
61
63
|
// cover: "https://image.tmdb.org/t/p/w500/...",
|
|
62
|
-
// rating:
|
|
64
|
+
// rating: 4.2,
|
|
63
65
|
// weight: 20.0,
|
|
64
66
|
// relationType: null,
|
|
65
67
|
// attribute: null,
|
|
@@ -96,6 +98,8 @@ console.log(movie);
|
|
|
96
98
|
|
|
97
99
|
Search results, relations, and recommendations share the same lightweight list item fields: `id`, `zuuid`, `category`, `title`, `date`, `cover`, `rating`, `weight`, `relationType`, `attribute`, and `order`.
|
|
98
100
|
|
|
101
|
+
Ratings are normalized to a `0-5` scale when the provider exposes a compatible numeric score. The original provider score is preserved in details as `provider_rating` for providers whose native scale differs.
|
|
102
|
+
|
|
99
103
|
## Supported Providers
|
|
100
104
|
|
|
101
105
|
| Provider | Category | Search | Fetch | Transform |
|
|
@@ -105,6 +109,18 @@ Search results, relations, and recommendations share the same lightweight list i
|
|
|
105
109
|
| TMDB | person | yes | yes | yes |
|
|
106
110
|
| Open Library | book | yes | yes | yes |
|
|
107
111
|
| Open Library | author | yes | yes | yes |
|
|
112
|
+
| ComicVine | volume, issue, story_arc, character, person, publisher | no | no | yes |
|
|
113
|
+
| GamesDB | game, platform | no | no | yes |
|
|
114
|
+
| Jikan | anime, manga, producer, magazine, character, person | no | no | yes |
|
|
115
|
+
| MusicBrainz | release, release-group, recording, artist, label, work | no | no | yes |
|
|
116
|
+
| OpenFoodFacts | product | no | no | yes |
|
|
117
|
+
| OpenStreetMap | city, country, place, venue | no | no | yes |
|
|
118
|
+
| Podcast / iTunes | podcast | no | no | yes |
|
|
119
|
+
| Setlist.fm | setlist, artist, venue | no | no | yes |
|
|
120
|
+
| Ticketmaster | event, attraction, venue | no | no | yes |
|
|
121
|
+
| Wger | exercise, equipment | no | no | yes |
|
|
122
|
+
|
|
123
|
+
For transformer-only providers, "Search" and "Fetch" are marked `no` because this package does not perform those HTTP requests yet. Use your own provider client or stored payloads, wrap the payload in a `SourceRecord`, and call the category transformer.
|
|
108
124
|
|
|
109
125
|
## TMDB Credentials
|
|
110
126
|
|
|
@@ -204,6 +220,33 @@ const source = await tmdb.fetchMovieSourceRecord({ id: 550 });
|
|
|
204
220
|
const movie = source ? await transformTmdbMovie(source, tmdb.transformOptions()) : undefined;
|
|
205
221
|
```
|
|
206
222
|
|
|
223
|
+
The source record contains the raw payload:
|
|
224
|
+
|
|
225
|
+
```ts
|
|
226
|
+
console.log(source?.payload);
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
The transform result is normalized `ZuuidData`:
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
console.log(movie?.primaryTitle);
|
|
233
|
+
console.log(movie?.externalIds);
|
|
234
|
+
console.log(movie?.provenance);
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
For transformer-only providers:
|
|
238
|
+
|
|
239
|
+
```ts
|
|
240
|
+
import { createSourceRecord, transformGamesDbGame } from "@zivue/zuuid";
|
|
241
|
+
|
|
242
|
+
const source = await createSourceRecord({
|
|
243
|
+
source: { provider: "gamesdb", category: "game", externalId: "17444" },
|
|
244
|
+
payload: rawGamesDbPayload
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
const game = await transformGamesDbGame(source);
|
|
248
|
+
```
|
|
249
|
+
|
|
207
250
|
Category-specific imports are available:
|
|
208
251
|
|
|
209
252
|
```ts
|
|
@@ -212,6 +255,11 @@ import { transformTmdbTv } from "@zivue/zuuid/providers/tmdb/tv";
|
|
|
212
255
|
import { transformTmdbPerson } from "@zivue/zuuid/providers/tmdb/person";
|
|
213
256
|
import { transformOpenLibraryBook } from "@zivue/zuuid/providers/openlibrary/book";
|
|
214
257
|
import { transformOpenLibraryAuthor } from "@zivue/zuuid/providers/openlibrary/author";
|
|
258
|
+
import { transformMusicBrainzReleaseGroup } from "@zivue/zuuid/providers/musicbrainz/release-group";
|
|
259
|
+
import { transformComicVineIssue } from "@zivue/zuuid/providers/comicvine/issue";
|
|
260
|
+
import { transformJikanProducer } from "@zivue/zuuid/providers/jikan/producer";
|
|
261
|
+
import { transformOpenStreetMapVenue } from "@zivue/zuuid/providers/openstreetmap/venue";
|
|
262
|
+
import { transformWgerEquipment } from "@zivue/zuuid/providers/wger/equipment";
|
|
215
263
|
```
|
|
216
264
|
|
|
217
265
|
## Data Model
|
|
@@ -277,7 +325,7 @@ zuuid.read.openlibrary?.search({ query: "The Lord of the Rings" });
|
|
|
277
325
|
zuuid.read.openlibrary?.fetch({ id: "OL82563W" });
|
|
278
326
|
```
|
|
279
327
|
|
|
280
|
-
##
|
|
328
|
+
## Example Scripts
|
|
281
329
|
|
|
282
330
|
The examples read `.env` from the repo root:
|
|
283
331
|
|
|
@@ -309,7 +357,35 @@ npm run example:fetch -- book OL82563W
|
|
|
309
357
|
npm run example:fetch -- author OL23919A
|
|
310
358
|
```
|
|
311
359
|
|
|
312
|
-
|
|
360
|
+
Fetch fixture-backed transformer examples:
|
|
361
|
+
|
|
362
|
+
```sh
|
|
363
|
+
npm run example:fetch -- gamesdb:game 17444
|
|
364
|
+
npm run example:fetch -- gamesdb:platform 6
|
|
365
|
+
npm run example:fetch -- musicbrainz:release-group aaa50249-1e6b-3910-b830-7e2fb622a8c4
|
|
366
|
+
npm run example:fetch -- musicbrainz:recording 0b5d8c0f-4975-4e44-9e67-0a5f1b5939f6
|
|
367
|
+
npm run example:fetch -- comicvine:issue 101
|
|
368
|
+
npm run example:fetch -- comicvine:story_arc 201
|
|
369
|
+
npm run example:fetch -- jikan:producer 14
|
|
370
|
+
npm run example:fetch -- jikan:magazine 1
|
|
371
|
+
npm run example:fetch -- openfoodfacts:product 3017620422003
|
|
372
|
+
npm run example:fetch -- openstreetmap:venue W123456
|
|
373
|
+
npm run example:fetch -- wger:equipment 7
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
`example:fetch` writes both raw and transformed JSON:
|
|
377
|
+
|
|
378
|
+
```text
|
|
379
|
+
data/<provider>/<category>/<id>.raw.json
|
|
380
|
+
data/<provider>/<category>/<id>.zuuid.json
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
`example:search` writes raw and transformed search JSON:
|
|
384
|
+
|
|
385
|
+
```text
|
|
386
|
+
data/<provider>/search/<category>/<query>.raw-search.json
|
|
387
|
+
data/<provider>/search/<category>/<query>.zuuid-search.json
|
|
388
|
+
```
|
|
313
389
|
|
|
314
390
|
## API Reference
|
|
315
391
|
|
|
@@ -332,6 +408,23 @@ Provider exports:
|
|
|
332
408
|
- `transformTmdbPerson(sourceRecord, options?)`
|
|
333
409
|
- `transformOpenLibraryBook(sourceRecord, options?)`
|
|
334
410
|
- `transformOpenLibraryAuthor(sourceRecord, options?)`
|
|
411
|
+
- `transformComicVine(sourceRecord)`
|
|
412
|
+
- `transformGamesDbGame(sourceRecord, options?)`
|
|
413
|
+
- `transformGamesDbPlatform(sourceRecord)`
|
|
414
|
+
- `transformJikan(sourceRecord)`
|
|
415
|
+
- `transformMusicBrainzRelease(sourceRecord, options?)`
|
|
416
|
+
- `transformMusicBrainzReleaseGroup(sourceRecord, options?)`
|
|
417
|
+
- `transformMusicBrainzRecording(sourceRecord)`
|
|
418
|
+
- `transformMusicBrainzArtist(sourceRecord)`
|
|
419
|
+
- `transformMusicBrainzLabel(sourceRecord)`
|
|
420
|
+
- `transformMusicBrainzWork(sourceRecord)`
|
|
421
|
+
- `transformOpenFoodFactsProduct(sourceRecord)`
|
|
422
|
+
- `transformOpenStreetMapPlace(sourceRecord)`
|
|
423
|
+
- `transformPodcast(sourceRecord)`
|
|
424
|
+
- `transformSetlistFm(sourceRecord)`
|
|
425
|
+
- `transformTicketmaster(sourceRecord)`
|
|
426
|
+
- `transformWgerExercise(sourceRecord)`
|
|
427
|
+
- `transformWgerEquipment(sourceRecord)`
|
|
335
428
|
- `searchTmdbMovies(provider, input, options?)`
|
|
336
429
|
- `searchTmdbTv(provider, input, options?)`
|
|
337
430
|
- `searchTmdbPeople(provider, input, options?)`
|
|
@@ -17,6 +17,7 @@ export declare function addMedia(data: ZuuidData, provider: string, url: string
|
|
|
17
17
|
export declare function stripHtml(input: string): string;
|
|
18
18
|
export declare function datePrefix(value: string | undefined): string | undefined;
|
|
19
19
|
export declare function formatNumber(value: number): string;
|
|
20
|
+
export declare function normalizeRating(value: number | undefined | null, fromMin: number, fromMax: number, toMin?: number, toMax?: number): number | undefined;
|
|
20
21
|
export declare function baseDataFromSource(source: SourceRecord, provider: string, category: string, publicCategory: string, externalId: string, primaryTitle: string): Promise<ZuuidData>;
|
|
21
22
|
export declare function finalizeData(data: ZuuidData, source: SourceRecord, confidence?: number): ZuuidData;
|
|
22
23
|
export declare function addRelation(data: ZuuidData, provider: string, category: string, externalId: string | undefined, relationType: string, title?: string, options?: Partial<Omit<EntityRelation, "id" | "zuuid" | "relationType" | "direction" | "category" | "title">>): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/providers/common.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/providers/common.ts"],"names":[],"mappings":"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"}
|
package/dist/providers/common.js
CHANGED
|
@@ -99,6 +99,14 @@ export function datePrefix(value) {
|
|
|
99
99
|
export function formatNumber(value) {
|
|
100
100
|
return value.toFixed(2).replace(/0+$/, "").replace(/\.$/, "");
|
|
101
101
|
}
|
|
102
|
+
export function normalizeRating(value, fromMin, fromMax, toMin = 0, toMax = 5) {
|
|
103
|
+
if (typeof value !== "number" || !Number.isFinite(value) || fromMax <= fromMin) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
const clamped = Math.min(Math.max(value, fromMin), fromMax);
|
|
107
|
+
const normalized = ((clamped - fromMin) / (fromMax - fromMin)) * (toMax - toMin) + toMin;
|
|
108
|
+
return Math.round(normalized * 1000) / 1000;
|
|
109
|
+
}
|
|
102
110
|
export async function baseDataFromSource(source, provider, category, publicCategory, externalId, primaryTitle) {
|
|
103
111
|
const zuuid = await providerZuuid({ provider, category, externalId });
|
|
104
112
|
return createZuuidData({ zuuid, category: publicCategory, primaryTitle });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../../../src/providers/gamesdb/game.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../../../src/providers/gamesdb/game.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAkBpD,MAAM,MAAM,uBAAuB,GAAG;IACpC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,SAAS,CAAC,CAwBpB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GAMESDB_GAME_CATEGORY, GAMESDB_PROVIDER } from "./constants.js";
|
|
2
|
-
import { addDescription, addDetail, addMedia, addTag, arrayField, baseDataFromSource, finalizeData, numberField, objectPayload, stringField, valueAsString } from "../common.js";
|
|
2
|
+
import { addDescription, addDetail, addMedia, addTag, arrayField, baseDataFromSource, finalizeData, normalizeRating, numberField, objectPayload, stringField, valueAsString } from "../common.js";
|
|
3
3
|
export async function transformGamesDbGame(source, options = {}) {
|
|
4
4
|
if (source.source.provider !== GAMESDB_PROVIDER || source.source.category !== GAMESDB_GAME_CATEGORY) {
|
|
5
5
|
throw new Error(`unsupported GamesDB source: ${source.source.provider}:${source.source.category}`);
|
|
@@ -12,7 +12,9 @@ export async function transformGamesDbGame(source, options = {}) {
|
|
|
12
12
|
if (!title)
|
|
13
13
|
throw new Error("missing required GamesDB game field: game_title");
|
|
14
14
|
const data = await baseDataFromSource(source, GAMESDB_PROVIDER, GAMESDB_GAME_CATEGORY, GAMESDB_GAME_CATEGORY, id, title);
|
|
15
|
-
|
|
15
|
+
const rawRating = numberField(payload, "rating");
|
|
16
|
+
data.rating = normalizeRating(rawRating, 0, 10);
|
|
17
|
+
addDetail(data, GAMESDB_PROVIDER, "provider_rating", rawRating);
|
|
16
18
|
data.primaryDate = releaseDate(stringField(payload, "release_date"));
|
|
17
19
|
addDescription(data, GAMESDB_PROVIDER, stringField(payload, "overview"));
|
|
18
20
|
addTagsFromNamedArray(data, payload, "genres");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/providers/jikan/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAO7E;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,SAAyB,GAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/providers/jikan/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAO7E;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,SAAyB,GAAG,OAAO,CAAC,SAAS,CAAC,CAuB3H;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,SAAyB,GAAG,OAAO,CAAC,SAAS,CAAC,CAa/H;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAerF;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAarF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { addAlias, addDescription, addDetail, addMedia, addRelation, addTag, arrayField, baseDataFromSource, datePrefix, finalizeData, nestedString, objectPayload, stringField, stripHtml, valueAsString } from "../common.js";
|
|
1
|
+
import { addAlias, addDescription, addDetail, addMedia, addRelation, addTag, arrayField, baseDataFromSource, datePrefix, finalizeData, nestedString, normalizeRating, objectPayload, stringField, stripHtml, valueAsString } from "../common.js";
|
|
2
2
|
import { JIKAN_ANIME_CATEGORY, JIKAN_CHARACTER_CATEGORY, JIKAN_MAGAZINE_CATEGORY, JIKAN_MANGA_CATEGORY, JIKAN_PERSON_CATEGORY, JIKAN_PRODUCER_CATEGORY, JIKAN_PROVIDER } from "./constants.js";
|
|
3
3
|
export async function transformJikan(source) {
|
|
4
4
|
if (source.source.provider !== JIKAN_PROVIDER)
|
|
@@ -22,7 +22,9 @@ export async function transformJikanTitle(source, publicCategory = source.source
|
|
|
22
22
|
if (!title)
|
|
23
23
|
throw new Error("missing required Jikan field: title");
|
|
24
24
|
const data = await baseDataFromSource(source, JIKAN_PROVIDER, source.source.category, publicCategory, id, title);
|
|
25
|
-
|
|
25
|
+
const rawScore = typeof payload.score === "number" ? payload.score : undefined;
|
|
26
|
+
data.rating = normalizeRating(rawScore, 0, 10);
|
|
27
|
+
addDetail(data, JIKAN_PROVIDER, "provider_rating", rawScore);
|
|
26
28
|
data.primaryDate = datePrefix(nestedString(payload, ["aired", "from"]) ?? nestedString(payload, ["published", "from"]));
|
|
27
29
|
addTitleAliases(data, payload, title);
|
|
28
30
|
addDescription(data, JIKAN_PROVIDER, stringField(payload, "synopsis") ?? stringField(payload, "background"), "en");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"book.d.ts","sourceRoot":"","sources":["../../../src/providers/openlibrary/book.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE/G,OAAO,EAA4C,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"book.d.ts","sourceRoot":"","sources":["../../../src/providers/openlibrary/book.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE/G,OAAO,EAA4C,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAA6B,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAEjH,eAAO,MAAM,0BAA0B,SAAS,CAAC;AAEjD,MAAM,MAAM,yBAAyB,GAAG;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,EAAE,CAAC;IACpE,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,aAAa,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,sBAAsB,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,yBAAyB,EAAE,CAAC;QACrC,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,OAAO,CAAC,EAAE,4BAA4B,EAAE,CAAC;IACzC,OAAO,CAAC,EAAE,yBAAyB,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CA0BnC;AAED,wBAAsB,kCAAkC,CACtD,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAMvC;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,sBAAsB,EAC7B,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAiC5C;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,SAAS,CAAC,CAwFpB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createZuuidData } from "../../entity.js";
|
|
2
2
|
import { providerZuuid } from "../../identity.js";
|
|
3
3
|
import { attachSourceMetadata, createSourceRecord } from "../../source.js";
|
|
4
|
+
import { normalizeRating } from "../common.js";
|
|
4
5
|
import { OPEN_LIBRARY_COVER_BASE_URL, OPEN_LIBRARY_PROVIDER } from "./constants.js";
|
|
5
6
|
export const OPEN_LIBRARY_BOOK_CATEGORY = "book";
|
|
6
7
|
export async function fetchOpenLibraryBookSourceRecord(provider, input) {
|
|
@@ -81,7 +82,7 @@ export async function transformOpenLibraryBook(source, options = {}) {
|
|
|
81
82
|
const preferredEdition = preferredOpenLibraryEdition(payload);
|
|
82
83
|
const rating = numberField(payload.ratings?.summary?.average ?? payload.ratings?.summary?.sortable ?? payload.search?.ratings_average);
|
|
83
84
|
if (rating !== undefined) {
|
|
84
|
-
data.rating = rating;
|
|
85
|
+
data.rating = normalizeRating(rating, 0, 5);
|
|
85
86
|
data.details.push({ key: "rating_average", value: rating, source: OPEN_LIBRARY_PROVIDER });
|
|
86
87
|
}
|
|
87
88
|
const ratingCount = numberField(payload.ratings?.summary?.count);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"place.d.ts","sourceRoot":"","sources":["../../../src/providers/openstreetmap/place.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"place.d.ts","sourceRoot":"","sources":["../../../src/providers/openstreetmap/place.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAkC1F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { addAlias, addDescription, addDetail, addMedia, addTag, arrayField, baseDataFromSource, finalizeData, nestedString, objectPayload, stringField, valueAsString } from "../common.js";
|
|
1
|
+
import { addAlias, addDescription, addDetail, addMedia, addTag, arrayField, baseDataFromSource, finalizeData, nestedString, normalizeRating, objectPayload, stringField, valueAsString } from "../common.js";
|
|
2
2
|
import { OPENSTREETMAP_CITY_CATEGORY, OPENSTREETMAP_COUNTRY_CATEGORY, OPENSTREETMAP_PLACE_CATEGORY, OPENSTREETMAP_PROVIDER, OPENSTREETMAP_VENUE_CATEGORY } from "./constants.js";
|
|
3
3
|
export async function transformOpenStreetMapPlace(source) {
|
|
4
4
|
if (source.source.provider !== OPENSTREETMAP_PROVIDER || ![OPENSTREETMAP_CITY_CATEGORY, OPENSTREETMAP_COUNTRY_CATEGORY, OPENSTREETMAP_PLACE_CATEGORY, OPENSTREETMAP_VENUE_CATEGORY].includes(source.source.category)) {
|
|
@@ -12,7 +12,9 @@ export async function transformOpenStreetMapPlace(source) {
|
|
|
12
12
|
if (!title)
|
|
13
13
|
throw new Error("missing required OpenStreetMap field: name");
|
|
14
14
|
const data = await baseDataFromSource(source, OPENSTREETMAP_PROVIDER, source.source.category, source.source.category, id, title);
|
|
15
|
-
|
|
15
|
+
const rawImportance = typeof payload.importance === "number" ? payload.importance : undefined;
|
|
16
|
+
data.rating = normalizeRating(rawImportance, 0, 1);
|
|
17
|
+
addDetail(data, OPENSTREETMAP_PROVIDER, "provider_rating", rawImportance);
|
|
16
18
|
addAlias(data, title, "title", true, OPENSTREETMAP_PROVIDER);
|
|
17
19
|
addNamedetailAliases(data, payload, title);
|
|
18
20
|
addDescription(data, OPENSTREETMAP_PROVIDER, stringField(payload, "display_name"), "en");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"movie.d.ts","sourceRoot":"","sources":["../../../src/providers/tmdb/movie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE/G,OAAO,EAA4C,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"movie.d.ts","sourceRoot":"","sources":["../../../src/providers/tmdb/movie.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createZuuidData } from "../../entity.js";
|
|
2
2
|
import { providerZuuid } from "../../identity.js";
|
|
3
3
|
import { attachSourceMetadata, createSourceRecord } from "../../source.js";
|
|
4
|
+
import { normalizeRating } from "../common.js";
|
|
4
5
|
import { TMDB_BACKDROP_BASE_URL, TMDB_POSTER_BASE_URL, TMDB_PROVIDER } from "./constants.js";
|
|
5
6
|
export const TMDB_MOVIE_CATEGORY = "movie";
|
|
6
7
|
export async function fetchTmdbMovieSourceRecord(provider, input) {
|
|
@@ -50,7 +51,7 @@ export async function searchTmdbMovies(provider, input, options = {}) {
|
|
|
50
51
|
title,
|
|
51
52
|
date: stringField(result.release_date) ?? null,
|
|
52
53
|
cover: mediaUrl(result.poster_path ?? undefined, options.posterBaseUrl ?? TMDB_POSTER_BASE_URL) ?? null,
|
|
53
|
-
rating:
|
|
54
|
+
rating: normalizeRating(result.vote_average, 0, 10) ?? null,
|
|
54
55
|
weight: typeof result.popularity === "number" ? result.popularity : null,
|
|
55
56
|
relationType: null,
|
|
56
57
|
attribute: null,
|
|
@@ -100,7 +101,8 @@ export async function transformTmdbMovie(source, options = {}) {
|
|
|
100
101
|
data.primaryDate = releaseDate;
|
|
101
102
|
}
|
|
102
103
|
if (typeof payload.vote_average === "number") {
|
|
103
|
-
data.rating = payload.vote_average;
|
|
104
|
+
data.rating = normalizeRating(payload.vote_average, 0, 10);
|
|
105
|
+
data.details.push({ key: "provider_rating", value: payload.vote_average, source: TMDB_PROVIDER });
|
|
104
106
|
}
|
|
105
107
|
const overview = stringField(payload.overview);
|
|
106
108
|
if (overview) {
|
|
@@ -147,7 +149,6 @@ export async function transformTmdbMovie(source, options = {}) {
|
|
|
147
149
|
addArrayDetail(data, "origin_country", payload.origin_country);
|
|
148
150
|
addMovieCertifications(data, payload);
|
|
149
151
|
addStructuredDetail(data, "production_countries", payload.production_countries);
|
|
150
|
-
addStructuredDetail(data, "release_dates", payload.release_dates?.results);
|
|
151
152
|
addStructuredDetail(data, "spoken_languages", payload.spoken_languages);
|
|
152
153
|
addStructuredDetail(data, "watch_providers", payload.watch_providers?.results);
|
|
153
154
|
return attachSourceMetadata(data, source);
|
|
@@ -444,27 +445,13 @@ function addMovieCertifications(data, payload) {
|
|
|
444
445
|
if (!certification) {
|
|
445
446
|
continue;
|
|
446
447
|
}
|
|
447
|
-
const certificationData = {
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
descriptors: release.descriptors ?? []
|
|
451
|
-
};
|
|
452
|
-
const language = stringField(release.iso_639_1);
|
|
453
|
-
const note = stringField(release.note);
|
|
454
|
-
const releaseDate = stringField(release.release_date);
|
|
455
|
-
if (language) {
|
|
456
|
-
certificationData.language = language;
|
|
457
|
-
}
|
|
458
|
-
if (note) {
|
|
459
|
-
certificationData.note = note;
|
|
460
|
-
}
|
|
461
|
-
if (releaseDate) {
|
|
462
|
-
certificationData.releaseDate = releaseDate;
|
|
448
|
+
const certificationData = { region, certification };
|
|
449
|
+
if (release.descriptors?.length) {
|
|
450
|
+
certificationData.descriptors = release.descriptors;
|
|
463
451
|
}
|
|
464
|
-
if (
|
|
465
|
-
certificationData
|
|
452
|
+
if (!certifications.some((item) => item.region === region && item.certification === certification)) {
|
|
453
|
+
certifications.push(certificationData);
|
|
466
454
|
}
|
|
467
|
-
certifications.push(certificationData);
|
|
468
455
|
}
|
|
469
456
|
}
|
|
470
457
|
if (!certifications.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tv.d.ts","sourceRoot":"","sources":["../../../src/providers/tmdb/tv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE/G,OAAO,EAA4C,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"tv.d.ts","sourceRoot":"","sources":["../../../src/providers/tmdb/tv.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createZuuidData } from "../../entity.js";
|
|
2
2
|
import { providerZuuid } from "../../identity.js";
|
|
3
3
|
import { attachSourceMetadata, createSourceRecord } from "../../source.js";
|
|
4
|
+
import { normalizeRating } from "../common.js";
|
|
4
5
|
import { TMDB_BACKDROP_BASE_URL, TMDB_POSTER_BASE_URL, TMDB_PROVIDER } from "./constants.js";
|
|
5
6
|
export const TMDB_TV_CATEGORY = "tv";
|
|
6
7
|
export const ZUUID_TV_CATEGORY = "tvshow";
|
|
@@ -51,7 +52,7 @@ export async function searchTmdbTv(provider, input, options = {}) {
|
|
|
51
52
|
title,
|
|
52
53
|
date: stringField(result.first_air_date) ?? null,
|
|
53
54
|
cover: mediaUrl(result.poster_path ?? undefined, options.posterBaseUrl ?? TMDB_POSTER_BASE_URL) ?? null,
|
|
54
|
-
rating:
|
|
55
|
+
rating: normalizeRating(result.vote_average, 0, 10) ?? null,
|
|
55
56
|
weight: typeof result.popularity === "number" ? result.popularity : null,
|
|
56
57
|
relationType: null,
|
|
57
58
|
attribute: null,
|
|
@@ -95,7 +96,8 @@ export async function transformTmdbTv(source, options = {}) {
|
|
|
95
96
|
data.primaryDate = firstAirDate;
|
|
96
97
|
}
|
|
97
98
|
if (typeof payload.vote_average === "number") {
|
|
98
|
-
data.rating = payload.vote_average;
|
|
99
|
+
data.rating = normalizeRating(payload.vote_average, 0, 10);
|
|
100
|
+
data.details.push({ key: "provider_rating", value: payload.vote_average, source: TMDB_PROVIDER });
|
|
99
101
|
}
|
|
100
102
|
const overview = stringField(payload.overview);
|
|
101
103
|
if (overview) {
|