]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/config.ts
Move transcoding files in their own directory
[github/Chocobozzz/PeerTube.git] / server / lib / config.ts
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 { VideoTranscodingProfilesManager } from './transcoding/video-transcoding-profiles'
10
11 let serverCommit: string
12
13 async function getServerConfig (ip?: string): Promise<ServerConfig> {
14 if (serverCommit === undefined) serverCommit = await getServerCommit()
15
16 const { allowed } = await Hooks.wrapPromiseFun(
17 isSignupAllowed,
18 {
19 ip
20 },
21 'filter:api.user.signup.allowed.result'
22 )
23
24 const allowedForCurrentIP = isSignupAllowedForCurrentIP(ip)
25 const defaultTheme = getThemeOrDefault(CONFIG.THEME.DEFAULT, DEFAULT_THEME_NAME)
26
27 return {
28 instance: {
29 name: CONFIG.INSTANCE.NAME,
30 shortDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION,
31 isNSFW: CONFIG.INSTANCE.IS_NSFW,
32 defaultNSFWPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
33 defaultClientRoute: CONFIG.INSTANCE.DEFAULT_CLIENT_ROUTE,
34 customizations: {
35 javascript: CONFIG.INSTANCE.CUSTOMIZATIONS.JAVASCRIPT,
36 css: CONFIG.INSTANCE.CUSTOMIZATIONS.CSS
37 }
38 },
39 search: {
40 remoteUri: {
41 users: CONFIG.SEARCH.REMOTE_URI.USERS,
42 anonymous: CONFIG.SEARCH.REMOTE_URI.ANONYMOUS
43 },
44 searchIndex: {
45 enabled: CONFIG.SEARCH.SEARCH_INDEX.ENABLED,
46 url: CONFIG.SEARCH.SEARCH_INDEX.URL,
47 disableLocalSearch: CONFIG.SEARCH.SEARCH_INDEX.DISABLE_LOCAL_SEARCH,
48 isDefaultSearch: CONFIG.SEARCH.SEARCH_INDEX.IS_DEFAULT_SEARCH
49 }
50 },
51 plugin: {
52 registered: getRegisteredPlugins(),
53 registeredExternalAuths: getExternalAuthsPlugins(),
54 registeredIdAndPassAuths: getIdAndPassAuthPlugins()
55 },
56 theme: {
57 registered: getRegisteredThemes(),
58 default: defaultTheme
59 },
60 email: {
61 enabled: isEmailEnabled()
62 },
63 contactForm: {
64 enabled: CONFIG.CONTACT_FORM.ENABLED
65 },
66 serverVersion: PEERTUBE_VERSION,
67 serverCommit,
68 signup: {
69 allowed,
70 allowedForCurrentIP,
71 requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION
72 },
73 transcoding: {
74 hls: {
75 enabled: CONFIG.TRANSCODING.HLS.ENABLED
76 },
77 webtorrent: {
78 enabled: CONFIG.TRANSCODING.WEBTORRENT.ENABLED
79 },
80 enabledResolutions: getEnabledResolutions('vod'),
81 profile: CONFIG.TRANSCODING.PROFILE,
82 availableProfiles: VideoTranscodingProfilesManager.Instance.getAvailableProfiles('vod')
83 },
84 live: {
85 enabled: CONFIG.LIVE.ENABLED,
86
87 allowReplay: CONFIG.LIVE.ALLOW_REPLAY,
88 maxDuration: CONFIG.LIVE.MAX_DURATION,
89 maxInstanceLives: CONFIG.LIVE.MAX_INSTANCE_LIVES,
90 maxUserLives: CONFIG.LIVE.MAX_USER_LIVES,
91
92 transcoding: {
93 enabled: CONFIG.LIVE.TRANSCODING.ENABLED,
94 enabledResolutions: getEnabledResolutions('live'),
95 profile: CONFIG.LIVE.TRANSCODING.PROFILE,
96 availableProfiles: VideoTranscodingProfilesManager.Instance.getAvailableProfiles('live')
97 },
98
99 rtmp: {
100 port: CONFIG.LIVE.RTMP.PORT
101 }
102 },
103 import: {
104 videos: {
105 http: {
106 enabled: CONFIG.IMPORT.VIDEOS.HTTP.ENABLED
107 },
108 torrent: {
109 enabled: CONFIG.IMPORT.VIDEOS.TORRENT.ENABLED
110 }
111 }
112 },
113 autoBlacklist: {
114 videos: {
115 ofUsers: {
116 enabled: CONFIG.AUTO_BLACKLIST.VIDEOS.OF_USERS.ENABLED
117 }
118 }
119 },
120 avatar: {
121 file: {
122 size: {
123 max: CONSTRAINTS_FIELDS.ACTORS.IMAGE.FILE_SIZE.max
124 },
125 extensions: CONSTRAINTS_FIELDS.ACTORS.IMAGE.EXTNAME
126 }
127 },
128 banner: {
129 file: {
130 size: {
131 max: CONSTRAINTS_FIELDS.ACTORS.IMAGE.FILE_SIZE.max
132 },
133 extensions: CONSTRAINTS_FIELDS.ACTORS.IMAGE.EXTNAME
134 }
135 },
136 video: {
137 image: {
138 extensions: CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME,
139 size: {
140 max: CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max
141 }
142 },
143 file: {
144 extensions: CONSTRAINTS_FIELDS.VIDEOS.EXTNAME
145 }
146 },
147 videoCaption: {
148 file: {
149 size: {
150 max: CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.FILE_SIZE.max
151 },
152 extensions: CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.EXTNAME
153 }
154 },
155 user: {
156 videoQuota: CONFIG.USER.VIDEO_QUOTA,
157 videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY
158 },
159 trending: {
160 videos: {
161 intervalDays: CONFIG.TRENDING.VIDEOS.INTERVAL_DAYS,
162 algorithms: {
163 enabled: CONFIG.TRENDING.VIDEOS.ALGORITHMS.ENABLED,
164 default: CONFIG.TRENDING.VIDEOS.ALGORITHMS.DEFAULT
165 }
166 }
167 },
168 tracker: {
169 enabled: CONFIG.TRACKER.ENABLED
170 },
171
172 followings: {
173 instance: {
174 autoFollowIndex: {
175 indexUrl: CONFIG.FOLLOWINGS.INSTANCE.AUTO_FOLLOW_INDEX.INDEX_URL
176 }
177 }
178 },
179
180 broadcastMessage: {
181 enabled: CONFIG.BROADCAST_MESSAGE.ENABLED,
182 message: CONFIG.BROADCAST_MESSAGE.MESSAGE,
183 level: CONFIG.BROADCAST_MESSAGE.LEVEL,
184 dismissable: CONFIG.BROADCAST_MESSAGE.DISMISSABLE
185 }
186 }
187 }
188
189 function getRegisteredThemes () {
190 return PluginManager.Instance.getRegisteredThemes()
191 .map(t => ({
192 name: t.name,
193 version: t.version,
194 description: t.description,
195 css: t.css,
196 clientScripts: t.clientScripts
197 }))
198 }
199
200 function getRegisteredPlugins () {
201 return PluginManager.Instance.getRegisteredPlugins()
202 .map(p => ({
203 name: p.name,
204 version: p.version,
205 description: p.description,
206 clientScripts: p.clientScripts
207 }))
208 }
209
210 function getEnabledResolutions (type: 'vod' | 'live') {
211 const transcoding = type === 'vod'
212 ? CONFIG.TRANSCODING
213 : CONFIG.LIVE.TRANSCODING
214
215 return Object.keys(transcoding.RESOLUTIONS)
216 .filter(key => transcoding.ENABLED && transcoding.RESOLUTIONS[key] === true)
217 .map(r => parseInt(r, 10))
218 }
219
220 // ---------------------------------------------------------------------------
221
222 export {
223 getServerConfig,
224 getRegisteredThemes,
225 getEnabledResolutions,
226 getRegisteredPlugins
227 }
228
229 // ---------------------------------------------------------------------------
230
231 function getIdAndPassAuthPlugins () {
232 const result: RegisteredIdAndPassAuthConfig[] = []
233
234 for (const p of PluginManager.Instance.getIdAndPassAuths()) {
235 for (const auth of p.idAndPassAuths) {
236 result.push({
237 npmName: p.npmName,
238 name: p.name,
239 version: p.version,
240 authName: auth.authName,
241 weight: auth.getWeight()
242 })
243 }
244 }
245
246 return result
247 }
248
249 function getExternalAuthsPlugins () {
250 const result: RegisteredExternalAuthConfig[] = []
251
252 for (const p of PluginManager.Instance.getExternalAuths()) {
253 for (const auth of p.externalAuths) {
254 result.push({
255 npmName: p.npmName,
256 name: p.name,
257 version: p.version,
258 authName: auth.authName,
259 authDisplayName: auth.authDisplayName()
260 })
261 }
262 }
263
264 return result
265 }