X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fjob-queue%2Fhandlers%2Fvideo-views.ts;h=2258cd02989304c3216d094939e3528ee4622767;hb=a3b7421abb4192e215aa280418b62e96958c5e42;hp=8a011d109c1e98cd84ec0d8b1df51d82cff31d7b;hpb=9431cabf8a92f602cf3b4626e12f23b0910f52a8;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/job-queue/handlers/video-views.ts b/server/lib/job-queue/handlers/video-views.ts index 8a011d109..2258cd029 100644 --- a/server/lib/job-queue/handlers/video-views.ts +++ b/server/lib/job-queue/handlers/video-views.ts @@ -2,11 +2,18 @@ import { Redis } from '../../redis' import { logger } from '../../../helpers/logger' import { VideoModel } from '../../../models/video/video' import { VideoViewModel } from '../../../models/video/video-views' +import { isTestInstance } from '../../../helpers/core-utils' +import { federateVideoIfNeeded } from '../../activitypub' -async function processVideosViewsViews () { - const hour = new Date().getHours() - const startDate = new Date().setMinutes(0, 0, 0) - const endDate = new Date().setMinutes(59, 59, 999) +async function processVideosViews () { + const lastHour = new Date() + + // In test mode, we run this function multiple times per hour, so we don't want the values of the previous hour + if (!isTestInstance()) lastHour.setHours(lastHour.getHours() - 1) + + const hour = lastHour.getHours() + const startDate = lastHour.setMinutes(0, 0, 0) + const endDate = lastHour.setMinutes(59, 59, 999) const videoIds = await Redis.Instance.getVideosIdViewed(hour) if (videoIds.length === 0) return @@ -16,28 +23,39 @@ async function processVideosViewsViews () { for (const videoId of videoIds) { try { const views = await Redis.Instance.getVideoViews(videoId, hour) - if (isNaN(views)) { - logger.error('Cannot process videos views of video %d in hour %d: views number is NaN.', videoId, hour) - } else { - logger.debug('Adding %d views to video %d in hour %d.', views, videoId, hour) + await Redis.Instance.deleteVideoViews(videoId, hour) - await VideoModel.incrementViews(videoId, views) + if (views) { + logger.debug('Adding %d views to video %d in hour %d.', views, videoId, hour) try { + const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId) + if (!video) { + logger.debug('Video %d does not exist anymore, skipping videos view addition.', videoId) + continue + } + await VideoViewModel.create({ startDate, endDate, views, videoId }) + + if (video.isOwned()) { + // If this is a remote video, the origin instance will send us an update + await VideoModel.incrementViews(videoId, views) + + // Send video update + video.views += views + await federateVideoIfNeeded(video, false) + } } catch (err) { - logger.debug('Cannot create video views for video %d in hour %d. Maybe the video does not exist anymore?', videoId, hour) + logger.error('Cannot create video views for video %d in hour %d.', videoId, hour, { err }) } } - - await Redis.Instance.deleteVideoViews(videoId, hour) } catch (err) { - logger.error('Cannot update video views of video %d in hour %d.', videoId, hour) + logger.error('Cannot update video views of video %d in hour %d.', videoId, hour, { err }) } } } @@ -45,5 +63,5 @@ async function processVideosViewsViews () { // --------------------------------------------------------------------------- export { - processVideosViewsViews + processVideosViews }