]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/files-cache/videos-preview-cache.ts
ee72cd3f9b6afce9cf77c6b98f0e47e00921cc42
[github/Chocobozzz/PeerTube.git] / server / lib / files-cache / videos-preview-cache.ts
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'
9
10 class VideosPreviewCache extends AbstractVideoStaticFileCache <string> {
11
12 private static instance: VideosPreviewCache
13
14 private constructor () {
15 super()
16 }
17
18 static get Instance () {
19 return this.instance || (this.instance = new this())
20 }
21
22 async getFilePathImpl (filename: string) {
23 const thumbnail = await ThumbnailModel.loadWithVideoByFilename(filename, ThumbnailType.PREVIEW)
24 if (!thumbnail) return undefined
25
26 if (thumbnail.Video.isOwned()) return { isOwned: true, path: thumbnail.getPath() }
27
28 return this.loadRemoteFile(thumbnail.Video.uuid)
29 }
30
31 // Key is the video UUID
32 protected async loadRemoteFile (key: string) {
33 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(key)
34 if (!video) return undefined
35
36 if (video.isOwned()) throw new Error('Cannot load remote preview of owned video.')
37
38 const preview = video.getPreview()
39 const destPath = join(FILES_CACHE.PREVIEWS.DIRECTORY, preview.filename)
40
41 const remoteUrl = preview.getFileUrl(video)
42 await doRequestAndSaveToFile({ uri: remoteUrl }, destPath)
43
44 logger.debug('Fetched remote preview %s to %s.', remoteUrl, destPath)
45
46 return { isOwned: false, path: destPath }
47 }
48 }
49
50 export {
51 VideosPreviewCache
52 }