From 557b13ae24019d9ab214bbea7eaa0f892c8f4b05 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 9 Aug 2019 11:32:40 +0200 Subject: Lazy load avatars --- server/controllers/lazy-static.ts | 80 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 server/controllers/lazy-static.ts (limited to 'server/controllers/lazy-static.ts') diff --git a/server/controllers/lazy-static.ts b/server/controllers/lazy-static.ts new file mode 100644 index 000000000..4285fd727 --- /dev/null +++ b/server/controllers/lazy-static.ts @@ -0,0 +1,80 @@ +import * as cors from 'cors' +import * as express from 'express' +import { LAZY_STATIC_PATHS, STATIC_MAX_AGE } from '../initializers/constants' +import { VideosCaptionCache, VideosPreviewCache } from '../lib/files-cache' +import { asyncMiddleware } from '../middlewares' +import { AvatarModel } from '../models/avatar/avatar' +import { logger } from '../helpers/logger' +import { avatarPathUnsafeCache, pushAvatarProcessInQueue } from '../lib/avatar' + +const lazyStaticRouter = express.Router() + +lazyStaticRouter.use(cors()) + +lazyStaticRouter.use( + LAZY_STATIC_PATHS.AVATARS + ':filename', + asyncMiddleware(getAvatar) +) + +lazyStaticRouter.use( + LAZY_STATIC_PATHS.PREVIEWS + ':uuid.jpg', + asyncMiddleware(getPreview) +) + +lazyStaticRouter.use( + LAZY_STATIC_PATHS.VIDEO_CAPTIONS + ':videoId-:captionLanguage([a-z]+).vtt', + asyncMiddleware(getVideoCaption) +) + +// --------------------------------------------------------------------------- + +export { + lazyStaticRouter, + getPreview, + getVideoCaption +} + +// --------------------------------------------------------------------------- + +async function getAvatar (req: express.Request, res: express.Response) { + const filename = req.params.filename + + if (avatarPathUnsafeCache.has(filename)) { + return res.sendFile(avatarPathUnsafeCache.get(filename), { maxAge: STATIC_MAX_AGE.SERVER }) + } + + const avatar = await AvatarModel.loadByName(filename) + if (avatar.onDisk === false) { + if (!avatar.fileUrl) return res.sendStatus(404) + + logger.info('Lazy serve remote avatar image %s.', avatar.fileUrl) + + await pushAvatarProcessInQueue({ filename: avatar.filename, fileUrl: avatar.fileUrl }) + + avatar.onDisk = true + avatar.save() + .catch(err => logger.error('Cannot save new avatar disk state.', { err })) + } + + const path = avatar.getPath() + + avatarPathUnsafeCache.set(filename, path) + return res.sendFile(path, { maxAge: STATIC_MAX_AGE.SERVER }) +} + +async function getPreview (req: express.Request, res: express.Response) { + const result = await VideosPreviewCache.Instance.getFilePath(req.params.uuid) + if (!result) return res.sendStatus(404) + + return res.sendFile(result.path, { maxAge: STATIC_MAX_AGE.SERVER }) +} + +async function getVideoCaption (req: express.Request, res: express.Response) { + const result = await VideosCaptionCache.Instance.getFilePath({ + videoId: req.params.videoId, + language: req.params.captionLanguage + }) + if (!result) return res.sendStatus(404) + + return res.sendFile(result.path, { maxAge: STATIC_MAX_AGE.SERVER }) +} -- cgit v1.2.3