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