@zivue/zuuid 0.2.0 → 0.2.2
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 +14 -0
- package/README.md +148 -5
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +36 -0
- package/dist/identity.d.ts +1 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- 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/client.d.ts +19 -0
- package/dist/providers/gamesdb/client.d.ts.map +1 -0
- package/dist/providers/gamesdb/client.js +57 -0
- package/dist/providers/gamesdb/constants.d.ts +2 -0
- package/dist/providers/gamesdb/constants.d.ts.map +1 -1
- package/dist/providers/gamesdb/constants.js +2 -0
- package/dist/providers/gamesdb/game.d.ts +7 -5
- package/dist/providers/gamesdb/game.d.ts.map +1 -1
- package/dist/providers/gamesdb/game.js +205 -22
- package/dist/providers/gamesdb/index.d.ts +2 -0
- package/dist/providers/gamesdb/index.d.ts.map +1 -1
- package/dist/providers/gamesdb/index.js +2 -0
- package/dist/providers/gamesdb/platform.d.ts +5 -2
- package/dist/providers/gamesdb/platform.d.ts.map +1 -1
- package/dist/providers/gamesdb/platform.js +87 -4
- package/dist/providers/gamesdb/types.d.ts +21 -0
- package/dist/providers/gamesdb/types.d.ts.map +1 -0
- package/dist/providers/gamesdb/types.js +1 -0
- package/dist/providers/imdb/client.d.ts +16 -0
- package/dist/providers/imdb/client.d.ts.map +1 -0
- package/dist/providers/imdb/client.js +29 -0
- package/dist/providers/imdb/constants.d.ts +4 -0
- package/dist/providers/imdb/constants.d.ts.map +1 -0
- package/dist/providers/imdb/constants.js +3 -0
- package/dist/providers/imdb/index.d.ts +4 -0
- package/dist/providers/imdb/index.d.ts.map +1 -0
- package/dist/providers/imdb/index.js +3 -0
- package/dist/providers/imdb/movie.d.ts +16 -0
- package/dist/providers/imdb/movie.d.ts.map +1 -0
- package/dist/providers/imdb/movie.js +183 -0
- package/dist/providers/imdb/types.d.ts +10 -0
- package/dist/providers/imdb/types.d.ts.map +1 -0
- package/dist/providers/imdb/types.js +1 -0
- 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 -3
- package/package.json +13 -1
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { createSourceRecord } from "../../source.js";
|
|
2
|
+
import { addAlias, addDescription, addDetail, addMedia, addRelation, addTag, baseDataFromSource, datePrefix, finalizeData, normalizeRating, objectPayload, stringField, valueAsString } from "../common.js";
|
|
3
|
+
import { IMDB_PROVIDER } from "./constants.js";
|
|
4
|
+
export async function fetchImdbMovieSourceRecord(provider, input) {
|
|
5
|
+
return fetchImdbTitleSourceRecord(provider, input, "movie");
|
|
6
|
+
}
|
|
7
|
+
export async function fetchImdbTvSourceRecord(provider, input) {
|
|
8
|
+
return fetchImdbTitleSourceRecord(provider, input, "tv");
|
|
9
|
+
}
|
|
10
|
+
export async function transformImdbMovie(source, options = {}) {
|
|
11
|
+
return transformImdbTitle(source, "movie", options);
|
|
12
|
+
}
|
|
13
|
+
export async function transformImdbTv(source, options = {}) {
|
|
14
|
+
return transformImdbTitle(source, "tv", options);
|
|
15
|
+
}
|
|
16
|
+
export async function searchImdbMovies() {
|
|
17
|
+
throw new Error("IMDb search is not implemented; fetch by IMDb title id instead.");
|
|
18
|
+
}
|
|
19
|
+
async function fetchImdbTitleSourceRecord(provider, input, category) {
|
|
20
|
+
const id = normalizeImdbTitleId(input.id);
|
|
21
|
+
const baseUrl = provider.titleBaseUrl?.replace(/\/$/, "");
|
|
22
|
+
if (!baseUrl) {
|
|
23
|
+
throw new Error("IMDb title base URL is disabled");
|
|
24
|
+
}
|
|
25
|
+
const url = `${baseUrl}/${id}/`;
|
|
26
|
+
const response = await provider.fetcher(url, {
|
|
27
|
+
headers: {
|
|
28
|
+
Accept: "text/html,application/xhtml+xml",
|
|
29
|
+
"Accept-Language": "en-US,en;q=0.9",
|
|
30
|
+
"User-Agent": provider.userAgent
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
if (response.status === 404) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
throw new Error(`IMDb title request failed with status ${response.status}`);
|
|
38
|
+
}
|
|
39
|
+
const html = await response.text();
|
|
40
|
+
return createSourceRecord({
|
|
41
|
+
source: { provider: IMDB_PROVIDER, category, externalId: id },
|
|
42
|
+
payload: extractImdbPayload(url, html)
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async function transformImdbTitle(source, fallbackCategory, options = {}) {
|
|
46
|
+
const payload = objectPayload(source.payload);
|
|
47
|
+
const jsonLd = objectPayload(payload.jsonLd ?? {});
|
|
48
|
+
const externalId = normalizeImdbTitleId(source.source.externalId);
|
|
49
|
+
const category = source.source.category === "tv" || schemaType(jsonLd).includes("TVSeries") ? "tv" : fallbackCategory;
|
|
50
|
+
const title = stringField(jsonLd, "name") ?? fallbackTitle(payload) ?? externalId;
|
|
51
|
+
const data = await baseDataFromSource(source, IMDB_PROVIDER, category, category, externalId, title);
|
|
52
|
+
data.primaryDate = datePrefix(stringField(jsonLd, "datePublished"));
|
|
53
|
+
addAlias(data, title, "primary", true, IMDB_PROVIDER);
|
|
54
|
+
addDescription(data, IMDB_PROVIDER, stringField(jsonLd, "description"));
|
|
55
|
+
addMedia(data, IMDB_PROVIDER, stringField(jsonLd, "image"), "poster");
|
|
56
|
+
const aggregateRating = objectPayload(jsonLd.aggregateRating ?? {});
|
|
57
|
+
const nativeRating = numericValue(aggregateRating.ratingValue);
|
|
58
|
+
const normalizedRating = normalizeRating(nativeRating, 0, 10);
|
|
59
|
+
if (normalizedRating !== undefined) {
|
|
60
|
+
data.rating = normalizedRating;
|
|
61
|
+
}
|
|
62
|
+
addDetail(data, IMDB_PROVIDER, "provider_rating", nativeRating);
|
|
63
|
+
addDetail(data, IMDB_PROVIDER, "rating_count", numericValue(aggregateRating.ratingCount));
|
|
64
|
+
addDetail(data, IMDB_PROVIDER, "best_rating", numericValue(aggregateRating.bestRating));
|
|
65
|
+
addDetail(data, IMDB_PROVIDER, "content_rating", stringField(jsonLd, "contentRating"));
|
|
66
|
+
addDetail(data, IMDB_PROVIDER, "duration", stringField(jsonLd, "duration"));
|
|
67
|
+
addDetail(data, IMDB_PROVIDER, "schema_type", valueAsString(jsonLd["@type"]));
|
|
68
|
+
addDetail(data, IMDB_PROVIDER, "url", stringField(payload, "url") ?? imdbTitleUrl(externalId, options.titleBaseUrl));
|
|
69
|
+
for (const genre of stringArray(jsonLd.genre)) {
|
|
70
|
+
addTag(data, genre);
|
|
71
|
+
}
|
|
72
|
+
for (const actor of personArray(jsonLd.actor)) {
|
|
73
|
+
await addPersonRelation(data, actor, "performed_by");
|
|
74
|
+
}
|
|
75
|
+
for (const director of personArray(jsonLd.director)) {
|
|
76
|
+
await addPersonRelation(data, director, "directed_by");
|
|
77
|
+
}
|
|
78
|
+
for (const creator of personArray(jsonLd.creator)) {
|
|
79
|
+
await addPersonRelation(data, creator, "created_by");
|
|
80
|
+
}
|
|
81
|
+
return finalizeData(data, source);
|
|
82
|
+
}
|
|
83
|
+
function extractImdbPayload(url, html) {
|
|
84
|
+
return {
|
|
85
|
+
url,
|
|
86
|
+
html,
|
|
87
|
+
title: cleanPageTitle(decodeHtml(textFromMatch(html.match(/<title[^>]*>([\s\S]*?)<\/title>/i)?.[1]))) ?? null,
|
|
88
|
+
jsonLd: parseJsonScript(html, /<script[^>]+type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/i) ?? null,
|
|
89
|
+
nextData: parseJsonScript(html, /<script[^>]+id=["']__NEXT_DATA__["'][^>]*>([\s\S]*?)<\/script>/i) ?? null
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function parseJsonScript(html, pattern) {
|
|
93
|
+
const raw = html.match(pattern)?.[1];
|
|
94
|
+
const text = textFromMatch(raw);
|
|
95
|
+
if (!text) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
return JSON.parse(decodeHtml(text) ?? text);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
try {
|
|
103
|
+
return JSON.parse(text);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function textFromMatch(value) {
|
|
111
|
+
const normalized = value?.trim();
|
|
112
|
+
return normalized || undefined;
|
|
113
|
+
}
|
|
114
|
+
function normalizeImdbTitleId(value) {
|
|
115
|
+
const raw = String(value).trim();
|
|
116
|
+
const withoutUrl = raw.match(/title\/(tt\d+)/i)?.[1] ?? raw;
|
|
117
|
+
const normalized = withoutUrl.toLowerCase().startsWith("tt") ? withoutUrl : `tt${withoutUrl.padStart(7, "0")}`;
|
|
118
|
+
if (!/^tt\d+$/i.test(normalized)) {
|
|
119
|
+
throw new Error(`Invalid IMDb title id: ${value}`);
|
|
120
|
+
}
|
|
121
|
+
return normalized.toLowerCase();
|
|
122
|
+
}
|
|
123
|
+
function imdbTitleUrl(id, titleBaseUrl) {
|
|
124
|
+
const base = titleBaseUrl?.replace(/\/$/, "");
|
|
125
|
+
return base ? `${base}/${id}/` : undefined;
|
|
126
|
+
}
|
|
127
|
+
function schemaType(jsonLd) {
|
|
128
|
+
const value = jsonLd["@type"];
|
|
129
|
+
return Array.isArray(value) ? value.map((item) => valueAsString(item)).filter(Boolean).join(",") : valueAsString(value) ?? "";
|
|
130
|
+
}
|
|
131
|
+
function fallbackTitle(payload) {
|
|
132
|
+
return cleanPageTitle(stringField(payload, "title"));
|
|
133
|
+
}
|
|
134
|
+
function cleanPageTitle(title) {
|
|
135
|
+
return title?.replace(/\s*-\s*IMDb\s*$/i, "").trim() || undefined;
|
|
136
|
+
}
|
|
137
|
+
function numericValue(value) {
|
|
138
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
139
|
+
return value;
|
|
140
|
+
}
|
|
141
|
+
if (typeof value === "string") {
|
|
142
|
+
const parsed = Number(value.replace(/,/g, ""));
|
|
143
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
144
|
+
}
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
function stringArray(value) {
|
|
148
|
+
if (typeof value === "string") {
|
|
149
|
+
return [value];
|
|
150
|
+
}
|
|
151
|
+
if (Array.isArray(value)) {
|
|
152
|
+
return value.filter((item) => typeof item === "string" && item.trim() !== "");
|
|
153
|
+
}
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
function personArray(value) {
|
|
157
|
+
if (Array.isArray(value)) {
|
|
158
|
+
return value.filter((item) => !!item && typeof item === "object" && !Array.isArray(item));
|
|
159
|
+
}
|
|
160
|
+
return value && typeof value === "object" && !Array.isArray(value) ? [value] : [];
|
|
161
|
+
}
|
|
162
|
+
async function addPersonRelation(data, person, relationType) {
|
|
163
|
+
const name = stringField(person, "name");
|
|
164
|
+
const externalId = imdbNameId(stringField(person, "url"));
|
|
165
|
+
if (!name || !externalId) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
await addRelation(data, IMDB_PROVIDER, "person", externalId, relationType, name);
|
|
169
|
+
}
|
|
170
|
+
function imdbNameId(url) {
|
|
171
|
+
return url?.match(/name\/(nm\d+)/i)?.[1]?.toLowerCase();
|
|
172
|
+
}
|
|
173
|
+
function decodeHtml(value) {
|
|
174
|
+
return value
|
|
175
|
+
?.replace(/"/g, '"')
|
|
176
|
+
.replace(/"/g, '"')
|
|
177
|
+
.replace(/'/g, "'")
|
|
178
|
+
.replace(/'/g, "'")
|
|
179
|
+
.replace(/&/g, "&")
|
|
180
|
+
.replace(/</g, "<")
|
|
181
|
+
.replace(/>/g, ">")
|
|
182
|
+
.trim();
|
|
183
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type ImdbFetchLike = (input: string | URL, init?: RequestInit) => Promise<Response>;
|
|
2
|
+
export type ImdbProviderOptions = {
|
|
3
|
+
fetch?: ImdbFetchLike;
|
|
4
|
+
titleBaseUrl?: string | null;
|
|
5
|
+
userAgent?: string;
|
|
6
|
+
};
|
|
7
|
+
export type ImdbTransformOptions = {
|
|
8
|
+
titleBaseUrl?: string | null;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/imdb/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE3F,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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":"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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 { 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) {
|
|
@@ -150,7 +152,6 @@ export async function transformTmdbTv(source, options = {}) {
|
|
|
150
152
|
addTvCertifications(data, payload);
|
|
151
153
|
addStructuredDetail(data, "production_countries", payload.production_countries);
|
|
152
154
|
addStructuredDetail(data, "spoken_languages", payload.spoken_languages);
|
|
153
|
-
addStructuredDetail(data, "content_ratings", payload.content_ratings?.results);
|
|
154
155
|
addStructuredDetail(data, "last_episode_to_air", payload.last_episode_to_air);
|
|
155
156
|
addStructuredDetail(data, "next_episode_to_air", payload.next_episode_to_air);
|
|
156
157
|
addStructuredDetail(data, "watch_providers", payload.watch_providers?.results);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zivue/zuuid",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "TypeScript helpers for fetching, searching, and transforming Zuuid datasets.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -243,6 +243,18 @@
|
|
|
243
243
|
"./providers/tmdb/person": {
|
|
244
244
|
"types": "./dist/providers/tmdb/person.d.ts",
|
|
245
245
|
"import": "./dist/providers/tmdb/person.js"
|
|
246
|
+
},
|
|
247
|
+
"./providers/imdb": {
|
|
248
|
+
"types": "./dist/providers/imdb/index.d.ts",
|
|
249
|
+
"import": "./dist/providers/imdb/index.js"
|
|
250
|
+
},
|
|
251
|
+
"./providers/imdb/movie": {
|
|
252
|
+
"types": "./dist/providers/imdb/movie.d.ts",
|
|
253
|
+
"import": "./dist/providers/imdb/movie.js"
|
|
254
|
+
},
|
|
255
|
+
"./providers/gamesdb/client": {
|
|
256
|
+
"types": "./dist/providers/gamesdb/client.d.ts",
|
|
257
|
+
"import": "./dist/providers/gamesdb/client.js"
|
|
246
258
|
}
|
|
247
259
|
},
|
|
248
260
|
"types": "./dist/index.d.ts",
|