From a90d98ff1b4e4a40e20b8d25b48c7bb5feb76fda Mon Sep 17 00:00:00 2001 From: Gabe Kangas Date: Mon, 15 Jun 2020 17:23:44 -0700 Subject: [PATCH] Auto-restart playback when the stream comes back online --- stats.go | 16 ++++++++++++++-- webroot/js/app.js | 17 ++++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/stats.go b/stats.go index 15afb7cef..f3600bcb9 100644 --- a/stats.go +++ b/stats.go @@ -23,8 +23,8 @@ type Stats struct { SessionMaxViewerCount int `json:"sessionMaxViewerCount"` OverallMaxViewerCount int `json:"overallMaxViewerCount"` LastDisconnectTime time.Time `json:"lastDisconnectTime"` - - clients map[string]time.Time + lastConnectTime time.Time `json:"-"` + clients map[string]time.Time } func (s *Stats) Setup() { @@ -62,6 +62,17 @@ func (s *Stats) purgeStaleViewers() { } func (s *Stats) IsStreamConnected() bool { + if !s.streamConnected { + return false + } + + // Kind of a hack. It takes a handful of seconds between a RTMP connection and when HLS data is available. + // So account for that with an artificial buffer. + timeSinceLastConnected := time.Since(s.lastConnectTime).Seconds() + if timeSinceLastConnected < 10 { + return false + } + return s.streamConnected } @@ -96,6 +107,7 @@ func (s *Stats) ViewerDisconnected(clientID string) { func (s *Stats) StreamConnected() { s.streamConnected = true + s.lastConnectTime = time.Now() timeSinceDisconnect := time.Since(s.LastDisconnectTime).Minutes() if timeSinceDisconnect > 15 { diff --git a/webroot/js/app.js b/webroot/js/app.js index 835b9a2a0..8db4a5204 100644 --- a/webroot/js/app.js +++ b/webroot/js/app.js @@ -41,11 +41,25 @@ function setupApp() { } async function getStatus() { - let url = "https://goth.land/status"; + let url = "/status"; try { const response = await fetch(url); const status = await response.json(); // read response body and parse as JSON + + if (!app.isOnline && status.online) { + // The stream was offline, but now it's online. Force start of playback after an arbitrary + // delay to make sure the stream has actual data ready to go. + setTimeout(function () { + var player = videojs('video'); + player.pause() + player.src(player.src()); // Reload the same video + player.load(); + player.play(); + }, 3000) + + } + app.streamStatus = status.online ? "Stream is online." : "Stream is offline." @@ -53,6 +67,7 @@ async function getStatus() { app.viewerCount = status.viewerCount; app.sessionMaxViewerCount = status.sessionMaxViewerCount; app.overallMaxViewerCount = status.overallMaxViewerCount; + app.isOnline = status.online; } catch (e) { app.streamStatus = "Stream server is offline."