moved thumbnail check to server side

This commit is contained in:
bill bittner 2018-03-02 17:24:18 -08:00
parent b3e6c89f0e
commit d28a5758dd
4 changed files with 53 additions and 54 deletions

View file

@ -1,6 +1,6 @@
const logger = require('winston'); const logger = require('winston');
const fs = require('fs'); const fs = require('fs');
const { site, wallet } = require('../config/speechConfig.js'); const { site, wallet, publish } = require('../config/speechConfig.js');
module.exports = { module.exports = {
parsePublishApiRequestBody ({name, nsfw, license, title, description, thumbnail}) { parsePublishApiRequestBody ({name, nsfw, license, title, description, thumbnail}) {
@ -28,7 +28,7 @@ module.exports = {
thumbnail, thumbnail,
}; };
}, },
parsePublishApiRequestFiles ({file}) { parsePublishApiRequestFiles ({file, thumbnail}) {
// make sure a file was provided // make sure a file was provided
if (!file) { if (!file) {
throw new Error('no file with key of [file] found in request'); throw new Error('no file with key of [file] found in request');
@ -50,9 +50,12 @@ module.exports = {
module.exports.validateFileTypeAndSize(file); module.exports.validateFileTypeAndSize(file);
// return results // return results
return { return {
fileName: file.name, fileName : file.name,
filePath: file.path, filePath : file.path,
fileType: file.type, fileType : file.type,
thumbnailFileName: (thumbnail ? thumbnail.name : null),
thumbnailFilePath: (thumbnail ? thumbnail.path : null),
thumbnailFileType: (thumbnail ? thumbnail.type : null),
}; };
}, },
parsePublishApiChannel ({channelName, channelPassword}, user) { parsePublishApiChannel ({channelName, channelPassword}, user) {
@ -138,7 +141,7 @@ module.exports = {
claim_address: wallet.lbryClaimAddress, claim_address: wallet.lbryClaimAddress,
}; };
// add thumbnail to channel if video // add thumbnail to channel if video
if (thumbnail !== null) { if (thumbnail) {
publishParams['metadata']['thumbnail'] = thumbnail; publishParams['metadata']['thumbnail'] = thumbnail;
} }
// add channel to params, if applicable // add channel to params, if applicable
@ -147,6 +150,29 @@ module.exports = {
} }
return publishParams; return publishParams;
}, },
createThumbnailPublishParams (thumbnailFilePath, claimName, license, nsfw) {
if (!thumbnailFilePath) {
return;
}
logger.debug(`Creating Thumbnail Publish Parameters`);
// create the publish params
return {
name : `${claimName}-thumb`,
file_path: thumbnailFilePath,
bid : 0.01,
metadata : {
title : `${claimName} thumbnail`,
description: `a thumbnail for ${claimName}`,
author : site.title,
language : 'en',
license,
nsfw,
},
claim_address: wallet.lbryClaimAddress,
channel_name : publish.thumbnailChannel,
channel_id : publish.thumbnailChannelId,
};
},
deleteTemporaryFile (filePath) { deleteTemporaryFile (filePath) {
fs.unlink(filePath, err => { fs.unlink(filePath, err => {
if (err) { if (err) {

View file

@ -34,20 +34,17 @@ function * publishFile (action) {
publishMetadata['thumbnail'] = createThumbnailUrl(thumbnailChannel, thumbnailChannelId, claim, host); publishMetadata['thumbnail'] = createThumbnailUrl(thumbnailChannel, thumbnailChannelId, claim, host);
} }
// create form data for main publish // create form data for main publish
const publishFormData = createPublishFormData(file, publishMetadata); const publishFormData = createPublishFormData(file, thumbnail, publishMetadata);
// make the publish request // make the publish request
const publishChannel = yield call(makePublishRequestChannel, publishFormData); const publishChannel = yield call(makePublishRequestChannel, publishFormData);
let publishInProgress = true; while (true) {
while (publishInProgress) {
const {loadStart, progress, load, success, error} = yield take(publishChannel); const {loadStart, progress, load, success, error} = yield take(publishChannel);
if (error) { if (error) {
yield put(updatePublishStatus(publishStates.FAILED, error.message)); return yield put(updatePublishStatus(publishStates.FAILED, error.message));
publishInProgress = false;
} }
if (success) { if (success) {
yield put(clearFile()); yield put(clearFile());
history.push(`/${success.data.claimId}/${success.data.name}`); return history.push(`/${success.data.claimId}/${success.data.name}`);
publishInProgress = false;
} }
if (loadStart) { if (loadStart) {
yield put(updatePublishStatus(publishStates.LOAD_START, null)); yield put(updatePublishStatus(publishStates.LOAD_START, null));
@ -59,41 +56,6 @@ function * publishFile (action) {
yield put(updatePublishStatus(publishStates.PUBLISHING, null)); yield put(updatePublishStatus(publishStates.PUBLISHING, null));
} }
} }
// publish thumbnail
if (thumbnail) {
// create form data for thumbnail publish
const thumbnailMetadata = {
name : `${claim}-thumb`,
title : `${claim} thumbnail`,
description : `a thumbnail for ${claim}`,
license : publishMetadata.license,
nsfw : publishMetadata.nsfw,
type : 'image/png',
channel_name: thumbnailChannel,
channel_id : thumbnailChannelId,
};
const thumbnailFormData = createPublishFormData(thumbnail, thumbnailMetadata);
// make the publish reqeust
const thumbnailPublishChannel = yield call(makePublishRequestChannel, thumbnailFormData);
while (true) {
const {loadStart, progress, load, success, error} = yield take(thumbnailPublishChannel);
if (error) {
return console.log('thumbnail error:', error.message);
}
if (success) {
return console.log('thumbnail success:', success.data);
}
if (loadStart) {
console.log('thumbnail load started.');
}
if (progress) {
console.log('thumbnail progress:', `${progress}%`);
}
if (load) {
console.log('thumbnail load completed.');
}
}
}
}; };
export function * watchPublishStart () { export function * watchPublishStart () {

View file

@ -13,10 +13,14 @@ export const createPublishMetadata = (claim, { type }, { title, description, lic
return metadata; return metadata;
}; };
export const createPublishFormData = (file, metadata) => { export const createPublishFormData = (file, thumbnail, metadata) => {
let fd = new FormData(); let fd = new FormData();
// append file // append file
fd.append('file', file); fd.append('file', file);
// append thumbnail
if (thumbnail) {
fd.append('thumbnail', thumbnail);
}
// append metadata // append metadata
for (let key in metadata) { for (let key in metadata) {
if (metadata.hasOwnProperty(key)) { if (metadata.hasOwnProperty(key)) {

View file

@ -5,7 +5,7 @@ const multipartMiddleware = multipart({uploadDir: files.uploadDirectory});
const db = require('../models'); const db = require('../models');
const { checkClaimNameAvailability, checkChannelAvailability, publish } = require('../controllers/publishController.js'); const { checkClaimNameAvailability, checkChannelAvailability, publish } = require('../controllers/publishController.js');
const { getClaimList, resolveUri, getClaim } = require('../helpers/lbryApi.js'); const { getClaimList, resolveUri, getClaim } = require('../helpers/lbryApi.js');
const { createPublishParams, parsePublishApiRequestBody, parsePublishApiRequestFiles, parsePublishApiChannel, addGetResultsToFileData, createFileData } = require('../helpers/publishHelpers.js'); const { addGetResultsToFileData, createFileData, createPublishParams, createThumbnailPublishParams, parsePublishApiRequestBody, parsePublishApiRequestFiles, parsePublishApiChannel } = require('../helpers/publishHelpers.js');
const errorHandlers = require('../helpers/errorHandlers.js'); const errorHandlers = require('../helpers/errorHandlers.js');
const { sendGAAnonymousPublishTiming, sendGAChannelPublishTiming } = require('../helpers/googleAnalytics.js'); const { sendGAAnonymousPublishTiming, sendGAChannelPublishTiming } = require('../helpers/googleAnalytics.js');
const { authenticateIfNoUserToken } = require('../auth/authentication.js'); const { authenticateIfNoUserToken } = require('../auth/authentication.js');
@ -135,14 +135,14 @@ module.exports = (app) => {
logger.debug('api/claim-publish body:', body); logger.debug('api/claim-publish body:', body);
logger.debug('api/claim-publish files:', files); logger.debug('api/claim-publish files:', files);
// define variables // define variables
let name, fileName, filePath, fileType, nsfw, license, title, description, thumbnail, channelName, channelPassword; let name, fileName, filePath, fileType, thumbnailFileName, thumbnailFilePath, thumbnailFileType, nsfw, license, title, description, thumbnail, channelName, channelPassword;
// record the start time of the request // record the start time of the request
const publishStartTime = Date.now(); const publishStartTime = Date.now();
// validate the body and files of the request // validate the body and files of the request
try { try {
// validateApiPublishRequest(body, files); // validateApiPublishRequest(body, files);
({name, nsfw, license, title, description, thumbnail} = parsePublishApiRequestBody(body)); ({name, nsfw, license, title, description, thumbnail} = parsePublishApiRequestBody(body));
({fileName, filePath, fileType} = parsePublishApiRequestFiles(files)); ({fileName, filePath, fileType, thumbnailFileName, thumbnailFilePath, thumbnailFileType} = parsePublishApiRequestFiles(files));
({channelName, channelPassword} = parsePublishApiChannel(body, user)); ({channelName, channelPassword} = parsePublishApiChannel(body, user));
} catch (error) { } catch (error) {
return res.status(400).json({success: false, message: error.message}); return res.status(400).json({success: false, message: error.message});
@ -161,9 +161,16 @@ module.exports = (app) => {
throw new Error('That name is already claimed by another user.'); throw new Error('That name is already claimed by another user.');
} }
// create publish parameters object // create publish parameters object
return createPublishParams(filePath, name, title, description, license, nsfw, thumbnail, channelName); return Promise.all([
createPublishParams(filePath, name, title, description, license, nsfw, thumbnail, channelName),
createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw),
]);
}) })
.then(publishParams => { .then(([publishParams, thumbnailPublishParams]) => {
// publish the thumbnail
if (thumbnailPublishParams) {
publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType);
}
// publish the asset // publish the asset
return publish(publishParams, fileName, fileType); return publish(publishParams, fileName, fileType);
}) })