aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/server/lib/activitypub/cache-file.ts
diff options
context:
space:
mode:
Diffstat (limited to 'server/server/lib/activitypub/cache-file.ts')
-rw-r--r--server/server/lib/activitypub/cache-file.ts82
1 files changed, 82 insertions, 0 deletions
diff --git a/server/server/lib/activitypub/cache-file.ts b/server/server/lib/activitypub/cache-file.ts
new file mode 100644
index 000000000..ef8bbace8
--- /dev/null
+++ b/server/server/lib/activitypub/cache-file.ts
@@ -0,0 +1,82 @@
1import { Transaction } from 'sequelize'
2import { MActorId, MVideoRedundancy, MVideoWithAllFiles } from '@server/types/models/index.js'
3import { CacheFileObject, VideoStreamingPlaylistType } from '@peertube/peertube-models'
4import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy.js'
5
6async function createOrUpdateCacheFile (cacheFileObject: CacheFileObject, video: MVideoWithAllFiles, byActor: MActorId, t: Transaction) {
7 const redundancyModel = await VideoRedundancyModel.loadByUrl(cacheFileObject.id, t)
8
9 if (redundancyModel) {
10 return updateCacheFile(cacheFileObject, redundancyModel, video, byActor, t)
11 }
12
13 return createCacheFile(cacheFileObject, video, byActor, t)
14}
15
16// ---------------------------------------------------------------------------
17
18export {
19 createOrUpdateCacheFile
20}
21
22// ---------------------------------------------------------------------------
23
24function createCacheFile (cacheFileObject: CacheFileObject, video: MVideoWithAllFiles, byActor: MActorId, t: Transaction) {
25 const attributes = cacheFileActivityObjectToDBAttributes(cacheFileObject, video, byActor)
26
27 return VideoRedundancyModel.create(attributes, { transaction: t })
28}
29
30function updateCacheFile (
31 cacheFileObject: CacheFileObject,
32 redundancyModel: MVideoRedundancy,
33 video: MVideoWithAllFiles,
34 byActor: MActorId,
35 t: Transaction
36) {
37 if (redundancyModel.actorId !== byActor.id) {
38 throw new Error('Cannot update redundancy ' + redundancyModel.url + ' of another actor.')
39 }
40
41 const attributes = cacheFileActivityObjectToDBAttributes(cacheFileObject, video, byActor)
42
43 redundancyModel.expiresOn = attributes.expiresOn
44 redundancyModel.fileUrl = attributes.fileUrl
45
46 return redundancyModel.save({ transaction: t })
47}
48
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 }
82}