X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Finitializers%2Fconstants.ts;h=0b4b412731a5456e21d4f37fde7cd84333eccf2e;hb=e9cb361cf51d11ef603128fb6715c103becf5123;hp=e712f02a8a8f1bd8c864c8b3a9fddc2ad2d4596d;hpb=529f037294d9917a62235f8162887a8edc04c32f;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index e712f02a8..0b4b41273 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -1,29 +1,30 @@ -import { join } from 'path' +import { randomInt } from '../../shared/core-utils/miscs/miscs' +import { CronRepeatOptions, EveryRepeatOptions } from 'bull' import { randomBytes } from 'crypto' -import { ActivityPubActorType } from '../../shared/models/activitypub' -import { FollowState } from '../../shared/models/actors' +import { invert } from 'lodash' +import { join } from 'path' import { AbuseState, + JobType, VideoImportState, VideoPrivacy, - VideoTranscodingFPS, - JobType, VideoRateType, VideoResolution, - VideoState + VideoState, + VideoTranscodingFPS } from '../../shared/models' -// Do not use barrels, remain constants as independent as possible -import { isTestInstance, sanitizeHost, sanitizeUrl, root } from '../helpers/core-utils' +import { ActivityPubActorType } from '../../shared/models/activitypub' +import { FollowState } from '../../shared/models/actors' import { NSFWPolicyType } from '../../shared/models/videos/nsfw-policy.type' -import { invert } from 'lodash' -import { CronRepeatOptions, EveryRepeatOptions } from 'bull' import { VideoPlaylistPrivacy } from '../../shared/models/videos/playlist/video-playlist-privacy.model' import { VideoPlaylistType } from '../../shared/models/videos/playlist/video-playlist-type.model' +// Do not use barrels, remain constants as independent as possible +import { isTestInstance, root, sanitizeHost, sanitizeUrl } from '../helpers/core-utils' import { CONFIG, registerConfigChangedHandler } from './config' // --------------------------------------------------------------------------- -const LAST_MIGRATION_VERSION = 540 +const LAST_MIGRATION_VERSION = 570 // --------------------------------------------------------------------------- @@ -62,7 +63,10 @@ const SORTABLE_COLUMNS = { JOBS: [ 'createdAt' ], VIDEO_CHANNELS: [ 'id', 'name', 'updatedAt', 'createdAt' ], VIDEO_IMPORTS: [ 'createdAt' ], + VIDEO_COMMENT_THREADS: [ 'createdAt', 'totalReplies' ], + VIDEO_COMMENTS: [ 'createdAt' ], + VIDEO_RATES: [ 'createdAt' ], BLACKLISTS: [ 'id', 'name', 'duration', 'views', 'likes', 'dislikes', 'uuid', 'createdAt' ], FOLLOWERS: [ 'createdAt', 'state', 'score' ], @@ -81,7 +85,7 @@ const SORTABLE_COLUMNS = { USER_NOTIFICATIONS: [ 'createdAt', 'read' ], - VIDEO_PLAYLISTS: [ 'displayName', 'createdAt', 'updatedAt' ], + VIDEO_PLAYLISTS: [ 'name', 'displayName', 'createdAt', 'updatedAt' ], PLUGINS: [ 'name', 'createdAt', 'updatedAt' ], @@ -172,7 +176,13 @@ const JOB_TTL: { [id in JobType]: number } = { } const REPEAT_JOBS: { [ id: string ]: EveryRepeatOptions | CronRepeatOptions } = { 'videos-views': { - cron: '1 * * * *' // At 1 minute past the hour + cron: randomInt(1, 20) + ' * * * *' // Between 1-20 minutes past the hour + } +} +const JOB_PRIORITY = { + TRANSCODING: { + OPTIMIZER: 10, + NEW_RESOLUTION: 100 } } @@ -190,7 +200,8 @@ const SCHEDULER_INTERVALS_MS = { checkPlugins: CONFIG.PLUGINS.INDEX.CHECK_LATEST_VERSIONS_INTERVAL, autoFollowIndexInstances: 60000 * 60 * 24, // 1 day removeOldViews: 60000 * 60 * 24, // 1 day - removeOldHistory: 60000 * 60 * 24 // 1 day + removeOldHistory: 60000 * 60 * 24, // 1 day + updateInboxStats: 1000 * 60// 1 minute } // --------------------------------------------------------------------------- @@ -253,7 +264,7 @@ const CONSTRAINTS_FIELDS = { DESCRIPTION: { min: 3, max: 10000 }, // Length SUPPORT: { min: 3, max: 1000 }, // Length IMAGE: { - EXTNAME: [ '.jpg', '.jpeg' ], + EXTNAME: [ '.png', '.jpg', '.jpeg', '.webp' ], FILE_SIZE: { max: 2 * 1024 * 1024 // 2MB } @@ -263,8 +274,6 @@ const CONSTRAINTS_FIELDS = { DURATION: { min: 0 }, // Number TAGS: { min: 0, max: 5 }, // Number of total tags TAG: { min: 2, max: 30 }, // Length - THUMBNAIL: { min: 2, max: 30 }, - THUMBNAIL_DATA: { min: 0, max: 20000 }, // Bytes VIEWS: { min: 0 }, LIKES: { min: 0 }, DISLIKES: { min: 0 }, @@ -287,7 +296,7 @@ const CONSTRAINTS_FIELDS = { PRIVATE_KEY: { min: 10, max: 5000 }, // Length URL: { min: 3, max: 2000 }, // Length AVATAR: { - EXTNAME: [ '.png', '.jpeg', '.jpg' ], + EXTNAME: [ '.png', '.jpeg', '.jpg', '.gif', '.webp' ], FILE_SIZE: { max: 2 * 1024 * 1024 // 2MB } @@ -316,7 +325,11 @@ const CONSTRAINTS_FIELDS = { } } -let VIDEO_VIEW_LIFETIME = 60000 * 60 // 1 hour +const VIEW_LIFETIME = { + VIDEO: 60000 * 60, // 1 hour + LIVE: 60000 * 5 // 5 minutes +} + let CONTACT_FORM_LIFETIME = 60000 * 60 // 1 hour const VIDEO_TRANSCODING_FPS: VideoTranscodingFPS = { @@ -328,6 +341,17 @@ const VIDEO_TRANSCODING_FPS: VideoTranscodingFPS = { KEEP_ORIGIN_FPS_RESOLUTION_MIN: 720 // We keep the original FPS on high resolutions (720 minimum) } +const VIDEO_TRANSCODING_ENCODERS = { + VIDEO: [ 'libx264' ], + + // Try the first one, if not available try the second one etc + AUDIO: [ + // we favor VBR, if a good AAC encoder is available + 'libfdk_aac', + 'aac' + ] +} + const DEFAULT_AUDIO_RESOLUTION = VideoResolution.H_480P const VIDEO_RATE_TYPES: { [ id: string ]: VideoRateType } = { @@ -336,8 +360,11 @@ const VIDEO_RATE_TYPES: { [ id: string ]: VideoRateType } = { } const FFMPEG_NICE: { [ id: string ]: number } = { - THUMBNAIL: 2, // 2 just for don't blocking servers - TRANSCODING: 15 + // parent process defaults to niceness = 0 + // reminder: lower = higher priority, max value is 19, lowest is -20 + THUMBNAIL: 2, // low value in order to avoid blocking server + LIVE: 9, // prioritize over VOD + VOD: 15 } const VIDEO_CATEGORIES = { @@ -508,6 +535,10 @@ const HTTP_SIGNATURE = { HEADER_NAME: 'signature', ALGORITHM: 'rsa-sha256', HEADERS_TO_SIGN: [ '(request-target)', 'host', 'date', 'digest' ], + REQUIRED_HEADERS: { + ALL: [ '(request-target)', 'host', 'date' ], + POST: [ '(request-target)', 'host', 'date', 'digest' ] + }, CLOCK_SKEW_SECONDS: 1800 } @@ -611,6 +642,8 @@ const VIDEO_LIVE = { CLEANUP_DELAY: 1000 * 60 * 5, // 5 minutes SEGMENT_TIME_SECONDS: 4, // 4 seconds SEGMENTS_LIST_SIZE: 15, // 15 maximum segments in live playlist + REPLAY_DIRECTORY: 'replay', + EDGE_LIVE_DELAY_SEGMENTS_NOTIFICATION: 4, RTMP: { CHUNK_SIZE: 60000, GOP_CACHE: true, @@ -715,6 +748,7 @@ if (isTestInstance() === true) { ACTIVITY_PUB.VIDEO_PLAYLIST_REFRESH_INTERVAL = 10 * 1000 // 10 seconds CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max = 100 * 1024 // 100KB + CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max = 400 * 1024 // 400KB SCHEDULER_INTERVALS_MS.actorFollowScores = 1000 SCHEDULER_INTERVALS_MS.removeOldJobs = 10000 @@ -722,11 +756,13 @@ if (isTestInstance() === true) { SCHEDULER_INTERVALS_MS.removeOldViews = 5000 SCHEDULER_INTERVALS_MS.updateVideos = 5000 SCHEDULER_INTERVALS_MS.autoFollowIndexInstances = 5000 + SCHEDULER_INTERVALS_MS.updateInboxStats = 5000 REPEAT_JOBS['videos-views'] = { every: 5000 } REDUNDANCY.VIDEOS.RANDOMIZED_FACTOR = 1 - VIDEO_VIEW_LIFETIME = 1000 // 1 second + VIEW_LIFETIME.VIDEO = 1000 // 1 second + VIEW_LIFETIME.LIVE = 1000 * 5 // 5 second CONTACT_FORM_LIFETIME = 1000 // 1 second JOB_ATTEMPTS['email'] = 1 @@ -740,6 +776,7 @@ if (isTestInstance() === true) { VIDEO_LIVE.CLEANUP_DELAY = 5000 VIDEO_LIVE.SEGMENT_TIME_SECONDS = 2 + VIDEO_LIVE.EDGE_LIVE_DELAY_SEGMENTS_NOTIFICATION = 1 } updateWebserverUrls() @@ -789,6 +826,7 @@ export { ACTOR_FOLLOW_SCORE, PREVIEWS_SIZE, REMOTE_SCHEME, + VIDEO_TRANSCODING_ENCODERS, FOLLOW_STATES, DEFAULT_USER_THEME_NAME, SERVER_ACTOR_NAME, @@ -818,6 +856,7 @@ export { VIDEO_STATES, QUEUE_CONCURRENCY, VIDEO_RATE_TYPES, + JOB_PRIORITY, VIDEO_TRANSCODING_FPS, FFMPEG_NICE, ABUSE_STATES, @@ -838,7 +877,7 @@ export { JOB_COMPLETED_LIFETIME, HTTP_SIGNATURE, VIDEO_IMPORT_STATES, - VIDEO_VIEW_LIFETIME, + VIEW_LIFETIME, CONTACT_FORM_LIFETIME, VIDEO_PLAYLIST_PRIVACIES, PLUGIN_EXTERNAL_AUTH_TOKEN_LIFETIME,