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 { HTMLServerConfig, 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 { VideoTranscodingProfilesManager } from './transcoding/video-transcoding-profiles'
11 async function getServerConfig (ip?: string): Promise<ServerConfig> {
12 const { allowed } = await Hooks.wrapPromiseFun(
17 'filter:api.user.signup.allowed.result'
20 const allowedForCurrentIP = isSignupAllowedForCurrentIP(ip)
25 requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION
28 const htmlConfig = await getHTMLServerConfig()
30 return { ...htmlConfig, signup }
33 // Config injected in HTML
34 let serverCommit: string
35 async function getHTMLServerConfig (): Promise<HTMLServerConfig> {
36 if (serverCommit === undefined) serverCommit = await getServerCommit()
38 const defaultTheme = getThemeOrDefault(CONFIG.THEME.DEFAULT, DEFAULT_THEME_NAME)
42 name: CONFIG.INSTANCE.NAME,
43 shortDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION,
44 isNSFW: CONFIG.INSTANCE.IS_NSFW,
45 defaultNSFWPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
46 defaultClientRoute: CONFIG.INSTANCE.DEFAULT_CLIENT_ROUTE,
48 javascript: CONFIG.INSTANCE.CUSTOMIZATIONS.JAVASCRIPT,
49 css: CONFIG.INSTANCE.CUSTOMIZATIONS.CSS
54 users: CONFIG.SEARCH.REMOTE_URI.USERS,
55 anonymous: CONFIG.SEARCH.REMOTE_URI.ANONYMOUS
58 enabled: CONFIG.SEARCH.SEARCH_INDEX.ENABLED,
59 url: CONFIG.SEARCH.SEARCH_INDEX.URL,
60 disableLocalSearch: CONFIG.SEARCH.SEARCH_INDEX.DISABLE_LOCAL_SEARCH,
61 isDefaultSearch: CONFIG.SEARCH.SEARCH_INDEX.IS_DEFAULT_SEARCH
65 registered: getRegisteredPlugins(),
66 registeredExternalAuths: getExternalAuthsPlugins(),
67 registeredIdAndPassAuths: getIdAndPassAuthPlugins()
70 registered: getRegisteredThemes(),
74 enabled: isEmailEnabled()
77 enabled: CONFIG.CONTACT_FORM.ENABLED
79 serverVersion: PEERTUBE_VERSION,
83 enabled: CONFIG.TRANSCODING.HLS.ENABLED
86 enabled: CONFIG.TRANSCODING.WEBTORRENT.ENABLED
88 enabledResolutions: getEnabledResolutions('vod'),
89 profile: CONFIG.TRANSCODING.PROFILE,
90 availableProfiles: VideoTranscodingProfilesManager.Instance.getAvailableProfiles('vod')
93 enabled: CONFIG.LIVE.ENABLED,
95 allowReplay: CONFIG.LIVE.ALLOW_REPLAY,
96 maxDuration: CONFIG.LIVE.MAX_DURATION,
97 maxInstanceLives: CONFIG.LIVE.MAX_INSTANCE_LIVES,
98 maxUserLives: CONFIG.LIVE.MAX_USER_LIVES,
101 enabled: CONFIG.LIVE.TRANSCODING.ENABLED,
102 enabledResolutions: getEnabledResolutions('live'),
103 profile: CONFIG.LIVE.TRANSCODING.PROFILE,
104 availableProfiles: VideoTranscodingProfilesManager.Instance.getAvailableProfiles('live')
108 port: CONFIG.LIVE.RTMP.PORT
114 enabled: CONFIG.IMPORT.VIDEOS.HTTP.ENABLED
117 enabled: CONFIG.IMPORT.VIDEOS.TORRENT.ENABLED
124 enabled: CONFIG.AUTO_BLACKLIST.VIDEOS.OF_USERS.ENABLED
131 max: CONSTRAINTS_FIELDS.ACTORS.IMAGE.FILE_SIZE.max
133 extensions: CONSTRAINTS_FIELDS.ACTORS.IMAGE.EXTNAME
139 max: CONSTRAINTS_FIELDS.ACTORS.IMAGE.FILE_SIZE.max
141 extensions: CONSTRAINTS_FIELDS.ACTORS.IMAGE.EXTNAME
146 extensions: CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME,
148 max: CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max
152 extensions: CONSTRAINTS_FIELDS.VIDEOS.EXTNAME
158 max: CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.FILE_SIZE.max
160 extensions: CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.EXTNAME
164 videoQuota: CONFIG.USER.VIDEO_QUOTA,
165 videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY
169 intervalDays: CONFIG.TRENDING.VIDEOS.INTERVAL_DAYS,
171 enabled: CONFIG.TRENDING.VIDEOS.ALGORITHMS.ENABLED,
172 default: CONFIG.TRENDING.VIDEOS.ALGORITHMS.DEFAULT
177 enabled: CONFIG.TRACKER.ENABLED
183 indexUrl: CONFIG.FOLLOWINGS.INSTANCE.AUTO_FOLLOW_INDEX.INDEX_URL
189 enabled: CONFIG.BROADCAST_MESSAGE.ENABLED,
190 message: CONFIG.BROADCAST_MESSAGE.MESSAGE,
191 level: CONFIG.BROADCAST_MESSAGE.LEVEL,
192 dismissable: CONFIG.BROADCAST_MESSAGE.DISMISSABLE
197 function getRegisteredThemes () {
198 return PluginManager.Instance.getRegisteredThemes()
202 description: t.description,
204 clientScripts: t.clientScripts
208 function getRegisteredPlugins () {
209 return PluginManager.Instance.getRegisteredPlugins()
213 description: p.description,
214 clientScripts: p.clientScripts
218 function getEnabledResolutions (type: 'vod' | 'live') {
219 const transcoding = type === 'vod'
221 : CONFIG.LIVE.TRANSCODING
223 return Object.keys(transcoding.RESOLUTIONS)
224 .filter(key => transcoding.ENABLED && transcoding.RESOLUTIONS[key] === true)
225 .map(r => parseInt(r, 10))
228 // ---------------------------------------------------------------------------
233 getEnabledResolutions,
234 getRegisteredPlugins,
238 // ---------------------------------------------------------------------------
240 function getIdAndPassAuthPlugins () {
241 const result: RegisteredIdAndPassAuthConfig[] = []
243 for (const p of PluginManager.Instance.getIdAndPassAuths()) {
244 for (const auth of p.idAndPassAuths) {
249 authName: auth.authName,
250 weight: auth.getWeight()
258 function getExternalAuthsPlugins () {
259 const result: RegisteredExternalAuthConfig[] = []
261 for (const p of PluginManager.Instance.getExternalAuths()) {
262 for (const auth of p.externalAuths) {
267 authName: auth.authName,
268 authDisplayName: auth.authDisplayName()