diff options
Diffstat (limited to 'packages/backend/src/server/web/url-preview.ts')
| -rw-r--r-- | packages/backend/src/server/web/url-preview.ts | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/packages/backend/src/server/web/url-preview.ts b/packages/backend/src/server/web/url-preview.ts new file mode 100644 index 0000000000..1375420c0a --- /dev/null +++ b/packages/backend/src/server/web/url-preview.ts @@ -0,0 +1,53 @@ +import * as Koa from 'koa'; +import summaly from 'summaly'; +import { fetchMeta } from '@/misc/fetch-meta'; +import Logger from '@/services/logger'; +import config from '@/config/index'; +import { query } from '@/prelude/url'; +import { getJson } from '@/misc/fetch'; + +const logger = new Logger('url-preview'); + +module.exports = async (ctx: Koa.Context) => { + const meta = await fetchMeta(); + + logger.info(meta.summalyProxy + ? `(Proxy) Getting preview of ${ctx.query.url}@${ctx.query.lang} ...` + : `Getting preview of ${ctx.query.url}@${ctx.query.lang} ...`); + + try { + const summary = meta.summalyProxy ? await getJson(`${meta.summalyProxy}?${query({ + url: ctx.query.url, + lang: ctx.query.lang || 'ja-JP' + })}`) : await summaly(ctx.query.url, { + followRedirects: false, + lang: ctx.query.lang || 'ja-JP' + }); + + logger.succ(`Got preview of ${ctx.query.url}: ${summary.title}`); + + summary.icon = wrap(summary.icon); + summary.thumbnail = wrap(summary.thumbnail); + + // Cache 7days + ctx.set('Cache-Control', 'max-age=604800, immutable'); + + ctx.body = summary; + } catch (e) { + logger.warn(`Failed to get preview of ${ctx.query.url}: ${e}`); + ctx.status = 200; + ctx.set('Cache-Control', 'max-age=86400, immutable'); + ctx.body = '{}'; + } +}; + +function wrap(url?: string): string | null { + return url != null + ? url.match(/^https?:\/\//) + ? `${config.url}/proxy/preview.jpg?${query({ + url, + preview: '1' + })}` + : url + : null; +} |