import { ActivityIconObject } from '../../../shared/index'
import { VideoTorrentObject } from '../../../shared/models/activitypub/objects'
import { VideoPrivacy, VideoRateType } from '../../../shared/models/videos'
-import { isVideoTorrentObjectValid } from '../../helpers/custom-validators/activitypub/videos'
+import { sanitizeAndCheckVideoTorrentObject } from '../../helpers/custom-validators/activitypub/videos'
import { isVideoFileInfoHashValid } from '../../helpers/custom-validators/videos'
import { retryTransactionWrapper } from '../../helpers/database-utils'
import { logger } from '../../helpers/logger'
videoObject: VideoTorrentObject,
to: string[] = []) {
const privacy = to.indexOf(ACTIVITY_PUB.PUBLIC) !== -1 ? VideoPrivacy.PUBLIC : VideoPrivacy.UNLISTED
-
const duration = videoObject.duration.replace(/[^\d]+/, '')
- let language = null
+
+ let language: string = null
if (videoObject.language) {
- language = parseInt(videoObject.language.identifier, 10)
+ language = videoObject.language.identifier
}
- let category = null
+ let category: number = null
if (videoObject.category) {
category = parseInt(videoObject.category.identifier, 10)
}
- let licence = null
+ let licence: number = null
if (videoObject.licence) {
licence = parseInt(videoObject.licence.identifier, 10)
}
return attributes
}
+function getOrCreateVideoChannel (videoObject: VideoTorrentObject) {
+ const channel = videoObject.attributedTo.find(a => a.type === 'Group')
+ if (!channel) throw new Error('Cannot find associated video channel to video ' + videoObject.url)
+
+ return getOrCreateActorAndServerAndModel(channel.id)
+}
+
async function getOrCreateVideo (videoObject: VideoTorrentObject, channelActor: ActorModel) {
logger.debug('Adding remote video %s.', videoObject.id)
// Don't block on request
generateThumbnailFromUrl(video, videoObject.icon)
- .catch(err => logger.warn('Cannot generate thumbnail of %s.', videoObject.id, err))
+ .catch(err => logger.warn('Cannot generate thumbnail of %s.', videoObject.id, { err }))
const videoCreated = await video.save(sequelizeOptions)
async function getOrCreateAccountAndVideoAndChannel (videoObject: VideoTorrentObject | string, actor?: ActorModel) {
if (typeof videoObject === 'string') {
- const videoFromDatabase = await VideoModel.loadByUrlAndPopulateAccount(videoObject)
+ const videoUrl = videoObject
+
+ const videoFromDatabase = await VideoModel.loadByUrlAndPopulateAccount(videoUrl)
if (videoFromDatabase) {
return {
video: videoFromDatabase,
}
}
- videoObject = await fetchRemoteVideo(videoObject)
- if (!videoObject) throw new Error('Cannot fetch remote video')
+ videoObject = await fetchRemoteVideo(videoUrl)
+ if (!videoObject) throw new Error('Cannot fetch remote video with url: ' + videoUrl)
}
if (!actor) {
actor = await getOrCreateActorAndServerAndModel(actorObj.id)
}
- const channel = videoObject.attributedTo.find(a => a.type === 'Group')
- if (!channel) throw new Error('Cannot find associated video channel to video ' + videoObject.url)
-
- const channelActor = await getOrCreateActorAndServerAndModel(channel.id)
+ const channelActor = await getOrCreateVideoChannel(videoObject)
const options = {
arguments: [ videoObject, channelActor ],
json: true,
activityPub: true
})
- const actorUrl = body.actor
- if (!actorUrl) continue
+ if (!body || !body.actor) {
+ logger.warn('Cannot add remote share with url: %s, skipping...', shareUrl)
+ continue
+ }
+ const actorUrl = body.actor
const actor = await getOrCreateActorAndServerAndModel(actorUrl)
const entry = {
videoActivityObjectToDBAttributes,
videoFileActivityUrlToDBAttributes,
getOrCreateVideo,
+ getOrCreateVideoChannel,
addVideoShares}
// ---------------------------------------------------------------------------
const { body } = await doRequest(options)
- if (isVideoTorrentObjectValid(body) === false) {
+ if (sanitizeAndCheckVideoTorrentObject(body) === false) {
logger.debug('Remote video JSON is not valid.', { body })
return undefined
}