@refkit/provider-met 0.2.4 → 0.4.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/dist/index.js +11 -8
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import {
|
|
3
3
|
defineProvider,
|
|
4
|
-
|
|
4
|
+
okJson,
|
|
5
|
+
plainText,
|
|
5
6
|
setIfBoolean,
|
|
6
7
|
setIfInt,
|
|
7
8
|
setIfString,
|
|
@@ -18,17 +19,18 @@ function toReference(o) {
|
|
|
18
19
|
rehostPolicy: "cache-allowed",
|
|
19
20
|
raw: { sourceTerms: "https://www.metmuseum.org/information/terms-and-conditions", sourceUrl: o.objectURL }
|
|
20
21
|
};
|
|
22
|
+
const description = plainText([o.objectName, o.medium, o.culture, o.period].filter(Boolean).join(". "));
|
|
23
|
+
const tags = [o.classification, ...(o.tags ?? []).map((t) => t.term)].filter((t) => !!t);
|
|
21
24
|
return {
|
|
22
|
-
id: referenceId("met", o.objectURL),
|
|
23
25
|
modality: "image",
|
|
26
|
+
kind: "artwork",
|
|
24
27
|
title: o.title || void 0,
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
...description ? { description } : {},
|
|
29
|
+
...tags.length > 0 ? { tags } : {},
|
|
30
|
+
sourceUrl: o.objectURL,
|
|
27
31
|
rights,
|
|
28
|
-
verifiedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
29
32
|
...o.primaryImageSmall ? { thumbnail: { url: o.primaryImageSmall } } : {},
|
|
30
33
|
preview: { url: image, mediaType: "image/jpeg" },
|
|
31
|
-
relevance: 0,
|
|
32
34
|
raw: o
|
|
33
35
|
};
|
|
34
36
|
}
|
|
@@ -36,6 +38,8 @@ function met(config = {}) {
|
|
|
36
38
|
return defineProvider({
|
|
37
39
|
id: "met",
|
|
38
40
|
modalities: ["image"],
|
|
41
|
+
kinds: ["artwork"],
|
|
42
|
+
description: "Open Access artworks from the Metropolitan Museum of Art",
|
|
39
43
|
capabilities: { controls: ["page"] },
|
|
40
44
|
async search(q, ctx) {
|
|
41
45
|
const searchUrl = new URL(`${BASE}/search`);
|
|
@@ -53,8 +57,7 @@ function met(config = {}) {
|
|
|
53
57
|
setIfInt(searchUrl, "dateBegin", opts?.dateBegin);
|
|
54
58
|
setIfInt(searchUrl, "dateEnd", opts?.dateEnd);
|
|
55
59
|
const res = await ctx.fetch(searchUrl.toString(), { signal: ctx.signal });
|
|
56
|
-
|
|
57
|
-
const { objectIDs } = await res.json();
|
|
60
|
+
const { objectIDs } = await okJson(res, "met search");
|
|
58
61
|
if (!objectIDs || objectIDs.length === 0) return [];
|
|
59
62
|
const n = Math.min(config.maxObjects ?? q.limit ?? 12, 30);
|
|
60
63
|
const from = offsetForPage(q.controls?.page, n) ?? 0;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n defineProvider,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n defineProvider, okJson, plainText, setIfBoolean, setIfInt, setIfString,\n type EmittedReference, type RightsRecord, type NormalizedQuery, type ProviderContext,\n offsetForPage,\n} from '@refkit/core'\n\nexport interface MetConfig {\n /** Max objects fetched per search. The Met search returns only IDs, so each\n * result costs one extra call — this bounds that N+1 fan-out. Default 12. */\n maxObjects?: number\n}\n\nexport interface MetSearchOptions {\n isHighlight?: boolean\n title?: boolean\n tags?: boolean\n departmentId?: number\n isOnView?: boolean\n artistOrCulture?: boolean\n medium?: string\n geoLocation?: string\n dateBegin?: number\n dateEnd?: number\n}\n\nconst BASE = 'https://collectionapi.metmuseum.org/public/collection/v1'\n\ninterface MetSearchResponse { total: number; objectIDs: number[] | null }\ninterface MetObject {\n objectID: number\n isPublicDomain: boolean\n primaryImage: string\n primaryImageSmall: string\n title: string\n artistDisplayName: string\n objectURL: string\n objectName: string\n medium: string\n culture?: string\n period?: string\n classification?: string\n tags?: Array<{ term: string }> | null\n}\n\nfunction toReference(o: MetObject): EmittedReference | null {\n // The Met releases open-access (public-domain) images under CC0. Copyrighted\n // works return an empty primaryImage — nothing usable to surface.\n if (!o.isPublicDomain) return null\n const image = o.primaryImage || o.primaryImageSmall\n if (!image) return null\n const rights: RightsRecord = {\n license: 'CC0-1.0',\n author: o.artistDisplayName || undefined,\n rehostPolicy: 'cache-allowed',\n raw: { sourceTerms: 'https://www.metmuseum.org/information/terms-and-conditions', sourceUrl: o.objectURL },\n }\n // The Met has no caption field; objectName/medium/culture/period are the descriptive\n // facets it does return, and reading as one line is what the reranker scores. Some\n // `medium` values run long and carry line breaks, so normalize through plainText.\n const description = plainText([o.objectName, o.medium, o.culture, o.period].filter(Boolean).join('. '))\n const tags = [o.classification, ...(o.tags ?? []).map(t => t.term)].filter((t): t is string => !!t)\n return {\n modality: 'image',\n kind: 'artwork',\n title: o.title || undefined,\n ...(description ? { description } : {}),\n ...(tags.length > 0 ? { tags } : {}),\n sourceUrl: o.objectURL,\n rights,\n ...(o.primaryImageSmall ? { thumbnail: { url: o.primaryImageSmall } } : {}),\n preview: { url: image, mediaType: 'image/jpeg' },\n raw: o,\n }\n}\n\nexport function met(config: MetConfig = {}) {\n return defineProvider({\n id: 'met',\n modalities: ['image'],\n kinds: ['artwork'],\n description: 'Open Access artworks from the Metropolitan Museum of Art',\n capabilities: { controls: ['page'] },\n async search(q: NormalizedQuery, ctx: ProviderContext): Promise<EmittedReference[]> {\n const searchUrl = new URL(`${BASE}/search`)\n searchUrl.searchParams.set('q', q.text)\n searchUrl.searchParams.set('hasImages', 'true')\n const opts = q.providerOptions as MetSearchOptions | undefined\n setIfBoolean(searchUrl, 'isHighlight', opts?.isHighlight)\n setIfBoolean(searchUrl, 'title', opts?.title)\n setIfBoolean(searchUrl, 'tags', opts?.tags)\n setIfInt(searchUrl, 'departmentId', opts?.departmentId)\n setIfBoolean(searchUrl, 'isOnView', opts?.isOnView)\n setIfBoolean(searchUrl, 'artistOrCulture', opts?.artistOrCulture)\n setIfString(searchUrl, 'medium', opts?.medium)\n setIfString(searchUrl, 'geoLocation', opts?.geoLocation)\n setIfInt(searchUrl, 'dateBegin', opts?.dateBegin)\n setIfInt(searchUrl, 'dateEnd', opts?.dateEnd)\n const res = await ctx.fetch(searchUrl.toString(), { signal: ctx.signal })\n const { objectIDs } = await okJson<MetSearchResponse>(res, 'met search')\n if (!objectIDs || objectIDs.length === 0) return []\n const n = Math.min(config.maxObjects ?? q.limit ?? 12, 30)\n // the search endpoint returns every matching id — page = a window over that list\n const from = offsetForPage(q.controls?.page, n) ?? 0\n const objects = await Promise.all(objectIDs.slice(from, from + n).map(async (id) => {\n try {\n const r = await ctx.fetch(`${BASE}/objects/${id}`, { signal: ctx.signal })\n if (!r.ok) return null\n return (await r.json()) as MetObject\n } catch {\n return null // one bad object fetch must not drop the whole batch\n }\n }))\n return objects\n .map((o) => (o ? toReference(o) : null))\n .filter((r): r is EmittedReference => r !== null)\n },\n })\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@refkit/provider-met",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "The Metropolitan Museum of Art provider satellite for refkit.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -33,14 +33,14 @@
|
|
|
33
33
|
}
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@refkit/core": "0.
|
|
36
|
+
"@refkit/core": "0.9.0"
|
|
37
37
|
},
|
|
38
38
|
"files": [
|
|
39
39
|
"dist",
|
|
40
40
|
"LICENSE"
|
|
41
41
|
],
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@refkit/provider-testkit": "0.
|
|
43
|
+
"@refkit/provider-testkit": "0.1.1"
|
|
44
44
|
},
|
|
45
45
|
"scripts": {
|
|
46
46
|
"typecheck": "tsc --noEmit",
|