]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/videos.ts
Fix express validator
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
1 import { values } from 'lodash'
2 import * as validator from 'validator'
3 import { VideoFilter, VideoPrivacy, VideoRateType } from '../../../shared'
4 import {
5 CONSTRAINTS_FIELDS,
6 MIMETYPES,
7 VIDEO_CATEGORIES,
8 VIDEO_LICENCES,
9 VIDEO_PRIVACIES,
10 VIDEO_RATE_TYPES,
11 VIDEO_STATES
12 } from '../../initializers/constants'
13 import { exists, isArray, isDateValid, isFileValid } from './misc'
14 import * as magnetUtil from 'magnet-uri'
15
16 const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
17
18 function isVideoFilterValid (filter: VideoFilter) {
19 return filter === 'local' || filter === 'all-local'
20 }
21
22 function isVideoCategoryValid (value: any) {
23 return value === null || VIDEO_CATEGORIES[ value ] !== undefined
24 }
25
26 function isVideoStateValid (value: any) {
27 return exists(value) && VIDEO_STATES[ value ] !== undefined
28 }
29
30 function isVideoLicenceValid (value: any) {
31 return value === null || VIDEO_LICENCES[ value ] !== undefined
32 }
33
34 function isVideoLanguageValid (value: any) {
35 return value === null ||
36 (typeof value === 'string' && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.LANGUAGE))
37 }
38
39 function isVideoDurationValid (value: string) {
40 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
41 }
42
43 function isVideoTruncatedDescriptionValid (value: string) {
44 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
45 }
46
47 function isVideoDescriptionValid (value: string) {
48 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
49 }
50
51 function isVideoSupportValid (value: string) {
52 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.SUPPORT))
53 }
54
55 function isVideoNameValid (value: string) {
56 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
57 }
58
59 function isVideoTagValid (tag: string) {
60 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
61 }
62
63 function isVideoTagsValid (tags: string[]) {
64 return tags === null || (
65 isArray(tags) &&
66 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
67 tags.every(tag => isVideoTagValid(tag))
68 )
69 }
70
71 function isVideoViewsValid (value: string) {
72 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
73 }
74
75 function isVideoRatingTypeValid (value: string) {
76 return value === 'none' || values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
77 }
78
79 function isVideoFileExtnameValid (value: string) {
80 return exists(value) && MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined
81 }
82
83 function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
84 const videoFileTypesRegex = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
85 .map(m => `(${m})`)
86 .join('|')
87
88 return isFileValid(files, videoFileTypesRegex, 'videofile', null)
89 }
90
91 const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
92 .map(v => v.replace('.', ''))
93 .join('|')
94 const videoImageTypesRegex = `image/(${videoImageTypes})`
95
96 function isVideoImage (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
97 return isFileValid(files, videoImageTypesRegex, field, CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max, true)
98 }
99
100 function isVideoPrivacyValid (value: number) {
101 return validator.isInt(value + '') && VIDEO_PRIVACIES[ value ] !== undefined
102 }
103
104 function isScheduleVideoUpdatePrivacyValid (value: number) {
105 return validator.isInt(value + '') &&
106 (
107 value === VideoPrivacy.UNLISTED ||
108 value === VideoPrivacy.PUBLIC
109 )
110 }
111
112 function isVideoOriginallyPublishedAtValid (value: string | null) {
113 return value === null || isDateValid(value)
114 }
115
116 function isVideoFileInfoHashValid (value: string | null | undefined) {
117 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
118 }
119
120 function isVideoFileResolutionValid (value: string) {
121 return exists(value) && validator.isInt(value + '')
122 }
123
124 function isVideoFPSResolutionValid (value: string) {
125 return value === null || validator.isInt(value + '')
126 }
127
128 function isVideoFileSizeValid (value: string) {
129 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
130 }
131
132 function isVideoMagnetUriValid (value: string) {
133 if (!exists(value)) return false
134
135 const parsed = magnetUtil.decode(value)
136 return parsed && isVideoFileInfoHashValid(parsed.infoHash)
137 }
138
139 // ---------------------------------------------------------------------------
140
141 export {
142 isVideoCategoryValid,
143 isVideoLicenceValid,
144 isVideoLanguageValid,
145 isVideoTruncatedDescriptionValid,
146 isVideoDescriptionValid,
147 isVideoFileInfoHashValid,
148 isVideoNameValid,
149 isVideoTagsValid,
150 isVideoFPSResolutionValid,
151 isScheduleVideoUpdatePrivacyValid,
152 isVideoOriginallyPublishedAtValid,
153 isVideoFile,
154 isVideoMagnetUriValid,
155 isVideoStateValid,
156 isVideoViewsValid,
157 isVideoRatingTypeValid,
158 isVideoFileExtnameValid,
159 isVideoDurationValid,
160 isVideoTagValid,
161 isVideoPrivacyValid,
162 isVideoFileResolutionValid,
163 isVideoFileSizeValid,
164 isVideoImage,
165 isVideoSupportValid,
166 isVideoFilterValid
167 }