]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/lib/activitypub/videos.ts
Add check constraints live tests
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / videos.ts
index 049e06cff86ce5375bc9242258cc499916cc740b..ea1e6a38f8473f6fc2766478299fd3722d252d6c 100644 (file)
@@ -1,3 +1,4 @@
+import { VideoLiveModel } from '@server/models/video/video-live'
 import * as Bluebird from 'bluebird'
 import { maxBy, minBy } from 'lodash'
 import * as magnetUtil from 'magnet-uri'
@@ -66,6 +67,7 @@ import { FilteredModelAttributes } from '../../types/sequelize'
 import { ActorFollowScoreCache } from '../files-cache'
 import { JobQueue } from '../job-queue'
 import { Notifier } from '../notifier'
+import { PeerTubeSocket } from '../peertube-socket'
 import { createPlaceholderThumbnail, createVideoMiniatureFromUrl } from '../thumbnail'
 import { setVideoTags } from '../video'
 import { autoBlacklistVideoIfNeeded } from '../video-blacklist'
@@ -83,7 +85,7 @@ async function federateVideoIfNeeded (videoArg: MVideoAPWithoutCaption, isNewVid
     // Check this is not a blacklisted video, or unfederated blacklisted video
     (video.isBlacklisted() === false || (isNewVideo === false && video.VideoBlacklist.unfederated === false)) &&
     // Check the video is public/unlisted and published
-    video.hasPrivacyForFederation() && video.state === VideoState.PUBLISHED
+    video.hasPrivacyForFederation() && (video.state === VideoState.PUBLISHED || video.state === VideoState.WAITING_FOR_LIVE)
   ) {
     // Fetch more attributes that we will need to serialize in AP object
     if (isArray(video.VideoCaptions) === false) {
@@ -348,6 +350,7 @@ async function updateVideoFromAP (options: {
       video.privacy = videoData.privacy
       video.channelId = videoData.channelId
       video.views = videoData.views
+      video.isLive = videoData.isLive
 
       const videoUpdated = await video.save(sequelizeOptions) as MVideoFullLight
 
@@ -422,6 +425,27 @@ async function updateVideoFromAP (options: {
         await Promise.all(videoCaptionsPromises)
       }
 
+      {
+        // Create or update existing live
+        if (video.isLive) {
+          const [ videoLive ] = await VideoLiveModel.upsert({
+            saveReplay: videoObject.liveSaveReplay,
+            videoId: video.id
+          }, { transaction: t, returning: true })
+
+          videoUpdated.VideoLive = videoLive
+        } else { // Delete existing live if it exists
+          await VideoLiveModel.destroy({
+            where: {
+              videoId: video.id
+            },
+            transaction: t
+          })
+
+          videoUpdated.VideoLive = null
+        }
+      }
+
       return videoUpdated
     })
 
@@ -434,6 +458,7 @@ async function updateVideoFromAP (options: {
     })
 
     if (wasPrivateVideo || wasUnlistedVideo) Notifier.Instance.notifyOnNewVideoIfNeeded(videoUpdated) // Notify our users?
+    if (videoUpdated.isLive) PeerTubeSocket.Instance.sendVideoLiveNewState(videoUpdated)
 
     logger.info('Remote video with uuid %s updated', videoObject.uuid)
 
@@ -603,6 +628,16 @@ async function createVideo (videoObject: VideoObject, channel: MChannelAccountLi
 
     videoCreated.VideoFiles = videoFiles
 
+    if (videoCreated.isLive) {
+      const videoLive = new VideoLiveModel({
+        streamKey: null,
+        saveReplay: videoObject.liveSaveReplay,
+        videoId: videoCreated.id
+      })
+
+      videoCreated.VideoLive = await videoLive.save({ transaction: t })
+    }
+
     const autoBlacklisted = await autoBlacklistVideoIfNeeded({
       video: videoCreated,
       user: undefined,