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