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