]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/videos.ts
Restore line feed for markdown lists support in comments
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
CommitLineData
79d5caf9 1import { values } from 'lodash'
7cde3b9c 2import 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) {
a1587156 23 return value === null || VIDEO_CATEGORIES[value] !== undefined
2186386c
C
24}
25
26function isVideoStateValid (value: any) {
a1587156 27 return exists(value) && VIDEO_STATES[value] !== undefined
6e07c3de
C
28}
29
9d3ef9fe 30function isVideoLicenceValid (value: any) {
a1587156 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) {
bdd428a6 76 return value === 'none' || values(VIDEO_RATE_TYPES).includes(value as VideoRateType)
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[]) {
30bc55c8 84 return isFileValid(files, MIMETYPES.VIDEO.MIMETYPES_REGEX, 'videofile', null)
ac81d1a0 85}
f6f7dfee 86
ac81d1a0 87const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
2186386c
C
88 .map(v => v.replace('.', ''))
89 .join('|')
ac81d1a0 90const videoImageTypesRegex = `image/(${videoImageTypes})`
2186386c 91
ac81d1a0 92function isVideoImage (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
0c237b19 93 return isFileValid(files, videoImageTypesRegex, field, CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max, true)
f6f7dfee
C
94}
95
2baea0c7 96function isVideoPrivacyValid (value: number) {
a1587156 97 return VIDEO_PRIVACIES[value] !== undefined
d4f1e94c
C
98}
99
2baea0c7 100function isScheduleVideoUpdatePrivacyValid (value: number) {
22a73cb8 101 return value === VideoPrivacy.UNLISTED || value === VideoPrivacy.PUBLIC || value === VideoPrivacy.INTERNAL
2baea0c7
C
102}
103
1e74f19a 104function isVideoOriginallyPublishedAtValid (value: string | null) {
105 return value === null || isDateValid(value)
106}
107
2cebd797 108function isVideoFileInfoHashValid (value: string | null | undefined) {
93e1258c
C
109 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
110}
111
d4f1e94c
C
112function isVideoFileResolutionValid (value: string) {
113 return exists(value) && validator.isInt(value + '')
114}
115
3a6f351b
C
116function isVideoFPSResolutionValid (value: string) {
117 return value === null || validator.isInt(value + '')
118}
119
d4f1e94c
C
120function isVideoFileSizeValid (value: string) {
121 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
8d468a16
C
122}
123
ce33919c
C
124function isVideoMagnetUriValid (value: string) {
125 if (!exists(value)) return false
126
127 const parsed = magnetUtil.decode(value)
128 return parsed && isVideoFileInfoHashValid(parsed.infoHash)
129}
130
55fa55a9
C
131// ---------------------------------------------------------------------------
132
65fcc311 133export {
65fcc311
C
134 isVideoCategoryValid,
135 isVideoLicenceValid,
136 isVideoLanguageValid,
9567011b 137 isVideoTruncatedDescriptionValid,
65fcc311 138 isVideoDescriptionValid,
93e1258c 139 isVideoFileInfoHashValid,
65fcc311
C
140 isVideoNameValid,
141 isVideoTagsValid,
3a6f351b 142 isVideoFPSResolutionValid,
2baea0c7 143 isScheduleVideoUpdatePrivacyValid,
1e74f19a 144 isVideoOriginallyPublishedAtValid,
65fcc311 145 isVideoFile,
ce33919c 146 isVideoMagnetUriValid,
2186386c 147 isVideoStateValid,
65fcc311 148 isVideoViewsValid,
65fcc311 149 isVideoRatingTypeValid,
14e2014a 150 isVideoFileExtnameValid,
8e10cf1a 151 isVideoDurationValid,
0d0e8dd0 152 isVideoTagValid,
8d468a16 153 isVideoPrivacyValid,
d4f1e94c
C
154 isVideoFileResolutionValid,
155 isVideoFileSizeValid,
2422c46b 156 isVideoImage,
1cd3facc
C
157 isVideoSupportValid,
158 isVideoFilterValid
65fcc311 159}