]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/videos.ts
/!\ Use a dedicated config file for development
[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'
d17c7b4e 5import { VideoFilter, VideoInclude, VideoPrivacy, VideoRateType } from '@shared/models'
3fd3ab2d 6import {
8f0bc73d
C
7 CONSTRAINTS_FIELDS,
8 MIMETYPES,
3fd3ab2d 9 VIDEO_CATEGORIES,
28be8916 10 VIDEO_LICENCES,
f6d6e7f8 11 VIDEO_LIVE,
3fd3ab2d 12 VIDEO_PRIVACIES,
2186386c 13 VIDEO_RATE_TYPES,
f6d6e7f8 14 VIDEO_STATES
74dc3bca 15} from '../../initializers/constants'
c729caf6 16import { exists, isArray, isDateValid, isFileValid } from './misc'
65fcc311
C
17
18const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
0b697522 19
1cd3facc 20function isVideoFilterValid (filter: VideoFilter) {
0aa52e17 21 return filter === 'local' || filter === 'all-local' || filter === 'all'
1cd3facc
C
22}
23
2760b454
C
24function isVideoIncludeValid (include: VideoInclude) {
25 return exists(include) && validator.isInt('' + include)
26}
27
9d3ef9fe 28function isVideoCategoryValid (value: any) {
a1587156 29 return value === null || VIDEO_CATEGORIES[value] !== undefined
2186386c
C
30}
31
32function isVideoStateValid (value: any) {
a1587156 33 return exists(value) && VIDEO_STATES[value] !== undefined
6e07c3de
C
34}
35
9d3ef9fe 36function isVideoLicenceValid (value: any) {
a1587156 37 return value === null || VIDEO_LICENCES[value] !== undefined
6f0c39e2
C
38}
39
9d3ef9fe
C
40function isVideoLanguageValid (value: any) {
41 return value === null ||
42 (typeof value === 'string' && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.LANGUAGE))
3092476e
C
43}
44
8e10cf1a
C
45function isVideoDurationValid (value: string) {
46 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
47}
48
9567011b
C
49function isVideoTruncatedDescriptionValid (value: string) {
50 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
51}
52
69818c93 53function isVideoDescriptionValid (value: string) {
f595d394 54 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
be587647
C
55}
56
2422c46b
C
57function isVideoSupportValid (value: string) {
58 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.SUPPORT))
59}
60
69818c93
C
61function isVideoNameValid (value: string) {
62 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
be587647
C
63}
64
0d0e8dd0
C
65function isVideoTagValid (tag: string) {
66 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
67}
68
c729caf6 69function areVideoTagsValid (tags: string[]) {
2efd32f6
C
70 return tags === null || (
71 isArray(tags) &&
72 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
73 tags.every(tag => isVideoTagValid(tag))
74 )
be587647
C
75}
76
69818c93
C
77function isVideoViewsValid (value: string) {
78 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
9e167724
C
79}
80
69818c93 81function isVideoRatingTypeValid (value: string) {
bdd428a6 82 return value === 'none' || values(VIDEO_RATE_TYPES).includes(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}