UNPKG

goodreads-bookshelf-api

Version:

Unofficial Goodreads API for getting any user's bookshelf details

4 lines (3 loc) 1.49 kB
import u from"rss-parser";var h=a=>a.replace(/(?:^\w|[A-Z]|\b\w)/g,(t,r)=>r===0?t.toLowerCase():t.toUpperCase()).replace(/\s+/g,""),m=a=>{let t=/href="([^"]*)"/,r=a.match(t),o=(r?r[1]:"").split("?")[0],p=/src="([^"]*)"/,c=a.match(p),e=(c?c[1]:"").replace(/\._.*?_/,"");return{bookLink:o,imageLink:e}};var i=class{constructor(t){this.options=t;this.options=t}fetch=async()=>{try{let{username:t,shelf:r}=this.options;if(t){if(!r)throw new Error("Shelf is required")}else throw new Error("Username is required");let s=new u;try{let o=await s.parseURL(`https://www.goodreads.com/review/list_rss/${t}?shelf=${r}`);return this.booksParse(o.items)}catch(o){throw new Error("Unable to fetch the shelf "+o.message)}}catch(t){throw t}};booksParse=t=>t.map(s=>{let o=s.content.split(`<br/> `).map(n=>n.trim()),{bookLink:p,imageLink:c}=m(o[0]),e={};o.splice(1).forEach(n=>{if(n=="")return;let[d,k]=n.split(":").map(g=>g.trim());e[h(d)]=k}),e.review=e.review.slice(5).replace(/<br\s*\/?>/gi,` `),e.rating=e.rating==="0"?null:parseFloat(e.rating),e.averageRating=parseFloat(e.averageRating),e.dateAdded=e.dateAdded===""?null:e.dateAdded,e.readAt=e.readAt===""?null:e.readAt,e.review=e.review===""?null:e.review,s.contentSnippet=s.contentSnippet===""?null:s.contentSnippet,e.shelves=e.shelves.split(",").map(n=>n.trim()),e.shelves.length===1&&e.shelves[0]===""&&(e.shelves=[this.options.shelf]);let l={...s};return delete l.content,{...l,...e,imageLink:c,bookLink:p}})};var x=i;export{x as default};