]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/videos.ts
Remove unnecessary NPM_RUN_BUILD_OPTS docker arg
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
CommitLineData
f6d6e7f8 1import { UploadFilesForCheck } from 'express'
79d5caf9 2import { values } from 'lodash'
41fb13c3 3import magnetUtil from 'magnet-uri'
7cde3b9c 4import validator from 'validator'
d17c7b4e 5import { VideoFilter, VideoInclude, VideoPrivacy, VideoRateType } from '@shared/models'
3fd3ab2d 6import {
8f0bc73d
C
7 CONSTRAINTS_FIELDS,
8 MIMETYPES,
3fd3ab2d 9 VIDEO_CATEGORIES,
28be8916 10 VIDEO_LICENCES,
f6d6e7f8 11 VIDEO_LIVE,
3fd3ab2d 12 VIDEO_PRIVACIES,
2186386c 13 VIDEO_RATE_TYPES,
f6d6e7f8 14 VIDEO_STATES
74dc3bca 15} from '../../initializers/constants'
f2eb23cd 16import { exists, isArray, isDateValid, isFileMimeTypeValid, isFileValid } from './misc'
65fcc311
C
17
18const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
0b697522 19
1cd3facc 20function isVideoFilterValid (filter: VideoFilter) {
0aa52e17 21 return filter === 'local' || filter === 'all-local' || filter === 'all'
1cd3facc
C
22}
23
2760b454
C
24function isVideoIncludeValid (include: VideoInclude) {
25 return exists(include) && validator.isInt('' + include)
26}
27
9d3ef9fe 28function isVideoCategoryValid (value: any) {
a1587156 29 return value === null || VIDEO_CATEGORIES[value] !== undefined
2186386c
C
30}
31
32function isVideoStateValid (value: any) {
a1587156 33 return exists(value) && VIDEO_STATES[value] !== undefined
6e07c3de
C
34}
35
9d3ef9fe 36function isVideoLicenceValid (value: any) {
a1587156 37 return value === null || VIDEO_LICENCES[value] !== undefined
6f0c39e2
C
38}
39
9d3ef9fe
C
40function isVideoLanguageValid (value: any) {
41 return value === null ||
42 (typeof value === 'string' && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.LANGUAGE))
3092476e
C
43}
44
8e10cf1a
C
45function isVideoDurationValid (value: string) {
46 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
47}
48
9567011b
C
49function isVideoTruncatedDescriptionValid (value: string) {
50 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
51}
52
69818c93 53function isVideoDescriptionValid (value: string) {
f595d394 54 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
be587647
C
55}
56
2422c46b
C
57function isVideoSupportValid (value: string) {
58 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.SUPPORT))
59}
60
69818c93
C
61function isVideoNameValid (value: string) {
62 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
be587647
C
63}
64
0d0e8dd0
C
65function isVideoTagValid (tag: string) {
66 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
67}
68
69818c93 69function isVideoTagsValid (tags: string[]) {
2efd32f6
C
70 return tags === null || (
71 isArray(tags) &&
72 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
73 tags.every(tag => isVideoTagValid(tag))
74 )
be587647
C
75}
76
69818c93
C
77function isVideoViewsValid (value: string) {
78 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
9e167724
C
79}
80
69818c93 81function isVideoRatingTypeValid (value: string) {
bdd428a6 82 return value === 'none' || values(VIDEO_RATE_TYPES).includes(value as VideoRateType)
d38b8281
C
83}
84
14e2014a 85function isVideoFileExtnameValid (value: string) {
c6c0fa6c 86 return exists(value) && (value === VIDEO_LIVE.EXTENSION || MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined)
14e2014a 87}
2186386c 88
f6d6e7f8 89function isVideoFileMimeTypeValid (files: UploadFilesForCheck) {
f2eb23cd 90 return isFileMimeTypeValid(files, MIMETYPES.VIDEO.MIMETYPES_REGEX, 'videofile')
ac81d1a0 91}
f6f7dfee 92
ac81d1a0 93const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
2186386c
C
94 .map(v => v.replace('.', ''))
95 .join('|')
ac81d1a0 96const videoImageTypesRegex = `image/(${videoImageTypes})`
2186386c 97
ac81d1a0 98function isVideoImage (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
0c237b19 99 return isFileValid(files, videoImageTypesRegex, field, CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max, true)
f6f7dfee
C
100}
101
2baea0c7 102function isVideoPrivacyValid (value: number) {
a1587156 103 return VIDEO_PRIVACIES[value] !== undefined
d4f1e94c
C
104}
105
2baea0c7 106function isScheduleVideoUpdatePrivacyValid (value: number) {
22a73cb8 107 return value === VideoPrivacy.UNLISTED || value === VideoPrivacy.PUBLIC || value === VideoPrivacy.INTERNAL
2baea0c7
C
108}
109
1e74f19a 110function isVideoOriginallyPublishedAtValid (value: string | null) {
111 return value === null || isDateValid(value)
112}
113
2cebd797 114function isVideoFileInfoHashValid (value: string | null | undefined) {
93e1258c
C
115 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
116}
117
d4f1e94c
C
118function isVideoFileResolutionValid (value: string) {
119 return exists(value) && validator.isInt(value + '')
120}
121
3a6f351b
C
122function isVideoFPSResolutionValid (value: string) {
123 return value === null || validator.isInt(value + '')
124}
125
d4f1e94c
C
126function isVideoFileSizeValid (value: string) {
127 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
8d468a16
C
128}
129
ce33919c
C
130function isVideoMagnetUriValid (value: string) {
131 if (!exists(value)) return false
132
133 const parsed = magnetUtil.decode(value)
134 return parsed && isVideoFileInfoHashValid(parsed.infoHash)
135}
136
55fa55a9
C
137// ---------------------------------------------------------------------------
138
65fcc311 139export {
65fcc311
C
140 isVideoCategoryValid,
141 isVideoLicenceValid,
142 isVideoLanguageValid,
9567011b 143 isVideoTruncatedDescriptionValid,
65fcc311 144 isVideoDescriptionValid,
93e1258c 145 isVideoFileInfoHashValid,
65fcc311
C
146 isVideoNameValid,
147 isVideoTagsValid,
3a6f351b 148 isVideoFPSResolutionValid,
2baea0c7 149 isScheduleVideoUpdatePrivacyValid,
1e74f19a 150 isVideoOriginallyPublishedAtValid,
ce33919c 151 isVideoMagnetUriValid,
2186386c 152 isVideoStateValid,
2760b454 153 isVideoIncludeValid,
65fcc311 154 isVideoViewsValid,
65fcc311 155 isVideoRatingTypeValid,
14e2014a 156 isVideoFileExtnameValid,
f2eb23cd 157 isVideoFileMimeTypeValid,
8e10cf1a 158 isVideoDurationValid,
0d0e8dd0 159 isVideoTagValid,
8d468a16 160 isVideoPrivacyValid,
d4f1e94c
C
161 isVideoFileResolutionValid,
162 isVideoFileSizeValid,
2422c46b 163 isVideoImage,
1cd3facc
C
164 isVideoSupportValid,
165 isVideoFilterValid
65fcc311 166}