From fff911010cdb7a831c42267c79ca178e9ac5f7fe Mon Sep 17 00:00:00 2001 From: Gabe Kangas Date: Fri, 17 Jul 2020 18:27:00 -0700 Subject: [PATCH] Centralize default values into an instance of config. For #64 --- config/config.go | 57 +++++++++++++++++------------------- config/defaults.go | 40 +++++++++++++++++++++++++ doc/config-example-full.yaml | 3 +- 3 files changed, 69 insertions(+), 31 deletions(-) create mode 100644 config/defaults.go diff --git a/config/config.go b/config/config.go index af3747e21..d619d5e3a 100644 --- a/config/config.go +++ b/config/config.go @@ -3,8 +3,6 @@ package config import ( "errors" "io/ioutil" - "os/exec" - "strings" "github.com/gabek/owncast/utils" log "github.com/sirupsen/logrus" @@ -13,6 +11,7 @@ import ( //Config contains a reference to the configuration var Config *config +var _default config type config struct { ChatDatabaseFilePath string `yaml:"chatDatabaseFile"` @@ -137,32 +136,12 @@ func (c *config) verifySettings() error { return nil } -func (c *config) GetFFMpegPath() string { - if c.FFMpegPath != "" { - return c.FFMpegPath - } - - cmd := exec.Command("which", "ffmpeg") - out, err := cmd.CombinedOutput() - if err != nil { - log.Panicln("Unable to determine path to ffmpeg. Please specify it in the config file.") - } - - path := strings.TrimSpace(string(out)) - - // Memoize it for future access - c.FFMpegPath = path - - return path -} - func (c *config) GetVideoSegmentSecondsLength() int { if c.VideoSettings.ChunkLengthInSeconds != 0 { return c.VideoSettings.ChunkLengthInSeconds } - // Default - return 4 + return _default.GetVideoSegmentSecondsLength() } func (c *config) GetPublicHLSSavePath() string { @@ -170,7 +149,7 @@ func (c *config) GetPublicHLSSavePath() string { return c.PublicHLSPath } - return "webroot/hls" + return _default.PublicHLSPath } func (c *config) GetPrivateHLSSavePath() string { @@ -178,7 +157,7 @@ func (c *config) GetPrivateHLSSavePath() string { return c.PrivateHLSPath } - return "hls" + return _default.PrivateHLSPath } func (c *config) GetPublicWebServerPort() int { @@ -186,8 +165,7 @@ func (c *config) GetPublicWebServerPort() int { return c.WebServerPort } - // Default web server port - return 8080 + return _default.WebServerPort } func (c *config) GetMaxNumberOfReferencedSegmentsInPlaylist() int { @@ -195,7 +173,7 @@ func (c *config) GetMaxNumberOfReferencedSegmentsInPlaylist() int { return c.Files.MaxNumberInPlaylist } - return 20 + return _default.GetMaxNumberOfReferencedSegmentsInPlaylist() } func (c *config) GetOfflineContentPath() string { @@ -204,12 +182,29 @@ func (c *config) GetOfflineContentPath() string { } // This is relative to the webroot, not the project root. - return "static/offline.m4v" + return _default.VideoSettings.OfflineContent +} + +func (c *config) GetFFMpegPath() string { + if c.FFMpegPath != "" { + return c.FFMpegPath + } + + return _default.FFMpegPath +} + +func (c *config) GetVideoStreamQualities() []StreamQuality { + if len(c.VideoSettings.StreamQualities) > 0 { + return c.VideoSettings.StreamQualities + } + + return _default.VideoSettings.StreamQualities } //Load tries to load the configuration file func Load(filePath string, versionInfo string) error { Config = new(config) + _default = getDefaults() if err := Config.load(filePath); err != nil { return err @@ -220,8 +215,10 @@ func Load(filePath string, versionInfo string) error { // Defaults // This is relative to the webroot, not the project root. + // Has to be set here instead of pulled from a getter + // since it's serialized to JSON. if Config.InstanceDetails.ExtraInfoFile == "" { - Config.InstanceDetails.ExtraInfoFile = "/static/content.md" + Config.InstanceDetails.ExtraInfoFile = _default.InstanceDetails.ExtraInfoFile } return Config.verifySettings() diff --git a/config/defaults.go b/config/defaults.go new file mode 100644 index 000000000..ded829273 --- /dev/null +++ b/config/defaults.go @@ -0,0 +1,40 @@ +package config + +import ( + "log" + "os/exec" + "strings" +) + +func getDefaults() config { + defaults := config{} + defaults.WebServerPort = 8080 + defaults.FFMpegPath = getDefaultFFMpegPath() + defaults.VideoSettings.ChunkLengthInSeconds = 4 + defaults.Files.MaxNumberInPlaylist = 5 + defaults.PublicHLSPath = "webroot/hls" + defaults.PrivateHLSPath = "hls" + defaults.VideoSettings.OfflineContent = "static/offline.m4v" + defaults.InstanceDetails.ExtraInfoFile = "/static/content.md" + + defaultQuality := StreamQuality{ + IsAudioPassthrough: true, + VideoBitrate: 1200, + EncoderPreset: "veryfast", + } + defaults.VideoSettings.StreamQualities = []StreamQuality{defaultQuality} + + return defaults +} + +func getDefaultFFMpegPath() string { + cmd := exec.Command("which", "ffmpeg") + out, err := cmd.CombinedOutput() + if err != nil { + log.Panicln("Unable to determine path to ffmpeg. Please specify it in the config file.") + } + + path := strings.TrimSpace(string(out)) + + return path +} diff --git a/doc/config-example-full.yaml b/doc/config-example-full.yaml index ac7bca6dc..9edcaf821 100644 --- a/doc/config-example-full.yaml +++ b/doc/config-example-full.yaml @@ -55,7 +55,8 @@ videoSettings: audioPassthrough: true # The slower the preset the higher quality the video is. # Select a preset from https://trac.ffmpeg.org/wiki/Encode/H.264 - encoderPreset: superfast + # "superfast" and "ultrafast" are generally not recommended since they look bad. + encoderPreset: veryfast - medium: videoBitrate: 800