diff --git a/controllers/admin/config.go b/controllers/admin/config.go index 51b9bc892..f22869ddd 100644 --- a/controllers/admin/config.go +++ b/controllers/admin/config.go @@ -528,6 +528,17 @@ func SetExternalActions(w http.ResponseWriter, r *http.Request) { controllers.WriteSimpleResponse(w, true, "external actions update") } +// SetCustomStyles will set the CSS string we insert into the page. +func SetCustomStyles(w http.ResponseWriter, r *http.Request) { + customStyles, success := getValueFromRequest(w, r) + if !success { + controllers.WriteSimpleResponse(w, false, "unable to update custom styles") + return + } + + data.SetCustomStyles(customStyles.Value.(string)) +} + func requirePOST(w http.ResponseWriter, r *http.Request) bool { if r.Method != controllers.POST { controllers.WriteSimpleResponse(w, false, r.Method+" not supported") diff --git a/controllers/admin/serverConfig.go b/controllers/admin/serverConfig.go index 8ba2d8ebd..042d41a39 100644 --- a/controllers/admin/serverConfig.go +++ b/controllers/admin/serverConfig.go @@ -39,6 +39,7 @@ func GetServerConfig(w http.ResponseWriter, r *http.Request) { Logo: data.GetLogoPath(), SocialHandles: data.GetSocialHandles(), NSFW: data.GetNSFW(), + CustomStyles: data.GetCustomStyles(), }, FFmpegPath: utils.ValidatedFfmpegPath(data.GetFfMpegPath()), StreamKey: data.GetStreamKey(), @@ -94,6 +95,7 @@ type webConfigResponse struct { ExtraPageContent string `json:"extraPageContent"` StreamTitle string `json:"streamTitle"` // What's going on with the current stream SocialHandles []models.SocialHandle `json:"socialHandles"` + CustomStyles string `json:"customStyles"` } type yp struct { diff --git a/controllers/config.go b/controllers/config.go index 723681b7f..dfde8285a 100644 --- a/controllers/config.go +++ b/controllers/config.go @@ -23,6 +23,7 @@ type webConfigResponse struct { SocialHandles []models.SocialHandle `json:"socialHandles"` ChatDisabled bool `json:"chatDisabled"` ExternalActions []models.ExternalAction `json:"externalActions"` + CustomStyles string `json:"customStyles"` } // GetWebConfig gets the status of the server. @@ -52,6 +53,7 @@ func GetWebConfig(w http.ResponseWriter, r *http.Request) { SocialHandles: socialHandles, ChatDisabled: data.GetChatDisabled(), ExternalActions: data.GetExternalActions(), + CustomStyles: data.GetCustomStyles(), } if err := json.NewEncoder(w).Encode(configuration); err != nil { diff --git a/core/data/config.go b/core/data/config.go index 134336410..7e12dd85a 100644 --- a/core/data/config.go +++ b/core/data/config.go @@ -38,6 +38,7 @@ const videoLatencyLevel = "video_latency_level" const videoStreamOutputVariantsKey = "video_stream_output_variants" const chatDisabledKey = "chat_disabled" const externalActionsKey = "external_actions" +const customStylesKey = "custom_styles" // GetExtraPageBodyContent will return the user-supplied body content. func GetExtraPageBodyContent() string { @@ -465,6 +466,21 @@ func SetExternalActions(actions []models.ExternalAction) error { return _datastore.Save(configEntry) } +// SetCustomStyles will save a string with CSS to insert into the page. +func SetCustomStyles(styles string) error { + return _datastore.SetString(customStylesKey, styles) +} + +// GetCustomStyles will return a string with CSS to insert into the page. +func GetCustomStyles() string { + style, err := _datastore.GetString(customStylesKey) + if err != nil { + return "" + } + + return style +} + // VerifySettings will perform a sanity check for specific settings values. func VerifySettings() error { if GetStreamKey() == "" { diff --git a/router/router.go b/router/router.go index 3dbcb8b1a..9bd9be260 100644 --- a/router/router.go +++ b/router/router.go @@ -196,6 +196,9 @@ func Start() error { // set external action links http.HandleFunc("/api/admin/config/externalactions", middleware.RequireAdminAuth(admin.SetExternalActions)) + // set custom style css + http.HandleFunc("api/admin/config/customstyles", middleware.RequireAdminAuth(admin.SetCustomStyles)) + port := config.WebServerPort log.Infof("Web server is listening on port %d.", port)