mirror of
https://github.com/owncast/owncast.git
synced 2024-11-29 03:29:03 +03:00
79 lines
2.2 KiB
Go
79 lines
2.2 KiB
Go
|
package controllers
|
||
|
|
||
|
import (
|
||
|
"net/http"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/owncast/owncast/replays"
|
||
|
log "github.com/sirupsen/logrus"
|
||
|
)
|
||
|
|
||
|
// GetReplays will return a list of all available replays.
|
||
|
func GetReplays(w http.ResponseWriter, r *http.Request) {
|
||
|
streams, err := replays.GetStreams()
|
||
|
if err != nil {
|
||
|
log.Errorln(err)
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
WriteResponse(w, streams)
|
||
|
}
|
||
|
|
||
|
// GetReplay will return a playable content for a given stream Id.
|
||
|
func GetReplay(w http.ResponseWriter, r *http.Request) {
|
||
|
pathComponents := strings.Split(r.URL.Path, "/")
|
||
|
if len(pathComponents) == 3 {
|
||
|
// Return the master playlist for the requested stream
|
||
|
streamId := pathComponents[2]
|
||
|
getReplayMasterPlaylist(streamId, w)
|
||
|
return
|
||
|
} else if len(pathComponents) == 4 {
|
||
|
// Return the media playlist for the requested stream and output config
|
||
|
streamId := pathComponents[2]
|
||
|
outputConfigId := pathComponents[3]
|
||
|
getReplayMediaPlaylist(streamId, outputConfigId, w)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
BadRequestHandler(w, nil)
|
||
|
}
|
||
|
|
||
|
// getReplayMasterPlaylist will return a complete replay of a stream as a HLS playlist.
|
||
|
// /api/replay/{streamId}.
|
||
|
func getReplayMasterPlaylist(streamId string, w http.ResponseWriter) {
|
||
|
playlistGenerator := replays.NewPlaylistGenerator()
|
||
|
playlist, err := playlistGenerator.GenerateMasterPlaylistForStream(streamId)
|
||
|
if err != nil {
|
||
|
log.Println(err)
|
||
|
}
|
||
|
|
||
|
if playlist == nil {
|
||
|
w.WriteHeader(http.StatusNotFound)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
w.Header().Add("Content-Type", "application/x-mpegURL")
|
||
|
if _, err := w.Write(playlist.Encode().Bytes()); err != nil {
|
||
|
log.Errorln(err)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// getReplayMediaPlaylist will return a media playlist for a given stream.
|
||
|
// /api/replay/{streamId}/{outputConfigId}.
|
||
|
func getReplayMediaPlaylist(streamId, outputConfigId string, w http.ResponseWriter) {
|
||
|
playlistGenerator := replays.NewPlaylistGenerator()
|
||
|
playlist, err := playlistGenerator.GenerateMediaPlaylistForStreamAndConfiguration(streamId, outputConfigId)
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
w.Header().Add("Content-Type", "application/x-mpegURL")
|
||
|
if _, err := w.Write(playlist.Encode().Bytes()); err != nil {
|
||
|
log.Errorln(err)
|
||
|
return
|
||
|
}
|
||
|
}
|