From cbe2f7c34822b1bd3b1f8c691f79f0c29cf21f07 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 10 May 2016 21:19:24 +0200 Subject: Refractoring and add thumbnails support (without tests) --- server/lib/friends.js | 39 ++++++++++----- server/lib/requestsScheduler.js | 12 +++-- server/lib/videos.js | 104 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 136 insertions(+), 19 deletions(-) (limited to 'server/lib') diff --git a/server/lib/friends.js b/server/lib/friends.js index 9a2c5c06e..3b8a52060 100644 --- a/server/lib/friends.js +++ b/server/lib/friends.js @@ -11,6 +11,7 @@ const peertubeCrypto = require('../helpers/peertubeCrypto') const Pods = require('../models/pods') const requestsScheduler = require('../lib/requestsScheduler') const requests = require('../helpers/requests') +const videos = require('../lib/videos') const Videos = require('../models/videos') const http = config.get('webserver.https') ? 'https' : 'http' @@ -20,6 +21,7 @@ const port = config.get('webserver.port') const pods = { addVideoToFriends: addVideoToFriends, hasFriends: hasFriends, + getMyCertificate: getMyCertificate, makeFriends: makeFriends, quitFriends: quitFriends, removeVideoToFriends: removeVideoToFriends @@ -42,11 +44,15 @@ function hasFriends (callback) { }) } +function getMyCertificate (callback) { + fs.readFile(peertubeCrypto.getCertDir() + 'peertube.pub', 'utf8', callback) +} + function makeFriends (callback) { const pods_score = {} logger.info('Make friends!') - fs.readFile(peertubeCrypto.getCertDir() + 'peertube.pub', 'utf8', function (err, cert) { + getMyCertificate(function (err, cert) { if (err) { logger.error('Cannot read public cert.') return callback(err) @@ -54,8 +60,8 @@ function makeFriends (callback) { const urls = config.get('network.friends') - async.each(urls, function (url, callback) { - computeForeignPodsList(url, pods_score, callback) + async.each(urls, function (url, callback_each) { + computeForeignPodsList(url, pods_score, callback_each) }, function (err) { if (err) return callback(err) @@ -96,11 +102,18 @@ function quitFriends (callback) { logger.info('Broke friends, so sad :(') - Videos.removeAllRemotes(function (err) { + Videos.listFromRemotes(function (err, videos_list) { if (err) return callback(err) - logger.info('Removed all remote videos.') - callback(null) + videos.removeRemoteVideos(videos_list, function (err) { + if (err) { + logger.error('Cannot remove remote videos.', { error: err }) + return callback(err) + } + + logger.info('Removed all remote videos.') + callback(null) + }) }) }) }) @@ -127,16 +140,14 @@ function computeForeignPodsList (url, pods_score, callback) { if (err) return callback(err) if (foreign_pods_list.length === 0) return callback() - async.each(foreign_pods_list, function (foreign_pod, callback_each) { + foreign_pods_list.forEach(function (foreign_pod) { const foreign_url = foreign_pod.url if (pods_score[foreign_url]) pods_score[foreign_url]++ else pods_score[foreign_url] = 1 - - callback_each() - }, function () { - callback() }) + + callback() }) } @@ -194,13 +205,15 @@ function makeRequestsToWinningPods (cert, pods_list, callback) { logger.error('Error with adding %s pod.', pod.url, { error: err }) return callback_each_request() } - - Videos.addRemotes(body.videos, function (err) { + console.log('hihi') + videos.createRemoteVideos(body.videos, function (err) { if (err) { logger.error('Error with adding videos of pod.', pod.url, { error: err }) return callback_each_request() } + console.log('kik') + logger.debug('Adding remote videos from %s.', pod.url, { videos: body.videos }) return callback_each_request() }) diff --git a/server/lib/requestsScheduler.js b/server/lib/requestsScheduler.js index 2c5474e51..4953f6a91 100644 --- a/server/lib/requestsScheduler.js +++ b/server/lib/requestsScheduler.js @@ -8,6 +8,7 @@ const logger = require('../helpers/logger') const Pods = require('../models/pods') const Requests = require('../models/requests') const requests = require('../helpers/requests') +const videos = require('../lib/videos') const Videos = require('../models/videos') let timer = null @@ -99,7 +100,7 @@ function makeRequest (type, requests_to_make, callback) { requests.makeMultipleRetryRequest(params, pods, callbackEachPodFinished, callbackAllPodsFinished) function callbackEachPodFinished (err, response, body, url, pod, callback_each_pod_finished) { - if (err || (response.statusCode !== 200 && response.statusCode !== 204)) { + if (err || (response.statusCode !== 200 && response.statusCode !== 201 && response.statusCode !== 204)) { bad_pods.push(pod._id) logger.error('Error sending secure request to %s pod.', url, { error: err || new Error('Status code not 20x') }) } else { @@ -187,12 +188,13 @@ function removeBadPods () { const urls = map(pods, 'url') const ids = map(pods, '_id') - Videos.removeAllRemotesOf(urls, function (err, r) { + Videos.listFromUrls(urls, function (err, videos_list) { if (err) { - logger.error('Cannot remove videos from a pod that we removing.', { error: err }) + logger.error('Cannot list videos urls.', { error: err, urls: urls }) } else { - const videos_removed = r.result.n - logger.info('Removed %d videos.', videos_removed) + videos.removeRemoteVideos(videos_list, function (err) { + if (err) logger.error('Cannot remove remote videos.', { error: err }) + }) } Pods.removeAllByIds(ids, function (err, r) { diff --git a/server/lib/videos.js b/server/lib/videos.js index 43d6c6b99..b3497743a 100644 --- a/server/lib/videos.js +++ b/server/lib/videos.js @@ -3,21 +3,39 @@ const async = require('async') const config = require('config') const ffmpeg = require('fluent-ffmpeg') +const fs = require('fs') +const map = require('lodash/map') const pathUtils = require('path') -const webtorrent = require('../lib/webtorrent') +const constants = require('../initializers/constants') const logger = require('../helpers/logger') +const utils = require('../helpers/utils') const Videos = require('../models/videos') +const webtorrent = require('../lib/webtorrent') const uploadDir = pathUtils.join(__dirname, '..', '..', config.get('storage.uploads')) +const thumbnailsDir = pathUtils.join(__dirname, '..', '..', config.get('storage.thumbnails')) const videos = { + createRemoteVideos: createRemoteVideos, getVideoDuration: getVideoDuration, getVideoState: getVideoState, + getVideoThumbnail: getVideoThumbnail, + removeVideosDataFromDisk: removeVideosDataFromDisk, + removeRemoteVideos: removeRemoteVideos, seed: seed, seedAllExisting: seedAllExisting } +function createRemoteVideos (videos, callback) { + // Create the remote videos from the new pod + createRemoteVideoObjects(videos, function (err, remote_videos) { + if (err) return callback(err) + + Videos.addRemotes(remote_videos, callback) + }) +} + function getVideoDuration (video_path, callback) { ffmpeg.ffprobe(video_path, function (err, metadata) { if (err) return callback(err) @@ -36,6 +54,51 @@ function getVideoState (video) { return { exist: exist, owned: owned } } +function getVideoThumbnail (video_path, callback) { + const filename = pathUtils.basename(video_path) + '.jpg' + ffmpeg(video_path) + .on('error', callback) + .on('end', function () { + callback(null, filename) + }) + .thumbnail({ + count: 1, + folder: thumbnailsDir, + size: constants.THUMBNAILS_SIZE, + filename: filename + }) +} + +// Remove video datas from disk (video file, thumbnail...) +function removeVideosDataFromDisk (videos, callback) { + async.each(videos, function (video, callback_each) { + fs.unlink(thumbnailsDir + video.thumbnail, function (err) { + if (err) logger.error('Cannot remove the video thumbnail') + + if (getVideoState(video).owned === true) { + fs.unlink(uploadDir + video.namePath, function (err) { + if (err) { + logger.error('Cannot remove this video file.') + return callback_each(err) + } + + callback_each(null) + }) + } else { + callback_each(null) + } + }) + }, callback) +} + +function removeRemoteVideos (videos, callback) { + Videos.removeByIds(map(videos, '_id'), function (err) { + if (err) return callback(err) + + removeVideosDataFromDisk(videos, callback) + }) +} + function seed (path, callback) { logger.info('Seeding %s...', path) @@ -69,3 +132,42 @@ function seedAllExisting (callback) { // --------------------------------------------------------------------------- module.exports = videos + +// --------------------------------------------------------------------------- + +function createRemoteVideoObjects (videos, callback) { + const remote_videos = [] + + async.each(videos, function (video, callback_each) { + // Creating the thumbnail for this remote video + utils.generateRandomString(16, function (err, random_string) { + if (err) return callback_each(err) + + const thumbnail_name = random_string + '.jpg' + createThumbnailFromBase64(thumbnail_name, video.thumbnail_base64, function (err) { + if (err) return callback_each(err) + + const params = { + name: video.name, + description: video.description, + magnetUri: video.magnetUri, + podUrl: video.podUrl, + duration: video.duration, + thumbnail: thumbnail_name + } + remote_videos.push(params) + + callback_each(null) + }) + }) + }, + function (err) { + if (err) return callback(err) + + callback(null, remote_videos) + }) +} + +function createThumbnailFromBase64 (thumbnail_name, data, callback) { + fs.writeFile(thumbnailsDir + thumbnail_name, data, { encoding: 'base64' }, callback) +} -- cgit v1.2.3