1 import { isSignupAllowed, isSignupAllowedForCurrentIP } from '@server/helpers/signup'
2 import { getServerCommit } from '@server/helpers/utils'
3 import { CONFIG, isEmailEnabled } from '@server/initializers/config'
4 import { CONSTRAINTS_FIELDS, DEFAULT_THEME_NAME, PEERTUBE_VERSION } from '@server/initializers/constants'
5 import { RegisteredExternalAuthConfig, RegisteredIdAndPassAuthConfig, ServerConfig } from '@shared/models'
6 import { Hooks } from './plugins/hooks'
7 import { PluginManager } from './plugins/plugin-manager'
8 import { getThemeOrDefault } from './plugins/theme-utils'
9 import { getEnabledResolutions } from './video-transcoding'
10 import { VideoTranscodingProfilesManager } from './video-transcoding-profiles'
12 let serverCommit: string
14 async function getServerConfig (ip?: string): Promise<ServerConfig> {
15 if (serverCommit === undefined) serverCommit = await getServerCommit()
17 const { allowed } = await Hooks.wrapPromiseFun(
22 'filter:api.user.signup.allowed.result'
25 const allowedForCurrentIP = isSignupAllowedForCurrentIP(ip)
26 const defaultTheme = getThemeOrDefault(CONFIG.THEME.DEFAULT, DEFAULT_THEME_NAME)
30 name: CONFIG.INSTANCE.NAME,
31 shortDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION,
32 isNSFW: CONFIG.INSTANCE.IS_NSFW,
33 defaultNSFWPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
34 defaultClientRoute: CONFIG.INSTANCE.DEFAULT_CLIENT_ROUTE,
36 javascript: CONFIG.INSTANCE.CUSTOMIZATIONS.JAVASCRIPT,
37 css: CONFIG.INSTANCE.CUSTOMIZATIONS.CSS
42 users: CONFIG.SEARCH.REMOTE_URI.USERS,
43 anonymous: CONFIG.SEARCH.REMOTE_URI.ANONYMOUS
46 enabled: CONFIG.SEARCH.SEARCH_INDEX.ENABLED,
47 url: CONFIG.SEARCH.SEARCH_INDEX.URL,
48 disableLocalSearch: CONFIG.SEARCH.SEARCH_INDEX.DISABLE_LOCAL_SEARCH,
49 isDefaultSearch: CONFIG.SEARCH.SEARCH_INDEX.IS_DEFAULT_SEARCH
53 registered: getRegisteredPlugins(),
54 registeredExternalAuths: getExternalAuthsPlugins(),
55 registeredIdAndPassAuths: getIdAndPassAuthPlugins()
58 registered: getRegisteredThemes(),
62 enabled: isEmailEnabled()
65 enabled: CONFIG.CONTACT_FORM.ENABLED
67 serverVersion: PEERTUBE_VERSION,
72 requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION
76 enabled: CONFIG.TRANSCODING.HLS.ENABLED
79 enabled: CONFIG.TRANSCODING.WEBTORRENT.ENABLED
81 enabledResolutions: getEnabledResolutions('vod'),
82 profile: CONFIG.TRANSCODING.PROFILE,
83 availableProfiles: VideoTranscodingProfilesManager.Instance.getAvailableProfiles('vod')
86 enabled: CONFIG.LIVE.ENABLED,
88 allowReplay: CONFIG.LIVE.ALLOW_REPLAY,
89 maxDuration: CONFIG.LIVE.MAX_DURATION,
90 maxInstanceLives: CONFIG.LIVE.MAX_INSTANCE_LIVES,
91 maxUserLives: CONFIG.LIVE.MAX_USER_LIVES,
94 enabled: CONFIG.LIVE.TRANSCODING.ENABLED,
95 enabledResolutions: getEnabledResolutions('live'),
96 profile: CONFIG.LIVE.TRANSCODING.PROFILE,
97 availableProfiles: VideoTranscodingProfilesManager.Instance.getAvailableProfiles('live')
101 port: CONFIG.LIVE.RTMP.PORT
107 enabled: CONFIG.IMPORT.VIDEOS.HTTP.ENABLED
110 enabled: CONFIG.IMPORT.VIDEOS.TORRENT.ENABLED
117 enabled: CONFIG.AUTO_BLACKLIST.VIDEOS.OF_USERS.ENABLED
124 max: CONSTRAINTS_FIELDS.ACTORS.IMAGE.FILE_SIZE.max
126 extensions: CONSTRAINTS_FIELDS.ACTORS.IMAGE.EXTNAME
132 max: CONSTRAINTS_FIELDS.ACTORS.IMAGE.FILE_SIZE.max
134 extensions: CONSTRAINTS_FIELDS.ACTORS.IMAGE.EXTNAME
139 extensions: CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME,
141 max: CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max
145 extensions: CONSTRAINTS_FIELDS.VIDEOS.EXTNAME
151 max: CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.FILE_SIZE.max
153 extensions: CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.EXTNAME
157 videoQuota: CONFIG.USER.VIDEO_QUOTA,
158 videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY
162 intervalDays: CONFIG.TRENDING.VIDEOS.INTERVAL_DAYS,
164 enabled: CONFIG.TRENDING.VIDEOS.ALGORITHMS.ENABLED,
165 default: CONFIG.TRENDING.VIDEOS.ALGORITHMS.DEFAULT
170 enabled: CONFIG.TRACKER.ENABLED
176 indexUrl: CONFIG.FOLLOWINGS.INSTANCE.AUTO_FOLLOW_INDEX.INDEX_URL
182 enabled: CONFIG.BROADCAST_MESSAGE.ENABLED,
183 message: CONFIG.BROADCAST_MESSAGE.MESSAGE,
184 level: CONFIG.BROADCAST_MESSAGE.LEVEL,
185 dismissable: CONFIG.BROADCAST_MESSAGE.DISMISSABLE
190 function getRegisteredThemes () {
191 return PluginManager.Instance.getRegisteredThemes()
195 description: t.description,
197 clientScripts: t.clientScripts
201 function getRegisteredPlugins () {
202 return PluginManager.Instance.getRegisteredPlugins()
206 description: p.description,
207 clientScripts: p.clientScripts
211 // ---------------------------------------------------------------------------
219 // ---------------------------------------------------------------------------
221 function getIdAndPassAuthPlugins () {
222 const result: RegisteredIdAndPassAuthConfig[] = []
224 for (const p of PluginManager.Instance.getIdAndPassAuths()) {
225 for (const auth of p.idAndPassAuths) {
230 authName: auth.authName,
231 weight: auth.getWeight()
239 function getExternalAuthsPlugins () {
240 const result: RegisteredExternalAuthConfig[] = []
242 for (const p of PluginManager.Instance.getExternalAuths()) {
243 for (const auth of p.externalAuths) {
248 authName: auth.authName,
249 authDisplayName: auth.authDisplayName()