summaryrefslogtreecommitdiff
path: root/controllers/admin/serverConfig.go
blob: 10ecaef47befac132053291ae4a0ebd86cd3ee53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package admin

import (
	"encoding/json"
	"net/http"

	"github.com/owncast/owncast/config"
	"github.com/owncast/owncast/core/data"
	"github.com/owncast/owncast/core/transcoder"
	"github.com/owncast/owncast/models"
	"github.com/owncast/owncast/router/middleware"
	"github.com/owncast/owncast/utils"
	log "github.com/sirupsen/logrus"
)

// GetServerConfig gets the config details of the server.
func GetServerConfig(w http.ResponseWriter, r *http.Request) {
	ffmpeg := utils.ValidatedFfmpegPath(data.GetFfMpegPath())
	usernameBlocklist := data.GetForbiddenUsernameList()
	usernameSuggestions := data.GetSuggestedUsernamesList()

	videoQualityVariants := make([]models.StreamOutputVariant, 0)
	for _, variant := range data.GetStreamOutputVariants() {
		videoQualityVariants = append(videoQualityVariants, models.StreamOutputVariant{
			Name:               variant.GetName(),
			IsAudioPassthrough: variant.GetIsAudioPassthrough(),
			IsVideoPassthrough: variant.IsVideoPassthrough,
			Framerate:          variant.GetFramerate(),
			VideoBitrate:       variant.VideoBitrate,
			AudioBitrate:       variant.AudioBitrate,
			CPUUsageLevel:      variant.CPUUsageLevel,
			ScaledWidth:        variant.ScaledWidth,
			ScaledHeight:       variant.ScaledHeight,
		})
	}
	response := serverConfigAdminResponse{
		InstanceDetails: webConfigResponse{
			Name:             data.GetServerName(),
			Summary:          data.GetServerSummary(),
			Tags:             data.GetServerMetadataTags(),
			ExtraPageContent: data.GetExtraPageBodyContent(),
			StreamTitle:      data.GetStreamTitle(),
			WelcomeMessage:   data.GetServerWelcomeMessage(),
			Logo:             data.GetLogoPath(),
			SocialHandles:    data.GetSocialHandles(),
			NSFW:             data.GetNSFW(),
			CustomStyles:     data.GetCustomStyles(),
		},
		FFmpegPath:     ffmpeg,
		StreamKey:      data.GetStreamKey(),
		WebServerPort:  config.WebServerPort,
		WebServerIP:    config.WebServerIP,
		RTMPServerPort: data.GetRTMPPortNumber(),
		ChatDisabled:   data.GetChatDisabled(),
		VideoSettings: videoSettings{
			VideoQualityVariants: videoQualityVariants,
			LatencyLevel:         data.GetStreamLatencyLevel().Level,
		},
		YP: yp{
			Enabled:     data.GetDirectoryEnabled(),
			InstanceURL: data.GetServerURL(),
		},
		S3:                 data.GetS3Config(),
		ExternalActions:    data.GetExternalActions(),
		SupportedCodecs:    transcoder.GetCodecs(ffmpeg),
		VideoCodec:         data.GetVideoCodec(),
		ForbiddenUsernames: usernameBlocklist,
		SuggestedUsernames: usernameSuggestions,
		Federation: federationConfigResponse{
			Enabled:        data.GetFederationEnabled(),
			IsPrivate:      data.GetFederationIsPrivate(),
			Username:       data.GetFederationUsername(),
			GoLiveMessage:  data.GetFederationGoLiveMessage(),
			ShowEngagement: data.GetFederationShowEngagement(),
			BlockedDomains: data.GetBlockedFederatedDomains(),
		},
		Notifications: notificationsConfigResponse{
			Discord: data.GetDiscordConfig(),
			Twilio:  data.GetTwilioConfig(),
			Browser: data.GetBrowserPushConfig(),
		},
	}

	w.Header().Set("Content-Type", "application/json")
	middleware.DisableCache(w)

	if err := json.NewEncoder(w).Encode(response); err != nil {
		log.Errorln(err)
	}
}

type serverConfigAdminResponse struct {
	InstanceDetails    webConfigResponse           `json:"instanceDetails"`
	FFmpegPath         string                      `json:"ffmpegPath"`
	StreamKey          string                      `json:"streamKey"`
	WebServerPort      int                         `json:"webServerPort"`
	WebServerIP        string                      `json:"webServerIP"`
	RTMPServerPort     int                         `json:"rtmpServerPort"`
	S3                 models.S3                   `json:"s3"`
	VideoSettings      videoSettings               `json:"videoSettings"`
	YP                 yp                          `json:"yp"`
	ChatDisabled       bool                        `json:"chatDisabled"`
	ExternalActions    []models.ExternalAction     `json:"externalActions"`
	SupportedCodecs    []string                    `json:"supportedCodecs"`
	VideoCodec         string                      `json:"videoCodec"`
	ForbiddenUsernames []string                    `json:"forbiddenUsernames"`
	Federation         federationConfigResponse    `json:"federation"`
	SuggestedUsernames []string                    `json:"suggestedUsernames"`
	Notifications      notificationsConfigResponse `json:"notifications"`
}

type videoSettings struct {
	VideoQualityVariants []models.StreamOutputVariant `json:"videoQualityVariants"`
	LatencyLevel         int                          `json:"latencyLevel"`
}

type webConfigResponse struct {
	Name             string                      `json:"name"`
	Summary          string                      `json:"summary"`
	WelcomeMessage   string                      `json:"welcomeMessage"`
	Logo             string                      `json:"logo"`
	Tags             []string                    `json:"tags"`
	Version          string                      `json:"version"`
	NSFW             bool                        `json:"nsfw"`
	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"`
	Notifications    notificationsConfigResponse `json:"notifications"`
}

type yp struct {
	Enabled      bool   `json:"enabled"`
	InstanceURL  string `json:"instanceUrl"` // The public URL the directory should link to
	YPServiceURL string `json:"-"`           // The base URL to the YP API to register with (optional)
}

type federationConfigResponse struct {
	Enabled        bool     `json:"enabled"`
	IsPrivate      bool     `json:"isPrivate"`
	Username       string   `json:"username"`
	GoLiveMessage  string   `json:"goLiveMessage"`
	ShowEngagement bool     `json:"showEngagement"`
	BlockedDomains []string `json:"blockedDomains"`
}

type notificationsConfigResponse struct {
	Browser models.BrowserNotificationConfiguration `json:"browser"`
	Twilio  models.TwilioConfiguration              `json:"twilio"`
	Discord models.DiscordConfiguration             `json:"discord"`
}