2017-11-10 07:34:45 -06:00
|
|
|
import * as magnetUtil from 'magnet-uri'
|
|
|
|
import * as Sequelize from 'sequelize'
|
|
|
|
import { VideoTorrentObject } from '../../../shared'
|
|
|
|
import { isVideoFileInfoHashValid } from '../../helpers/custom-validators/videos'
|
|
|
|
import { database as db } from '../../initializers'
|
|
|
|
import { VIDEO_MIMETYPE_EXT } from '../../initializers/constants'
|
|
|
|
import { VideoChannelInstance } from '../../models/video/video-channel-interface'
|
|
|
|
import { VideoFileAttributes } from '../../models/video/video-file-interface'
|
|
|
|
import { VideoAttributes, VideoInstance } from '../../models/video/video-interface'
|
|
|
|
|
2017-11-10 10:27:49 -06:00
|
|
|
async function videoActivityObjectToDBAttributes (
|
|
|
|
videoChannel: VideoChannelInstance,
|
|
|
|
videoObject: VideoTorrentObject,
|
|
|
|
t: Sequelize.Transaction
|
|
|
|
) {
|
2017-11-10 07:34:45 -06:00
|
|
|
const videoFromDatabase = await db.Video.loadByUUIDOrURL(videoObject.uuid, videoObject.id, t)
|
|
|
|
if (videoFromDatabase) throw new Error('Video with this UUID/Url already exists.')
|
|
|
|
|
|
|
|
const duration = videoObject.duration.replace(/[^\d]+/, '')
|
|
|
|
const videoData: VideoAttributes = {
|
|
|
|
name: videoObject.name,
|
|
|
|
uuid: videoObject.uuid,
|
|
|
|
url: videoObject.id,
|
|
|
|
category: parseInt(videoObject.category.identifier, 10),
|
|
|
|
licence: parseInt(videoObject.licence.identifier, 10),
|
|
|
|
language: parseInt(videoObject.language.identifier, 10),
|
|
|
|
nsfw: videoObject.nsfw,
|
|
|
|
description: videoObject.content,
|
|
|
|
channelId: videoChannel.id,
|
|
|
|
duration: parseInt(duration, 10),
|
|
|
|
createdAt: videoObject.published,
|
|
|
|
// FIXME: updatedAt does not seems to be considered by Sequelize
|
|
|
|
updatedAt: videoObject.updated,
|
|
|
|
views: videoObject.views,
|
|
|
|
likes: 0,
|
|
|
|
dislikes: 0,
|
|
|
|
// likes: videoToCreateData.likes,
|
|
|
|
// dislikes: videoToCreateData.dislikes,
|
|
|
|
remote: true,
|
|
|
|
privacy: 1
|
|
|
|
// privacy: videoToCreateData.privacy
|
|
|
|
}
|
|
|
|
|
|
|
|
return videoData
|
|
|
|
}
|
|
|
|
|
|
|
|
function videoFileActivityUrlToDBAttributes (videoCreated: VideoInstance, videoObject: VideoTorrentObject) {
|
|
|
|
const fileUrls = videoObject.url
|
|
|
|
.filter(u => Object.keys(VIDEO_MIMETYPE_EXT).indexOf(u.mimeType) !== -1)
|
|
|
|
|
|
|
|
const attributes: VideoFileAttributes[] = []
|
|
|
|
for (const url of fileUrls) {
|
|
|
|
// Fetch associated magnet uri
|
|
|
|
const magnet = videoObject.url
|
|
|
|
.find(u => {
|
|
|
|
return u.mimeType === 'application/x-bittorrent;x-scheme-handler/magnet' && u.width === url.width
|
|
|
|
})
|
|
|
|
if (!magnet) throw new Error('Cannot find associated magnet uri for file ' + url.url)
|
|
|
|
|
|
|
|
const parsed = magnetUtil.decode(magnet.url)
|
|
|
|
if (!parsed || isVideoFileInfoHashValid(parsed.infoHash) === false) throw new Error('Cannot parse magnet URI ' + magnet.url)
|
|
|
|
|
|
|
|
const attribute = {
|
|
|
|
extname: VIDEO_MIMETYPE_EXT[url.mimeType],
|
|
|
|
infoHash: parsed.infoHash,
|
|
|
|
resolution: url.width,
|
|
|
|
size: url.size,
|
|
|
|
videoId: videoCreated.id
|
|
|
|
}
|
|
|
|
attributes.push(attribute)
|
|
|
|
}
|
|
|
|
|
|
|
|
return attributes
|
|
|
|
}
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
export {
|
|
|
|
videoFileActivityUrlToDBAttributes,
|
|
|
|
videoActivityObjectToDBAttributes
|
|
|
|
}
|