@prose-reader/metadata-fetcher 1.341.0 → 1.343.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.
@@ -1,14 +1,6 @@
1
- import { ResolvedMetadata } from '@prose-reader/archive-reader';
2
1
  import { FetchedMetadata } from './types/fetchedMetadata.ts';
2
+ import { FetchMetadataInput } from './types/fetchMetadataInput.ts';
3
3
  import { MetadataProvider } from './types/provider.ts';
4
- /**
5
- * A {@link ResolvedMetadata}, or anything carrying one — the `ResolvedArchive`
6
- * shape, so the output of `resolveArchive` goes straight in. Hand-built terms
7
- * (`{ title: "Dune" }`) work too, when there is no container to resolve.
8
- */
9
- export type FetchMetadataInput = ResolvedMetadata | {
10
- readonly metadata: ResolvedMetadata;
11
- };
12
4
  export type FetchMetadataOptions = {
13
5
  /**
14
6
  * The catalogs to ask, queried concurrently. Their order is the tie-break
@@ -36,8 +28,9 @@ export type FetchMetadataOptions = {
36
28
  /**
37
29
  * Asks every provider what it knows about a book, scores the answers against
38
30
  * what you gave it, and returns the ranked candidates with the evidence behind
39
- * each score. Candidates use the same {@link ResolvedMetadata} vocabulary as
40
- * `resolveArchive`, so remote and embedded metadata stay interchangeable.
31
+ * each score. The input contains only fields understood for lookup and
32
+ * matching; candidates retain archive-reader's rich `ResolvedMetadata`
33
+ * vocabulary, including catalog-only covers, descriptions and subjects.
41
34
  *
42
35
  * ```ts
43
36
  * import { resolveArchive } from "@prose-reader/archive-reader"
@@ -45,10 +38,11 @@ export type FetchMetadataOptions = {
45
38
  * createOpenLibraryProvider,
46
39
  * createProjectGutenbergProvider,
47
40
  * fetchMetadata,
41
+ * metadataInputFromResolvedArchive,
48
42
  * } from "@prose-reader/metadata-fetcher"
49
43
  *
50
44
  * const resolved = await resolveArchive(archive)
51
- * const fetched = await fetchMetadata(resolved, {
45
+ * const fetched = await fetchMetadata(metadataInputFromResolvedArchive(resolved), {
52
46
  * providers: [
53
47
  * createProjectGutenbergProvider(),
54
48
  * createOpenLibraryProvider(),
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@prose-reader/archive-reader"),t=require("@prose-reader/shared"),n=require("xmldoc");var r=e=>{let t=e.contributors??[],n=t.filter(e=>e.roles.includes(`author`)),r=(n.length>0?n:t).map(e=>e.name.trim()).filter(e=>e.length>0);return[...new Set(r)]},i=/^\d{13}$/,a=/^\d{9}[\dX]$/,o=t=>{let n=(0,e.normalizeIsbn)(t);if(n===void 0)return;if(i.test(n))return n;if(!a.test(n))return;let r=`978${n.slice(0,9)}`,o=0;for(let e=0;e<r.length;e++){let t=r.charCodeAt(e)-48;o+=e%2==0?t:t*3}return`${r}${(10-o%10)%10}`},s=/[\u0300-\u036f]/g,c=/[^\p{L}\p{N}]+/gu,l=e=>e.normalize(`NFD`).replace(s,``).toLowerCase().replace(c,` `).trim(),u=e=>{let t=new Map;for(let n=0;n<e.length-1;n++){let r=e.slice(n,n+2);t.set(r,(t.get(r)??0)+1)}return t},d=(e,t)=>{let n=l(e).replaceAll(` `,``),r=l(t).replaceAll(` `,``);if(n.length===0||r.length===0)return 0;if(n===r)return 1;if(n.length<2||r.length<2)return 0;let i=u(n),a=0;for(let[e,t]of u(r))a+=Math.min(t,i.get(e)??0);return 2*a/(n.length-1+(r.length-1))},f=/\s*[:;]\s*|\s+[-–—]\s+/,p=e=>{let[t=``,...n]=e.split(f),r=t.trim(),i=n.join(` `).trim();return r.length===0?{main:e,hasSubtitle:!1}:{main:r,hasSubtitle:i.length>0}},m=.9,h=[`volume`,`part`,`book`],g=/\b(volumes?|vols?|parts?|books?)\s+([\p{L}\p{N}]+)\b/gu,_={one:1,first:1,two:2,second:2,three:3,third:3,four:4,fourth:4,five:5,fifth:5,six:6,sixth:6,seven:7,seventh:7,eight:8,eighth:8,nine:9,ninth:9,ten:10,tenth:10,eleven:11,eleventh:11,twelve:12,twelfth:12},v={i:1,v:5,x:10,l:50,c:100,d:500,m:1e3},y=e=>{if(!/^m{0,3}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/i.test(e))return;let t=0,n=0;for(let r of[...e.toLowerCase()].reverse()){let e=v[r];if(e===void 0)return;e<n?t-=e:(t+=e,n=e)}return t>0?t:void 0},b=e=>/^\d+$/.test(e)?Number.parseInt(e,10):_[e]??y(e),x=e=>{if(e.startsWith(`vol`))return`volume`;if(e.startsWith(`part`))return`part`;if(e.startsWith(`book`))return`book`},S=e=>{let t=new Map;for(let n of l(e).matchAll(g)){let e=n[1]===void 0?void 0:x(n[1]),r=n[2]===void 0?void 0:b(n[2]);if(e===void 0||r===void 0)continue;let i=t.get(e)??new Set;i.add(r),t.set(e,i)}return t},C=(e,t)=>{let n=S(e),r=S(t);for(let e of h){let t=n.get(e),i=r.get(e);if(!(t===void 0||i===void 0)&&[...t].every(e=>!i.has(e)))return!0}return!1},w=(e,t)=>{if(C(e,t))return 0;let n=d(e,t),r=p(e),i=p(t);return r.hasSubtitle===i.hasSubtitle?n:Math.max(n,d(r.main,i.main)*m)},T=e=>l(e).split(` `).filter(e=>e.length>0).sort().join(` `),E=(e,t)=>d(T(e),T(t)),D={isbn:1,gtin:1,identifiers:.6,title:.8,contributors:.5,series:.3,"publication.original.date":.2,"publication.original.publisher":.15,"publication.edition.date":.2,"publication.edition.publisher":.15,languages:.15,numberOfPages:.15},ee=new Set([`isbn`,`gtin`]),O=e=>{let t=e?.trim();return t!==void 0&&t.length>0?t:void 0},k=(e,t)=>{let n=O(e.value)?.toLowerCase();return n!==void 0&&n===O(t.value)?.toLowerCase()},A=e=>O(e.scheme)?.toLowerCase(),te=e=>e.scheme===void 0?e.value:`${e.scheme}:${e.value}`,ne=(e,t)=>{if(!k(e,t))return!1;let n=A(e),r=A(t);return n===void 0||r===void 0||n===r},re=(e,t)=>{if(!k(e,t))return!1;let n=A(e),r=A(t);return n!==void 0&&n===r},ie=e=>e.trim().toLowerCase().split(`-`)[0]??``,ae=(e,t)=>{let n=Math.abs(e-t);return n===0?1:n===1?.6:n<=3?.3:0},oe=(e,t)=>{let n=Math.max(e,t);return n<=0?0:Math.max(0,1-Math.abs(e-t)/n*2)},se=(e,t,n)=>e.reduce((e,r)=>t.reduce((e,t)=>Math.max(e,n(r,t)),e),0),ce=(e,t)=>{let n=[],i=(e,t)=>{t!==void 0&&n.push({field:e,weight:D[e],score:Math.min(1,Math.max(0,t.score)),query:t.query,candidate:t.candidate})},a=(e,t,n,r=d)=>{let a=O(t),o=O(n);a===void 0||o===void 0||i(e,{score:r(a,o),query:a,candidate:o})},s=O(e.isbn),c=O(t.isbn),l=s===void 0?void 0:o(s),u=c===void 0?void 0:o(c);s!==void 0&&c!==void 0&&l!==void 0&&u!==void 0&&i(`isbn`,{score:+(l===u),query:s,candidate:c});let f=O(e.gtin),p=O(t.gtin);f!==void 0&&p!==void 0&&i(`gtin`,{score:+(f===p),query:f,candidate:p});let m=e.identifiers??[],h=t.identifiers??[],g=m.some(e=>h.some(t=>re(e,t)));m.length>0&&h.length>0&&i(`identifiers`,{score:+!!m.some(e=>h.some(t=>ne(e,t))),query:m.map(te).join(`, `),candidate:h.map(te).join(`, `)}),a(`title`,e.title,t.title,w),a(`publication.original.publisher`,e.publication?.original?.publisher,t.publication?.original?.publisher),a(`publication.edition.publisher`,e.publication?.edition?.publisher,t.publication?.edition?.publisher),a(`series`,e.belongsTo?.series?.[0]?.name,t.belongsTo?.series?.[0]?.name);let _=r(t),v=r(e);v.length>0&&_.length>0&&i(`contributors`,{score:se(v,_,E),query:v.join(`, `),candidate:_.join(`, `)});let y=(e,t,n)=>{t===void 0||n===void 0||i(e,{score:ae(t,n),query:String(t),candidate:String(n)})};y(`publication.original.date`,e.publication?.original?.date?.year,t.publication?.original?.date?.year),y(`publication.edition.date`,e.publication?.edition?.date?.year,t.publication?.edition?.date?.year);let b=e.languages??[],x=t.languages??[];if(b.length>0&&x.length>0){let e=new Set(x.map(ie));i(`languages`,{score:+!!b.some(t=>e.has(ie(t))),query:b.join(`, `),candidate:x.join(`, `)})}e.numberOfPages!==void 0&&t.numberOfPages!==void 0&&i(`numberOfPages`,{score:oe(e.numberOfPages,t.numberOfPages),query:String(e.numberOfPages),candidate:String(t.numberOfPages)});let S=n.filter(e=>ee.has(e.field));if(S.some(e=>e.score===0))return{score:0,signals:n};if(g||S.some(e=>e.score===1))return{score:1,signals:n};let C=n.reduce((e,t)=>e+t.weight,0);return C===0?{score:0,signals:n}:{score:n.reduce((e,t)=>e+t.score*t.weight,0)/C,signals:n}},j=class extends Error{status;constructor(e,t){super(t??`Provider responded with status ${e}`),this.name=`MetadataProviderResponseError`,this.status=e}},M=e=>{if(typeof e!=`object`||!e||!(`status`in e))return;let{status:t}=e;if(!(typeof t!=`number`||!Number.isInteger(t)))return t>=100&&t<=599?t:void 0},N=t.Report.namespace(`@prose-reader/metadata-fetcher`,void 0,{color:`#b06642`}),P=e=>{let t=Object.entries(e).filter(([,e])=>e!==void 0);return Object.fromEntries(t)},le=5,ue=.5,de=3,fe=({candidate:e,providerId:t,score:n,signals:r,accepted:i,includeRaw:a})=>P({providerId:t,score:n,signals:r,accepted:i,metadata:e.metadata,id:e.id,url:e.url,raw:a?e.raw:void 0}),pe=async(e,t)=>{let n=`metadata`in e?e.metadata:e,r=t.limit??le,i=t.minScore??ue,a=t.includeRaw===!0,o=await Promise.all(t.providers.map(async e=>{try{return{provider:e,candidates:await e.search(n,{limit:r,signal:t.signal}),failure:void 0}}catch(n){if(t.signal?.aborted===!0)throw n;return N.error(`fetchMetadata: provider "${e.id}" failed`,n),{provider:e,candidates:void 0,failure:P({id:e.id,status:M(n)})}}})),s=o.flatMap(e=>e.failure===void 0?[]:[e.failure]),c={},l=[];for(let{provider:e,candidates:t}of o){if(t===void 0)continue;let o=t.map(t=>{let{score:r,signals:o}=ce(n,t.metadata);return fe({candidate:t,providerId:e.id,score:r,signals:o,accepted:r>=i,includeRaw:a})}).sort((e,t)=>t.score-e.score).slice(0,r);c[e.id]!==void 0&&N.warn(`fetchMetadata: several providers share the id "${e.id}"`),c[e.id]={provider:{id:e.id,name:e.name},matches:o},l.push(...o)}return{version:de,matches:[...l].sort((e,t)=>t.score-e.score),sources:c,failedProviders:s}},F=`ProjectGutenberg`,me=new Set([`gutenberg.org`,`www.gutenberg.org`]),he=[/^\/ebooks\/(\d+)(?:[./]|$)/i,/^\/files\/(\d+)(?:\/|$)/i,/^\/cache\/epub\/(\d+)(?:\/|$)/i,/^\/(\d+)(?:\/|$)/],I=e=>{let t=e.trim();if(!/^\d+$/.test(t))return;let n=t.replace(/^0+(?=\d)/,``);return n===`0`?void 0:n},ge=e=>{try{let t=new URL(e.trim());if(t.protocol!==`http:`&&t.protocol!==`https:`||!me.has(t.hostname.toLowerCase()))return;for(let e of he){let n=e.exec(t.pathname)?.[1];if(n!==void 0)return I(n)}}catch{return}},L=e=>{for(let t of e.identifiers??[]){let e=t.scheme?.trim().toLowerCase(),n=e===`projectgutenberg`?I(t.value):e===void 0||e===`url`||e===`uri`?ge(t.value):void 0;if(n!==void 0)return{id:n,identifier:{value:t.value,...t.scheme===void 0?{}:{scheme:t.scheme}}}}},R=e=>typeof e==`object`&&!!e&&!Array.isArray(e),z=(e,t)=>{let n=e[t];if(typeof n!=`string`)return;let r=n.trim();return r.length>0?r:void 0},B=(e,t)=>{let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0},V=(e,t)=>{let n=e[t];if(!Array.isArray(n))return;let r=n.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e.length>0);return r.length>0?r:void 0},_e=(e,t)=>{let n=e[t];return Array.isArray(n)?n.filter(R):[]},ve=e=>({key:z(e,`key`),title:z(e,`title`),subtitle:z(e,`subtitle`),author_name:V(e,`author_name`),first_publish_year:B(e,`first_publish_year`),language:V(e,`language`),subject:V(e,`subject`),number_of_pages_median:B(e,`number_of_pages_median`),cover_i:B(e,`cover_i`),id_project_gutenberg:V(e,`id_project_gutenberg`)}),H=e=>R(e)?_e(e,`docs`).map(ve):[],ye={afr:`af`,alb:`sq`,amh:`am`,ara:`ar`,arm:`hy`,asm:`as`,aze:`az`,baq:`eu`,bel:`be`,ben:`bn`,bos:`bs`,bul:`bg`,bur:`my`,cat:`ca`,ces:`cs`,chi:`zh`,cym:`cy`,cze:`cs`,dan:`da`,deu:`de`,dut:`nl`,ell:`el`,eng:`en`,epo:`eo`,est:`et`,eus:`eu`,fao:`fo`,fas:`fa`,fin:`fi`,fra:`fr`,fre:`fr`,geo:`ka`,ger:`de`,gle:`ga`,glg:`gl`,gre:`el`,guj:`gu`,heb:`he`,hin:`hi`,hrv:`hr`,hun:`hu`,hye:`hy`,ice:`is`,ind:`id`,isl:`is`,ita:`it`,jpn:`ja`,kan:`kn`,kat:`ka`,kaz:`kk`,khm:`km`,kor:`ko`,lao:`lo`,lat:`la`,lav:`lv`,lit:`lt`,ltz:`lb`,mac:`mk`,mal:`ml`,mar:`mr`,may:`ms`,mkd:`mk`,mlt:`mt`,mon:`mn`,msa:`ms`,mya:`my`,nep:`ne`,nld:`nl`,nno:`nn`,nob:`nb`,nor:`no`,ori:`or`,pan:`pa`,per:`fa`,pol:`pl`,por:`pt`,rom:`ro`,ron:`ro`,rum:`ro`,rus:`ru`,scc:`sr`,scr:`hr`,sin:`si`,slk:`sk`,slo:`sk`,slv:`sl`,snd:`sd`,spa:`es`,sqi:`sq`,srp:`sr`,swa:`sw`,swe:`sv`,tam:`ta`,tel:`te`,tgl:`tl`,tha:`th`,tur:`tr`,ukr:`uk`,urd:`ur`,uzb:`uz`,vie:`vi`,wel:`cy`,yid:`yi`,zho:`zh`},be=new Set([`mul`,`und`,`zxx`,`sgn`]),U=e=>{let t=e.trim().toLowerCase();if(t.length!==0&&!be.has(t))return ye[t]??t},xe=25,Se={key:`identifiers`,title:`title`,subtitle:`title`,author_name:`contributors`,first_publish_year:`publication.original.date`,language:`languages`,subject:`subjects`,number_of_pages_median:`numberOfPages`,cover_i:`cover`,id_project_gutenberg:`identifiers`},W=`OpenLibrary`,Ce=`ProjectGutenberg`,G=e=>e.length>0?e:void 0,K=(e,t)=>{let n=e.title!==void 0&&e.subtitle!==void 0?`${e.title}: ${e.subtitle}`:e.title,r=G([...new Set((e.language??[]).map(U).filter(e=>e!==void 0))]),i=[...t.isbn===void 0?[]:[{value:t.isbn,scheme:`ISBN`}],...t.matchedProjectGutenbergIdentifier===void 0?[]:[t.matchedProjectGutenbergIdentifier],...(e.id_project_gutenberg??[]).map(e=>({value:e,scheme:Ce})),...e.key===void 0?[]:[{value:e.key,scheme:W}]];return P({title:n,cover:e.cover_i===void 0?void 0:{uri:`${t.coversBaseUrl}/b/id/${e.cover_i}-L.jpg`,mediaType:`image/jpeg`,confidence:`derived`},publication:e.first_publish_year===void 0?void 0:{original:{date:{year:e.first_publish_year}}},languages:r,subjects:G((e.subject??[]).slice(0,25)),contributors:G((e.author_name??[]).map(e=>({name:e,roles:[`author`]}))),numberOfPages:e.number_of_pages_median,isbn:t.isbn,identifiers:G(i)})},we=`openLibrary`,Te=`https://openlibrary.org`,Ee=`https://covers.openlibrary.org`,De=[`key`,`title`,`subtitle`,`author_name`,`first_publish_year`,`language`,`subject`,`number_of_pages_median`,`cover_i`,`id_project_gutenberg`].join(`,`),Oe=e=>{let t=e.title?.trim();if(t===void 0||t.length===0)return;let n=r(e)[0];return{title:t,...n===void 0?{}:{author:n}}},ke=(e={})=>{let t=e.baseUrl??Te,n=e.coversBaseUrl??Ee,r=async(n,r)=>{let i=new URL(`/search.json`,t);for(let[e,t]of Object.entries(n))i.searchParams.set(e,t);i.searchParams.set(`fields`,De),i.searchParams.set(`limit`,String(r.limit));let a=await(e.fetch??globalThis.fetch)(i.toString(),{signal:r.signal,headers:{Accept:`application/json`,...e.userAgent===void 0?{}:{"User-Agent":e.userAgent}}});if(!a.ok)throw new j(a.status,`Open Library search failed with status ${a.status}`);return H(await a.json())},i=(e,r={})=>e.map(e=>({metadata:K(e,{coversBaseUrl:n,isbn:r.isbn,matchedProjectGutenbergIdentifier:r.confirmedProjectGutenberg?.identifier}),id:e.key,url:e.key===void 0?void 0:`${t}${e.key}`,raw:e}));return{id:we,name:`Open Library`,search:async(e,t)=>{let n=e.isbn?.trim()||void 0,a=L(e);if(n!==void 0){let e=await r({isbn:n},t);if(e.length>0)return i(e,{isbn:n})}if(a!==void 0){let e=await r({q:`id_project_gutenberg:${a.id}`},t);if(e.length>0)return i(e,{confirmedProjectGutenberg:a})}let o=Oe(e);return o===void 0?[]:i(await r(o,t))}}},q=e=>e.includes(`:`)?e.slice(e.lastIndexOf(`:`)+1):e,Ae=e=>e.type===`element`,J=(e,t)=>e.children.filter(e=>Ae(e)&&q(e.name).toLowerCase()===t.toLowerCase()),Y=(e,t)=>J(e,t)[0],X=e=>{let t=e?.val.trim();return t!==void 0&&t.length>0?t:void 0},Z=(e,t)=>{for(let[n,r]of Object.entries(e.attr)){if(q(n).toLowerCase()!==t.toLowerCase())continue;let e=r.trim();if(e.length>0)return e}},je=(e,t)=>J(e,t).flatMap(e=>{let t=X(Y(Y(e,`Description`)??e,`value`));return t===void 0?[]:[t]}),Me=e=>{let t=Z(e,`about`),n=t===void 0?void 0:/(?:^|\/)ebooks\/(\d+)$/.exec(t)?.[1];if(n===void 0)return;let r=n.replace(/^0+(?=\d)/,``);return r===`0`?void 0:r},Ne=e=>{let t=[];for(let n of e.children){if(!Ae(n))continue;let e=n.name.toLowerCase()===`dcterms:creator`,r=n.name.toLowerCase().startsWith(`marcrel:`);if(!e&&!r)continue;let i=X(Y(Y(n,`agent`)??n,`name`));i!==void 0&&t.push({name:i,role:e?`aut`:q(n.name).toLowerCase()})}return t},Pe=e=>J(e,`subject`).flatMap(e=>{let t=Y(e,`Description`),n=t===void 0?void 0:Z(Y(t,`memberOf`)??t,`resource`),r=X(t===void 0?void 0:Y(t,`value`));return r!==void 0&&n?.endsWith(`/LCSH`)===!0?[r]:[]}),Fe=e=>{let t=J(e,`hasFormat`).flatMap(e=>{let t=Y(e,`file`);if(t===void 0)return[];let n=Z(t,`about`),r=J(t,`format`).map(e=>X(Y(Y(e,`Description`)??e,`value`))).find(e=>e?.startsWith(`image/`)===!0);return n===void 0||r===void 0||!/\.cover\.(?:medium|small)\.[a-z0-9]+(?:$|[?#])/i.test(n)?[]:[{uri:n,mediaType:r}]});return t.find(e=>/\.cover\.medium\./i.test(e.uri))??t[0]},Q=e=>e.length>0?e:void 0,Ie=e=>{let t;try{t=new n.XmlDocument(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Project Gutenberg RDF is malformed: ${t}`,{cause:e})}if(q(t.name).toLowerCase()!==`rdf`)return;let r=Y(t,`ebook`);if(r===void 0)return;let i=Me(r);if(i===void 0)return;let a=[...new Set(je(r,`language`))],o=[...new Set(Pe(r))],s=[...new Set(je(r,`bookshelf`))],c=Ne(r);return{id:i,title:X(Y(r,`title`)),publisher:X(Y(r,`publisher`)),issued:X(Y(r,`issued`)),originalPublication:X(Y(r,`marc260`)),rights:X(Y(r,`rights`)),description:X(Y(r,`description`)),summary:X(Y(r,`marc520`)),languages:Q(a),subjects:Q(o),bookshelves:Q(s),contributors:Q(c),cover:Fe(r)}},Le=25,Re={id:`identifiers`,title:`title`,publisher:`publication.edition.publisher`,issued:`publication.edition.date`,originalPublication:`publication.original`,rights:`rights`,description:`description`,summary:`description`,languages:`languages`,subjects:`subjects`,bookshelves:`subjects`,contributors:`contributors`,cover:`cover`},ze={art:`artist`,aut:`author`,clr:`colorist`,ctb:`contributor`,edt:`editor`,ill:`illustrator`,nrt:`narrator`,trl:`translator`},Be=e=>{let t=new Map;for(let n of e.contributors??[]){let e=n.name.trim().toLowerCase(),r=ze[n.role.trim().toLowerCase()]??n.role,i=t.get(e);i===void 0?t.set(e,{name:n.name,roles:[r]}):i.roles.includes(r)||i.roles.push(r)}return t.size>0?[...t.values()]:void 0},Ve=e=>{if(e===void 0)return;let t=/^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/.exec(e.trim());if(t===null)return;let n=Number(t[1]),r=t[2]===void 0?void 0:Number(t[2]),i=t[3]===void 0?void 0:Number(t[3]);if(!(!Number.isInteger(n)||n<=0||r!==void 0&&(r<1||r>12)||i!==void 0&&(i<1||i>31)))return{year:n,...r===void 0?{}:{month:r},...i===void 0?{}:{day:i}}},$=(e,t)=>e.split(`$`).slice(1).flatMap(e=>e[0]?.toLowerCase()===t.toLowerCase()?[e.slice(1).trim()]:[]).filter(e=>e.length>0),He=e=>{if(e===void 0)return;let t=$(e,`b`),n=(t.length===1?t[0]:void 0)?.replace(/[\s,;:/]+$/u,``).trim(),r=$(e,`c`),i=[...new Set(r.flatMap(e=>[...e.matchAll(/\d{4}/g)].flatMap(e=>e[0]===void 0?[]:[Number(e[0])])))],a=P({date:i.length===1?{year:i[0]}:void 0,publisher:n!==void 0&&n.length>0&&!/^\[?s\.n\.?\]?$/i.test(n)?n:void 0});return a.date!==void 0||a.publisher!==void 0?a:void 0},Ue=(e,t)=>{try{let n=new URL(e,t);return n.protocol===`http:`||n.protocol===`https:`?n.toString():void 0}catch{return}},We=e=>e.length>0?e:void 0,Ge=(e,t)=>{let n=[t.matchedIdentifier,{value:e.id,scheme:F}].filter((e,t,n)=>n.findIndex(t=>t.value.trim().toLowerCase()===e.value.trim().toLowerCase()&&t.scheme?.trim().toLowerCase()===e.scheme?.trim().toLowerCase())===t),r=[...new Set([...e.subjects??[],...e.bookshelves??[]])].slice(0,25),i=e.cover===void 0?void 0:Ue(e.cover.uri,t.baseUrl),a=i===void 0?void 0:{uri:i,mediaType:e.cover?.mediaType,confidence:`derived`},o=P({date:Ve(e.issued),publisher:e.publisher}),s=P({original:He(e.originalPublication),edition:o.date!==void 0||o.publisher!==void 0?o:void 0});return P({title:e.title,publication:s.original!==void 0||s.edition!==void 0?s:void 0,description:e.summary??e.description,rights:e.rights,languages:We([...new Set(e.languages??[])]),subjects:We(r),contributors:Be(e),identifiers:n,cover:a})},Ke=`projectGutenberg`,qe=`https://www.gutenberg.org`,Je=(e={})=>{let t=e.baseUrl??qe;return{id:Ke,name:`Project Gutenberg`,search:async(n,r)=>{let i=L(n);if(i===void 0)return[];let a=new URL(`/cache/epub/${i.id}/pg${i.id}.rdf`,t),o=await(e.fetch??globalThis.fetch)(a.toString(),{signal:r.signal,headers:{Accept:`application/rdf+xml, application/xml;q=0.9`,...e.userAgent===void 0?{}:{"User-Agent":e.userAgent}}});if(o.status===404)return[];if(!o.ok)throw new j(o.status,`Project Gutenberg metadata lookup failed with status ${o.status}`);let s=Ie(await o.text());if(s===void 0||s.id!==i.id)throw Error(`Project Gutenberg RDF did not contain the requested eBook ${i.id}`);let c=new URL(`/ebooks/${i.id}`,t).toString();return[{id:s.id,url:c,raw:s,metadata:Ge(s,{baseUrl:t,matchedIdentifier:i.identifier})}]}}},Ye=e=>[e.title,e.isbn,e.gtin,e.belongsTo?.series?.[0]?.name].some(e=>e!==void 0&&e.trim().length>0)||(e.identifiers??[]).length>0||r(e).length>0;exports.METADATA_MATCH_WEIGHTS=D,exports.MetadataProviderResponseError=j,exports.OPEN_LIBRARY_IDENTIFIER_SCHEME=W,exports.OPEN_LIBRARY_MAX_SUBJECTS=xe,exports.OPEN_LIBRARY_PROVIDER_ID=we,exports.PROJECT_GUTENBERG_IDENTIFIER_SCHEME=F,exports.PROJECT_GUTENBERG_MAX_SUBJECTS=Le,exports.PROJECT_GUTENBERG_PROVIDER_ID=Ke,exports.createOpenLibraryProvider=ke,exports.createProjectGutenbergProvider=Je,exports.fetchMetadata=pe,exports.hasSearchTerms=Ye,exports.marcLanguageToBcp47=U,exports.metadataAuthors=r,exports.normalizeForComparison=l,exports.openLibraryMetadataHomes=Se,exports.parseOpenLibrarySearchResponse=H,exports.parseProjectGutenbergRdf=Ie,exports.personNameSimilarity=E,exports.projectGutenbergLookupFromMetadata=L,exports.projectGutenbergMetadataHomes=Re,exports.resolveOpenLibraryDoc=K,exports.resolveProjectGutenbergRecord=Ge,exports.responseErrorStatus=M,exports.scoreMetadataCandidate=ce,exports.textSimilarity=d,exports.titleSimilarity=w,exports.toIsbn13=o;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@prose-reader/archive-reader"),t=require("@prose-reader/shared"),n=require("xmldoc");var r=e=>{let t=e.contributors??[],n=t.filter(e=>e.roles.includes(`author`)),r=(n.length>0?n:t).map(e=>e.name.trim()).filter(e=>e.length>0);return[...new Set(r)]},i=/^\d{13}$/,a=/^\d{9}[\dX]$/,o=t=>{let n=(0,e.normalizeIsbn)(t);if(n===void 0)return;if(i.test(n))return n;if(!a.test(n))return;let r=`978${n.slice(0,9)}`,o=0;for(let e=0;e<r.length;e++){let t=r.charCodeAt(e)-48;o+=e%2==0?t:t*3}return`${r}${(10-o%10)%10}`},s=/[\u0300-\u036f]/g,c=/[^\p{L}\p{N}]+/gu,l=e=>e.normalize(`NFD`).replace(s,``).toLowerCase().replace(c,` `).trim(),u=e=>{let t=new Map;for(let n=0;n<e.length-1;n++){let r=e.slice(n,n+2);t.set(r,(t.get(r)??0)+1)}return t},d=(e,t)=>{let n=l(e).replaceAll(` `,``),r=l(t).replaceAll(` `,``);if(n.length===0||r.length===0)return 0;if(n===r)return 1;if(n.length<2||r.length<2)return 0;let i=u(n),a=0;for(let[e,t]of u(r))a+=Math.min(t,i.get(e)??0);return 2*a/(n.length-1+(r.length-1))},f=/\s*[:;]\s*|\s+[-–—]\s+/,p=e=>{let[t=``,...n]=e.split(f),r=t.trim(),i=n.join(` `).trim();return r.length===0?{main:e,hasSubtitle:!1}:{main:r,hasSubtitle:i.length>0}},m=.9,h=[`volume`,`part`,`book`],g=/\b(volumes?|vols?|parts?|books?)\s+([\p{L}\p{N}]+)\b/gu,_={one:1,first:1,two:2,second:2,three:3,third:3,four:4,fourth:4,five:5,fifth:5,six:6,sixth:6,seven:7,seventh:7,eight:8,eighth:8,nine:9,ninth:9,ten:10,tenth:10,eleven:11,eleventh:11,twelve:12,twelfth:12},v={i:1,v:5,x:10,l:50,c:100,d:500,m:1e3},y=e=>{if(!/^m{0,3}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/i.test(e))return;let t=0,n=0;for(let r of[...e.toLowerCase()].reverse()){let e=v[r];if(e===void 0)return;e<n?t-=e:(t+=e,n=e)}return t>0?t:void 0},b=e=>/^\d+$/.test(e)?Number.parseInt(e,10):_[e]??y(e),x=e=>{if(e.startsWith(`vol`))return`volume`;if(e.startsWith(`part`))return`part`;if(e.startsWith(`book`))return`book`},S=e=>{let t=new Map;for(let n of l(e).matchAll(g)){let e=n[1]===void 0?void 0:x(n[1]),r=n[2]===void 0?void 0:b(n[2]);if(e===void 0||r===void 0)continue;let i=t.get(e)??new Set;i.add(r),t.set(e,i)}return t},ee=(e,t)=>{let n=S(e),r=S(t);for(let e of h){let t=n.get(e),i=r.get(e);if(!(t===void 0||i===void 0)&&[...t].every(e=>!i.has(e)))return!0}return!1},te=(e,t)=>{if(ee(e,t))return 0;let n=d(e,t),r=p(e),i=p(t);return r.hasSubtitle===i.hasSubtitle?n:Math.max(n,d(r.main,i.main)*m)},C=e=>l(e).split(` `).filter(e=>e.length>0).sort().join(` `),w=(e,t)=>d(C(e),C(t)),T={isbn:1,gtin:1,identifiers:.6,title:.8,authors:.5,series:.3,publishedYear:.2,publisher:.15,languages:.15,numberOfPages:.15},ne=new Set([`isbn`,`gtin`]),E=e=>{let t=e?.trim();return t!==void 0&&t.length>0?t:void 0},D=(e,t)=>{let n=E(e.value)?.toLowerCase();return n!==void 0&&n===E(t.value)?.toLowerCase()},O=e=>E(e.scheme)?.toLowerCase(),re=e=>e.scheme===void 0?e.value:`${e.scheme}:${e.value}`,ie=(e,t)=>{if(!D(e,t))return!1;let n=O(e),r=O(t);return n===void 0||r===void 0||n===r},ae=(e,t)=>{if(!D(e,t))return!1;let n=O(e),r=O(t);return n!==void 0&&n===r},oe=e=>e.trim().toLowerCase().split(`-`)[0]??``,se=(e,t)=>{let n=Math.abs(e-t);return n===0?1:n===1?.6:n<=3?.3:0},ce=(e,t)=>{let n=Math.max(e,t);return n<=0?0:Math.max(0,1-Math.abs(e-t)/n*2)},le=(e,t,n)=>e.reduce((e,r)=>t.reduce((e,t)=>Math.max(e,n(r,t)),e),0),ue=(e,t,n=d)=>{let r=E(e);if(r===void 0)return;let i;for(let e of t){let t=E(e);if(t===void 0)continue;let a={score:n(r,t),query:r,candidate:t};(i===void 0||a.score>i.score)&&(i=a)}return i},de=(e,t)=>{if(e===void 0)return;let n;for(let r of t){if(r===void 0)continue;let t={score:se(e,r),query:String(e),candidate:String(r)};(n===void 0||t.score>n.score)&&(n=t)}return n},k=(e,t)=>{let n=[],i=(e,t)=>{t!==void 0&&n.push({field:e,weight:T[e],score:Math.min(1,Math.max(0,t.score)),query:t.query,candidate:t.candidate})},a=(e,t,n,r=d)=>{let a=E(t),o=E(n);a===void 0||o===void 0||i(e,{score:r(a,o),query:a,candidate:o})},s=E(e.isbn),c=E(t.isbn),l=s===void 0?void 0:o(s),u=c===void 0?void 0:o(c);s!==void 0&&c!==void 0&&l!==void 0&&u!==void 0&&i(`isbn`,{score:+(l===u),query:s,candidate:c});let f=E(e.gtin),p=E(t.gtin);f!==void 0&&p!==void 0&&i(`gtin`,{score:+(f===p),query:f,candidate:p});let m=e.identifiers??[],h=t.identifiers??[],g=m.some(e=>h.some(t=>ae(e,t)));m.length>0&&h.length>0&&i(`identifiers`,{score:+!!m.some(e=>h.some(t=>ie(e,t))),query:m.map(re).join(`, `),candidate:h.map(re).join(`, `)}),a(`title`,e.title,t.title,te),i(`publisher`,ue(e.publisher,[t.publication?.original?.publisher,t.publication?.edition?.publisher])),a(`series`,e.series,t.belongsTo?.series?.[0]?.name);let _=r(t),v=(e.authors??[]).flatMap(e=>{let t=E(e);return t===void 0?[]:[t]});v.length>0&&_.length>0&&i(`authors`,{score:le(v,_,w),query:v.join(`, `),candidate:_.join(`, `)}),i(`publishedYear`,de(e.publishedYear,[t.publication?.original?.date?.year,t.publication?.edition?.date?.year]));let y=e.languages??[],b=t.languages??[];if(y.length>0&&b.length>0){let e=new Set(b.map(oe));i(`languages`,{score:+!!y.some(t=>e.has(oe(t))),query:y.join(`, `),candidate:b.join(`, `)})}e.numberOfPages!==void 0&&t.numberOfPages!==void 0&&i(`numberOfPages`,{score:ce(e.numberOfPages,t.numberOfPages),query:String(e.numberOfPages),candidate:String(t.numberOfPages)});let x=n.filter(e=>ne.has(e.field));if(x.some(e=>e.score===0))return{score:0,signals:n};if(g||x.some(e=>e.score===1))return{score:1,signals:n};let S=n.reduce((e,t)=>e+t.weight,0);return S===0?{score:0,signals:n}:{score:n.reduce((e,t)=>e+t.score*t.weight,0)/S,signals:n}},A=class extends Error{status;constructor(e,t){super(t??`Provider responded with status ${e}`),this.name=`MetadataProviderResponseError`,this.status=e}},j=e=>{if(typeof e!=`object`||!e||!(`status`in e))return;let{status:t}=e;if(!(typeof t!=`number`||!Number.isInteger(t)))return t>=100&&t<=599?t:void 0},M=t.Report.namespace(`@prose-reader/metadata-fetcher`,void 0,{color:`#b06642`}),N=e=>{let t=Object.entries(e).filter(([,e])=>e!==void 0);return Object.fromEntries(t)},fe=5,pe=.5,me=4,he=({candidate:e,providerId:t,score:n,signals:r,accepted:i,includeRaw:a})=>N({providerId:t,score:n,signals:r,accepted:i,metadata:e.metadata,id:e.id,url:e.url,raw:a?e.raw:void 0}),ge=async(e,t)=>{let n=t.limit??fe,r=t.minScore??pe,i=t.includeRaw===!0,a=await Promise.all(t.providers.map(async r=>{try{return{provider:r,candidates:await r.search(e,{limit:n,signal:t.signal}),failure:void 0}}catch(e){if(t.signal?.aborted===!0)throw e;return M.error(`fetchMetadata: provider "${r.id}" failed`,e),{provider:r,candidates:void 0,failure:N({id:r.id,status:j(e)})}}})),o=a.flatMap(e=>e.failure===void 0?[]:[e.failure]),s={},c=[];for(let{provider:t,candidates:o}of a){if(o===void 0)continue;let a=o.map(n=>{let{score:a,signals:o}=k(e,n.metadata);return he({candidate:n,providerId:t.id,score:a,signals:o,accepted:a>=r,includeRaw:i})}).sort((e,t)=>t.score-e.score).slice(0,n);s[t.id]!==void 0&&M.warn(`fetchMetadata: several providers share the id "${t.id}"`),s[t.id]={provider:{id:t.id,name:t.name},matches:a},c.push(...a)}return{version:me,matches:[...c].sort((e,t)=>t.score-e.score),sources:s,failedProviders:o}},_e=e=>{let{metadata:t}=e,n=r(t),i=t.identifiers?.map(({value:e,scheme:t})=>N({value:e,scheme:t}));return N({title:t.title,authors:n.length>0?n:void 0,isbn:t.isbn,gtin:t.gtin,identifiers:i!==void 0&&i.length>0?i:void 0,series:t.belongsTo?.series?.[0]?.name,publisher:t.publication?.edition?.publisher??t.publication?.original?.publisher,publishedYear:t.publication?.edition?.date?.year??t.publication?.original?.date?.year,languages:t.languages,numberOfPages:t.numberOfPages})},P=`ProjectGutenberg`,ve=new Set([`gutenberg.org`,`www.gutenberg.org`]),ye=[/^\/ebooks\/(\d+)(?:[./]|$)/i,/^\/files\/(\d+)(?:\/|$)/i,/^\/cache\/epub\/(\d+)(?:\/|$)/i,/^\/(\d+)(?:\/|$)/],F=e=>{let t=e.trim();if(!/^\d+$/.test(t))return;let n=t.replace(/^0+(?=\d)/,``);return n===`0`?void 0:n},be=e=>{try{let t=new URL(e.trim());if(t.protocol!==`http:`&&t.protocol!==`https:`||!ve.has(t.hostname.toLowerCase()))return;for(let e of ye){let n=e.exec(t.pathname)?.[1];if(n!==void 0)return F(n)}}catch{return}},I=e=>{for(let t of e.identifiers??[]){let e=t.scheme?.trim().toLowerCase(),n=e===`projectgutenberg`?F(t.value):e===void 0||e===`url`||e===`uri`?be(t.value):void 0;if(n!==void 0)return{id:n,identifier:{value:t.value,...t.scheme===void 0?{}:{scheme:t.scheme}}}}},L=e=>typeof e==`object`&&!!e&&!Array.isArray(e),R=(e,t)=>{let n=e[t];if(typeof n!=`string`)return;let r=n.trim();return r.length>0?r:void 0},z=(e,t)=>{let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0},B=(e,t)=>{let n=e[t];if(!Array.isArray(n))return;let r=n.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e.length>0);return r.length>0?r:void 0},xe=(e,t)=>{let n=e[t];return Array.isArray(n)?n.filter(L):[]},Se=e=>({key:R(e,`key`),title:R(e,`title`),subtitle:R(e,`subtitle`),author_name:B(e,`author_name`),first_publish_year:z(e,`first_publish_year`),language:B(e,`language`),subject:B(e,`subject`),number_of_pages_median:z(e,`number_of_pages_median`),cover_i:z(e,`cover_i`),id_project_gutenberg:B(e,`id_project_gutenberg`)}),V=e=>L(e)?xe(e,`docs`).map(Se):[],Ce={afr:`af`,alb:`sq`,amh:`am`,ara:`ar`,arm:`hy`,asm:`as`,aze:`az`,baq:`eu`,bel:`be`,ben:`bn`,bos:`bs`,bul:`bg`,bur:`my`,cat:`ca`,ces:`cs`,chi:`zh`,cym:`cy`,cze:`cs`,dan:`da`,deu:`de`,dut:`nl`,ell:`el`,eng:`en`,epo:`eo`,est:`et`,eus:`eu`,fao:`fo`,fas:`fa`,fin:`fi`,fra:`fr`,fre:`fr`,geo:`ka`,ger:`de`,gle:`ga`,glg:`gl`,gre:`el`,guj:`gu`,heb:`he`,hin:`hi`,hrv:`hr`,hun:`hu`,hye:`hy`,ice:`is`,ind:`id`,isl:`is`,ita:`it`,jpn:`ja`,kan:`kn`,kat:`ka`,kaz:`kk`,khm:`km`,kor:`ko`,lao:`lo`,lat:`la`,lav:`lv`,lit:`lt`,ltz:`lb`,mac:`mk`,mal:`ml`,mar:`mr`,may:`ms`,mkd:`mk`,mlt:`mt`,mon:`mn`,msa:`ms`,mya:`my`,nep:`ne`,nld:`nl`,nno:`nn`,nob:`nb`,nor:`no`,ori:`or`,pan:`pa`,per:`fa`,pol:`pl`,por:`pt`,rom:`ro`,ron:`ro`,rum:`ro`,rus:`ru`,scc:`sr`,scr:`hr`,sin:`si`,slk:`sk`,slo:`sk`,slv:`sl`,snd:`sd`,spa:`es`,sqi:`sq`,srp:`sr`,swa:`sw`,swe:`sv`,tam:`ta`,tel:`te`,tgl:`tl`,tha:`th`,tur:`tr`,ukr:`uk`,urd:`ur`,uzb:`uz`,vie:`vi`,wel:`cy`,yid:`yi`,zho:`zh`},we=new Set([`mul`,`und`,`zxx`,`sgn`]),H=e=>{let t=e.trim().toLowerCase();if(t.length!==0&&!we.has(t))return Ce[t]??t},Te=25,Ee={key:`identifiers`,title:`title`,subtitle:`title`,author_name:`contributors`,first_publish_year:`publication.original.date`,language:`languages`,subject:`subjects`,number_of_pages_median:`numberOfPages`,cover_i:`cover`,id_project_gutenberg:`identifiers`},U=`OpenLibrary`,De=`ProjectGutenberg`,W=e=>e.length>0?e:void 0,G=(e,t)=>{let n=e.title!==void 0&&e.subtitle!==void 0?`${e.title}: ${e.subtitle}`:e.title,r=W([...new Set((e.language??[]).map(H).filter(e=>e!==void 0))]),i=[...t.isbn===void 0?[]:[{value:t.isbn,scheme:`ISBN`}],...t.matchedProjectGutenbergIdentifier===void 0?[]:[t.matchedProjectGutenbergIdentifier],...(e.id_project_gutenberg??[]).map(e=>({value:e,scheme:De})),...e.key===void 0?[]:[{value:e.key,scheme:U}]];return N({title:n,cover:e.cover_i===void 0?void 0:{uri:`${t.coversBaseUrl}/b/id/${e.cover_i}-L.jpg`,mediaType:`image/jpeg`,confidence:`derived`},publication:e.first_publish_year===void 0?void 0:{original:{date:{year:e.first_publish_year}}},languages:r,subjects:W((e.subject??[]).slice(0,25)),contributors:W((e.author_name??[]).map(e=>({name:e,roles:[`author`]}))),numberOfPages:e.number_of_pages_median,isbn:t.isbn,identifiers:W(i)})},Oe=`openLibrary`,ke=`https://openlibrary.org`,Ae=`https://covers.openlibrary.org`,je=[`key`,`title`,`subtitle`,`author_name`,`first_publish_year`,`language`,`subject`,`number_of_pages_median`,`cover_i`,`id_project_gutenberg`].join(`,`),Me=e=>{let t=e.title?.trim();if(t===void 0||t.length===0)return;let n=e.authors?.find(e=>e.trim().length>0)?.trim();return{title:t,...n===void 0?{}:{author:n}}},Ne=(e={})=>{let t=e.baseUrl??ke,n=e.coversBaseUrl??Ae,r=async(n,r)=>{let i=new URL(`/search.json`,t);for(let[e,t]of Object.entries(n))i.searchParams.set(e,t);i.searchParams.set(`fields`,je),i.searchParams.set(`limit`,String(r.limit));let a=await(e.fetch??globalThis.fetch)(i.toString(),{signal:r.signal,headers:{Accept:`application/json`,...e.userAgent===void 0?{}:{"User-Agent":e.userAgent}}});if(!a.ok)throw new A(a.status,`Open Library search failed with status ${a.status}`);return V(await a.json())},i=(e,r={})=>e.map(e=>({metadata:G(e,{coversBaseUrl:n,isbn:r.isbn,matchedProjectGutenbergIdentifier:r.confirmedProjectGutenberg?.identifier}),id:e.key,url:e.key===void 0?void 0:`${t}${e.key}`,raw:e}));return{id:Oe,name:`Open Library`,search:async(e,t)=>{let n=e.isbn?.trim()||void 0,a=I(e);if(n!==void 0){let e=await r({isbn:n},t);if(e.length>0)return i(e,{isbn:n})}if(a!==void 0){let e=await r({q:`id_project_gutenberg:${a.id}`},t);if(e.length>0)return i(e,{confirmedProjectGutenberg:a})}let o=Me(e);if(o===void 0)return[];let s=await r(o,t);if(s.length>0)return i(s);let c=o.author===void 0?o.title:`${o.title} ${o.author}`;return i(await r({q:c},t))}}},K=e=>e.includes(`:`)?e.slice(e.lastIndexOf(`:`)+1):e,Pe=e=>e.type===`element`,q=(e,t)=>e.children.filter(e=>Pe(e)&&K(e.name).toLowerCase()===t.toLowerCase()),J=(e,t)=>q(e,t)[0],Y=e=>{let t=e?.val.trim();return t!==void 0&&t.length>0?t:void 0},X=(e,t)=>{for(let[n,r]of Object.entries(e.attr)){if(K(n).toLowerCase()!==t.toLowerCase())continue;let e=r.trim();if(e.length>0)return e}},Fe=(e,t)=>q(e,t).flatMap(e=>{let t=Y(J(J(e,`Description`)??e,`value`));return t===void 0?[]:[t]}),Ie=e=>{let t=X(e,`about`),n=t===void 0?void 0:/(?:^|\/)ebooks\/(\d+)$/.exec(t)?.[1];if(n===void 0)return;let r=n.replace(/^0+(?=\d)/,``);return r===`0`?void 0:r},Le=e=>{let t=[];for(let n of e.children){if(!Pe(n))continue;let e=n.name.toLowerCase()===`dcterms:creator`,r=n.name.toLowerCase().startsWith(`marcrel:`);if(!e&&!r)continue;let i=Y(J(J(n,`agent`)??n,`name`));i!==void 0&&t.push({name:i,role:e?`aut`:K(n.name).toLowerCase()})}return t},Re=e=>q(e,`subject`).flatMap(e=>{let t=J(e,`Description`),n=t===void 0?void 0:X(J(t,`memberOf`)??t,`resource`),r=Y(t===void 0?void 0:J(t,`value`));return r!==void 0&&n?.endsWith(`/LCSH`)===!0?[r]:[]}),ze=e=>{let t=q(e,`hasFormat`).flatMap(e=>{let t=J(e,`file`);if(t===void 0)return[];let n=X(t,`about`),r=q(t,`format`).map(e=>Y(J(J(e,`Description`)??e,`value`))).find(e=>e?.startsWith(`image/`)===!0);return n===void 0||r===void 0||!/\.cover\.(?:medium|small)\.[a-z0-9]+(?:$|[?#])/i.test(n)?[]:[{uri:n,mediaType:r}]});return t.find(e=>/\.cover\.medium\./i.test(e.uri))??t[0]},Z=e=>e.length>0?e:void 0,Be=e=>{let t;try{t=new n.XmlDocument(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Project Gutenberg RDF is malformed: ${t}`,{cause:e})}if(K(t.name).toLowerCase()!==`rdf`)return;let r=J(t,`ebook`);if(r===void 0)return;let i=Ie(r);if(i===void 0)return;let a=[...new Set(Fe(r,`language`))],o=[...new Set(Re(r))],s=[...new Set(Fe(r,`bookshelf`))],c=Le(r);return{id:i,title:Y(J(r,`title`)),publisher:Y(J(r,`publisher`)),issued:Y(J(r,`issued`)),originalPublication:Y(J(r,`marc260`)),rights:Y(J(r,`rights`)),description:Y(J(r,`description`)),summary:Y(J(r,`marc520`)),languages:Z(a),subjects:Z(o),bookshelves:Z(s),contributors:Z(c),cover:ze(r)}},Ve=25,He={id:`identifiers`,title:`title`,publisher:`publication.edition.publisher`,issued:`publication.edition.date`,originalPublication:`publication.original`,rights:`rights`,description:`description`,summary:`description`,languages:`languages`,subjects:`subjects`,bookshelves:`subjects`,contributors:`contributors`,cover:`cover`},Ue={art:`artist`,aut:`author`,clr:`colorist`,ctb:`contributor`,edt:`editor`,ill:`illustrator`,nrt:`narrator`,trl:`translator`},We=e=>{let t=new Map;for(let n of e.contributors??[]){let e=n.name.trim().toLowerCase(),r=Ue[n.role.trim().toLowerCase()]??n.role,i=t.get(e);i===void 0?t.set(e,{name:n.name,roles:[r]}):i.roles.includes(r)||i.roles.push(r)}return t.size>0?[...t.values()]:void 0},Ge=e=>{if(e===void 0)return;let t=/^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/.exec(e.trim());if(t===null)return;let n=Number(t[1]),r=t[2]===void 0?void 0:Number(t[2]),i=t[3]===void 0?void 0:Number(t[3]);if(!(!Number.isInteger(n)||n<=0||r!==void 0&&(r<1||r>12)||i!==void 0&&(i<1||i>31)))return{year:n,...r===void 0?{}:{month:r},...i===void 0?{}:{day:i}}},Q=(e,t)=>e.split(`$`).slice(1).flatMap(e=>e[0]?.toLowerCase()===t.toLowerCase()?[e.slice(1).trim()]:[]).filter(e=>e.length>0),Ke=e=>{if(e===void 0)return;let t=Q(e,`b`),n=(t.length===1?t[0]:void 0)?.replace(/[\s,;:/]+$/u,``).trim(),r=Q(e,`c`),i=[...new Set(r.flatMap(e=>[...e.matchAll(/\d{4}/g)].flatMap(e=>e[0]===void 0?[]:[Number(e[0])])))],a=N({date:i.length===1?{year:i[0]}:void 0,publisher:n!==void 0&&n.length>0&&!/^\[?s\.n\.?\]?$/i.test(n)?n:void 0});return a.date!==void 0||a.publisher!==void 0?a:void 0},qe=(e,t)=>{try{let n=new URL(e,t);return n.protocol===`http:`||n.protocol===`https:`?n.toString():void 0}catch{return}},Je=e=>e.length>0?e:void 0,Ye=(e,t)=>{let n=[t.matchedIdentifier,{value:e.id,scheme:P}].filter((e,t,n)=>n.findIndex(t=>t.value.trim().toLowerCase()===e.value.trim().toLowerCase()&&t.scheme?.trim().toLowerCase()===e.scheme?.trim().toLowerCase())===t),r=[...new Set([...e.subjects??[],...e.bookshelves??[]])].slice(0,25),i=e.cover===void 0?void 0:qe(e.cover.uri,t.baseUrl),a=i===void 0?void 0:{uri:i,mediaType:e.cover?.mediaType,confidence:`derived`},o=N({date:Ge(e.issued),publisher:e.publisher}),s=N({original:Ke(e.originalPublication),edition:o.date!==void 0||o.publisher!==void 0?o:void 0});return N({title:e.title,publication:s.original!==void 0||s.edition!==void 0?s:void 0,description:e.summary??e.description,rights:e.rights,languages:Je([...new Set(e.languages??[])]),subjects:Je(r),contributors:We(e),identifiers:n,cover:a})},$=`projectGutenberg`,Xe=`https://www.gutenberg.org`,Ze=(e={})=>{let t=e.baseUrl??Xe;return{id:$,name:`Project Gutenberg`,search:async(n,r)=>{let i=I(n);if(i===void 0)return[];let a=new URL(`/cache/epub/${i.id}/pg${i.id}.rdf`,t),o=await(e.fetch??globalThis.fetch)(a.toString(),{signal:r.signal,headers:{Accept:`application/rdf+xml, application/xml;q=0.9`,...e.userAgent===void 0?{}:{"User-Agent":e.userAgent}}});if(o.status===404)return[];if(!o.ok)throw new A(o.status,`Project Gutenberg metadata lookup failed with status ${o.status}`);let s=Be(await o.text());if(s===void 0||s.id!==i.id)throw Error(`Project Gutenberg RDF did not contain the requested eBook ${i.id}`);let c=new URL(`/ebooks/${i.id}`,t).toString();return[{id:s.id,url:c,raw:s,metadata:Ye(s,{baseUrl:t,matchedIdentifier:i.identifier})}]}}},Qe=e=>[e.title,e.isbn,e.gtin,e.series].some(e=>e!==void 0&&e.trim().length>0)||(e.identifiers??[]).some(e=>e.value.trim().length>0)||(e.authors??[]).some(e=>e.trim().length>0);exports.METADATA_MATCH_WEIGHTS=T,exports.MetadataProviderResponseError=A,exports.OPEN_LIBRARY_IDENTIFIER_SCHEME=U,exports.OPEN_LIBRARY_MAX_SUBJECTS=Te,exports.OPEN_LIBRARY_PROVIDER_ID=Oe,exports.PROJECT_GUTENBERG_IDENTIFIER_SCHEME=P,exports.PROJECT_GUTENBERG_MAX_SUBJECTS=Ve,exports.PROJECT_GUTENBERG_PROVIDER_ID=$,exports.createOpenLibraryProvider=Ne,exports.createProjectGutenbergProvider=Ze,exports.fetchMetadata=ge,exports.hasSearchTerms=Qe,exports.marcLanguageToBcp47=H,exports.metadataAuthors=r,exports.metadataInputFromResolvedArchive=_e,exports.normalizeForComparison=l,exports.openLibraryMetadataHomes=Ee,exports.parseOpenLibrarySearchResponse=V,exports.parseProjectGutenbergRdf=Be,exports.personNameSimilarity=w,exports.projectGutenbergLookupFromInput=I,exports.projectGutenbergMetadataHomes=He,exports.resolveOpenLibraryDoc=G,exports.resolveProjectGutenbergRecord=Ye,exports.responseErrorStatus=j,exports.scoreMetadataCandidate=k,exports.textSimilarity=d,exports.titleSimilarity=te,exports.toIsbn13=o;
2
2
  //# sourceMappingURL=index.cjs.map