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