]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Correctly terminate an ended live
authorChocobozzz <me@florianbigard.com>
Tue, 15 Nov 2022 07:55:27 +0000 (08:55 +0100)
committerChocobozzz <me@florianbigard.com>
Tue, 15 Nov 2022 09:50:57 +0000 (10:50 +0100)
client/src/standalone/videos/embed.ts
client/src/standalone/videos/shared/live-manager.ts
server/tests/api/views/video-views-counter.ts
server/tests/api/views/video-views-overall-stats.ts
server/tests/api/views/video-views-retention-stats.ts
server/tests/api/views/video-views-timeserie-stats.ts

index 356f149c0de491f8aacaed47cec87d19228ec76d..2b826b9a280df24e8be83fe6e416ef7e4245bb7c 100644 (file)
@@ -3,12 +3,12 @@ import '../../assets/player/shared/dock/peertube-dock-component'
 import '../../assets/player/shared/dock/peertube-dock-plugin'
 import videojs from 'video.js'
 import { peertubeTranslate } from '../../../../shared/core-utils/i18n'
-import { HTMLServerConfig, ResultList, VideoDetails, VideoPlaylist, VideoPlaylistElement } from '../../../../shared/models'
+import { HTMLServerConfig, ResultList, VideoDetails, VideoPlaylist, VideoPlaylistElement, VideoState } from '../../../../shared/models'
 import { PeertubePlayerManager } from '../../assets/player'
 import { TranslationsManager } from '../../assets/player/translations-manager'
 import { getParamString, logger, videoRequiresAuth } from '../../root-helpers'
 import { PeerTubeEmbedApi } from './embed-api'
-import { AuthHTTP, LiveManager, PeerTubePlugin, PlayerManagerOptions, PlaylistFetcher, PlaylistTracker, VideoFetcher } from './shared'
+import { AuthHTTP, LiveManager, PeerTubePlugin, PlayerManagerOptions, PlaylistFetcher, PlaylistTracker, Translations, VideoFetcher } from './shared'
 import { PlayerHTML } from './shared/player-html'
 
 export class PeerTubeEmbed {
@@ -251,18 +251,25 @@ export class PeerTubeEmbed {
       })
     }
 
