]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/videos.ts
Update server dependencies
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
1 import { UploadFilesForCheck } from 'express'
2 import { decode as magnetUriDecode } from 'magnet-uri'
3 import validator from 'validator'
4 import { VideoFilter, VideoInclude, VideoPrivacy, VideoRateType } from '@shared/models'
5 import {
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'
15 import { exists, isArray, isDateValid, isFileValid } from './misc'
16
17 const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
18
19 function isVideoFilterValid (filter: VideoFilter) {
20 return filter === 'local' || filter === 'all-local' || filter === 'all'
21 }
22
23 function isVideoIncludeValid (include: VideoInclude) {
24 return exists(include) && validator.isInt('' + include)
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 isVideoDescriptionValid (value: string) {
49 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
50 }
51
52 function isVideoSupportValid (value: string) {
53 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.SUPPORT))
54 }
55
56 function isVideoNameValid (value: string) {
57 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
58 }
59
60 function isVideoTagValid (tag: string) {
61 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
62 }
63
64 function 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
72 function isVideoViewsValid (value: string) {
73 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
74 }
75
76 const ratingTypes = new Set(Object.values(VIDEO_RATE_TYPES))
77 function isVideoRatingTypeValid (value: string) {
78 return value === 'none' || ratingTypes.has(value as VideoRateType)
79 }
80
81 function isVideoFileExtnameValid (value: string) {
82 return exists(value) && (value === VIDEO_LIVE.EXTENSION || MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined)
83 }
84
85 function isVideoFileMimeTypeValid (files: UploadFilesForCheck, field = 'videofile') {
86 return isFileValid({
87 files,
88 mimeTypeRegex: MIMETYPES.VIDEO.MIMETYPES_REGEX,
89 field,
90 maxSize: null
91 })
92 }
93
94 const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
95 .map(v => v.replace('.', ''))
96 .join('|')
97 const videoImageTypesRegex = `image/(${videoImageTypes})`
98
99 function 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
109 function isVideoPrivacyValid (value: number) {
110 return VIDEO_PRIVACIES[value] !== undefined
111 }
112
113 function isScheduleVideoUpdatePrivacyValid (value: number) {
114 return value === VideoPrivacy.UNLISTED || value === VideoPrivacy.PUBLIC || value === VideoPrivacy.INTERNAL
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 = magnetUriDecode(value)
141 return parsed && isVideoFileInfoHashValid(parsed.infoHash)
142 }
143
144 // ---------------------------------------------------------------------------
145
146 export {
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 }