diff --git a/client/src/assets/player/p2p-media-loader/segment-validator.ts b/client/src/assets/player/p2p-media-loader/segment-validator.ts index 844956d6a..4a0caec5e 100644 --- a/client/src/assets/player/p2p-media-loader/segment-validator.ts +++ b/client/src/assets/player/p2p-media-loader/segment-validator.ts @@ -10,7 +10,7 @@ function segmentValidatorFactory (segmentsSha256Url: string, isLive: boolean) { let segmentsJSON = fetchSha256Segments(segmentsSha256Url) const regex = /bytes=(\d+)-(\d+)/ - return async function segmentValidator (segment: Segment, retry = 1) { + return async function segmentValidator (segment: Segment, _method: string, _peerId: string, retry = 1) { // Wait for hash generation from the server if (isLive) await wait(1000) @@ -28,7 +28,7 @@ function segmentValidatorFactory (segmentsSha256Url: string, isLive: boolean) { await wait(1000) segmentsJSON = fetchSha256Segments(segmentsSha256Url) - await segmentValidator(segment, retry + 1) + await segmentValidator(segment, _method, _peerId, retry + 1) return } diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 679503731..02e42a594 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -620,6 +620,7 @@ const VIDEO_LIVE = { CLEANUP_DELAY: 1000 * 60 * 5, // 5 minutes SEGMENT_TIME_SECONDS: 4, // 4 seconds SEGMENTS_LIST_SIZE: 15, // 15 maximum segments in live playlist + EDGE_LIVE_DELAY_SEGMENTS_NOTIFICATION: 3, RTMP: { CHUNK_SIZE: 60000, GOP_CACHE: true, @@ -750,6 +751,7 @@ if (isTestInstance() === true) { VIDEO_LIVE.CLEANUP_DELAY = 5000 VIDEO_LIVE.SEGMENT_TIME_SECONDS = 2 + VIDEO_LIVE.EDGE_LIVE_DELAY_SEGMENTS_NOTIFICATION = 1 } updateWebserverUrls() diff --git a/server/lib/live-manager.ts b/server/lib/live-manager.ts index 60ef30d15..d1a0cee91 100644 --- a/server/lib/live-manager.ts +++ b/server/lib/live-manager.ts @@ -323,11 +323,15 @@ class LiveManager { await video.save() videoLive.Video = video - await federateVideoIfNeeded(video, false) + setTimeout(() => { + federateVideoIfNeeded(video, false) + .catch(err => logger.error('Cannot federate live video %s.', video.url, { err })) + + PeerTubeSocket.Instance.sendVideoLiveNewState(video) + }, VIDEO_LIVE.SEGMENT_TIME_SECONDS * 1000 * VIDEO_LIVE.EDGE_LIVE_DELAY_SEGMENTS_NOTIFICATION) - PeerTubeSocket.Instance.sendVideoLiveNewState(video) } catch (err) { - logger.error('Cannot federate video %d.', videoLive.videoId, { err }) + logger.error('Cannot save/federate live video %d.', videoLive.videoId, { err }) } finally { masterWatcher.close() .catch(err => logger.error('Cannot close master watcher of %s.', outPath, { err }))