]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/videos.ts
Client: handle multiple file resolutions
[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
b60e5f38 110function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
f6f7dfee
C
111 // Should have files
112 if (!files) return false
b60e5f38 113 if (isArray(files)) return false
f6f7dfee
C
114
115 // Should have videofile file
b60e5f38 116 const videofile = files['videofile']
f6f7dfee
C
117 if (!videofile || videofile.length === 0) return false
118
119 // The file should exist
120 const file = videofile[0]
121 if (!file || !file.originalname) return false
122
123 return new RegExp('^video/(webm|mp4|ogg)$', 'i').test(file.mimetype)
124}
125
93e1258c
C
126function isVideoFileSizeValid (value: string) {
127 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
128}
129
130function isVideoFileResolutionValid (value: string) {
131 return VIDEO_FILE_RESOLUTIONS[value] !== undefined
132}
133
134function isVideoFileExtnameValid (value: string) {
135 return VIDEOS_CONSTRAINTS_FIELDS.EXTNAME.indexOf(value) !== -1
136}
137
138function isVideoFileInfoHashValid (value: string) {
139 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
140}
141
55fa55a9
C
142// ---------------------------------------------------------------------------
143
65fcc311 144export {
0a6658fd 145 isVideoIdOrUUIDValid,
65fcc311
C
146 isVideoAuthorValid,
147 isVideoDateValid,
148 isVideoCategoryValid,
149 isVideoLicenceValid,
150 isVideoLanguageValid,
151 isVideoNSFWValid,
152 isVideoDescriptionValid,
153 isVideoDurationValid,
93e1258c 154 isVideoFileInfoHashValid,
65fcc311
C
155 isVideoNameValid,
156 isVideoTagsValid,
157 isVideoThumbnailValid,
158 isVideoThumbnailDataValid,
93e1258c 159 isVideoFileExtnameValid,
0a6658fd 160 isVideoUUIDValid,
65fcc311
C
161 isVideoAbuseReasonValid,
162 isVideoAbuseReporterUsernameValid,
163 isVideoFile,
164 isVideoViewsValid,
165 isVideoLikesValid,
166 isVideoRatingTypeValid,
167 isVideoDislikesValid,
93e1258c
C
168 isVideoEventCountValid,
169 isVideoFileSizeValid,
170 isVideoFileResolutionValid
65fcc311 171}