summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/web/url-preview.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/src/server/web/url-preview.ts')
-rw-r--r--packages/backend/src/server/web/url-preview.ts53
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;
+}