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