1 import { join } from 'path'
2 import { FILES_CACHE } from '../../initializers/constants'
3 import { VideoModel } from '../../models/video/video'
4 import { AbstractVideoStaticFileCache } from './abstract-video-static-file-cache'
5 import { doRequestAndSaveToFile } from '@server/helpers/requests'
6 import { ThumbnailModel } from '@server/models/video/thumbnail'
7 import { ThumbnailType } from '@shared/models'
8 import { logger } from '@server/helpers/logger'
10 class VideosPreviewCache extends AbstractVideoStaticFileCache <string> {
12 private static instance: VideosPreviewCache
14 private constructor () {
18 static get Instance () {
19 return this.instance || (this.instance = new this())
22 async getFilePathImpl (filename: string) {
23 const thumbnail = await ThumbnailModel.loadWithVideoByFilename(filename, ThumbnailType.PREVIEW)
24 if (!thumbnail) return undefined
26 if (thumbnail.Video.isOwned()) return { isOwned: true, path: thumbnail.getPath() }
28 return this.loadRemoteFile(thumbnail.Video.uuid)
31 // Key is the video UUID
32 protected async loadRemoteFile (key: string) {
33 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(key)
34 if (!video) return undefined
36 if (video.isOwned()) throw new Error('Cannot load remote preview of owned video.')
38 const preview = video.getPreview()
39 const destPath = join(FILES_CACHE.PREVIEWS.DIRECTORY, preview.filename)
41 const remoteUrl = preview.getFileUrl(video)
42 await doRequestAndSaveToFile(remoteUrl, destPath)
44 logger.debug('Fetched remote preview %s to %s.', remoteUrl, destPath)
46 return { isOwned: false, path: destPath }