0

Auto-restart playback when the stream comes back online

This commit is contained in:
Gabe Kangas 2020-06-15 17:23:44 -07:00
parent f900539481
commit a90d98ff1b
2 changed files with 30 additions and 3 deletions

View File

@ -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 {

View File

@ -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."