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