]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/videos.ts
Add info when server is processing a video at upload
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
CommitLineData
65fcc311 1import { values } from 'lodash'
4d4e5cd4 2import * as validator from 'validator'
fdbda9e3 3import 'express-validator'
1840c2f7 4import 'multer'
65fcc311
C
5
6import {
7 CONSTRAINTS_FIELDS,
8 VIDEO_CATEGORIES,
9 VIDEO_LICENCES,
10 VIDEO_LANGUAGES,
93e1258c
C
11 VIDEO_RATE_TYPES,
12 VIDEO_FILE_RESOLUTIONS
65fcc311
C
13} from '../../initializers'
14import { isUserUsernameValid } from './users'
69818c93 15import { isArray, exists } from './misc'
ee9e7b61 16import { VideoRateType } from '../../../shared'
65fcc311
C
17
18const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
19const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
20const VIDEO_EVENTS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_EVENTS
0b697522 21
0a6658fd
C
22function isVideoIdOrUUIDValid (value: string) {
23 return validator.isInt(value) || isVideoUUIDValid(value)
24}
25
69818c93 26function isVideoAuthorValid (value: string) {
65fcc311 27 return isUserUsernameValid(value)
be587647
C
28}
29
69818c93
C
30function isVideoDateValid (value: string) {
31 return exists(value) && validator.isISO8601(value)
be587647
C
32}
33
69818c93 34function isVideoCategoryValid (value: number) {
65fcc311 35 return VIDEO_CATEGORIES[value] !== undefined
6e07c3de
C
36}
37
69818c93 38function isVideoLicenceValid (value: number) {
65fcc311 39 return VIDEO_LICENCES[value] !== undefined
6f0c39e2
C
40}
41
69818c93 42function isVideoLanguageValid (value: number) {
65fcc311 43 return value === null || VIDEO_LANGUAGES[value] !== undefined
3092476e
C
44}
45
69818c93
C
46function isVideoNSFWValid (value: any) {
47 return typeof value === 'boolean' || (typeof value === 'string' && validator.isBoolean(value))
31b59b47
C
48}
49
69818c93
C
50function isVideoDescriptionValid (value: string) {
51 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION)
be587647
C
52}
53
69818c93
C
54function isVideoDurationValid (value: string) {
55 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
be587647
C
56}
57
69818c93
C
58function isVideoNameValid (value: string) {
59 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
be587647
C
60}
61
69818c93 62function isVideoTagsValid (tags: string[]) {
65fcc311 63 return isArray(tags) &&
69818c93 64 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
075f16ca 65 tags.every(tag => {
69818c93 66 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
be587647
C
67 })
68}
69
69818c93
C
70function isVideoThumbnailValid (value: string) {
71 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL)
aaf61f38
C
72}
73
69818c93
C
74function isVideoThumbnailDataValid (value: string) {
75 return exists(value) && validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL_DATA)
be587647
C
76}
77
0a6658fd
C
78function isVideoUUIDValid (value: string) {
79 return exists(value) && validator.isUUID('' + value, 4)
558d7c23
C
80}
81
69818c93
C
82function isVideoAbuseReasonValid (value: string) {
83 return exists(value) && validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON)
e4c55619
C
84}
85
69818c93 86function isVideoAbuseReporterUsernameValid (value: string) {
65fcc311 87 return isUserUsernameValid(value)
3d118fb5
C
88}
89
69818c93
C
90function isVideoViewsValid (value: string) {
91 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
9e167724
C
92}
93
69818c93
C
94function isVideoLikesValid (value: string) {
95 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.LIKES)
9e167724
C
96}
97
69818c93
C
98function isVideoDislikesValid (value: string) {
99 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DISLIKES)
e4c87ec2
C
100}
101
69818c93
C
102function isVideoEventCountValid (value: string) {
103 return exists(value) && validator.isInt(value + '', VIDEO_EVENTS_CONSTRAINTS_FIELDS.COUNT)
9e167724
C
104}
105
69818c93 106function isVideoRatingTypeValid (value: string) {
ee9e7b61 107 return values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
d38b8281
C
108}
109
69818c93 110function isVideoFile (value: string, files: { [ fieldname: string ]: Express.Multer.File[] }) {
f6f7dfee
C
111 // Should have files
112 if (!files) return false
113
114 // Should have videofile file
115 const videofile = files.videofile
116 if (!videofile || videofile.length === 0) return false
117
118 // The file should exist
119 const file = videofile[0]
120 if (!file || !file.originalname) return false
121
122 return new RegExp('^video/(webm|mp4|ogg)$', 'i').test(file.mimetype)
123}
124
93e1258c
C
125function isVideoFileSizeValid (value: string) {
126 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
127}
128
129function isVideoFileResolutionValid (value: string) {
130 return VIDEO_FILE_RESOLUTIONS[value] !== undefined
131}
132
133function isVideoFileExtnameValid (value: string) {
134 return VIDEOS_CONSTRAINTS_FIELDS.EXTNAME.indexOf(value) !== -1
135}
136
137function isVideoFileInfoHashValid (value: string) {
138 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
139}
140
55fa55a9
C
141// ---------------------------------------------------------------------------
142
65fcc311 143export {
0a6658fd 144 isVideoIdOrUUIDValid,
65fcc311
C
145 isVideoAuthorValid,
146 isVideoDateValid,
147 isVideoCategoryValid,
148 isVideoLicenceValid,
149 isVideoLanguageValid,
150 isVideoNSFWValid,
151 isVideoDescriptionValid,
152 isVideoDurationValid,
93e1258c 153 isVideoFileInfoHashValid,
65fcc311
C
154 isVideoNameValid,
155 isVideoTagsValid,
156 isVideoThumbnailValid,
157 isVideoThumbnailDataValid,
93e1258c 158 isVideoFileExtnameValid,
0a6658fd 159 isVideoUUIDValid,
65fcc311
C
160 isVideoAbuseReasonValid,
161 isVideoAbuseReporterUsernameValid,
162 isVideoFile,
163 isVideoViewsValid,
164 isVideoLikesValid,
165 isVideoRatingTypeValid,
166 isVideoDislikesValid,
93e1258c
C
167 isVideoEventCountValid,
168 isVideoFileSizeValid,
169 isVideoFileResolutionValid
65fcc311 170}
69818c93 171
556ddc31
C
172declare module 'express-validator' {
173 export interface Validator {
174 isVideoIdOrUUIDValid,
175 isVideoAuthorValid,
176 isVideoDateValid,
177 isVideoCategoryValid,
178 isVideoLicenceValid,
179 isVideoLanguageValid,
180 isVideoNSFWValid,
181 isVideoDescriptionValid,
182 isVideoDurationValid,
183 isVideoInfoHashValid,
184 isVideoNameValid,
185 isVideoTagsValid,
186 isVideoThumbnailValid,
187 isVideoThumbnailDataValid,
188 isVideoExtnameValid,
189 isVideoUUIDValid,
190 isVideoAbuseReasonValid,
191 isVideoAbuseReporterUsernameValid,
192 isVideoFile,
193 isVideoViewsValid,
194 isVideoLikesValid,
195 isVideoRatingTypeValid,
196 isVideoDislikesValid,
197 isVideoEventCountValid,
198 isVideoFileSizeValid,
199 isVideoFileResolutionValid
69818c93
C
200 }
201}