X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Factivitypub%2Fcache-file.ts;h=c3acd7112adddd4a79eb0d409435d81fa0bc727b;hb=e901579b00fbcd8fc0f7b45fd841636329148a34;hp=87f8a4162b0a7770d4327499486ab5dc9c0474d2;hpb=12ba460e9ebf4951f9c1caee8822a8ca1523563f;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/activitypub/cache-file.ts b/server/lib/activitypub/cache-file.ts index 87f8a4162..c3acd7112 100644 --- a/server/lib/activitypub/cache-file.ts +++ b/server/lib/activitypub/cache-file.ts @@ -1,50 +1,82 @@ -import { CacheFileObject } from '../../../shared/index' -import { VideoModel } from '../../models/video/video' -import { sequelizeTypescript } from '../../initializers' +import { Transaction } from 'sequelize' +import { MActorId, MVideoRedundancy, MVideoWithAllFiles } from '@server/types/models' +import { CacheFileObject, VideoStreamingPlaylistType } from '@shared/models' import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy' -function cacheFileActivityObjectToDBAttributes (cacheFileObject: CacheFileObject, video: VideoModel, byActor: { id?: number }) { - const url = cacheFileObject.url +async function createOrUpdateCacheFile (cacheFileObject: CacheFileObject, video: MVideoWithAllFiles, byActor: MActorId, t: Transaction) { + const redundancyModel = await VideoRedundancyModel.loadByUrl(cacheFileObject.id, t) - const videoFile = video.VideoFiles.find(f => { - return f.resolution === url.height && f.fps === url.fps - }) + if (redundancyModel) { + return updateCacheFile(cacheFileObject, redundancyModel, video, byActor, t) + } - if (!videoFile) throw new Error(`Cannot find video file ${url.height} ${url.fps} of video ${video.url}`) + return createCacheFile(cacheFileObject, video, byActor, t) +} - return { - expiresOn: new Date(cacheFileObject.expires), - url: cacheFileObject.id, - fileUrl: cacheFileObject.url.href, - strategy: null, - videoFileId: videoFile.id, - actorId: byActor.id - } +// --------------------------------------------------------------------------- + +export { + createOrUpdateCacheFile } -function createCacheFile (cacheFileObject: CacheFileObject, video: VideoModel, byActor: { id?: number }) { - return sequelizeTypescript.transaction(async t => { - const attributes = cacheFileActivityObjectToDBAttributes(cacheFileObject, video, byActor) +// --------------------------------------------------------------------------- - return VideoRedundancyModel.create(attributes, { transaction: t }) - }) +function createCacheFile (cacheFileObject: CacheFileObject, video: MVideoWithAllFiles, byActor: MActorId, t: Transaction) { + const attributes = cacheFileActivityObjectToDBAttributes(cacheFileObject, video, byActor) + + return VideoRedundancyModel.create(attributes, { transaction: t }) } -function updateCacheFile (cacheFileObject: CacheFileObject, redundancyModel: VideoRedundancyModel, byActor: { id?: number }) { +function updateCacheFile ( + cacheFileObject: CacheFileObject, + redundancyModel: MVideoRedundancy, + video: MVideoWithAllFiles, + byActor: MActorId, + t: Transaction +) { if (redundancyModel.actorId !== byActor.id) { throw new Error('Cannot update redundancy ' + redundancyModel.url + ' of another actor.') } - const attributes = cacheFileActivityObjectToDBAttributes(cacheFileObject, redundancyModel.VideoFile.Video, byActor) + const attributes = cacheFileActivityObjectToDBAttributes(cacheFileObject, video, byActor) - redundancyModel.set('expires', attributes.expiresOn) - redundancyModel.set('fileUrl', attributes.fileUrl) + redundancyModel.expiresOn = attributes.expiresOn + redundancyModel.fileUrl = attributes.fileUrl - return redundancyModel.save() + return redundancyModel.save({ transaction: t }) } -export { - createCacheFile, - updateCacheFile, - cacheFileActivityObjectToDBAttributes +function cacheFileActivityObjectToDBAttributes (cacheFileObject: CacheFileObject, video: MVideoWithAllFiles, byActor: MActorId) { + + if (cacheFileObject.url.mediaType === 'application/x-mpegURL') { + const url = cacheFileObject.url + + const playlist = video.VideoStreamingPlaylists.find(t => t.type === VideoStreamingPlaylistType.HLS) + if (!playlist) throw new Error('Cannot find HLS playlist of video ' + video.url) + + return { + expiresOn: cacheFileObject.expires ? new Date(cacheFileObject.expires) : null, + url: cacheFileObject.id, + fileUrl: url.href, + strategy: null, + videoStreamingPlaylistId: playlist.id, + actorId: byActor.id + } + } + + const url = cacheFileObject.url + const videoFile = video.VideoFiles.find(f => { + return f.resolution === url.height && f.fps === url.fps + }) + + if (!videoFile) throw new Error(`Cannot find video file ${url.height} ${url.fps} of video ${video.url}`) + + return { + expiresOn: cacheFileObject.expires ? new Date(cacheFileObject.expires) : null, + url: cacheFileObject.id, + fileUrl: url.href, + strategy: null, + videoFileId: videoFile.id, + actorId: byActor.id + } }