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