]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame_incremental - server/helpers/custom-validators/videos.ts
Translated using Weblate (German)
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / videos.ts
... / ...
CommitLineData
1import { values } from 'lodash'
2import validator from 'validator'
3import { VideoFilter, VideoPrivacy, VideoRateType } from '../../../shared'
4import {
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'
13import { exists, isArray, isDateValid, isFileValid } from './misc'
14import * as magnetUtil from 'magnet-uri'
15
16const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
17
18function isVideoFilterValid (filter: VideoFilter) {
19 return filter === 'local' || filter === 'all-local'
20}
21
22function isVideoCategoryValid (value: any) {
23 return value === null || VIDEO_CATEGORIES[value] !== undefined
24}
25
26function isVideoStateValid (value: any) {
27 return exists(value) && VIDEO_STATES[value] !== undefined
28}
29
30function isVideoLicenceValid (value: any) {
31 return value === null || VIDEO_LICENCES[value] !== undefined
32}
33
34function isVideoLanguageValid (value: any) {
35 return value === null ||
36 (typeof value === 'string' && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.LANGUAGE))
37}
38
39function isVideoDurationValid (value: string) {
40 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
41}
42
43function isVideoTruncatedDescriptionValid (value: string) {
44 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
45}
46
47function isVideoDescriptionValid (value: string) {
48 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
49}
50
51function isVideoSupportValid (value: string) {
52 return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.SUPPORT))
53}
54
55function isVideoNameValid (value: string) {
56 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
57}
58
59function isVideoTagValid (tag: string) {
60 return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
61}
62
63function 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
71function isVideoViewsValid (value: string) {
72 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
73}
74
75function isVideoRatingTypeValid (value: string) {
76 return value === 'none' || values(VIDEO_RATE_TYPES).includes(value as VideoRateType)
77}
78
79function isVideoFileExtnameValid (value: string) {
80 return exists(value) && MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined
81}
82
83function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
84 return isFileValid(files, MIMETYPES.VIDEO.MIMETYPES_REGEX, 'videofile', null)
85}
86
87const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
88 .map(v => v.replace('.', ''))
89 .join('|')
90const videoImageTypesRegex = `image/(${videoImageTypes})`
91
92function 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
96function isVideoPrivacyValid (value: number) {
97 return VIDEO_PRIVACIES[value] !== undefined
98}
99
100function isScheduleVideoUpdatePrivacyValid (value: number) {
101 return value === VideoPrivacy.UNLISTED || value === VideoPrivacy.PUBLIC || value === VideoPrivacy.INTERNAL
102}
103
104function isVideoOriginallyPublishedAtValid (value: string | null) {
105 return value === null || isDateValid(value)
106}
107
108function isVideoFileInfoHashValid (value: string | null | undefined) {
109 return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
110}
111
112function isVideoFileResolutionValid (value: string) {
113 return exists(value) && validator.isInt(value + '')
114}
115
116function isVideoFPSResolutionValid (value: string) {
117 return value === null || validator.isInt(value + '')
118}
119
120function isVideoFileSizeValid (value: string) {
121 return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
122}
123
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
131// ---------------------------------------------------------------------------
132
133export {
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}