51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
import { VercelRequest, VercelResponse } from '@vercel/node'
|
|
import { formatInTimeZone } from 'date-fns-tz'
|
|
import { PXIMG_BASEURL_I, ajax } from './utils.js'
|
|
import { Artwork } from '../src/types/Artworks.js'
|
|
|
|
type ArtworkOrAd = Artwork | { isAdContainer: boolean }
|
|
|
|
export default async (req: VercelRequest, res: VercelResponse) => {
|
|
const requestImage =
|
|
(req.headers.accept?.includes('image') || req.query.format === 'image') &&
|
|
req.query.format !== 'json'
|
|
try {
|
|
const data: { illusts?: ArtworkOrAd[] } = (
|
|
await ajax({
|
|
url: '/ajax/illust/discovery',
|
|
params: {
|
|
mode: req.query.mode ?? 'safe',
|
|
max: requestImage ? '1' : req.query.max ?? '18',
|
|
},
|
|
headers: req.headers,
|
|
})
|
|
).data
|
|
const illusts = (data.illusts ?? []).filter((value): value is Artwork =>
|
|
Object.keys(value).includes('id')
|
|
)
|
|
illusts.forEach((value) => {
|
|
const middle = `img/${formatInTimeZone(
|
|
value.updateDate,
|
|
'Asia/Tokyo',
|
|
'yyyy/MM/dd/HH/mm/ss'
|
|
)}/${value.id}`
|
|
value.urls = {
|
|
mini: `${PXIMG_BASEURL_I}c/48x48/img-master/${middle}_p0_square1200.jpg`,
|
|
thumb: `${PXIMG_BASEURL_I}c/250x250_80_a2/img-master/${middle}_p0_square1200.jpg`,
|
|
small: `${PXIMG_BASEURL_I}c/540x540_70/img-master/${middle}_p0_master1200.jpg`,
|
|
regular: `${PXIMG_BASEURL_I}img-master/${middle}_p0_master1200.jpg`,
|
|
original: `${PXIMG_BASEURL_I}img-original/${middle}_p0.jpg`,
|
|
}
|
|
})
|
|
if (requestImage) {
|
|
res.redirect(illusts[0].urls.regular)
|
|
return
|
|
} else {
|
|
res.send(illusts)
|
|
return
|
|
}
|
|
} catch (e: any) {
|
|
res.status(e?.response?.status ?? 500).send(e?.response?.data ?? e)
|
|
}
|
|
}
|