]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/initializers/constants.ts
Fix spelling (#126)
[github/Chocobozzz/PeerTube.git] / server / initializers / constants.ts
CommitLineData
4d4e5cd4 1import * as config from 'config'
65fcc311 2import { join } from 'path'
e861452f 3
e02643f3 4// Do not use barrels, remain constants as independent as possible
1840c2f7 5import { root, isTestInstance } from '../helpers/core-utils'
e02643f3 6
ee9e7b61 7import {
ee9e7b61
C
8 VideoRateType,
9 RequestEndpoint,
10 RequestVideoEventType,
11 RequestVideoQaduType,
72c7248b 12 RemoteVideoRequestType,
ecb455b6 13 JobState
ee9e7b61 14} from '../../shared/models'
fd45e8f4 15import { VideoPrivacy } from '../../shared/models/videos/video-privacy.enum'
ee9e7b61 16
9f6bae3a
C
17// ---------------------------------------------------------------------------
18
fd45e8f4 19const LAST_MIGRATION_VERSION = 95
5804c0db
C
20
21// ---------------------------------------------------------------------------
22
9f6bae3a 23// API version
f0f5567b 24const API_VERSION = 'v1'
9f10b292 25
9f6bae3a
C
26// Number of results by default for the pagination
27const PAGINATION_COUNT_DEFAULT = 15
28
29// Sortable columns per schema
30const SEARCHABLE_COLUMNS = {
feb4bdfd 31 VIDEOS: [ 'name', 'magnetUri', 'host', 'author', 'tags' ]
a3ee6fa2 32}
9f10b292 33
9f6bae3a
C
34// Sortable columns per schema
35const SORTABLE_COLUMNS = {
8a02bd04 36 PODS: [ 'id', 'host', 'score', 'createdAt' ],
9c2c18f3
C
37 USERS: [ 'id', 'username', 'createdAt' ],
38 VIDEO_ABUSES: [ 'id', 'createdAt' ],
72c7248b 39 VIDEO_CHANNELS: [ 'id', 'name', 'updatedAt', 'createdAt' ],
792dbaf0
GS
40 VIDEOS: [ 'name', 'duration', 'createdAt', 'views', 'likes' ],
41 BLACKLISTS: [ 'id', 'name', 'duration', 'views', 'likes', 'dislikes', 'uuid', 'createdAt' ]
9f6bae3a 42}
9f10b292 43
2f372a86
C
44const OAUTH_LIFETIME = {
45 ACCESS_TOKEN: 3600 * 4, // 4 hours
46 REFRESH_TOKEN: 1209600 // 2 weeks
47}
48
9f6bae3a 49// ---------------------------------------------------------------------------
26d7d31b 50
e861452f 51const CONFIG = {
d16b5172 52 LISTEN: {
65fcc311 53 PORT: config.get<number>('listen.port')
d16b5172 54 },
e861452f 55 DATABASE: {
65fcc311
C
56 DBNAME: 'peertube' + config.get<string>('database.suffix'),
57 HOSTNAME: config.get<string>('database.hostname'),
58 PORT: config.get<number>('database.port'),
59 USERNAME: config.get<string>('database.username'),
60 PASSWORD: config.get<string>('database.password')
e861452f 61 },
e861452f 62 STORAGE: {
e02643f3
C
63 CERT_DIR: join(root(), config.get<string>('storage.certs')),
64 LOG_DIR: join(root(), config.get<string>('storage.logs')),
65 VIDEOS_DIR: join(root(), config.get<string>('storage.videos')),
66 THUMBNAILS_DIR: join(root(), config.get<string>('storage.thumbnails')),
67 PREVIEWS_DIR: join(root(), config.get<string>('storage.previews')),
f981dae8
C
68 TORRENTS_DIR: join(root(), config.get<string>('storage.torrents')),
69 CACHE_DIR: join(root(), config.get<string>('storage.cache'))
e861452f
C
70 },
71 WEBSERVER: {
65fcc311
C
72 SCHEME: config.get<boolean>('webserver.https') === true ? 'https' : 'http',
73 WS: config.get<boolean>('webserver.https') === true ? 'wss' : 'ws',
74 HOSTNAME: config.get<string>('webserver.hostname'),
75 PORT: config.get<number>('webserver.port'),
76 URL: '',
77 HOST: ''
4793c343
C
78 },
79 ADMIN: {
65fcc311 80 EMAIL: config.get<string>('admin.email')
e22528ac
C
81 },
82 SIGNUP: {
291e8d3e 83 ENABLED: config.get<boolean>('signup.enabled'),
980246ea 84 LIMIT: config.get<number>('signup.limit')
b0f9f39e
C
85 },
86 USER: {
87 VIDEO_QUOTA: config.get<number>('user.video_quota')
227d02fe
C
88 },
89 TRANSCODING: {
65fcc311 90 ENABLED: config.get<boolean>('transcoding.enabled'),
40298b02
C
91 THREADS: config.get<number>('transcoding.threads'),
92 RESOLUTIONS: {
93 '240' : config.get<boolean>('transcoding.resolutions.240p'),
94 '360': config.get<boolean>('transcoding.resolutions.360p'),
95 '480': config.get<boolean>('transcoding.resolutions.480p'),
96 '720': config.get<boolean>('transcoding.resolutions.720p'),
97 '1080': config.get<boolean>('transcoding.resolutions.1080p')
98 }
f981dae8
C
99 },
100 CACHE: {
101 PREVIEWS: {
102 SIZE: config.get<number>('cache.previews.size')
103 }
e861452f
C
104 }
105}
3737bbaf 106CONFIG.WEBSERVER.URL = CONFIG.WEBSERVER.SCHEME + '://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT
49abbbbe 107CONFIG.WEBSERVER.HOST = CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT
e861452f 108
9f6bae3a
C
109// ---------------------------------------------------------------------------
110
e4c55619
C
111const CONSTRAINTS_FIELDS = {
112 USERS: {
113 USERNAME: { min: 3, max: 20 }, // Length
b0f9f39e
C
114 PASSWORD: { min: 6, max: 255 }, // Length
115 VIDEO_QUOTA: { min: -1 }
e4c55619 116 },
55fa55a9
C
117 VIDEO_ABUSES: {
118 REASON: { min: 2, max: 300 } // Length
119 },
72c7248b 120 VIDEO_CHANNELS: {
a265f7f3 121 NAME: { min: 3, max: 120 }, // Length
72c7248b
C
122 DESCRIPTION: { min: 3, max: 250 } // Length
123 },
e4c55619 124 VIDEOS: {
a265f7f3 125 NAME: { min: 3, max: 120 }, // Length
9567011b
C
126 TRUNCATED_DESCRIPTION: { min: 3, max: 250 }, // Length
127 DESCRIPTION: { min: 3, max: 3000 }, // Length
feb4bdfd 128 EXTNAME: [ '.mp4', '.ogv', '.webm' ],
0e1dc3e7 129 INFO_HASH: { min: 40, max: 40 }, // Length, info hash is 20 bytes length but we represent it in hexadecimal so 20 * 2
e4c55619 130 DURATION: { min: 1, max: 7200 }, // Number
a265f7f3
C
131 TAGS: { min: 0, max: 5 }, // Number of total tags
132 TAG: { min: 2, max: 30 }, // Length
e4c55619 133 THUMBNAIL: { min: 2, max: 30 },
e4c87ec2
C
134 THUMBNAIL_DATA: { min: 0, max: 20000 }, // Bytes
135 VIEWS: { min: 0 },
136 LIKES: { min: 0 },
93e1258c
C
137 DISLIKES: { min: 0 },
138 FILE_SIZE: { min: 10, max: 1024 * 1024 * 1024 * 3 /* 3Go */ }
e4c87ec2
C
139 },
140 VIDEO_EVENTS: {
141 COUNT: { min: 0 }
e4c55619
C
142 }
143}
144
ee9e7b61 145const VIDEO_RATE_TYPES: { [ id: string ]: VideoRateType } = {
d38b8281
C
146 LIKE: 'like',
147 DISLIKE: 'dislike'
148}
149
6e07c3de
C
150const VIDEO_CATEGORIES = {
151 1: 'Music',
152 2: 'Films',
153 3: 'Vehicles',
154 4: 'Art',
155 5: 'Sports',
156 6: 'Travels',
157 7: 'Gaming',
158 8: 'People',
159 9: 'Comedy',
160 10: 'Entertainment',
161 11: 'News',
40298b02 162 12: 'How To',
6e07c3de
C
163 13: 'Education',
164 14: 'Activism',
165 15: 'Science & Technology',
166 16: 'Animals',
167 17: 'Kids',
168 18: 'Food'
169}
170
6f0c39e2
C
171// See https://creativecommons.org/licenses/?lang=en
172const VIDEO_LICENCES = {
173 1: 'Attribution',
174 2: 'Attribution - Share Alike',
175 3: 'Attribution - No Derivatives',
176 4: 'Attribution - Non Commercial',
177 5: 'Attribution - Non Commercial - Share Alike',
178 6: 'Attribution - Non Commercial - No Derivatives',
179 7: 'Public Domain Dedication'
180}
181
3092476e
C
182// See https://en.wikipedia.org/wiki/List_of_languages_by_number_of_native_speakers#Nationalencyklopedin
183const VIDEO_LANGUAGES = {
184 1: 'English',
185 2: 'Spanish',
186 3: 'Mandarin',
187 4: 'Hindi',
188 5: 'Arabic',
189 6: 'Portuguese',
190 7: 'Bengali',
191 8: 'Russian',
192 9: 'Japanese',
193 10: 'Punjabi',
194 11: 'German',
195 12: 'Korean',
196 13: 'French',
40298b02 197 14: 'Italian'
3092476e
C
198}
199
fd45e8f4
C
200const VIDEO_PRIVACIES = {
201 [VideoPrivacy.PUBLIC]: 'Public',
202 [VideoPrivacy.UNLISTED]: 'Unlisted',
203 [VideoPrivacy.PRIVATE]: 'Private'
204}
205
9f6bae3a
C
206// ---------------------------------------------------------------------------
207
9f10b292 208// Score a pod has when we create it as a friend
a3ee6fa2
C
209const FRIEND_SCORE = {
210 BASE: 100,
211 MAX: 1000
212}
9f10b292 213
9f6bae3a
C
214// ---------------------------------------------------------------------------
215
9f10b292 216// Number of points we add/remove from a friend after a successful/bad request
f0f5567b 217const PODS_SCORE = {
40298b02 218 PENALTY: -10,
9f10b292
C
219 BONUS: 10
220}
221
9f6bae3a
C
222// Time to wait between requests to the friends (10 min)
223let REQUESTS_INTERVAL = 600000
224
528a9efa
C
225// Number of requests in parallel we can make
226const REQUESTS_IN_PARALLEL = 10
9f10b292 227
bd14d16a
C
228// To how many pods we send requests
229const REQUESTS_LIMIT_PODS = 10
230// How many requests we send to a pod per interval
231const REQUESTS_LIMIT_PER_POD = 5
b3595463 232
9e167724
C
233const REQUESTS_VIDEO_QADU_LIMIT_PODS = 10
234// The QADU requests are not big
235const REQUESTS_VIDEO_QADU_LIMIT_PER_POD = 50
236
e4c87ec2
C
237const REQUESTS_VIDEO_EVENT_LIMIT_PODS = 10
238// The EVENTS requests are not big
239const REQUESTS_VIDEO_EVENT_LIMIT_PER_POD = 50
240
528a9efa
C
241// Number of requests to retry for replay requests module
242const RETRY_REQUESTS = 5
8c255eb5 243
ee9e7b61 244const REQUEST_ENDPOINTS: { [ id: string ]: RequestEndpoint } = {
4b466058 245 VIDEOS: 'videos'
4b08096b 246}
4b466058 247
72c7248b
C
248const REQUEST_ENDPOINT_ACTIONS: {
249 [ id: string ]: {
250 [ id: string ]: RemoteVideoRequestType
251 }
252} = {}
62f4ef41 253REQUEST_ENDPOINT_ACTIONS[REQUEST_ENDPOINTS.VIDEOS] = {
72c7248b
C
254 ADD_VIDEO: 'add-video',
255 UPDATE_VIDEO: 'update-video',
256 REMOVE_VIDEO: 'remove-video',
257 ADD_CHANNEL: 'add-channel',
258 UPDATE_CHANNEL: 'update-channel',
259 REMOVE_CHANNEL: 'remove-channel',
260 ADD_AUTHOR: 'add-author',
261 REMOVE_AUTHOR: 'remove-author',
62f4ef41
C
262 REPORT_ABUSE: 'report-abuse'
263}
4b08096b 264
4b466058
C
265const REQUEST_VIDEO_QADU_ENDPOINT = 'videos/qadu'
266const REQUEST_VIDEO_EVENT_ENDPOINT = 'videos/events'
267
ee9e7b61 268const REQUEST_VIDEO_QADU_TYPES: { [ id: string ]: RequestVideoQaduType } = {
9e167724
C
269 LIKES: 'likes',
270 DISLIKES: 'dislikes',
271 VIEWS: 'views'
272}
273
ee9e7b61 274const REQUEST_VIDEO_EVENT_TYPES: { [ id: string ]: RequestVideoEventType } = {
e4c87ec2
C
275 LIKES: 'likes',
276 DISLIKES: 'dislikes',
277 VIEWS: 'views'
278}
279
f285faa0
C
280const REMOTE_SCHEME = {
281 HTTP: 'https',
441b66f8 282 WS: 'wss'
f285faa0
C
283}
284
ee9e7b61 285const JOB_STATES: { [ id: string ]: JobState } = {
227d02fe
C
286 PENDING: 'pending',
287 PROCESSING: 'processing',
288 ERROR: 'error',
289 SUCCESS: 'success'
290}
291// How many maximum jobs we fetch from the database per cycle
292const JOBS_FETCH_LIMIT_PER_CYCLE = 10
227d02fe
C
293// 1 minutes
294let JOBS_FETCHING_INTERVAL = 60000
295
bdfbd4f1
C
296// ---------------------------------------------------------------------------
297
15103f11
C
298const PRIVATE_CERT_NAME = 'peertube.key.pem'
299const PUBLIC_CERT_NAME = 'peertube.pub'
bdfbd4f1
C
300const SIGNATURE_ALGORITHM = 'RSA-SHA256'
301const SIGNATURE_ENCODING = 'hex'
302
9f6bae3a
C
303// Password encryption
304const BCRYPT_SALT_SIZE = 10
a877d5ac 305
bdfbd4f1
C
306// ---------------------------------------------------------------------------
307
052937db
C
308// Express static paths (router)
309const STATIC_PATHS = {
f285faa0
C
310 PREVIEWS: '/static/previews/',
311 THUMBNAILS: '/static/thumbnails/',
052937db
C
312 TORRENTS: '/static/torrents/',
313 WEBSEED: '/static/webseed/'
314}
315
dc009132
C
316// Cache control
317let STATIC_MAX_AGE = '30d'
318
cbe2f7c3 319// Videos thumbnail size
d8755eed
C
320const THUMBNAILS_SIZE = {
321 width: 200,
322 height: 110
323}
324const PREVIEWS_SIZE = {
164174a6
C
325 width: 560,
326 height: 315
327}
328
329const EMBED_SIZE = {
330 width: 560,
331 height: 315
d8755eed 332}
cbe2f7c3 333
980246ea 334// Sub folders of cache directory
f981dae8
C
335const CACHE = {
336 DIRECTORIES: {
337 PREVIEWS: join(CONFIG.STORAGE.CACHE_DIR, 'previews')
338 }
339}
340
bdfbd4f1
C
341// ---------------------------------------------------------------------------
342
d8755eed 343const OPENGRAPH_AND_OEMBED_COMMENT = '<!-- open graph and oembed tags -->'
709756b8
C
344
345// ---------------------------------------------------------------------------
346
9f10b292
C
347// Special constants for a test instance
348if (isTestInstance() === true) {
9f6bae3a 349 CONSTRAINTS_FIELDS.VIDEOS.DURATION.max = 14
a3ee6fa2 350 FRIEND_SCORE.BASE = 20
d3cd34be 351 REQUESTS_INTERVAL = 10000
227d02fe 352 JOBS_FETCHING_INTERVAL = 10000
f285faa0
C
353 REMOTE_SCHEME.HTTP = 'http'
354 REMOTE_SCHEME.WS = 'ws'
65fcc311 355 STATIC_MAX_AGE = '0'
9f10b292
C
356}
357
358// ---------------------------------------------------------------------------
359
65fcc311 360export {
9f6bae3a
C
361 API_VERSION,
362 BCRYPT_SALT_SIZE,
f981dae8 363 CACHE,
9f6bae3a
C
364 CONFIG,
365 CONSTRAINTS_FIELDS,
164174a6 366 EMBED_SIZE,
9f6bae3a 367 FRIEND_SCORE,
227d02fe 368 JOB_STATES,
227d02fe 369 JOBS_FETCH_LIMIT_PER_CYCLE,
709756b8 370 JOBS_FETCHING_INTERVAL,
b769007f 371 LAST_MIGRATION_VERSION,
9f6bae3a 372 OAUTH_LIFETIME,
d8755eed 373 OPENGRAPH_AND_OEMBED_COMMENT,
9f6bae3a
C
374 PAGINATION_COUNT_DEFAULT,
375 PODS_SCORE,
f285faa0 376 PREVIEWS_SIZE,
15103f11
C
377 PRIVATE_CERT_NAME,
378 PUBLIC_CERT_NAME,
f285faa0 379 REMOTE_SCHEME,
62f4ef41 380 REQUEST_ENDPOINT_ACTIONS,
15103f11 381 REQUEST_ENDPOINTS,
4b466058 382 REQUEST_VIDEO_EVENT_ENDPOINT,
e4c87ec2 383 REQUEST_VIDEO_EVENT_TYPES,
4b466058 384 REQUEST_VIDEO_QADU_ENDPOINT,
9e167724 385 REQUEST_VIDEO_QADU_TYPES,
9f6bae3a
C
386 REQUESTS_IN_PARALLEL,
387 REQUESTS_INTERVAL,
bd14d16a 388 REQUESTS_LIMIT_PER_POD,
15103f11 389 REQUESTS_LIMIT_PODS,
e4c87ec2
C
390 REQUESTS_VIDEO_EVENT_LIMIT_PER_POD,
391 REQUESTS_VIDEO_EVENT_LIMIT_PODS,
4b466058
C
392 REQUESTS_VIDEO_QADU_LIMIT_PER_POD,
393 REQUESTS_VIDEO_QADU_LIMIT_PODS,
9f6bae3a
C
394 RETRY_REQUESTS,
395 SEARCHABLE_COLUMNS,
bdfbd4f1
C
396 SIGNATURE_ALGORITHM,
397 SIGNATURE_ENCODING,
9f6bae3a 398 SORTABLE_COLUMNS,
dc009132 399 STATIC_MAX_AGE,
a6375e69 400 STATIC_PATHS,
9f6bae3a 401 THUMBNAILS_SIZE,
6e07c3de 402 VIDEO_CATEGORIES,
3092476e 403 VIDEO_LANGUAGES,
fd45e8f4 404 VIDEO_PRIVACIES,
6f0c39e2 405 VIDEO_LICENCES,
d38b8281 406 VIDEO_RATE_TYPES
9f10b292 407}