From f162d32da098aa55f6de2367142faa166edb7c08 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 6 Jun 2023 15:59:51 +0200 Subject: Support lazy download thumbnails --- .../video-previews-simple-file-cache.ts | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 server/lib/files-cache/video-previews-simple-file-cache.ts (limited to 'server/lib/files-cache/video-previews-simple-file-cache.ts') diff --git a/server/lib/files-cache/video-previews-simple-file-cache.ts b/server/lib/files-cache/video-previews-simple-file-cache.ts new file mode 100644 index 000000000..a05e80e16 --- /dev/null +++ b/server/lib/files-cache/video-previews-simple-file-cache.ts @@ -0,0 +1,58 @@ +import { join } from 'path' +import { FILES_CACHE } from '../../initializers/constants' +import { VideoModel } from '../../models/video/video' +import { AbstractSimpleFileCache } from './shared/abstract-simple-file-cache' +import { doRequestAndSaveToFile } from '@server/helpers/requests' +import { ThumbnailModel } from '@server/models/video/thumbnail' +import { ThumbnailType } from '@shared/models' +import { logger } from '@server/helpers/logger' + +class VideoPreviewsSimpleFileCache extends AbstractSimpleFileCache { + + private static instance: VideoPreviewsSimpleFileCache + + private constructor () { + super() + } + + static get Instance () { + return this.instance || (this.instance = new this()) + } + + async getFilePathImpl (filename: string) { + const thumbnail = await ThumbnailModel.loadWithVideoByFilename(filename, ThumbnailType.PREVIEW) + if (!thumbnail) return undefined + + if (thumbnail.Video.isOwned()) return { isOwned: true, path: thumbnail.getPath() } + + return this.loadRemoteFile(thumbnail.Video.uuid) + } + + // Key is the video UUID + protected async loadRemoteFile (key: string) { + const video = await VideoModel.loadFull(key) + if (!video) return undefined + + if (video.isOwned()) throw new Error('Cannot load remote preview of owned video.') + + const preview = video.getPreview() + const destPath = join(FILES_CACHE.PREVIEWS.DIRECTORY, preview.filename) + const remoteUrl = preview.getOriginFileUrl(video) + + try { + await doRequestAndSaveToFile(remoteUrl, destPath) + + logger.debug('Fetched remote preview %s to %s.', remoteUrl, destPath) + + return { isOwned: false, path: destPath } + } catch (err) { + logger.info('Cannot fetch remote preview file %s.', remoteUrl, { err }) + + return undefined + } + } +} + +export { + VideoPreviewsSimpleFileCache +} -- cgit v1.2.3