mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-21 18:01:36 +03:00
9347e996f8
refs https://github.com/TryGhost/Toolbox/issues/523 - We need media file imports. Media handler is one of the pre-processing parts that need to be done during the import process - Media import handler is handling import files with following extensions: ".mp4",".webm", ".ogv", ".mp3", ".wav", ".ogg", ".m4a" - The implementation is largely a copy-paste with class syntax adjustments from the "/core/server/data/importer/handles/image.js" module - There are a lot of code similarities between media and image import handlers. The new "ImporterMedia" class could serve as a generic base class for file-storage-related imports
66 lines
2.1 KiB
JavaScript
66 lines
2.1 KiB
JavaScript
const _ = require('lodash');
|
|
const path = require('path');
|
|
|
|
class ImporterMediaHandler {
|
|
/**
|
|
*
|
|
* @param {Object} deps dependencies
|
|
* @param {Object} deps.storage storage adapter instance
|
|
* @param {Object} deps.config config instance
|
|
* @param {object} deps.urlUtils urlUtils instance
|
|
*/
|
|
constructor(deps) {
|
|
this.storage = deps.storage;
|
|
this.config = deps.config;
|
|
this.urlUtils = deps.urlUtils;
|
|
}
|
|
|
|
type = 'media';
|
|
|
|
get extensions() {
|
|
return this.config.get('uploads').media.extensions;
|
|
}
|
|
|
|
get contentTypes() {
|
|
return this.config.get('uploads').media.contentTypes;
|
|
}
|
|
|
|
directories = ['media', 'content'];
|
|
|
|
async loadFile(files, baseDir) {
|
|
const baseDirRegex = baseDir ? new RegExp('^' + baseDir + '/') : new RegExp('');
|
|
|
|
const mediaFolderRegexes = _.map(this.storage.staticFileURLPrefix.split('/'), function (dir) {
|
|
return new RegExp('^' + dir + '/');
|
|
});
|
|
|
|
// normalize the directory structure
|
|
const mediaContentPath = this.config.getContentPath('media');
|
|
files = _.map(files, function (file) {
|
|
const noBaseDir = file.name.replace(baseDirRegex, '');
|
|
let noGhostDirs = noBaseDir;
|
|
|
|
_.each(mediaFolderRegexes, function (regex) {
|
|
noGhostDirs = noGhostDirs.replace(regex, '');
|
|
});
|
|
|
|
file.originalPath = noBaseDir;
|
|
file.name = noGhostDirs;
|
|
file.targetDir = path.join(mediaContentPath, path.dirname(noGhostDirs));
|
|
return file;
|
|
});
|
|
|
|
const self = this;
|
|
return Promise.all(files.map(function (image) {
|
|
return self.storage.getUniqueFileName(image, image.targetDir).then(function (targetFilename) {
|
|
image.newPath = self.urlUtils.urlJoin('/', self.urlUtils.getSubdir(), self.storage.staticFileURLPrefix,
|
|
path.relative(self.config.getContentPath('media'), targetFilename));
|
|
|
|
return image;
|
|
});
|
|
}));
|
|
}
|
|
}
|
|
|
|
module.exports = ImporterMediaHandler;
|