X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Finitializers%2Fconstants.ts;h=57f7af789ca16969de4b63899222c8960f5070a5;hb=c55e3d7227fe1453869e309025996b9d75256d5d;hp=5f121d9a4db6cb842a03ed812bbc4cb5ad46a8b8;hpb=9e8789497377cac5554a622da605f5b89587aa9c;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 5f121d9a4..57f7af789 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -2,7 +2,7 @@ import { CronRepeatOptions, EveryRepeatOptions } from 'bull' import { randomBytes } from 'crypto' import { invert } from 'lodash' import { join } from 'path' -import { randomInt } from '../../shared/core-utils/common/miscs' +import { randomInt, root } from '@shared/core-utils' import { AbuseState, JobType, @@ -19,12 +19,12 @@ import { NSFWPolicyType } from '../../shared/models/videos/nsfw-policy.type' 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 { isTestInstance, sanitizeHost, sanitizeUrl } from '../helpers/core-utils' import { CONFIG, registerConfigChangedHandler } from './config' // --------------------------------------------------------------------------- -const LAST_MIGRATION_VERSION = 655 +const LAST_MIGRATION_VERSION = 675 // --------------------------------------------------------------------------- @@ -52,7 +52,8 @@ const WEBSERVER = { WS: '', HOSTNAME: '', PORT: 0, - RTMP_URL: '' + RTMP_URL: '', + RTMPS_URL: '' } // Sortable columns per schema @@ -69,8 +70,11 @@ const SORTABLE_COLUMNS = { VIDEO_RATES: [ 'createdAt' ], BLACKLISTS: [ 'id', 'name', 'duration', 'views', 'likes', 'dislikes', 'uuid', 'createdAt' ], - FOLLOWERS: [ 'createdAt', 'state', 'score' ], - FOLLOWING: [ 'createdAt', 'redundancyAllowed', 'state' ], + + INSTANCE_FOLLOWERS: [ 'createdAt', 'state', 'score' ], + INSTANCE_FOLLOWING: [ 'createdAt', 'redundancyAllowed', 'state' ], + ACCOUNT_FOLLOWERS: [ 'createdAt' ], + CHANNEL_FOLLOWERS: [ 'createdAt' ], VIDEOS: [ 'name', 'duration', 'createdAt', 'publishedAt', 'originallyPublishedAt', 'views', 'likes', 'trending', 'hot', 'best' ], @@ -134,9 +138,9 @@ const REMOTE_SCHEME = { } const JOB_ATTEMPTS: { [id in JobType]: number } = { - 'activitypub-http-broadcast': 5, - 'activitypub-http-unicast': 5, - 'activitypub-http-fetcher': 5, + 'activitypub-http-broadcast': 1, + 'activitypub-http-unicast': 1, + 'activitypub-http-fetcher': 2, 'activitypub-follow': 5, 'activitypub-cleaner': 1, 'video-file-import': 1, @@ -144,25 +148,27 @@ const JOB_ATTEMPTS: { [id in JobType]: number } = { 'video-import': 1, 'email': 5, 'actor-keys': 3, - 'videos-views': 1, + 'videos-views-stats': 1, 'activitypub-refresher': 1, 'video-redundancy': 1, - 'video-live-ending': 1 + 'video-live-ending': 1, + 'move-to-object-storage': 3 } // Excluded keys are jobs that can be configured by admins const JOB_CONCURRENCY: { [id in Exclude]: number } = { 'activitypub-http-broadcast': 1, - 'activitypub-http-unicast': 5, + 'activitypub-http-unicast': 10, 'activitypub-http-fetcher': 3, 'activitypub-cleaner': 1, 'activitypub-follow': 1, 'video-file-import': 1, 'email': 5, 'actor-keys': 1, - 'videos-views': 1, + 'videos-views-stats': 1, 'activitypub-refresher': 1, 'video-redundancy': 1, - 'video-live-ending': 10 + 'video-live-ending': 10, + 'move-to-object-storage': 1 } const JOB_TTL: { [id in JobType]: number } = { 'activitypub-http-broadcast': 60000 * 10, // 10 minutes @@ -175,13 +181,14 @@ const JOB_TTL: { [id in JobType]: number } = { 'video-import': 1000 * 3600 * 2, // 2 hours 'email': 60000 * 10, // 10 minutes 'actor-keys': 60000 * 20, // 20 minutes - 'videos-views': undefined, // Unlimited + 'videos-views-stats': undefined, // Unlimited 'activitypub-refresher': 60000 * 10, // 10 minutes 'video-redundancy': 1000 * 3600 * 3, // 3 hours - 'video-live-ending': 1000 * 60 * 10 // 10 minutes + 'video-live-ending': 1000 * 60 * 10, // 10 minutes + 'move-to-object-storage': 1000 * 60 * 60 * 3 // 3 hours } -const REPEAT_JOBS: { [ id: string ]: EveryRepeatOptions | CronRepeatOptions } = { - 'videos-views': { +const REPEAT_JOBS: { [ id in JobType ]?: EveryRepeatOptions | CronRepeatOptions } = { + 'videos-views-stats': { cron: randomInt(1, 20) + ' * * * *' // Between 1-20 minutes past the hour }, 'activitypub-cleaner': { @@ -195,22 +202,28 @@ const JOB_PRIORITY = { const BROADCAST_CONCURRENCY = 30 // How many requests in parallel we do in activitypub-http-broadcast job const AP_CLEANER_CONCURRENCY = 10 // How many requests in parallel we do in activitypub-cleaner job const CRAWL_REQUEST_CONCURRENCY = 1 // How many requests in parallel to fetch remote data (likes, shares...) -const REQUEST_TIMEOUT = 7000 // 7 seconds +const REQUEST_TIMEOUTS = { + DEFAULT: 7000, // 7 seconds + FILE: 30000, // 30 seconds + REDUNDANCY: JOB_TTL['video-redundancy'] +} + const JOB_COMPLETED_LIFETIME = 60000 * 60 * 24 * 2 // 2 days const VIDEO_IMPORT_TIMEOUT = 1000 * 3600 // 1 hour const SCHEDULER_INTERVALS_MS = { - actorFollowScores: 60000 * 60, // 1 hour - removeOldJobs: 60000 * 60, // 1 hour - updateVideos: 60000, // 1 minute - youtubeDLUpdate: 60000 * 60 * 24, // 1 day - checkPlugins: CONFIG.PLUGINS.INDEX.CHECK_LATEST_VERSIONS_INTERVAL, - checkPeerTubeVersion: 60000 * 60 * 24, // 1 day - autoFollowIndexInstances: 60000 * 60 * 24, // 1 day - removeOldViews: 60000 * 60 * 24, // 1 day - removeOldHistory: 60000 * 60 * 24, // 1 day - updateInboxStats: 1000 * 60, // 1 minute - removeDanglingResumableUploads: 60000 * 60 * 16 // 16 hours + ACTOR_FOLLOW_SCORES: 60000 * 60, // 1 hour + REMOVE_OLD_JOBS: 60000 * 60, // 1 hour + UPDATE_VIDEOS: 60000, // 1 minute + YOUTUBE_DL_UPDATE: 60000 * 60 * 24, // 1 day + VIDEO_VIEWS_BUFFER_UPDATE: CONFIG.VIEWS.VIDEOS.LOCAL_BUFFER_UPDATE_INTERVAL, + CHECK_PLUGINS: CONFIG.PLUGINS.INDEX.CHECK_LATEST_VERSIONS_INTERVAL, + CHECK_PEERTUBE_VERSION: 60000 * 60 * 24, // 1 day + AUTO_FOLLOW_INDEX_INSTANCES: 60000 * 60 * 24, // 1 day + REMOVE_OLD_VIEWS: 60000 * 60 * 24, // 1 day + REMOVE_OLD_HISTORY: 60000 * 60 * 24, // 1 day + UPDATE_INBOX_STATS: 1000 * 60, // 1 minute + REMOVE_DANGLING_RESUMABLE_UPLOADS: 60000 * 60 // 1 hour } // --------------------------------------------------------------------------- @@ -336,14 +349,14 @@ const CONSTRAINTS_FIELDS = { } const VIEW_LIFETIME = { - VIDEO: 60000 * 60, // 1 hour - LIVE: 60000 * 5 // 5 minutes + VIEW: CONFIG.VIEWS.VIDEOS.IP_VIEW_EXPIRATION, + VIEWER: 60000 * 5 // 5 minutes } let CONTACT_FORM_LIFETIME = 60000 * 60 // 1 hour const VIDEO_TRANSCODING_FPS: VideoTranscodingFPS = { - MIN: 10, + MIN: 1, STANDARD: [ 24, 25, 30 ], HD_STANDARD: [ 50, 60 ], AVERAGE: 30, @@ -412,7 +425,9 @@ const VIDEO_STATES: { [ id in VideoState ]: string } = { [VideoState.TO_TRANSCODE]: 'To transcode', [VideoState.TO_IMPORT]: 'To import', [VideoState.WAITING_FOR_LIVE]: 'Waiting for livestream', - [VideoState.LIVE_ENDED]: 'Livestream ended' + [VideoState.LIVE_ENDED]: 'Livestream ended', + [VideoState.TO_MOVE_TO_EXTERNAL_STORAGE]: 'To move to an external storage', + [VideoState.TRANSCODING_FAILED]: 'Transcoding failed' } const VIDEO_IMPORT_STATES: { [ id in VideoImportState ]: string } = { @@ -490,6 +505,12 @@ const MIMETYPES = { MIMETYPES.AUDIO.EXT_MIMETYPE = invert(MIMETYPES.AUDIO.MIMETYPE_EXT) MIMETYPES.IMAGE.EXT_MIMETYPE = invert(MIMETYPES.IMAGE.MIMETYPE_EXT) +const BINARY_CONTENT_TYPES = new Set([ + 'binary/octet-stream', + 'application/octet-stream', + 'application/x-binary' +]) + // --------------------------------------------------------------------------- const OVERVIEWS = { @@ -499,10 +520,6 @@ const OVERVIEWS = { } } -const VIDEO_CHANNELS = { - MAX_PER_USER: 20 -} - // --------------------------------------------------------------------------- const SERVER_ACTOR_NAME = 'peertube' @@ -570,7 +587,6 @@ const NSFW_POLICY_TYPES: { [ id: string ]: NSFWPolicyType } = { // Express static paths (router) const STATIC_PATHS = { THUMBNAILS: '/static/thumbnails/', - TORRENTS: '/static/torrents/', WEBSEED: '/static/webseed/', REDUNDANCY: '/static/redundancy/', STREAMING_PLAYLISTS: { @@ -653,6 +669,8 @@ const RESUMABLE_UPLOAD_DIRECTORY = join(CONFIG.STORAGE.TMP_DIR, 'resumable-uploa const HLS_STREAMING_PLAYLIST_DIRECTORY = join(CONFIG.STORAGE.STREAMING_PLAYLISTS_DIR, 'hls') const HLS_REDUNDANCY_DIRECTORY = join(CONFIG.STORAGE.REDUNDANCY_DIR, 'hls') +const RESUMABLE_UPLOAD_SESSION_LIFETIME = SCHEDULER_INTERVALS_MS.REMOVE_DANGLING_RESUMABLE_UPLOADS + const VIDEO_LIVE = { EXTENSION: '.ts', CLEANUP_DELAY: 1000 * 60 * 5, // 5 minutes @@ -769,21 +787,20 @@ if (isTestInstance() === true) { CONSTRAINTS_FIELDS.ACTORS.IMAGE.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 - SCHEDULER_INTERVALS_MS.removeOldHistory = 5000 - SCHEDULER_INTERVALS_MS.removeOldViews = 5000 - SCHEDULER_INTERVALS_MS.updateVideos = 5000 - SCHEDULER_INTERVALS_MS.autoFollowIndexInstances = 5000 - SCHEDULER_INTERVALS_MS.updateInboxStats = 5000 - SCHEDULER_INTERVALS_MS.checkPeerTubeVersion = 2000 - REPEAT_JOBS['videos-views'] = { every: 5000 } + SCHEDULER_INTERVALS_MS.ACTOR_FOLLOW_SCORES = 1000 + SCHEDULER_INTERVALS_MS.REMOVE_OLD_JOBS = 10000 + SCHEDULER_INTERVALS_MS.REMOVE_OLD_HISTORY = 5000 + SCHEDULER_INTERVALS_MS.REMOVE_OLD_VIEWS = 5000 + SCHEDULER_INTERVALS_MS.UPDATE_VIDEOS = 5000 + SCHEDULER_INTERVALS_MS.AUTO_FOLLOW_INDEX_INSTANCES = 5000 + SCHEDULER_INTERVALS_MS.UPDATE_INBOX_STATS = 5000 + SCHEDULER_INTERVALS_MS.CHECK_PEERTUBE_VERSION = 2000 + REPEAT_JOBS['videos-views-stats'] = { every: 5000 } REPEAT_JOBS['activitypub-cleaner'] = { every: 5000 } REDUNDANCY.VIDEOS.RANDOMIZED_FACTOR = 1 - VIEW_LIFETIME.VIDEO = 1000 // 1 second - VIEW_LIFETIME.LIVE = 1000 * 5 // 5 second + VIEW_LIFETIME.VIEWER = 1000 * 5 // 5 second CONTACT_FORM_LIFETIME = 1000 // 1 second JOB_ATTEMPTS['email'] = 1 @@ -826,6 +843,7 @@ export { LAZY_STATIC_PATHS, SEARCH_INDEX, RESUMABLE_UPLOAD_DIRECTORY, + RESUMABLE_UPLOAD_SESSION_LIFETIME, HLS_REDUNDANCY_DIRECTORY, P2P_MEDIA_LOADER_PEER_VERSION, ACTOR_IMAGES_SIZE, @@ -882,9 +900,8 @@ export { VIDEO_TRANSCODING_FPS, FFMPEG_NICE, ABUSE_STATES, - VIDEO_CHANNELS, LRU_CACHE, - REQUEST_TIMEOUT, + REQUEST_TIMEOUTS, USER_PASSWORD_RESET_LIFETIME, USER_PASSWORD_CREATE_LIFETIME, MEMOIZE_TTL, @@ -896,6 +913,7 @@ export { MIMETYPES, CRAWL_REQUEST_CONCURRENCY, DEFAULT_AUDIO_RESOLUTION, + BINARY_CONTENT_TYPES, JOB_COMPLETED_LIFETIME, HTTP_SIGNATURE, VIDEO_IMPORT_STATES, @@ -987,6 +1005,7 @@ function updateWebserverUrls () { WEBSERVER.PORT = CONFIG.WEBSERVER.PORT WEBSERVER.RTMP_URL = 'rtmp://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.LIVE.RTMP.PORT + '/' + VIDEO_LIVE.RTMP.BASE_PATH + WEBSERVER.RTMPS_URL = 'rtmps://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.LIVE.RTMPS.PORT + '/' + VIDEO_LIVE.RTMP.BASE_PATH } function updateWebserverConfig () { @@ -1051,10 +1070,14 @@ function buildLanguages () { kab: true, // Kabyle + lat: true, // Latin + epo: true, // Esperanto tlh: true, // Klingon jbo: true, // Lojban - avk: true // Kotava + avk: true, // Kotava + + zxx: true // No linguistic content (ISO-639-2) } // Only add ISO639-1 languages and some sign languages (ISO639-3)