redirecter for ao3 that adds opengraph metadata
1import { $ } from "bun" 2import DOM from "fauxdom" 3 4async function Image ({ data, addr }) { 5 const authorsFormatted = data.authors 6 ? data.authors.map((a) => { 7 if (a.anonymous) return "Anonymous" 8 if (a.pseud !== a.username) return `${a.pseud} (${a.username})` 9 return a.username 10 }) 11 : [] 12 const authorString = authorsFormatted.length > 1 13 ? authorsFormatted.slice(0, -1).join(", ") + " & " + 14 authorsFormatted.slice(-1)[0] 15 : authorsFormatted[0] 16 const summaryDOM = new DOM(data.summary, {decodeEntities: true}); 17 const summaryFormatted = summaryDOM.innerHTML.replace("<br />", "\n").replace( 18 /(<([^>]+)>)/ig, 19 "", 20 ) 21 const titleString = `${data.title} by ${authorString}` 22 const chapterString = data.chapterInfo ? (data.chapterInfo.name 23 ? data.chapterInfo.name 24 : "Chapter " + data.chapterInfo.index) : '' 25 const chapterCountString = data.chapters 26 ? ' | Chapters: '+data.chapters.published+' / '+( 27 data.chapters.total 28 ? data.chapters.total 29 : '?' 30 ) 31 : '' 32 const filename = addr.replaceAll("/", "-") 33 await $`magick -size 1600x900 xc:#990000 tmp/${filename}-base.png` 34 await $`magick -size 1520x300 -background none -gravity SouthWest -font Georgia -pointsize 72 -fill white caption:"${titleString}${chapterString !== '' ? "\n"+chapterString+"" : ''}" tmp/${filename}-title.png` 35 await $`magick -size 1520x480 xc:white tmp/${filename}-box.png` 36 await $`magick -size 1440x20 -background none -gravity East -font Verdana -pointsize 18 -fill black caption:"https://archiveofourown.org/${addr}" tmp/${filename}-addr.png` 37 await $`magick -size 1440x400 -background none -font Verdana -pointsize 24 -fill black caption:"Wordcount: ${data.words}${chapterCountString} | Rating: ${data.rating}\n\n${summaryFormatted}" tmp/${filename}-desc.png` 38 await $`magick -size 1600x900 xc:#990000 -draw "image over 40,40, 0,0 tmp/${filename}-title.png" -draw "image over 40,380, 0,0 tmp/${filename}-box.png" -draw "image over 80,420 0,0 tmp/${filename}-desc.png" -draw "image over 80,800 0,0 tmp/${filename}-addr.png" imagecache/${filename}.png` 39 await $`rm tmp/${filename}-*.png` 40 const file = Bun.file(`imagecache/${filename}.png`) 41 return Response(await file.arrayBuffer(), { 42 headers: { 43 'Content-Type': 'image/png' 44 } 45 }) 46} 47 48export default Image