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