]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/controllers/api/videos/index.ts
Refactor video views
[github/Chocobozzz/PeerTube.git] / server / controllers / api / videos / index.ts
index 49490f79b13c3579918f0f47d337d47cd88f97d1..72b382595865356697030c6421d97977e6100e39 100644 (file)
@@ -1,10 +1,11 @@
-import * as express from 'express'
+import express from 'express'
 import toInt from 'validator/lib/toInt'
 import { pickCommonVideoQuery } from '@server/helpers/query'
 import { doJSONRequest } from '@server/helpers/requests'
-import { LiveManager } from '@server/lib/live'
+import { VideoViews } from '@server/lib/video-views'
 import { openapiOperationDoc } from '@server/middlewares/doc'
 import { getServerActor } from '@server/models/application/application'
+import { guessAdditionalAttributesFromQuery } from '@server/models/video/formatter/video-format-utils'
 import { MVideoAccountLight } from '@server/types/models'
 import { HttpStatusCode } from '../../../../shared/models'
 import { auditLoggerFactory, getAuditIdFromRes, VideoAuditView } from '../../../helpers/audit-logger'
@@ -16,7 +17,6 @@ import { sequelizeTypescript } from '../../../initializers/database'
 import { sendView } from '../../../lib/activitypub/send/send-view'
 import { JobQueue } from '../../../lib/job-queue'
 import { Hooks } from '../../../lib/plugins/hooks'
-import { Redis } from '../../../lib/redis'
 import {
   asyncMiddleware,
   asyncRetryTransactionMiddleware,
@@ -102,11 +102,11 @@ videosRouter.get('/:id',
   optionalAuthenticate,
   asyncMiddleware(videosCustomGetValidator('for-api')),
   asyncMiddleware(checkVideoFollowConstraints),
-  asyncMiddleware(getVideo)
+  getVideo
 )
 videosRouter.post('/:id/views',
   openapiOperationDoc({ operationId: 'addView' }),
-  asyncMiddleware(videosCustomGetValidator('only-immutable-attributes')),
+  asyncMiddleware(videosCustomGetValidator('only-video')),
   asyncMiddleware(viewVideo)
 )
 
@@ -141,7 +141,7 @@ function listVideoPrivacies (_req: express.Request, res: express.Response) {
   res.json(VIDEO_PRIVACIES)
 }
 
-async function getVideo (_req: express.Request, res: express.Response) {
+function getVideo (_req: express.Request, res: express.Response) {
   const video = res.locals.videoAPI
 
   if (video.isOutdated()) {
@@ -152,44 +152,17 @@ async function getVideo (_req: express.Request, res: express.Response) {
 }
 
 async function viewVideo (req: express.Request, res: express.Response) {
-  const immutableVideoAttrs = res.locals.onlyImmutableVideo
+  const video = res.locals.onlyVideo
 
   const ip = req.ip
-  const exists = await Redis.Instance.doesVideoIPViewExist(ip, immutableVideoAttrs.uuid)
-  if (exists) {
-    logger.debug('View for ip %s and video %s already exists.', ip, immutableVideoAttrs.uuid)
-    return res.status(HttpStatusCode.NO_CONTENT_204).end()
-  }
-
-  const video = await VideoModel.load(immutableVideoAttrs.id)
-
-  const promises: Promise<any>[] = [
-    Redis.Instance.setIPVideoView(ip, video.uuid, video.isLive)
-  ]
-
-  let federateView = true
-
-  // Increment our live manager
-  if (video.isLive && video.isOwned()) {
-    LiveManager.Instance.addViewTo(video.id)
-
-    // Views of our local live will be sent by our live manager
-    federateView = false
-  }
+  const success = await VideoViews.Instance.processView({ video, ip })
 
-  // Increment our video views cache counter
-  if (!video.isLive) {
-    promises.push(Redis.Instance.addVideoView(video.id))
-  }
-
-  if (federateView) {
+  if (success) {
     const serverActor = await getServerActor()
-    promises.push(sendView(serverActor, video, undefined))
-  }
+    await sendView(serverActor, video, undefined)
 
-  await Promise.all(promises)
-
-  Hooks.runAction('action:api.video.viewed', { video, ip })
+    Hooks.runAction('action:api.video.viewed', { video: video, ip })
+  }
 
   return res.status(HttpStatusCode.NO_CONTENT_204).end()
 }
@@ -211,15 +184,19 @@ async function getVideoFileMetadata (req: express.Request, res: express.Response
 }
 
 async function listVideos (req: express.Request, res: express.Response) {
+  const serverActor = await getServerActor()
+
   const query = pickCommonVideoQuery(req.query)
   const countVideos = getCountVideos(req)
 
   const apiOptions = await Hooks.wrapObject({
     ...query,
 
-    includeLocalVideos: true,
+    displayOnlyForFollower: {
+      actorId: serverActor.id,
+      orLocalVideos: true
+    },
     nsfw: buildNSFWFilter(res, query.nsfw),
-    withFiles: false,
     user: res.locals.oauth ? res.locals.oauth.token.User : undefined,
     countVideos
   }, 'filter:api.videos.list.params')
@@ -230,7 +207,7 @@ async function listVideos (req: express.Request, res: express.Response) {
     'filter:api.videos.list.result'
   )
 
-  return res.json(getFormattedObjects(resultList.data, resultList.total))
+  return res.json(getFormattedObjects(resultList.data, resultList.total, guessAdditionalAttributesFromQuery(query)))
 }
 
 async function removeVideo (_req: express.Request, res: express.Response) {