]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Improve views/viewers documentation
authorChocobozzz <me@florianbigard.com>
Tue, 5 Apr 2022 13:15:09 +0000 (15:15 +0200)
committerChocobozzz <chocobozzz@cpy.re>
Fri, 15 Apr 2022 07:49:35 +0000 (09:49 +0200)
server/initializers/constants.ts
server/lib/redis.ts
server/lib/views/shared/video-viewers.ts
server/lib/views/video-views-manager.ts
server/models/view/local-video-viewer.ts
server/models/view/video-view.ts

index 4929923dcd851e54fd3da70e12a106ff39d72293..9afbc5aeaf939d6c4382c4338a4e244d2a770969 100644 (file)
@@ -367,7 +367,7 @@ const CONSTRAINTS_FIELDS = {
 
 const VIEW_LIFETIME = {
   VIEW: CONFIG.VIEWS.VIDEOS.IP_VIEW_EXPIRATION,
-  VIEWER: 60000 * 5, // 5 minutes
+  VIEWER_COUNTER: 60000 * 5, // 5 minutes
   VIEWER_STATS: 60000 * 60 // 1 hour
 }
 
@@ -845,7 +845,7 @@ if (isTestInstance() === true) {
 
   REDUNDANCY.VIDEOS.RANDOMIZED_FACTOR = 1
 
-  VIEW_LIFETIME.VIEWER = 1000 * 5 // 5 second
+  VIEW_LIFETIME.VIEWER_COUNTER = 1000 * 5 // 5 second
   VIEW_LIFETIME.VIEWER_STATS = 1000 * 5 // 5 second
   CONTACT_FORM_LIFETIME = 1000 // 1 second
 
index b86aefa0ebba99f7f538f719d09fc5067b335b79..f9cea57cde3096b36b08e7d4656648cc8f06c2ed 100644 (file)
@@ -146,7 +146,7 @@ class Redis {
   }
 
   setIPVideoViewer (ip: string, videoUUID: string) {
-    return this.setValue(this.generateIPViewerKey(ip, videoUUID), '1', VIEW_LIFETIME.VIEWER)
+    return this.setValue(this.generateIPViewerKey(ip, videoUUID), '1', VIEW_LIFETIME.VIEWER_COUNTER)
   }
 
   async doesVideoIPViewExist (ip: string, videoUUID: string) {
index 5c26f8982a404b3949852dc16d9ddfc4fde0f4b0..4dad1f0e88f7c734854e80830ba5bd3b2e7ddb21 100644 (file)
@@ -41,7 +41,7 @@ export class VideoViewers {
   private processingViewerStats = false
 
   constructor () {
-    setInterval(() => this.cleanViewerCounters(), VIEW_LIFETIME.VIEWER)
+    setInterval(() => this.cleanViewerCounters(), VIEW_LIFETIME.VIEWER_COUNTER)
 
     setInterval(() => this.processViewerStats(), VIEW_LIFETIME.VIEWER_STATS)
   }
@@ -56,7 +56,7 @@ export class VideoViewers {
   }
 
   buildViewerExpireTime () {
-    return new Date().getTime() + VIEW_LIFETIME.VIEWER
+    return new Date().getTime() + VIEW_LIFETIME.VIEWER_COUNTER
   }
 
   async getWatchTime (videoId: number, ip: string) {
@@ -210,7 +210,7 @@ export class VideoViewers {
     if (this.processingViewerStats) return
     this.processingViewerStats = true
 
-    if (!isTestInstance()) logger.info('Processing viewers.', lTags())
+    if (!isTestInstance()) logger.info('Processing viewer statistics.', lTags())
 
     const now = new Date().getTime()
 
@@ -220,6 +220,7 @@ export class VideoViewers {
       for (const key of allKeys) {
         const stats: LocalViewerStats = await Redis.Instance.getLocalVideoViewer({ key })
 
+        // Process expired stats
         if (stats.lastUpdated > now - VIEW_LIFETIME.VIEWER_STATS) {
           continue
         }
index e07af1ca940f39cca68a6fb4b0e43a204cd26886..9382fb482401fb4441cb1f3dbf34430620dd1ade 100644 (file)
@@ -3,6 +3,24 @@ import { MVideo } from '@server/types/models'
 import { VideoViewEvent } from '@shared/models'
 import { VideoViewers, VideoViews } from './shared'
 
+/**
+ * If processing a local view:
+ *  - We update viewer information (segments watched, watch time etc)
+ *  - We add +1 to video viewers counter if this is a new viewer
+ *  - We add +1 to video views counter if this is a new view and if the user watched enough seconds
+ *  - We send AP message to notify about this viewer and this view
+ *  - We update last video time for the user if authenticated
+ *
+ * If processing a remote view:
+ *  - We add +1 to video viewers counter
+ *  - We add +1 to video views counter
+ *
+ * A viewer is a someone that watched one or multiple sections of a video
+ * A viewer that watched only a few seconds of a video may not increment the video views counter
+ * Viewers statistics are sent to origin instance using the `WatchAction` ActivityPub object
+ *
+ */
+
 const lTags = loggerTagsFactory('views')
 
 export class VideoViewsManager {
index 6f8de53cd82e541fb3aa45451ea719209d33ea3f..1491acb9e3f8afcf23c721377c65e231c10d0533 100644 (file)
@@ -8,6 +8,13 @@ import { AttributesOnly } from '@shared/typescript-utils'
 import { VideoModel } from '../video/video'
 import { LocalVideoViewerWatchSectionModel } from './local-video-viewer-watch-section'
 
+/**
+ *
+ * Aggregate viewers of local videos only to display statistics to video owners
+ * A viewer is a user that watched one or multiple sections of a specific video inside a time window
+ *
+ */
+
 @Table({
   tableName: 'localVideoViewer',
   updatedAt: false,
index df462e631a52da67418a7d93c61ae45775929198..1504a364ebfbbbafe4451d0b1f3c5631649cc06a 100644 (file)
@@ -3,6 +3,13 @@ import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Model, T
 import { AttributesOnly } from '@shared/typescript-utils'
 import { VideoModel } from '../video/video'
 
+/**
+ *
+ * Aggregate views of all videos federated with our instance
+ * Mainly used by the trending/hot algorithms
+ *
+ */
+
 @Table({
   tableName: 'videoView',
   updatedAt: false,