You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.3 KiB
84 lines
2.3 KiB
package controllers |
|
|
|
import ( |
|
"net/http" |
|
"strings" |
|
|
|
"github.com/owncast/owncast/config" |
|
"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) { |
|
if !config.EnableReplayFeatures { |
|
w.WriteHeader(http.StatusNotFound) |
|
return |
|
} |
|
|
|
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 |
|
} |
|
}
|
|
|