]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/videos.ts
Add hooks documentation
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
CommitLineData
8d468a16 1import { Response } from 'express'
fdbda9e3 2import 'express-validator'
79d5caf9 3import { values } from 'lodash'
1840c2f7 4import 'multer'
79d5caf9 5import * as validator from 'validator'
1cd3facc 6import { UserRight, VideoFilter, VideoPrivacy, VideoRateType } from '../../../shared'
3fd3ab2d 7import {
8f0bc73d
C
8 CONSTRAINTS_FIELDS,
9 MIMETYPES,
3fd3ab2d 10 VIDEO_CATEGORIES,
28be8916 11 VIDEO_LICENCES,
3fd3ab2d 12 VIDEO_PRIVACIES,
2186386c
C
13 VIDEO_RATE_TYPES,
14 VIDEO_STATES
74dc3bca 15} from '../../initializers/constants'
3fd3ab2d 16import { VideoModel } from '../../models/video/video'
1e74f19a 17import { exists, isArray, isDateValid, isFileValid } from './misc'
6200d8d9 18import { UserModel } from '../../models/account/user'
ce33919c 19import * as magnetUtil from 'magnet-uri'
65fcc311
C
20
21const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
0b697522 22
1cd3facc
C
23function isVideoFilterValid (filter: VideoFilter) {
24 return filter === 'local' || filter === 'all-local'
25}
26
9d3ef9fe 27function isVideoCategoryValid (value: any) {
2186386c
C
28 return value === null || VIDEO_CATEGORIES[ value ] !== undefined
29}
30
31function isVideoStateValid (value: any) {
32 return exists(value) && VIDEO_STATES[ value ] !== undefined
6e07c3de
C
33}
34
9d3ef9fe 35function isVideoLicenceValid (value: any) {
2186386c 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
69818c93 68function isVideoTagsValid (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
69818c93 80function isVideoRatingTypeValid (value: string) {
57a49263 81 return value === 'none' || values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
d38b8281
C
82}
83
14e2014a
C
84function isVideoFileExtnameValid (value: string) {
85 return exists(value) && MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined
86}
2186386c 87
b60e5f38 88function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
14e2014a 89 const videoFileTypesRegex = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
307902e2
C
90 .map(m => `(${m})`)
91 .join('|')
14e2014a 92
0c237b19 93 return isFileValid(files, videoFileTypesRegex, 'videofile', null)
ac81d1a0 94}
f6f7dfee 95
ac81d1a0 96const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
2186386c
C
97 .map(v => v.replace('.', ''))
98 .join('|')
ac81d1a0 99const videoImageTypesRegex = `image/(${videoImageTypes})`
2186386c 100
ac81d1a0 101function isVideoImage (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
0c237b19 102 return isFileValid(files, videoImageTypesRegex, field, CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max, true)
f6f7dfee
C
103}
104
2baea0c7 105function isVideoPrivacyValid (value: number) {
2186386c 106 return validator.isInt(value + '') && VIDEO_PRIVACIES[ value ] !== undefined
d4f1e94c
C
107}
108
2baea0c7
C
109function isScheduleVideoUpdatePrivacyValid (value: number) {
110 return validator.isInt(value + '') &&
111 (
112 value === VideoPrivacy.UNLISTED ||
113 value === VideoPrivacy.PUBLIC
114 )
115}
116
1e74f19a 117function isVideoOriginallyPublishedAtValid (value: string | null) {
118 return value === null || isDateValid(value)
119}
120
2cebd797 121function isVideoFileInfoHashValid (value: string | null | undefined) {
93e1258c
C
122 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
123}
124
d4f1e94c
C
125function isVideoFileResolutionValid (value: string) {
126 return exists(value) && validator.isInt(value + '')
127}
128
3a6f351b
C
129function isVideoFPSResolutionValid (value: string) {
130 return value === null || validator.isInt(value + '')
131}
132
d4f1e94c
C
133function isVideoFileSizeValid (value: string) {
134 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
8d468a16
C
135}
136
ce33919c
C
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
55fa55a9
C
144// ---------------------------------------------------------------------------
145
65fcc311 146export {
65fcc311
C
147 isVideoCategoryValid,
148 isVideoLicenceValid,
149 isVideoLanguageValid,
9567011b 150 isVideoTruncatedDescriptionValid,
65fcc311 151 isVideoDescriptionValid,
93e1258c 152 isVideoFileInfoHashValid,
65fcc311
C
153 isVideoNameValid,
154 isVideoTagsValid,
3a6f351b 155 isVideoFPSResolutionValid,
2baea0c7 156 isScheduleVideoUpdatePrivacyValid,
1e74f19a 157 isVideoOriginallyPublishedAtValid,
65fcc311 158 isVideoFile,
ce33919c 159 isVideoMagnetUriValid,
2186386c 160 isVideoStateValid,
65fcc311 161 isVideoViewsValid,
65fcc311 162 isVideoRatingTypeValid,
14e2014a 163 isVideoFileExtnameValid,
8e10cf1a 164 isVideoDurationValid,
0d0e8dd0 165 isVideoTagValid,
8d468a16 166 isVideoPrivacyValid,
d4f1e94c
C
167 isVideoFileResolutionValid,
168 isVideoFileSizeValid,
2422c46b 169 isVideoImage,
1cd3facc
C
170 isVideoSupportValid,
171 isVideoFilterValid
65fcc311 172}