X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fcache%2Fvideos-preview-cache.ts;h=22b6d9cb0db82ecafd74747062ca0db8879fbe36;hb=f4001cf408a99049d01a356bfb20a62342de06ea;hp=776f647a048ba1e45ee7ec74edd8da8e9d74ed59;hpb=571389d43b8fc8aaf27e77c06f19b320b08dbbc9;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/cache/videos-preview-cache.ts b/server/lib/cache/videos-preview-cache.ts index 776f647a0..22b6d9cb0 100644 --- a/server/lib/cache/videos-preview-cache.ts +++ b/server/lib/cache/videos-preview-cache.ts @@ -1,68 +1,39 @@ -import * as asyncLRU from 'async-lru' import { join } from 'path' -import { createWriteStream } from 'fs' +import { CACHE, CONFIG, STATIC_PATHS } from '../../initializers' +import { VideoModel } from '../../models/video/video' +import { AbstractVideoStaticFileCache } from './abstract-video-static-file-cache' -import { database as db, CONFIG, CACHE } from '../../initializers' -import { logger, unlinkPromise, fetchRemoteVideoPreview } from '../../helpers' -import { VideoInstance } from '../../models' - -class VideosPreviewCache { +class VideosPreviewCache extends AbstractVideoStaticFileCache { private static instance: VideosPreviewCache - private lru - - private constructor () { } + private constructor () { + super() + } static get Instance () { return this.instance || (this.instance = new this()) } - init (max: number) { - this.lru = new asyncLRU({ - max, - load: (key, cb) => { - this.loadPreviews(key) - .then(res => cb(null, res)) - .catch(err => cb(err)) - } - }) - - this.lru.on('evict', (obj: { key: string, value: string }) => { - unlinkPromise(obj.value).then(() => logger.debug('%s evicted from VideosPreviewCache', obj.value)) - }) - } - - getPreviewPath (key: string) { - return new Promise((res, rej) => { - this.lru.get(key, (err, value) => { - err ? rej(err) : res(value) - }) - }) - } - - private async loadPreviews (key: string) { - const video = await db.Video.loadByUUIDAndPopulateAccountAndPodAndTags(key) + async getFilePath (videoUUID: string) { + const video = await VideoModel.loadByUUID(videoUUID) if (!video) return undefined if (video.isOwned()) return join(CONFIG.STORAGE.PREVIEWS_DIR, video.getPreviewName()) - const res = await this.saveRemotePreviewAndReturnPath(video) - - return res + return this.loadFromLRU(videoUUID) } - private saveRemotePreviewAndReturnPath (video: VideoInstance) { - const req = fetchRemoteVideoPreview(video) + protected async loadRemoteFile (key: string) { + const video = await VideoModel.loadByUUIDAndPopulateAccountAndServerAndTags(key) + if (!video) return undefined + + if (video.isOwned()) throw new Error('Cannot load remote preview of owned video.') - return new Promise((res, rej) => { - const path = join(CACHE.DIRECTORIES.PREVIEWS, video.getPreviewName()) - const stream = createWriteStream(path) + const remoteStaticPath = join(STATIC_PATHS.PREVIEWS, video.getPreviewName()) + const destPath = join(CACHE.PREVIEWS.DIRECTORY, video.getPreviewName()) - req.pipe(stream) - .on('finish', () => res(path)) - .on('error', (err) => rej(err)) - }) + return this.saveRemoteVideoFileAndReturnPath(video, remoteStaticPath, destPath) } }