// ---------------------------------------------------------------------------
-const LAST_MIGRATION_VERSION = 400
+const LAST_MIGRATION_VERSION = 465
// ---------------------------------------------------------------------------
// Sortable columns per schema
const SORTABLE_COLUMNS = {
- USERS: [ 'id', 'username', 'createdAt' ],
+ USERS: [ 'id', 'username', 'videoQuotaUsed', 'createdAt' ],
USER_SUBSCRIPTIONS: [ 'id', 'createdAt' ],
ACCOUNTS: [ 'createdAt' ],
JOBS: [ 'createdAt' ],
VIDEO_ABUSES: [ 'id', 'createdAt', 'state' ],
VIDEO_CHANNELS: [ 'id', 'name', 'updatedAt', 'createdAt' ],
VIDEO_IMPORTS: [ 'createdAt' ],
- VIDEO_COMMENT_THREADS: [ 'createdAt' ],
+ VIDEO_COMMENT_THREADS: [ 'createdAt', 'totalReplies' ],
VIDEO_RATES: [ 'createdAt' ],
BLACKLISTS: [ 'id', 'name', 'duration', 'views', 'likes', 'dislikes', 'uuid', 'createdAt' ],
- FOLLOWERS: [ 'createdAt' ],
- FOLLOWING: [ 'createdAt' ],
+ FOLLOWERS: [ 'createdAt', 'state', 'score' ],
+ FOLLOWING: [ 'createdAt', 'redundancyAllowed', 'state' ],
VIDEOS: [ 'name', 'duration', 'createdAt', 'publishedAt', 'views', 'likes', 'trending' ],
updateVideos: 60000, // 1 minute
youtubeDLUpdate: 60000 * 60 * 24, // 1 day
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
}
+const INSTANCES_INDEX = {
+ HOSTS_PATH: '/api/v1/instances/hosts'
+}
+
// ---------------------------------------------------------------------------
const CONSTRAINTS_FIELDS = {
PLUGINS: {
NAME: { min: 1, max: 214 }, // Length
DESCRIPTION: { min: 1, max: 20000 } // Length
+ },
+ COMMONS: {
+ URL: { min: 5, max: 2000 } // Length
}
}
const VIDEO_PRIVACIES = {
[ VideoPrivacy.PUBLIC ]: 'Public',
[ VideoPrivacy.UNLISTED ]: 'Unlisted',
- [ VideoPrivacy.PRIVATE ]: 'Private'
+ [ VideoPrivacy.PRIVATE ]: 'Private',
+ [ VideoPrivacy.INTERNAL ]: 'Internal'
}
const VIDEO_STATES = {
VIDEO_CAPTIONS: {
MIMETYPE_EXT: {
'text/vtt': '.vtt',
- 'application/x-subrip': '.srt'
+ 'application/x-subrip': '.srt',
+ 'text/plain': '.srt'
}
},
TORRENT: {
}
}
+const VIDEO_CHANNELS = {
+ MAX_PER_USER: 20
+}
+
// ---------------------------------------------------------------------------
const SERVER_ACTOR_NAME = 'peertube'
const ACTIVITY_PUB_ACTOR_TYPES: { [ id: string ]: ActivityPubActorType } = {
GROUP: 'Group',
PERSON: 'Person',
- APPLICATION: 'Application'
+ APPLICATION: 'Application',
+ ORGANIZATION: 'Organization',
+ SERVICE: 'Service'
}
const HTTP_SIGNATURE = {
HEADER_NAME: 'signature',
ALGORITHM: 'rsa-sha256',
- HEADERS_TO_SIGN: [ '(request-target)', 'host', 'date', 'digest' ]
+ HEADERS_TO_SIGN: [ '(request-target)', 'host', 'date', 'digest' ],
+ CLOCK_SKEW_SECONDS: 1800
}
// ---------------------------------------------------------------------------
// Password encryption
const BCRYPT_SALT_SIZE = 10
-const USER_PASSWORD_RESET_LIFETIME = 60000 * 5 // 5 minutes
+const USER_PASSWORD_RESET_LIFETIME = 60000 * 60 // 60 minutes
const USER_EMAIL_VERIFY_LIFETIME = 60000 * 60 // 60 minutes
}
const STATIC_DOWNLOAD_PATHS = {
TORRENTS: '/download/torrents/',
- VIDEOS: '/download/videos/'
+ VIDEOS: '/download/videos/',
+ HLS_VIDEOS: '/download/streaming-playlists/hls/videos/'
+}
+const LAZY_STATIC_PATHS = {
+ AVATARS: '/lazy-static/avatars/',
+ PREVIEWS: '/static/previews/',
+ VIDEO_CAPTIONS: '/static/video-captions/'
}
// Cache control
-let STATIC_MAX_AGE = '2h'
+let STATIC_MAX_AGE = {
+ SERVER: '2h',
+ CLIENT: '30d'
+}
// Videos thumbnail size
const THUMBNAILS_SIZE = {
}
}
-const CACHE = {
+const LRU_CACHE = {
USER_TOKENS: {
- MAX_SIZE: 10000
+ MAX_SIZE: 1000
+ },
+ AVATAR_STATIC: {
+ MAX_SIZE: 500
}
}
const HLS_REDUNDANCY_DIRECTORY = join(CONFIG.STORAGE.REDUNDANCY_DIR, 'hls')
const MEMOIZE_TTL = {
- OVERVIEWS_SAMPLE: 1000 * 3600 * 4 // 4 hours
+ OVERVIEWS_SAMPLE: 1000 * 3600 * 4, // 4 hours
+ INFO_HASH_EXISTS: 1000 * 3600 * 12 // 12 hours
+}
+
+const MEMOIZE_LENGTH = {
+ INFO_HASH_EXISTS: 200
+}
+
+const QUEUE_CONCURRENCY = {
+ AVATAR_PROCESS_IMAGE: 3
}
const REDUNDANCY = {
const ACCEPT_HEADERS = [ 'html', 'application/json' ].concat(ACTIVITY_PUB.POTENTIAL_ACCEPT_HEADERS)
const ASSETS_PATH = {
- DEFAULT_AUDIO_BACKGROUND: join(root(), 'server', 'assets', 'default-audio-background.jpg')
+ DEFAULT_AUDIO_BACKGROUND: join(root(), 'dist', 'server', 'assets', 'default-audio-background.jpg')
}
// ---------------------------------------------------------------------------
}
const MAX_LOGS_OUTPUT_CHARACTERS = 10 * 1000 * 1000
+const LOG_FILENAME = 'peertube.log'
+const AUDIT_LOG_FILENAME = 'peertube-audit.log'
// ---------------------------------------------------------------------------
REMOTE_SCHEME.HTTP = 'http'
REMOTE_SCHEME.WS = 'ws'
- STATIC_MAX_AGE = '0'
+ STATIC_MAX_AGE.SERVER = '0'
ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE = 2
ACTIVITY_PUB.ACTOR_REFRESH_INTERVAL = 10 * 1000 // 10 seconds
SCHEDULER_INTERVALS_MS.removeOldHistory = 5000
SCHEDULER_INTERVALS_MS.removeOldViews = 5000
SCHEDULER_INTERVALS_MS.updateVideos = 5000
+ SCHEDULER_INTERVALS_MS.autoFollowIndexInstances = 5000
REPEAT_JOBS[ 'videos-views' ] = { every: 5000 }
REDUNDANCY.VIDEOS.RANDOMIZED_FACTOR = 1
WEBSERVER,
API_VERSION,
PEERTUBE_VERSION,
+ LAZY_STATIC_PATHS,
HLS_REDUNDANCY_DIRECTORY,
P2P_MEDIA_LOADER_PEER_VERSION,
AVATARS_SIZE,
BCRYPT_SALT_SIZE,
TRACKER_RATE_LIMITS,
FILES_CACHE,
+ LOG_FILENAME,
CONSTRAINTS_FIELDS,
EMBED_SIZE,
REDUNDANCY,
OAUTH_LIFETIME,
CUSTOM_HTML_TAG_COMMENTS,
BROADCAST_CONCURRENCY,
+ AUDIT_LOG_FILENAME,
PAGINATION,
ACTOR_FOLLOW_SCORE,
PREVIEWS_SIZE,
REMOTE_SCHEME,
FOLLOW_STATES,
+ INSTANCES_INDEX,
DEFAULT_USER_THEME_NAME,
SERVER_ACTOR_NAME,
PLUGIN_GLOBAL_CSS_FILE_NAME,
ACTIVITY_PUB_ACTOR_TYPES,
THUMBNAILS_SIZE,
VIDEO_CATEGORIES,
+ MEMOIZE_LENGTH,
VIDEO_LANGUAGES,
VIDEO_PRIVACIES,
VIDEO_LICENCES,
VIDEO_STATES,
+ QUEUE_CONCURRENCY,
VIDEO_RATE_TYPES,
VIDEO_TRANSCODING_FPS,
FFMPEG_NICE,
VIDEO_ABUSE_STATES,
- CACHE,
+ VIDEO_CHANNELS,
+ LRU_CACHE,
JOB_REQUEST_TIMEOUT,
USER_PASSWORD_RESET_LIFETIME,
MEMOIZE_TTL,
'video/x-flv': '.flv',
'video/x-matroska': '.mkv',
'application/octet-stream': '.mkv',
- 'video/avi': '.avi'
+ 'video/avi': '.avi',
+ 'video/x-m4v': '.m4v',
+ 'video/m4v': '.m4v'
})
}