1 import * as validator from 'validator'
2 import { ACTIVITY_PUB } from '../../../initializers'
3 import { exists, isDateValid, isUUIDValid } from '../misc'
4 import { isVideoChannelDescriptionValid, isVideoChannelNameValid } from '../video-channels'
10 isVideoTruncatedDescriptionValid,
14 import { isBaseActivityValid } from './misc'
16 function isVideoTorrentAddActivityValid (activity: any) {
17 return isBaseActivityValid(activity, 'Add') &&
18 isVideoTorrentObjectValid(activity.object)
21 function isVideoTorrentUpdateActivityValid (activity: any) {
22 return isBaseActivityValid(activity, 'Update') &&
23 isVideoTorrentObjectValid(activity.object)
26 function isVideoTorrentDeleteActivityValid (activity: any) {
27 return isBaseActivityValid(activity, 'Delete')
30 function isActivityPubVideoDurationValid (value: string) {
31 // https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration
32 return exists(value) &&
33 typeof value === 'string' &&
34 value.startsWith('PT') &&
35 value.endsWith('S') &&
36 isVideoDurationValid(value.replace(/[^0-9]+/, ''))
39 function isVideoTorrentObjectValid (video: any) {
40 return video.type === 'Video' &&
41 isVideoNameValid(video.name) &&
42 isActivityPubVideoDurationValid(video.duration) &&
43 isUUIDValid(video.uuid) &&
44 setValidRemoteTags(video) &&
45 isRemoteIdentifierValid(video.category) &&
46 isRemoteIdentifierValid(video.licence) &&
47 isRemoteIdentifierValid(video.language) &&
48 isVideoViewsValid(video.video) &&
49 isVideoNSFWValid(video.nsfw) &&
50 isDateValid(video.published) &&
51 isDateValid(video.updated) &&
52 isRemoteVideoContentValid(video.mediaType, video.content) &&
53 isRemoteVideoIconValid(video.icon) &&
54 setValidRemoteVideoUrls(video.url)
57 function isVideoChannelCreateActivityValid (activity: any) {
58 return isBaseActivityValid(activity, 'Create') &&
59 isVideoChannelObjectValid(activity.object)
62 function isVideoChannelUpdateActivityValid (activity: any) {
63 return isBaseActivityValid(activity, 'Update') &&
64 isVideoChannelObjectValid(activity.object)
67 function isVideoChannelDeleteActivityValid (activity: any) {
68 return isBaseActivityValid(activity, 'Delete')
71 function isVideoChannelObjectValid (videoChannel: any) {
72 return videoChannel.type === 'VideoChannel' &&
73 isVideoChannelNameValid(videoChannel.name) &&
74 isVideoChannelDescriptionValid(videoChannel.description) &&
75 isUUIDValid(videoChannel.uuid)
78 // ---------------------------------------------------------------------------
81 isVideoTorrentAddActivityValid,
82 isVideoChannelCreateActivityValid,
83 isVideoTorrentUpdateActivityValid,
84 isVideoChannelUpdateActivityValid,
85 isVideoChannelDeleteActivityValid,
86 isVideoTorrentDeleteActivityValid
89 // ---------------------------------------------------------------------------
91 function setValidRemoteTags (video: any) {
92 if (Array.isArray(video.tag) === false) return false
94 const newTag = video.tag.filter(t => {
95 return t.type === 'Hashtag' &&
96 isVideoTagValid(t.name)
103 function isRemoteIdentifierValid (data: any) {
104 return validator.isInt(data.identifier, { min: 0 })
107 function isRemoteVideoContentValid (mediaType: string, content: string) {
108 return mediaType === 'text/markdown' && isVideoTruncatedDescriptionValid(content)
111 function isRemoteVideoIconValid (icon: any) {
112 return icon.type === 'Image' &&
113 isVideoUrlValid(icon.url) &&
114 icon.mediaType === 'image/jpeg' &&
115 validator.isInt(icon.width, { min: 0 }) &&
116 validator.isInt(icon.height, { min: 0 })
119 function setValidRemoteVideoUrls (video: any) {
120 if (Array.isArray(video.url) === false) return false
122 const newUrl = video.url.filter(u => isRemoteVideoUrlValid(u))
128 function isRemoteVideoUrlValid (url: any) {
129 return url.type === 'Link' &&
130 ACTIVITY_PUB.VIDEO_URL_MIME_TYPES.indexOf(url.mimeType) !== -1 &&
131 isVideoUrlValid(url.url) &&
132 validator.isInt(url.width, { min: 0 }) &&
133 validator.isInt(url.size, { min: 0 })