]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/activitypub/videos.ts
Federate video views
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / activitypub / videos.ts
CommitLineData
0d0e8dd0 1import * as validator from 'validator'
8e10cf1a
C
2import { ACTIVITY_PUB } from '../../../initializers'
3import { exists, isDateValid, isUUIDValid } from '../misc'
65fcc311 4import {
d8465018 5 isVideoAbuseReasonValid,
65fcc311 6 isVideoDurationValid,
65fcc311 7 isVideoNameValid,
8e10cf1a 8 isVideoNSFWValid,
e34c85e5 9 isVideoTagValid,
8e10cf1a
C
10 isVideoTruncatedDescriptionValid,
11 isVideoUrlValid,
12 isVideoViewsValid
65fcc311 13} from '../videos'
d8465018 14import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
0d0e8dd0
C
15
16function isVideoTorrentAddActivityValid (activity: any) {
17 return isBaseActivityValid(activity, 'Add') &&
18 isVideoTorrentObjectValid(activity.object)
19}
20
21function isVideoTorrentUpdateActivityValid (activity: any) {
22 return isBaseActivityValid(activity, 'Update') &&
23 isVideoTorrentObjectValid(activity.object)
65fcc311
C
24}
25
350e31d6
C
26function isVideoTorrentDeleteActivityValid (activity: any) {
27 return isBaseActivityValid(activity, 'Delete')
28}
29
54141398
C
30function isVideoFlagValid (activity: any) {
31 return isBaseActivityValid(activity, 'Create') &&
32 activity.object.type === 'Flag' &&
33 isVideoAbuseReasonValid(activity.object.content) &&
34 isActivityPubUrlValid(activity.object.object)
35}
36
8e10cf1a
C
37function isActivityPubVideoDurationValid (value: string) {
38 // https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration
39 return exists(value) &&
40 typeof value === 'string' &&
41 value.startsWith('PT') &&
42 value.endsWith('S') &&
efc32059 43 isVideoDurationValid(value.replace(/[^0-9]+/g, ''))
8e10cf1a
C
44}
45
0d0e8dd0
C
46function isVideoTorrentObjectValid (video: any) {
47 return video.type === 'Video' &&
20494f12 48 isActivityPubUrlValid(video.id) &&
0d0e8dd0 49 isVideoNameValid(video.name) &&
8e10cf1a 50 isActivityPubVideoDurationValid(video.duration) &&
0d0e8dd0
C
51 isUUIDValid(video.uuid) &&
52 setValidRemoteTags(video) &&
53 isRemoteIdentifierValid(video.category) &&
54 isRemoteIdentifierValid(video.licence) &&
40ff5707 55 (!video.language || isRemoteIdentifierValid(video.language)) &&
efc32059 56 isVideoViewsValid(video.views) &&
0d0e8dd0
C
57 isVideoNSFWValid(video.nsfw) &&
58 isDateValid(video.published) &&
59 isDateValid(video.updated) &&
60 isRemoteVideoContentValid(video.mediaType, video.content) &&
61 isRemoteVideoIconValid(video.icon) &&
efc32059
C
62 setValidRemoteVideoUrls(video) &&
63 video.url.length !== 0
65fcc311
C
64}
65
65fcc311
C
66// ---------------------------------------------------------------------------
67
68export {
0d0e8dd0 69 isVideoTorrentAddActivityValid,
0d0e8dd0 70 isVideoTorrentUpdateActivityValid,
d8465018 71 isVideoTorrentDeleteActivityValid,
54141398 72 isVideoFlagValid
65fcc311
C
73}
74
75// ---------------------------------------------------------------------------
76
0d0e8dd0
C
77function setValidRemoteTags (video: any) {
78 if (Array.isArray(video.tag) === false) return false
65fcc311 79
0d0e8dd0
C
80 const newTag = video.tag.filter(t => {
81 return t.type === 'Hashtag' &&
82 isVideoTagValid(t.name)
83 })
72c7248b 84
0d0e8dd0
C
85 video.tag = newTag
86 return true
72c7248b
C
87}
88
0d0e8dd0
C
89function isRemoteIdentifierValid (data: any) {
90 return validator.isInt(data.identifier, { min: 0 })
72c7248b
C
91}
92
0d0e8dd0
C
93function isRemoteVideoContentValid (mediaType: string, content: string) {
94 return mediaType === 'text/markdown' && isVideoTruncatedDescriptionValid(content)
72c7248b
C
95}
96
0d0e8dd0
C
97function isRemoteVideoIconValid (icon: any) {
98 return icon.type === 'Image' &&
e34c85e5 99 isVideoUrlValid(icon.url) &&
0d0e8dd0 100 icon.mediaType === 'image/jpeg' &&
efc32059
C
101 validator.isInt(icon.width + '', { min: 0 }) &&
102 validator.isInt(icon.height + '', { min: 0 })
72c7248b
C
103}
104
0d0e8dd0
C
105function setValidRemoteVideoUrls (video: any) {
106 if (Array.isArray(video.url) === false) return false
65fcc311 107
0d0e8dd0
C
108 const newUrl = video.url.filter(u => isRemoteVideoUrlValid(u))
109 video.url = newUrl
65fcc311 110
0d0e8dd0 111 return true
65fcc311
C
112}
113
0d0e8dd0
C
114function isRemoteVideoUrlValid (url: any) {
115 return url.type === 'Link' &&
20494f12
C
116 (
117 ACTIVITY_PUB.URL_MIME_TYPES.VIDEO.indexOf(url.mimeType) !== -1 &&
118 isVideoUrlValid(url.url) &&
119 validator.isInt(url.width + '', { min: 0 }) &&
120 validator.isInt(url.size + '', { min: 0 })
121 ) ||
122 (
123 ACTIVITY_PUB.URL_MIME_TYPES.TORRENT.indexOf(url.mimeType) !== -1 &&
124 isVideoUrlValid(url.url) &&
125 validator.isInt(url.width + '', { min: 0 })
126 ) ||
127 (
128 ACTIVITY_PUB.URL_MIME_TYPES.MAGNET.indexOf(url.mimeType) !== -1 &&
129 validator.isLength(url.url, { min: 5 }) &&
130 validator.isInt(url.width + '', { min: 0 })
131 )
65fcc311 132}