// ---------------------------------------------------------------------------
-const LAST_MIGRATION_VERSION = 285
+const LAST_MIGRATION_VERSION = 300
// ---------------------------------------------------------------------------
const ROUTE_CACHE_LIFETIME = {
FEEDS: '15 minutes',
ROBOTS: '2 hours',
+ SITEMAP: '1 day',
SECURITYTXT: '2 hours',
NODEINFO: '10 minutes',
DNT_POLICY: '1 week',
'video-file': 1,
'video-import': 1,
'email': 5,
- 'videos-views': 1
+ 'videos-views': 1,
+ 'activitypub-refresher': 1
}
const JOB_CONCURRENCY: { [ id in JobType ]: number } = {
'activitypub-http-broadcast': 1,
'video-file': 1,
'video-import': 1,
'email': 5,
- 'videos-views': 1
+ 'videos-views': 1,
+ 'activitypub-refresher': 1
}
const JOB_TTL: { [ id in JobType ]: number } = {
'activitypub-http-broadcast': 60000 * 10, // 10 minutes
'video-file': 1000 * 3600 * 48, // 2 days, transcoding could be long
'video-import': 1000 * 3600 * 2, // hours
'email': 60000 * 10, // 10 minutes
- 'videos-views': undefined // Unlimited
+ 'videos-views': undefined, // Unlimited
+ 'activitypub-refresher': 60000 * 10 // 10 minutes
}
const REPEAT_JOBS: { [ id: string ]: EveryRepeatOptions | CronRepeatOptions } = {
'videos-views': {
- cron: '1 * * * *' // At 1 minutes past the hour
+ cron: '1 * * * *' // At 1 minute past the hour
}
}
FROM_ADDRESS: config.get<string>('smtp.from_address')
},
STORAGE: {
+ TMP_DIR: buildPath(config.get<string>('storage.tmp')),
AVATARS_DIR: buildPath(config.get<string>('storage.avatars')),
LOG_DIR: buildPath(config.get<string>('storage.logs')),
VIDEOS_DIR: buildPath(config.get<string>('storage.videos')),
+ REDUNDANCY_DIR: buildPath(config.get<string>('storage.redundancy')),
THUMBNAILS_DIR: buildPath(config.get<string>('storage.thumbnails')),
PREVIEWS_DIR: buildPath(config.get<string>('storage.previews')),
CAPTIONS_DIR: buildPath(config.get<string>('storage.captions')),
},
TRANSCODING: {
get ENABLED () { return config.get<boolean>('transcoding.enabled') },
+ get ALLOW_ADDITIONAL_EXTENSIONS () { return config.get<boolean>('transcoding.allow_additional_extensions') },
get THREADS () { return config.get<number>('transcoding.threads') },
RESOLUTIONS: {
get '240p' () { return config.get<boolean>('transcoding.resolutions.240p') },
get SECURITYTXT_CONTACT () { return config.get<string>('admin.email') }
},
SERVICES: {
+ get 'CSP-LOGGER' () { return config.get<string>('services.csp-logger') },
TWITTER: {
get USERNAME () { return config.get<string>('services.twitter.username') },
get WHITELISTED () { return config.get<boolean>('services.twitter.whitelisted') }
// ---------------------------------------------------------------------------
-const CONSTRAINTS_FIELDS = {
+let CONSTRAINTS_FIELDS = {
USERS: {
- NAME: { min: 3, max: 120 }, // Length
+ NAME: { min: 1, max: 120 }, // Length
DESCRIPTION: { min: 3, max: 1000 }, // Length
- USERNAME: { min: 3, max: 20 }, // Length
+ USERNAME: { min: 1, max: 50 }, // Length
PASSWORD: { min: 6, max: 255 }, // Length
VIDEO_QUOTA: { min: -1 },
VIDEO_QUOTA_DAILY: { min: -1 },
REASON: { min: 2, max: 300 } // Length
},
VIDEO_CHANNELS: {
- NAME: { min: 3, max: 120 }, // Length
+ NAME: { min: 1, max: 120 }, // Length
DESCRIPTION: { min: 3, max: 1000 }, // Length
SUPPORT: { min: 3, max: 1000 }, // Length
URL: { min: 3, max: 2000 } // Length
VIDEOS_REDUNDANCY: {
URL: { min: 3, max: 2000 } // Length
},
+ VIDEO_RATES: {
+ URL: { min: 3, max: 2000 } // Length
+ },
VIDEOS: {
NAME: { min: 3, max: 120 }, // Length
LANGUAGE: { min: 1, max: 10 }, // Length
max: 2 * 1024 * 1024 // 2MB
}
},
- EXTNAME: [ '.mp4', '.ogv', '.webm' ],
+ EXTNAME: buildVideosExtname(),
INFO_HASH: { min: 40, max: 40 }, // Length, info hash is 20 bytes length but we represent it in hexadecimal so 20 * 2
DURATION: { min: 0 }, // Number
TAGS: { min: 0, max: 5 }, // Number of total tags
[VideoAbuseState.ACCEPTED]: 'Accepted'
}
-const VIDEO_MIMETYPE_EXT = {
- 'video/webm': '.webm',
- 'video/ogg': '.ogv',
- 'video/mp4': '.mp4'
-}
-const VIDEO_EXT_MIMETYPE = invert(VIDEO_MIMETYPE_EXT)
-
-const IMAGE_MIMETYPE_EXT = {
- 'image/png': '.png',
- 'image/jpg': '.jpg',
- 'image/jpeg': '.jpg'
-}
-
-const VIDEO_CAPTIONS_MIMETYPE_EXT = {
- 'text/vtt': '.vtt',
- 'application/x-subrip': '.srt'
-}
-
-const TORRENT_MIMETYPE_EXT = {
- 'application/x-bittorrent': '.torrent'
+const MIMETYPES = {
+ VIDEO: {
+ MIMETYPE_EXT: buildVideoMimetypeExt(),
+ EXT_MIMETYPE: null as { [ id: string ]: string }
+ },
+ IMAGE: {
+ MIMETYPE_EXT: {
+ 'image/png': '.png',
+ 'image/jpg': '.jpg',
+ 'image/jpeg': '.jpg'
+ }
+ },
+ VIDEO_CAPTIONS: {
+ MIMETYPE_EXT: {
+ 'text/vtt': '.vtt',
+ 'application/x-subrip': '.srt'
+ }
+ },
+ TORRENT: {
+ MIMETYPE_EXT: {
+ 'application/x-bittorrent': '.torrent'
+ }
+ }
}
+MIMETYPES.VIDEO.EXT_MIMETYPE = invert(MIMETYPES.VIDEO.MIMETYPE_EXT)
// ---------------------------------------------------------------------------
COLLECTION_ITEMS_PER_PAGE: 10,
FETCH_PAGE_LIMIT: 100,
URL_MIME_TYPES: {
- VIDEO: Object.keys(VIDEO_MIMETYPE_EXT),
+ VIDEO: Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT),
TORRENT: [ 'application/x-bittorrent' ],
MAGNET: [ 'application/x-bittorrent;x-scheme-handler/magnet' ]
},
const HTTP_SIGNATURE = {
HEADER_NAME: 'signature',
ALGORITHM: 'rsa-sha256',
- HEADERS_TO_SIGN: [ 'date', 'host', 'digest', '(request-target)' ]
+ HEADERS_TO_SIGN: [ '(request-target)', 'host', 'date', 'digest' ]
}
// ---------------------------------------------------------------------------
-const PRIVATE_RSA_KEY_SIZE = 2048
+let PRIVATE_RSA_KEY_SIZE = 2048
// Password encryption
const BCRYPT_SALT_SIZE = 10
THUMBNAILS: '/static/thumbnails/',
TORRENTS: '/static/torrents/',
WEBSEED: '/static/webseed/',
+ REDUNDANCY: '/static/redundancy/',
AVATARS: '/static/avatars/',
VIDEO_CAPTIONS: '/static/video-captions/'
}
// Special constants for a test instance
if (isTestInstance() === true) {
+ PRIVATE_RSA_KEY_SIZE = 1024
+
ACTOR_FOLLOW_SCORE.BASE = 20
REMOTE_SCHEME.HTTP = 'http'
ROUTE_CACHE_LIFETIME.OVERVIEWS.VIDEOS = '0ms'
}
-updateWebserverConfig()
+updateWebserverUrls()
// ---------------------------------------------------------------------------
export {
API_VERSION,
- VIDEO_CAPTIONS_MIMETYPE_EXT,
AVATARS_SIZE,
ACCEPT_HEADERS,
BCRYPT_SALT_SIZE,
FEEDS,
JOB_TTL,
NSFW_POLICY_TYPES,
- TORRENT_MIMETYPE_EXT,
STATIC_MAX_AGE,
STATIC_PATHS,
VIDEO_IMPORT_TIMEOUT,
VIDEO_LICENCES,
VIDEO_STATES,
VIDEO_RATE_TYPES,
- VIDEO_MIMETYPE_EXT,
VIDEO_TRANSCODING_FPS,
FFMPEG_NICE,
VIDEO_ABUSE_STATES,
USER_PASSWORD_RESET_LIFETIME,
MEMOIZE_TTL,
USER_EMAIL_VERIFY_LIFETIME,
- IMAGE_MIMETYPE_EXT,
OVERVIEWS,
SCHEDULER_INTERVALS_MS,
REPEAT_JOBS,
STATIC_DOWNLOAD_PATHS,
RATES_LIMIT,
- VIDEO_EXT_MIMETYPE,
+ MIMETYPES,
CRAWL_REQUEST_CONCURRENCY,
JOB_COMPLETED_LIFETIME,
HTTP_SIGNATURE,
return join(dirname(configSources[ 0 ].name), filename + '.json')
}
-function updateWebserverConfig () {
+function buildVideoMimetypeExt () {
+ const data = {
+ 'video/webm': '.webm',
+ 'video/ogg': '.ogv',
+ 'video/mp4': '.mp4'
+ }
+
+ if (CONFIG.TRANSCODING.ENABLED && CONFIG.TRANSCODING.ALLOW_ADDITIONAL_EXTENSIONS) {
+ Object.assign(data, {
+ 'video/quicktime': '.mov',
+ 'video/x-msvideo': '.avi',
+ 'video/x-flv': '.flv',
+ 'video/x-matroska': '.mkv'
+ })
+ }
+
+ return data
+}
+
+function updateWebserverUrls () {
CONFIG.WEBSERVER.URL = sanitizeUrl(CONFIG.WEBSERVER.SCHEME + '://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT)
CONFIG.WEBSERVER.HOST = sanitizeHost(CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT, REMOTE_SCHEME.HTTP)
}
+function updateWebserverConfig () {
+ CONSTRAINTS_FIELDS.VIDEOS.EXTNAME = buildVideosExtname()
+
+ MIMETYPES.VIDEO.MIMETYPE_EXT = buildVideoMimetypeExt()
+ MIMETYPES.VIDEO.EXT_MIMETYPE = invert(MIMETYPES.VIDEO.MIMETYPE_EXT)
+}
+
+function buildVideosExtname () {
+ return CONFIG.TRANSCODING.ENABLED && CONFIG.TRANSCODING.ALLOW_ADDITIONAL_EXTENSIONS
+ ? [ '.mp4', '.ogv', '.webm', '.mkv', '.mov', '.avi', '.flv' ]
+ : [ '.mp4', '.ogv', '.webm' ]
+}
+
function buildVideosRedundancy (objs: any[]): VideosRedundancy[] {
if (!objs) return []
return objs.map(obj => {
- return Object.assign(obj, {
+ return Object.assign({}, obj, {
minLifetime: parseDuration(obj.min_lifetime),
size: bytes.parse(obj.size),
minViews: obj.min_views
config = require('config')
updateWebserverConfig()
+ updateWebserverUrls()
}