Server: use binary data instead of base64 to send thumbnails
authorChocobozzz <florian.bigard@gmail.com>
Thu, 29 Dec 2016 11:13:19 +0000 (12:13 +0100)
committerChocobozzz <florian.bigard@gmail.com>
Thu, 29 Dec 2016 11:13:19 +0000 (12:13 +0100)
package.json
server/controllers/api/remote.js
server/controllers/api/users.js
server/helpers/custom-validators/videos.js
server/initializers/constants.js
server/models/video.js

index bff21082fceac7f2e663dd0fde7d11a7075a66a9..5eadcc363fd1bab62a0331bdb0103c9c1f08c17d 100644 (file)
@@ -66,6 +66,7 @@
     "request": "^2.57.0",
     "request-replay": "^1.0.2",
     "rimraf": "^2.5.4",
+    "safe-buffer": "^5.0.1",
     "scripty": "^1.5.0",
     "sequelize": "^3.27.0",
     "ursa": "^0.9.1",
index 94d6e740e8f221d2285ce3be3d4d695d7d79c743..ac850c2d28edc7cc369fd6c39b701fde01cebb1d 100644 (file)
@@ -147,9 +147,9 @@ function addRemoteVideo (videoToCreateData, fromHost, finalCallback) {
     },
 
     function generateThumbnail (t, tagInstances, video, callback) {
-      db.Video.generateThumbnailFromBase64(video, videoToCreateData.thumbnailBase64, function (err) {
+      db.Video.generateThumbnailFromData(video, videoToCreateData.thumbnailData, function (err) {
         if (err) {
-          logger.error('Cannot generate thumbnail from base 64 data.', { error: err })
+          logger.error('Cannot generate thumbnail from data.', { error: err })
           return callback(err)
         }
 
index e4423680cfddadff917ae3ea6783b2f6f4c67fc0..53bf567904da072bebc7c7601827f30f91b66ce8 100644 (file)
@@ -1,12 +1,10 @@
 'use strict'
 
-const each = require('async/each')
 const express = require('express')
 const waterfall = require('async/waterfall')
 
 const constants = require('../../initializers/constants')
 const db = require('../../initializers/database')
-const friends = require('../../lib/friends')
 const logger = require('../../helpers/logger')
 const middlewares = require('../../middlewares')
 const admin = middlewares.admin
index da857ba5f379871f0b25b41f576df9a1d512a1e8..4aaa6aaa99c37454457309b3e8651cc8ecef3117 100644 (file)
@@ -17,7 +17,7 @@ const videosValidators = {
   isVideoNameValid,
   isVideoTagsValid,
   isVideoThumbnailValid,
-  isVideoThumbnail64Valid
+  isVideoThumbnailDataValid
 }
 
 function isEachRemoteVideosValid (requests) {
@@ -33,7 +33,7 @@ function isEachRemoteVideosValid (requests) {
         isVideoInfoHashValid(video.infoHash) &&
         isVideoNameValid(video.name) &&
         isVideoTagsValid(video.tags) &&
-        isVideoThumbnail64Valid(video.thumbnailBase64) &&
+        isVideoThumbnailDataValid(video.thumbnailData) &&
         isVideoRemoteIdValid(video.remoteId) &&
         isVideoExtnameValid(video.extname)
       ) ||
@@ -86,9 +86,8 @@ function isVideoThumbnailValid (value) {
   return validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL)
 }
 
-function isVideoThumbnail64Valid (value) {
-  return validator.isBase64(value) &&
-         validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL64)
+function isVideoThumbnailDataValid (value) {
+  return validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL_DATA)
 }
 
 function isVideoRemoteIdValid (value) {
index 0af7aca3c39040cb0ed1d61411c0f6a3b0477739..474a3727790d178ceb2cb956a19ee8da2cf368df 100644 (file)
@@ -74,7 +74,7 @@ const CONSTRAINTS_FIELDS = {
     TAGS: { min: 1, max: 3 }, // Number of total tags
     TAG: { min: 2, max: 10 }, // Length
     THUMBNAIL: { min: 2, max: 30 },
-    THUMBNAIL64: { min: 0, max: 20000 } // Bytes
+    THUMBNAIL_DATA: { min: 0, max: 20000 } // Bytes
   }
 }
 
index 564e362fdd244fbf85a3d7b2dbb6a1b2d3ee3817..0e84e89867f722d88e0c6d236986b4faa6646d15 100644 (file)
@@ -1,5 +1,6 @@
 'use strict'
 
+const Buffer = require('safe-buffer').Buffer
 const createTorrent = require('create-torrent')
 const ffmpeg = require('fluent-ffmpeg')
 const fs = require('fs')
@@ -106,7 +107,7 @@ module.exports = function (sequelize, DataTypes) {
       classMethods: {
         associate,
 
-        generateThumbnailFromBase64,
+        generateThumbnailFromData,
         getDurationFromFile,
         list,
         listForApi,
@@ -336,7 +337,7 @@ function toFormatedJSON () {
 function toRemoteJSON (callback) {
   const self = this
 
-  // Convert thumbnail to base64
+  // Get thumbnail data to send to the other pod
   const thumbnailPath = pathUtils.join(constants.CONFIG.STORAGE.THUMBNAILS_DIR, this.getThumbnailName())
   fs.readFile(thumbnailPath, function (err, thumbnailData) {
     if (err) {
@@ -351,7 +352,7 @@ function toRemoteJSON (callback) {
       remoteId: self.id,
       author: self.Author.name,
       duration: self.duration,
-      thumbnailBase64: new Buffer(thumbnailData).toString('base64'),
+      thumbnailData: thumbnailData.toString('binary'),
       tags: map(self.Tags, 'name'),
       createdAt: self.createdAt,
       extname: self.extname
@@ -363,12 +364,12 @@ function toRemoteJSON (callback) {
 
 // ------------------------------ STATICS ------------------------------
 
-function generateThumbnailFromBase64 (video, thumbnailData, callback) {
+function generateThumbnailFromData (video, thumbnailData, callback) {
   // Creating the thumbnail for a remote video
 
   const thumbnailName = video.getThumbnailName()
   const thumbnailPath = constants.CONFIG.STORAGE.THUMBNAILS_DIR + thumbnailName
-  fs.writeFile(thumbnailPath, thumbnailData, { encoding: 'base64' }, function (err) {
+  fs.writeFile(thumbnailPath, Buffer.from(thumbnailData, 'binary'), function (err) {
     if (err) return callback(err)
 
     return callback(null, thumbnailName)