@refkit/provider-met 0.1.2 → 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/dist/index.d.ts +13 -1
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,18 @@ interface MetConfig {
|
|
|
5
5
|
* result costs one extra call — this bounds that N+1 fan-out. Default 12. */
|
|
6
6
|
maxObjects?: number;
|
|
7
7
|
}
|
|
8
|
+
interface MetSearchOptions {
|
|
9
|
+
isHighlight?: boolean;
|
|
10
|
+
title?: boolean;
|
|
11
|
+
tags?: boolean;
|
|
12
|
+
departmentId?: number;
|
|
13
|
+
isOnView?: boolean;
|
|
14
|
+
artistOrCulture?: boolean;
|
|
15
|
+
medium?: string;
|
|
16
|
+
geoLocation?: string;
|
|
17
|
+
dateBegin?: number;
|
|
18
|
+
dateEnd?: number;
|
|
19
|
+
}
|
|
8
20
|
declare function met(config?: MetConfig): _refkit_core.ReferenceProvider;
|
|
9
21
|
|
|
10
|
-
export { type MetConfig, met };
|
|
22
|
+
export { type MetConfig, type MetSearchOptions, met };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import {
|
|
3
3
|
defineProvider,
|
|
4
|
-
referenceId
|
|
4
|
+
referenceId,
|
|
5
|
+
setIfBoolean,
|
|
6
|
+
setIfInt,
|
|
7
|
+
setIfString
|
|
5
8
|
} from "@refkit/core";
|
|
6
9
|
var BASE = "https://collectionapi.metmuseum.org/public/collection/v1";
|
|
7
10
|
function toReference(o) {
|
|
@@ -33,10 +36,22 @@ function met(config = {}) {
|
|
|
33
36
|
id: "met",
|
|
34
37
|
modalities: ["image"],
|
|
35
38
|
queryFeatures: ["keyword"],
|
|
39
|
+
capabilities: { controls: [] },
|
|
36
40
|
async search(q, ctx) {
|
|
37
41
|
const searchUrl = new URL(`${BASE}/search`);
|
|
38
42
|
searchUrl.searchParams.set("q", q.text);
|
|
39
43
|
searchUrl.searchParams.set("hasImages", "true");
|
|
44
|
+
const opts = q.providerOptions;
|
|
45
|
+
setIfBoolean(searchUrl, "isHighlight", opts?.isHighlight);
|
|
46
|
+
setIfBoolean(searchUrl, "title", opts?.title);
|
|
47
|
+
setIfBoolean(searchUrl, "tags", opts?.tags);
|
|
48
|
+
setIfInt(searchUrl, "departmentId", opts?.departmentId);
|
|
49
|
+
setIfBoolean(searchUrl, "isOnView", opts?.isOnView);
|
|
50
|
+
setIfBoolean(searchUrl, "artistOrCulture", opts?.artistOrCulture);
|
|
51
|
+
setIfString(searchUrl, "medium", opts?.medium);
|
|
52
|
+
setIfString(searchUrl, "geoLocation", opts?.geoLocation);
|
|
53
|
+
setIfInt(searchUrl, "dateBegin", opts?.dateBegin);
|
|
54
|
+
setIfInt(searchUrl, "dateEnd", opts?.dateEnd);
|
|
40
55
|
const res = await ctx.fetch(searchUrl.toString(), { signal: ctx.signal });
|
|
41
56
|
if (!res.ok) throw new Error(`met search failed: ${res.status}`);
|
|
42
57
|
const { objectIDs } = await res.json();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n defineProvider, referenceId,\n type Reference, type RightsRecord, type NormalizedQuery, type ProviderContext,\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\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}\n\nfunction toReference(o: MetObject): Reference | 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 return {\n id: referenceId('met', o.objectURL),\n modality: 'image',\n title: o.title || undefined,\n source: { providerId: 'met', sourceUrl: o.objectURL },\n canonicalUrl: o.objectURL,\n rights,\n verifiedAt: new Date().toISOString(),\n ...(o.primaryImageSmall ? { thumbnail: { url: o.primaryImageSmall } } : {}),\n preview: { url: image, mediaType: 'image/jpeg' },\n relevance: 0,\n raw: o,\n }\n}\n\nexport function met(config: MetConfig = {}) {\n return defineProvider({\n id: 'met',\n modalities: ['image'],\n queryFeatures: ['keyword'],\n async search(q: NormalizedQuery, ctx: ProviderContext): Promise<Reference[]> {\n const searchUrl = new URL(`${BASE}/search`)\n searchUrl.searchParams.set('q', q.text)\n searchUrl.searchParams.set('hasImages', 'true')\n const res = await ctx.fetch(searchUrl.toString(), { signal: ctx.signal })\n if (!res.ok) throw new Error(`met search failed: ${res.status}`)\n const { objectIDs } = (await res.json()) as MetSearchResponse\n if (!objectIDs || objectIDs.length === 0) return []\n const n = Math.min(config.maxObjects ?? q.limit ?? 12, 30)\n const objects = await Promise.all(objectIDs.slice(0, 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 Reference => r !== null)\n },\n })\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EAAgB;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n defineProvider, referenceId,\n setIfBoolean, setIfInt, setIfString,\n type Reference, type RightsRecord, type NormalizedQuery, type ProviderContext,\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}\n\nfunction toReference(o: MetObject): Reference | 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 return {\n id: referenceId('met', o.objectURL),\n modality: 'image',\n title: o.title || undefined,\n source: { providerId: 'met', sourceUrl: o.objectURL },\n canonicalUrl: o.objectURL,\n rights,\n verifiedAt: new Date().toISOString(),\n ...(o.primaryImageSmall ? { thumbnail: { url: o.primaryImageSmall } } : {}),\n preview: { url: image, mediaType: 'image/jpeg' },\n relevance: 0,\n raw: o,\n }\n}\n\nexport function met(config: MetConfig = {}) {\n return defineProvider({\n id: 'met',\n modalities: ['image'],\n queryFeatures: ['keyword'],\n capabilities: { controls: [] },\n async search(q: NormalizedQuery, ctx: ProviderContext): Promise<Reference[]> {\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 if (!res.ok) throw new Error(`met search failed: ${res.status}`)\n const { objectIDs } = (await res.json()) as MetSearchResponse\n if (!objectIDs || objectIDs.length === 0) return []\n const n = Math.min(config.maxObjects ?? q.limit ?? 12, 30)\n const objects = await Promise.all(objectIDs.slice(0, 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 Reference => 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.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "The Metropolitan Museum of Art provider satellite for refkit.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@refkit/core": "0.
|
|
29
|
+
"@refkit/core": "0.5.0"
|
|
30
30
|
},
|
|
31
31
|
"files": [
|
|
32
32
|
"dist",
|