]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/lib/activitypub/cache-file.ts
feature/ability to disable video history by default (#5728)
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / cache-file.ts
CommitLineData
e5565833 1import { Transaction } from 'sequelize'
26d6bf65 2import { MActorId, MVideoRedundancy, MVideoWithAllFiles } from '@server/types/models'
d17c7b4e 3import { CacheFileObject, VideoStreamingPlaylistType } from '@shared/models'
49af5ac8 4import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy'
c48e82b5 5
49af5ac8
C
6async function createOrUpdateCacheFile (cacheFileObject: CacheFileObject, video: MVideoWithAllFiles, byActor: MActorId, t: Transaction) {
7 const redundancyModel = await VideoRedundancyModel.loadByUrl(cacheFileObject.id, t)
09209296 8
49af5ac8
C
9 if (redundancyModel) {
10 return updateCacheFile(cacheFileObject, redundancyModel, video, byActor, t)
09209296
C
11 }
12
49af5ac8 13 return createCacheFile(cacheFileObject, video, byActor, t)
c48e82b5
C
14}
15
49af5ac8 16// ---------------------------------------------------------------------------
b88a4596 17
49af5ac8
C
18export {
19 createOrUpdateCacheFile
b88a4596
C
20}
21
49af5ac8
C
22// ---------------------------------------------------------------------------
23
453e83ea 24function createCacheFile (cacheFileObject: CacheFileObject, video: MVideoWithAllFiles, byActor: MActorId, t: Transaction) {
e5565833 25 const attributes = cacheFileActivityObjectToDBAttributes(cacheFileObject, video, byActor)
c48e82b5 26
e5565833 27 return VideoRedundancyModel.create(attributes, { transaction: t })
c48e82b5
C
28}
29
e5565833
C
30function updateCacheFile (
31 cacheFileObject: CacheFileObject,
453e83ea
C
32 redundancyModel: MVideoRedundancy,
33 video: MVideoWithAllFiles,
34 byActor: MActorId,
e5565833
C
35 t: Transaction
36) {
12ba460e
C
37 if (redundancyModel.actorId !== byActor.id) {
38 throw new Error('Cannot update redundancy ' + redundancyModel.url + ' of another actor.')
39 }
40
e5565833 41 const attributes = cacheFileActivityObjectToDBAttributes(cacheFileObject, video, byActor)
c48e82b5 42
1735c825
C
43 redundancyModel.expiresOn = attributes.expiresOn
44 redundancyModel.fileUrl = attributes.fileUrl
c48e82b5 45
e5565833 46 return redundancyModel.save({ transaction: t })
c48e82b5
C
47}
48
49af5ac8
C
49function cacheFileActivityObjectToDBAttributes (cacheFileObject: CacheFileObject, video: MVideoWithAllFiles, byActor: MActorId) {
50
51 if (cacheFileObject.url.mediaType === 'application/x-mpegURL') {
52 const url = cacheFileObject.url
53
54 const playlist = video.VideoStreamingPlaylists.find(t => t.type === VideoStreamingPlaylistType.HLS)
55 if (!playlist) throw new Error('Cannot find HLS playlist of video ' + video.url)
56
57 return {
58 expiresOn: cacheFileObject.expires ? new Date(cacheFileObject.expires) : null,
59 url: cacheFileObject.id,
60 fileUrl: url.href,
61 strategy: null,
62 videoStreamingPlaylistId: playlist.id,
63 actorId: byActor.id
64 }
65 }
66
67 const url = cacheFileObject.url
68 const videoFile = video.VideoFiles.find(f => {
69 return f.resolution === url.height && f.fps === url.fps
70 })
71
72 if (!videoFile) throw new Error(`Cannot find video file ${url.height} ${url.fps} of video ${video.url}`)
73
74 return {
75 expiresOn: cacheFileObject.expires ? new Date(cacheFileObject.expires) : null,
76 url: cacheFileObject.id,
77 fileUrl: url.href,
78 strategy: null,
79 videoFileId: videoFile.id,
80 actorId: byActor.id
81 }
c48e82b5 82}