aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/lib/views
diff options
context:
space:
mode:
Diffstat (limited to 'server/lib/views')
-rw-r--r--server/lib/views/shared/video-viewer-counters.ts31
-rw-r--r--server/lib/views/video-views-manager.ts9
2 files changed, 35 insertions, 5 deletions
diff --git a/server/lib/views/shared/video-viewer-counters.ts b/server/lib/views/shared/video-viewer-counters.ts
index f851ce050..f5b83130e 100644
--- a/server/lib/views/shared/video-viewer-counters.ts
+++ b/server/lib/views/shared/video-viewer-counters.ts
@@ -10,9 +10,14 @@ import { buildUUID, sha256 } from '@shared/extra-utils'
10 10
11const lTags = loggerTagsFactory('views') 11const lTags = loggerTagsFactory('views')
12 12
13export type ViewerScope = 'local' | 'remote'
14export type VideoScope = 'local' | 'remote'
15
13type Viewer = { 16type Viewer = {
14 expires: number 17 expires: number
15 id: string 18 id: string
19 viewerScope: ViewerScope
20 videoScope: VideoScope
16 lastFederation?: number 21 lastFederation?: number
17} 22}
18 23
@@ -50,7 +55,7 @@ export class VideoViewerCounters {
50 return false 55 return false
51 } 56 }
52 57
53 const newViewer = await this.addViewerToVideo({ viewerId, video }) 58 const newViewer = await this.addViewerToVideo({ viewerId, video, viewerScope: 'local' })
54 await this.federateViewerIfNeeded(video, newViewer) 59 await this.federateViewerIfNeeded(video, newViewer)
55 60
56 return true 61 return true
@@ -65,13 +70,26 @@ export class VideoViewerCounters {
65 70
66 logger.debug('Adding remote viewer to video %s.', video.uuid, { ...lTags(video.uuid) }) 71 logger.debug('Adding remote viewer to video %s.', video.uuid, { ...lTags(video.uuid) })
67 72
68 await this.addViewerToVideo({ video, viewerExpires, viewerId }) 73 await this.addViewerToVideo({ video, viewerExpires, viewerId, viewerScope: 'remote' })
69 74
70 return true 75 return true
71 } 76 }
72 77
73 // --------------------------------------------------------------------------- 78 // ---------------------------------------------------------------------------
74 79
80 getTotalViewers (options: {
81 viewerScope: ViewerScope
82 videoScope: VideoScope
83 }) {
84 let total = 0
85
86 for (const viewers of this.viewersPerVideo.values()) {
87 total += viewers.filter(v => v.viewerScope === options.viewerScope && v.videoScope === options.videoScope).length
88 }
89
90 return total
91 }
92
75 getViewers (video: MVideo) { 93 getViewers (video: MVideo) {
76 const viewers = this.viewersPerVideo.get(video.id) 94 const viewers = this.viewersPerVideo.get(video.id)
77 if (!viewers) return 0 95 if (!viewers) return 0
@@ -88,9 +106,10 @@ export class VideoViewerCounters {
88 private async addViewerToVideo (options: { 106 private async addViewerToVideo (options: {
89 video: MVideoImmutable 107 video: MVideoImmutable
90 viewerId: string 108 viewerId: string
109 viewerScope: ViewerScope
91 viewerExpires?: Date 110 viewerExpires?: Date
92 }) { 111 }) {
93 const { video, viewerExpires, viewerId } = options 112 const { video, viewerExpires, viewerId, viewerScope } = options
94 113
95 let watchers = this.viewersPerVideo.get(video.id) 114 let watchers = this.viewersPerVideo.get(video.id)
96 115
@@ -103,7 +122,11 @@ export class VideoViewerCounters {
103 ? viewerExpires.getTime() 122 ? viewerExpires.getTime()
104 : this.buildViewerExpireTime() 123 : this.buildViewerExpireTime()
105 124
106 const viewer = { id: viewerId, expires } 125 const videoScope: VideoScope = video.remote
126 ? 'remote'
127 : 'local'
128
129 const viewer = { id: viewerId, expires, videoScope, viewerScope }
107 watchers.push(viewer) 130 watchers.push(viewer)
108 131
109 this.idToViewer.set(viewerId, viewer) 132 this.idToViewer.set(viewerId, viewer)
diff --git a/server/lib/views/video-views-manager.ts b/server/lib/views/video-views-manager.ts
index 86758e8d8..c088dad5e 100644
--- a/server/lib/views/video-views-manager.ts
+++ b/server/lib/views/video-views-manager.ts
@@ -1,7 +1,7 @@
1import { logger, loggerTagsFactory } from '@server/helpers/logger' 1import { logger, loggerTagsFactory } from '@server/helpers/logger'
2import { MVideo, MVideoImmutable } from '@server/types/models' 2import { MVideo, MVideoImmutable } from '@server/types/models'
3import { VideoViewEvent } from '@shared/models' 3import { VideoViewEvent } from '@shared/models'
4import { VideoViewerCounters, VideoViewerStats, VideoViews } from './shared' 4import { VideoScope, VideoViewerCounters, VideoViewerStats, VideoViews, ViewerScope } from './shared'
5 5
6/** 6/**
7 * If processing a local view: 7 * If processing a local view:
@@ -79,6 +79,13 @@ export class VideoViewsManager {
79 return this.videoViewerCounters.getViewers(video) 79 return this.videoViewerCounters.getViewers(video)
80 } 80 }
81 81
82 getTotalViewers (options: {
83 viewerScope: ViewerScope
84 videoScope: VideoScope
85 }) {
86 return this.videoViewerCounters.getTotalViewers(options)
87 }
88
82 buildViewerExpireTime () { 89 buildViewerExpireTime () {
83 return this.videoViewerCounters.buildViewerExpireTime() 90 return this.videoViewerCounters.buildViewerExpireTime()
84 } 91 }