lazy-static.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import * as cors from 'cors'
  2. import * as express from 'express'
  3. import { LAZY_STATIC_PATHS, STATIC_MAX_AGE } from '../initializers/constants'
  4. import { VideosCaptionCache, VideosPreviewCache } from '../lib/files-cache'
  5. import { asyncMiddleware } from '../middlewares'
  6. import { AvatarModel } from '../models/avatar/avatar'
  7. import { logger } from '../helpers/logger'
  8. import { avatarPathUnsafeCache, pushAvatarProcessInQueue } from '../lib/avatar'
  9. const lazyStaticRouter = express.Router()
  10. lazyStaticRouter.use(cors())
  11. lazyStaticRouter.use(
  12. LAZY_STATIC_PATHS.AVATARS + ':filename',
  13. asyncMiddleware(getAvatar)
  14. )
  15. lazyStaticRouter.use(
  16. LAZY_STATIC_PATHS.PREVIEWS + ':uuid.jpg',
  17. asyncMiddleware(getPreview)
  18. )
  19. lazyStaticRouter.use(
  20. LAZY_STATIC_PATHS.VIDEO_CAPTIONS + ':videoId-:captionLanguage([a-z]+).vtt',
  21. asyncMiddleware(getVideoCaption)
  22. )
  23. // ---------------------------------------------------------------------------
  24. export {
  25. lazyStaticRouter,
  26. getPreview,
  27. getVideoCaption
  28. }
  29. // ---------------------------------------------------------------------------
  30. async function getAvatar (req: express.Request, res: express.Response) {
  31. const filename = req.params.filename
  32. if (avatarPathUnsafeCache.has(filename)) {
  33. return res.sendFile(avatarPathUnsafeCache.get(filename), { maxAge: STATIC_MAX_AGE.SERVER })
  34. }
  35. const avatar = await AvatarModel.loadByName(filename)
  36. if (!avatar) return res.sendStatus(404)
  37. if (avatar.onDisk === false) {
  38. if (!avatar.fileUrl) return res.sendStatus(404)
  39. logger.info('Lazy serve remote avatar image %s.', avatar.fileUrl)
  40. try {
  41. await pushAvatarProcessInQueue({ filename: avatar.filename, fileUrl: avatar.fileUrl })
  42. } catch (err) {
  43. logger.warn('Cannot process remote avatar %s.', avatar.fileUrl, { err })
  44. return res.sendStatus(404)
  45. }
  46. avatar.onDisk = true
  47. avatar.save()
  48. .catch(err => logger.error('Cannot save new avatar disk state.', { err }))
  49. }
  50. const path = avatar.getPath()
  51. avatarPathUnsafeCache.set(filename, path)
  52. return res.sendFile(path, { maxAge: STATIC_MAX_AGE.SERVER })
  53. }
  54. async function getPreview (req: express.Request, res: express.Response) {
  55. const result = await VideosPreviewCache.Instance.getFilePath(req.params.uuid)
  56. if (!result) return res.sendStatus(404)
  57. return res.sendFile(result.path, { maxAge: STATIC_MAX_AGE.SERVER })
  58. }
  59. async function getVideoCaption (req: express.Request, res: express.Response) {
  60. const result = await VideosCaptionCache.Instance.getFilePath({
  61. videoId: req.params.videoId,
  62. language: req.params.captionLanguage
  63. })
  64. if (!result) return res.sendStatus(404)
  65. return res.sendFile(result.path, { maxAge: STATIC_MAX_AGE.SERVER })
  66. }