summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/web/UrlPreviewService.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-09-18 03:27:08 +0900
committerGitHub <noreply@github.com>2022-09-18 03:27:08 +0900
commitb75184ec8e3436200bacdcd832e3324702553d20 (patch)
tree8b7e316f29e95df921db57289c8b8da476d18f07 /packages/backend/src/server/web/UrlPreviewService.ts
parentUpdate ROADMAP.md (diff)
downloadmisskey-b75184ec8e3436200bacdcd832e3324702553d20.tar.gz
misskey-b75184ec8e3436200bacdcd832e3324702553d20.tar.bz2
misskey-b75184ec8e3436200bacdcd832e3324702553d20.zip
なんかもうめっちゃ変えた
Diffstat (limited to 'packages/backend/src/server/web/UrlPreviewService.ts')
-rw-r--r--packages/backend/src/server/web/UrlPreviewService.ts84
1 files changed, 84 insertions, 0 deletions
diff --git a/packages/backend/src/server/web/UrlPreviewService.ts b/packages/backend/src/server/web/UrlPreviewService.ts
new file mode 100644
index 0000000000..4e3b456144
--- /dev/null
+++ b/packages/backend/src/server/web/UrlPreviewService.ts
@@ -0,0 +1,84 @@
+import { Inject, Injectable } from '@nestjs/common';
+import summaly from 'summaly';
+import { DI } from '@/di-symbols.js';
+import { UsersRepository } from '@/models/index.js';
+import { Config } from '@/config.js';
+import { MetaService } from '@/core/MetaService.js';
+import { HttpRequestService } from '@/core/HttpRequestService.js';
+import Logger from '@/logger.js';
+import { query } from '@/misc/prelude/url.js';
+import type Koa from 'koa';
+
+@Injectable()
+export class UrlPreviewService {
+ #logger: Logger;
+
+ constructor(
+ @Inject(DI.config)
+ private config: Config,
+
+ @Inject(DI.usersRepository)
+ private usersRepository: UsersRepository,
+
+ private metaService: MetaService,
+ private httpRequestService: HttpRequestService,
+ ) {
+ this.#logger = new Logger('url-preview');
+ }
+
+ #wrap(url?: string): string | null {
+ return url != null
+ ? url.match(/^https?:\/\//)
+ ? `${this.config.url}/proxy/preview.webp?${query({
+ url,
+ preview: '1',
+ })}`
+ : url
+ : null;
+ }
+
+ public async handle(ctx: Koa.Context) {
+ const url = ctx.query.url;
+ if (typeof url !== 'string') {
+ ctx.status = 400;
+ return;
+ }
+
+ const lang = ctx.query.lang;
+ if (Array.isArray(lang)) {
+ ctx.status = 400;
+ return;
+ }
+
+ const meta = await this.metaService.fetch();
+
+ this.#logger.info(meta.summalyProxy
+ ? `(Proxy) Getting preview of ${url}@${lang} ...`
+ : `Getting preview of ${url}@${lang} ...`);
+
+ try {
+ const summary = meta.summalyProxy ? await this.httpRequestService.getJson(`${meta.summalyProxy}?${query({
+ url: url,
+ lang: lang ?? 'ja-JP',
+ })}`) : await summaly.default(url, {
+ followRedirects: false,
+ lang: lang ?? 'ja-JP',
+ });
+
+ this.#logger.succ(`Got preview of ${url}: ${summary.title}`);
+
+ summary.icon = this.#wrap(summary.icon);
+ summary.thumbnail = this.#wrap(summary.thumbnail);
+
+ // Cache 7days
+ ctx.set('Cache-Control', 'max-age=604800, immutable');
+
+ ctx.body = summary;
+ } catch (err) {
+ this.#logger.warn(`Failed to get preview of ${url}: ${err}`);
+ ctx.status = 200;
+ ctx.set('Cache-Control', 'max-age=86400, immutable');
+ ctx.body = '{}';
+ }
+ }
+}