]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/videos.ts
Implement remote runner jobs in server
[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
69818c93 48function isVideoDescriptionValid (value: string) {
f595d394 49 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
be587647
C
50}
51
2422c46b
C
52function isVideoSupportValid (value: string) {
53 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.SUPPORT))
54}
55
69818c93
C
56function isVideoNameValid (value: string) {
57 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
be587647
C
58}
59
0d0e8dd0
C
60function isVideoTagValid (tag: string) {
61 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
62}
63
c729caf6 64function areVideoTagsValid (tags: string[]) {
2efd32f6
C
65 return tags === null || (
66 isArray(tags) &&
67 validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
68 tags.every(tag => isVideoTagValid(tag))
69 )
be587647
C
70}
71
69818c93
C
72function isVideoViewsValid (value: string) {
73 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
9e167724
C
74}
75
690bb8f9 76const ratingTypes = new Set(Object.values(VIDEO_RATE_TYPES))
69818c93 77function isVideoRatingTypeValid (value: string) {
690bb8f9 78 return value === 'none' || ratingTypes.has(value as VideoRateType)
d38b8281
C
79}
80
14e2014a 81function isVideoFileExtnameValid (value: string) {
c6c0fa6c 82 return exists(value) && (value === VIDEO_LIVE.EXTENSION || MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined)
14e2014a 83}
2186386c 84
c729caf6
C
85function isVideoFileMimeTypeValid (files: UploadFilesForCheck, field = 'videofile') {
86 return isFileValid({
87 files,
88 mimeTypeRegex: MIMETYPES.VIDEO.MIMETYPES_REGEX,
89 field,
90 maxSize: null
91 })
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
c729caf6
C
99function 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 })
f6f7dfee
C
107}
108
2baea0c7 109function isVideoPrivacyValid (value: number) {
a1587156 110 return VIDEO_PRIVACIES[value] !== undefined
d4f1e94c
C
111}
112
2baea0c7 113function isScheduleVideoUpdatePrivacyValid (value: number) {
22a73cb8 114 return value === VideoPrivacy.UNLISTED || value === VideoPrivacy.PUBLIC || value === VideoPrivacy.INTERNAL
2baea0c7
C
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,
65fcc311 150 isVideoDescriptionValid,
93e1258c 151 isVideoFileInfoHashValid,
65fcc311 152 isVideoNameValid,
c729caf6 153 areVideoTagsValid,
3a6f351b 154 isVideoFPSResolutionValid,
2baea0c7 155 isScheduleVideoUpdatePrivacyValid,
1e74f19a 156 isVideoOriginallyPublishedAtValid,
ce33919c 157 isVideoMagnetUriValid,
2186386c 158 isVideoStateValid,
2760b454 159 isVideoIncludeValid,
65fcc311 160 isVideoViewsValid,
65fcc311 161 isVideoRatingTypeValid,
14e2014a 162 isVideoFileExtnameValid,
f2eb23cd 163 isVideoFileMimeTypeValid,
8e10cf1a 164 isVideoDurationValid,
0d0e8dd0 165 isVideoTagValid,
8d468a16 166 isVideoPrivacyValid,
d4f1e94c
C
167 isVideoFileResolutionValid,
168 isVideoFileSizeValid,
c729caf6 169 isVideoImageValid,
1cd3facc
C
170 isVideoSupportValid,
171 isVideoFilterValid
65fcc311 172}