-    this.peertubePlugin.getPluginsManager().runHook('action:embed.player.loaded', undefined, { player: this.player, videojs, video })
-
     if (video.isLive) {
-      this.liveManager.displayInfoAndListenForChanges({
+      this.liveManager.listenForChanges({
         video,
-        translations,
         onPublishedVideo: () => {
           this.liveManager.stopListeningForChanges(video)
           this.loadVideoAndBuildPlayer(video.uuid)
         }
       })
+
+      if (video.state.id === VideoState.WAITING_FOR_LIVE || video.state.id === VideoState.LIVE_ENDED) {
+        this.liveManager.displayInfo({ state: video.state.id, translations })
+
+        this.disablePlayer()
+      } else {
+        this.correctlyHandleLiveEnding(translations)
+      }
     }
+
+    this.peertubePlugin.getPluginsManager().runHook('action:embed.player.loaded', undefined, { player: this.player, videojs, video })
   }
 
   private resetPlayerElement () {
@@ -351,6 +358,31 @@ export class PeerTubeEmbed {
   private isPlaylistEmbed () {
     return window.location.pathname.split('/')[1] === 'video-playlists'
   }
+
+  // ---------------------------------------------------------------------------
+
+  private correctlyHandleLiveEnding (translations: Translations) {
+    this.player.one('ended', () => {
+      // Display the live ended information
+      this.liveManager.displayInfo({ state: VideoState.LIVE_ENDED, translations })
+
+      this.disablePlayer()
+    })
+  }
+
+  private disablePlayer () {
+    if (this.player.isFullscreen()) {
+      this.player.exitFullscreen()
+    }
+
+    // Disable player
+    this.player.hasStarted(false)
+    this.player.removeClass('vjs-has-autoplay')
+    this.player.bigPlayButton.hide();
+
+    (this.player.el() as HTMLElement).style.pointerEvents = 'none'
+  }
+
 }
 
 PeerTubeEmbed.main()
index ec11d0b61a628f7788a75403a42411c3ef646779..5fac229ba88843897a56002e4eb6318915a7e76c 100644 (file)
@@ -14,15 +14,12 @@ export class LiveManager {
 
   }
 
-  async displayInfoAndListenForChanges (options: {
+  async listenForChanges (options: {
     video: VideoDetails
-    translations: Translations
     onPublishedVideo: () => any
   }) {
     const { video, onPublishedVideo } = options
 
-    this.displayAppropriateInfo(options)
-
     if (!this.liveSocket) {
       const io = (await import('socket.io-client')).io
       this.liveSocket = io(window.location.origin + '/live-videos')
@@ -51,18 +48,18 @@ export class LiveManager {
     this.liveSocket.emit('unsubscribe', { videoId: video.id })
   }
 
-  private displayAppropriateInfo (options: {
-    video: VideoDetails
+  displayInfo (options: {
+    state: VideoState
     translations: Translations
   }) {
-    const { video, translations } = options
+    const { state, translations } = options
 
-    if (video.state.id === VideoState.WAITING_FOR_LIVE) {
+    if (state === VideoState.WAITING_FOR_LIVE) {
       this.displayWaitingForLiveInfo(translations)
       return
     }
 
-    if (video.state.id === VideoState.LIVE_ENDED) {
+    if (state === VideoState.LIVE_ENDED) {
       this.displayEndedLiveInfo(translations)
       return
     }
index ca33ff9cd395965b4766de7c0d251edf678c87cf..0c1b7859cc7d21807126bb6ff1d7e2fce7854552 100644 (file)
@@ -76,7 +76,7 @@ describe('Test video views/viewers counters', function () {
     let command: FfmpegCommand
 
     before(async function () {
-      this.timeout(120000);
+      this.timeout(240000);
 
       ({ vodVideoId, liveVideoId, ffmpegCommand: command } = await prepareViewsVideos({ servers, live: true, vod: true }))
     })
index bb00684efd1aecfae7333ed388ed1859d2596bca..3aadc9689027da730dbf2617e4ec35ab1024acdc 100644 (file)
@@ -20,7 +20,7 @@ describe('Test views overall stats', function () {
     let command: FfmpegCommand
 
     before(async function () {
-      this.timeout(120000);
+      this.timeout(240000);
 
       ({ vodVideoId, liveVideoId, ffmpegCommand: command } = await prepareViewsVideos({ servers, live: true, vod: true }))
     })
@@ -179,7 +179,7 @@ describe('Test views overall stats', function () {
     let before2Watchers: Date
 
     before(async function () {
-      this.timeout(120000);
+      this.timeout(240000);
 
       ({ vodVideoId: videoUUID } = await prepareViewsVideos({ servers, live: true, vod: true }))
     })
index 621b0511015d59b5eb9933793b71f0a8b28d8aa4..5b9ce4c929c11d197c0a4c11771529a7d34218e2 100644 (file)
@@ -17,7 +17,7 @@ describe('Test views retention stats', function () {
     let vodVideoId: string
 
     before(async function () {
-      this.timeout(120000);
+      this.timeout(240000);
 
       ({ vodVideoId } = await prepareViewsVideos({ servers, live: false, vod: true }))
     })
index e8cb34ad63706900f7391fb6fbbc8e75b8b1fdb1..2d991d7ea64439d17c00cb2859dcb1078260b0bf 100644 (file)
@@ -30,7 +30,7 @@ describe('Test views timeserie stats', function () {
     let vodVideoId: string
 
     before(async function () {
-      this.timeout(120000);
+      this.timeout(240000);
 
       ({ vodVideoId } = await prepareViewsVideos({ servers, live: false, vod: true }))
     })
@@ -81,7 +81,7 @@ describe('Test views timeserie stats', function () {
     }
 
     before(async function () {
-      this.timeout(120000);
+      this.timeout(240000);
 
       ({ vodVideoId, liveVideoId, ffmpegCommand: command } = await prepareViewsVideos({ servers, live: true, vod: true }))
     })