]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/videos.ts
Prefer using Object.values
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
CommitLineData
f6d6e7f8 1import { UploadFilesForCheck } from 'express'
41fb13c3 2import magnetUtil from 'magnet-uri'
7cde3b9c 3import validator from 'validator'
d17c7b4e 4import { VideoFilter, VideoInclude, VideoPrivacy, VideoRateType } from '@shared/models'
3fd3ab2d 5import {
8f0bc73d
C
6 CONSTRAINTS_FIELDS,
7 MIMETYPES,
3fd3ab2d 8 VIDEO_CATEGORIES,
28be8916 9 VIDEO_LICENCES,
f6d6e7f8 10 VIDEO_LIVE,
3fd3ab2d 11 VIDEO_PRIVACIES,
2186386c 12 VIDEO_RATE_TYPES,
f6d6e7f8 13 VIDEO_STATES
74dc3bca 14} from '../../initializers/constants'
c729caf6 15import { exists, isArray, isDateValid, isFileValid } from './misc'
65fcc311
C
16
17const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
0b697522 18
1cd3facc 19function isVideoFilterValid (filter: VideoFilter) {
0aa52e17 20 return filter === 'local' || filter === 'all-local' || filter === 'all'
1cd3facc
C
21}
22
2760b454
C
23function isVideoIncludeValid (include: VideoInclude) {
24 return exists(include) && validator.isInt('' + include)
25}
26
9d3ef9fe 27function isVideoCategoryValid (value: any) {
a1587156 28 return value === null || VIDEO_CATEGORIES[value] !== undefined
2186386c
C
29}
30
31function isVideoStateValid (value: any) {
a1587156 32 return exists(value) && VIDEO_STATES[value] !== undefined
6e07c3de
C
33}
34
9d3ef9fe 35function isVideoLicenceValid (value: any) {
a1587156 36 return value === null || VIDEO_LICENCES[value] !== undefined
6f0c39e2
C
37}
38
9d3ef9fe
C
39function isVideoLanguageValid (value: any) {
40 return value === null ||
41 (typeof value === 'string' && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.LANGUAGE))
3092476e
C
42}
43
8e10cf1a
C
44function isVideoDurationValid (value: string) {
45 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
46}
47
9567011b
C
48function isVideoTruncatedDescriptionValid (value: string) {
49 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
50}
51
69818c93 52function isVideoDescriptionValid (value: string) {
f595d394 53 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
be587647
C
54}
55
2422c46b
C
56function isVideoSupportValid (value: string) {
57 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.SUPPORT))
58}
59
69818c93
C
60function isVideoNameValid (value: string) {
61 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
be587647
C
62}
63
0d0e8dd0
C
64function isVideoTagValid (tag: string) {
65 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
66}
67
c729caf6 68function areVideoTagsValid (tags: string[]) {
2efd32f6
C
69 return tags === null || (
70 isArray(tags) &&
71 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
72 tags.every(tag => isVideoTagValid(tag))
73 )
be587647
C
74}
75
69818c93
C
76function isVideoViewsValid (value: string) {
77 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
9e167724
C
78}
79
690bb8f9 80const ratingTypes = new Set(Object.values(VIDEO_RATE_TYPES))
69818c93 81function isVideoRatingTypeValid (value: string) {
690bb8f9 82 return value === 'none' || ratingTypes.has(value as VideoRateType)
d38b8281
C
83}
84
14e2014a 85function isVideoFileExtnameValid (value: string) {
c6c0fa6c 86 return exists(value) && (value === VIDEO_LIVE.EXTENSION || MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined)
14e2014a 87}
2186386c 88
c729caf6
C
89function isVideoFileMimeTypeValid (files: UploadFilesForCheck, field = 'videofile') {
90 return isFileValid({
91 files,
92 mimeTypeRegex: MIMETYPES.VIDEO.MIMETYPES_REGEX,
93 field,
94 maxSize: null
95 })
ac81d1a0 96}
f6f7dfee 97
ac81d1a0 98const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
2186386c
C
99 .map(v => v.replace('.', ''))
100 .join('|')
ac81d1a0 101const videoImageTypesRegex = `image/(${videoImageTypes})`
2186386c 102
c729caf6
C
103function isVideoImageValid (files: UploadFilesForCheck, field: string, optional = true) {
104 return isFileValid({
105 files,
106 mimeTypeRegex: videoImageTypesRegex,
107 field,
108 maxSize: CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max,
109 optional
110 })
f6f7dfee
C
111}
112
2baea0c7 113function isVideoPrivacyValid (value: number) {
a1587156 114 return VIDEO_PRIVACIES[value] !== undefined
d4f1e94c
C
115}
116
2baea0c7 117function isScheduleVideoUpdatePrivacyValid (value: number) {
22a73cb8 118 return value === VideoPrivacy.UNLISTED || value === VideoPrivacy.PUBLIC || value === VideoPrivacy.INTERNAL
2baea0c7
C
119}
120
1e74f19a 121function isVideoOriginallyPublishedAtValid (value: string | null) {
122 return value === null || isDateValid(value)
123}
124
2cebd797 125function isVideoFileInfoHashValid (value: string | null | undefined) {
93e1258c
C
126 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
127}
128
d4f1e94c
C
129function isVideoFileResolutionValid (value: string) {
130 return exists(value) && validator.isInt(value + '')
131}
132
3a6f351b
C
133function isVideoFPSResolutionValid (value: string) {
134 return value === null || validator.isInt(value + '')
135}
136
d4f1e94c
C
137function isVideoFileSizeValid (value: string) {
138 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
8d468a16
C
139}
140
ce33919c
C
141function isVideoMagnetUriValid (value: string) {
142 if (!exists(value)) return false
143
144 const parsed = magnetUtil.decode(value)
145 return parsed && isVideoFileInfoHashValid(parsed.infoHash)
146}
147
55fa55a9
C
148// ---------------------------------------------------------------------------
149
65fcc311 150export {
65fcc311
C
151 isVideoCategoryValid,
152 isVideoLicenceValid,
153 isVideoLanguageValid,
9567011b 154 isVideoTruncatedDescriptionValid,
65fcc311 155 isVideoDescriptionValid,
93e1258c 156 isVideoFileInfoHashValid,
65fcc311 157 isVideoNameValid,
c729caf6 158 areVideoTagsValid,
3a6f351b 159 isVideoFPSResolutionValid,
2baea0c7 160 isScheduleVideoUpdatePrivacyValid,
1e74f19a 161 isVideoOriginallyPublishedAtValid,
ce33919c 162 isVideoMagnetUriValid,
2186386c 163 isVideoStateValid,
2760b454 164 isVideoIncludeValid,
65fcc311 165 isVideoViewsValid,
65fcc311 166 isVideoRatingTypeValid,
14e2014a 167 isVideoFileExtnameValid,
f2eb23cd 168 isVideoFileMimeTypeValid,
8e10cf1a 169 isVideoDurationValid,
0d0e8dd0 170 isVideoTagValid,
8d468a16 171 isVideoPrivacyValid,
d4f1e94c
C
172 isVideoFileResolutionValid,
173 isVideoFileSizeValid,
c729caf6 174 isVideoImageValid,
1cd3facc
C
175 isVideoSupportValid,
176 isVideoFilterValid
65fcc311 177}