aboutsummaryrefslogtreecommitdiff
path: root/src/api/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/utils')
-rw-r--r--src/api/utils/ThumbUtil.js58
-rw-r--r--src/api/utils/Util.js21
2 files changed, 50 insertions, 29 deletions
diff --git a/src/api/utils/ThumbUtil.js b/src/api/utils/ThumbUtil.js
index 5c96b5c..e508969 100644
--- a/src/api/utils/ThumbUtil.js
+++ b/src/api/utils/ThumbUtil.js
@@ -2,59 +2,85 @@ const jetpack = require('fs-jetpack');
const path = require('path');
const sharp = require('sharp');
const ffmpeg = require('fluent-ffmpeg');
+const generatePreview = require('ffmpeg-generate-video-preview');
-const imageExtensions = ['.jpg', '.jpeg', '.gif', '.png', '.webp'];
-const videoExtensions = ['.webm', '.mp4', '.wmv', '.avi', '.mov'];
+const log = require('./Log');
class ThumbUtil {
+ static imageExtensions = ['.jpg', '.jpeg', '.gif', '.png', '.webp'];
+ static videoExtensions = ['.webm', '.mp4', '.wmv', '.avi', '.mov'];
+
+ static thumbPath = path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, 'thumbs');
+ static squareThumbPath = path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, 'thumbs', 'square');
+ static videoPreviewPath = path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, 'thumbs', 'preview');
+
static generateThumbnails(filename) {
const ext = path.extname(filename).toLowerCase();
const output = `${filename.slice(0, -ext.length)}.png`;
- if (imageExtensions.includes(ext)) return this.generateThumbnailForImage(filename, output);
- if (videoExtensions.includes(ext)) return this.generateThumbnailForVideo(filename);
+ const previewOutput = `${filename.slice(0, -ext.length)}.gif`;
+
+ if (ThumbUtil.imageExtensions.includes(ext)) return this.generateThumbnailForImage(filename, output);
+ if (ThumbUtil.videoExtensions.includes(ext)) return this.generateThumbnailForVideo(filename, previewOutput);
return null;
}
static async generateThumbnailForImage(filename, output) {
- const file = await jetpack.readAsync(
- path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, filename),
- 'buffer'
- );
+ const filePath = path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, filename);
+
+ const file = await jetpack.readAsync(filePath, 'buffer');
await sharp(file)
.resize(64, 64)
.toFormat('png')
- .toFile(path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, 'thumbs', 'square', output));
+ .toFile(path.join(ThumbUtil.squareThumbPath, output));
await sharp(file)
.resize(225, null)
.toFormat('png')
- .toFile(path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, 'thumbs', output));
+ .toFile(path.join(ThumbUtil.thumbPath, output));
}
- static generateThumbnailForVideo(filename) {
- ffmpeg(path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, filename))
+ static generateThumbnailForVideo(filename, output) {
+ const filePath = path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, filename);
+
+ ffmpeg(filePath)
.thumbnail({
timestamps: [0],
filename: '%b.png',
- folder: path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, 'thumbs', 'square'),
+ folder: ThumbUtil.squareThumbPath,
size: '64x64'
})
.on('error', error => log.error(error.message));
- ffmpeg(path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, filename))
+
+ ffmpeg(filePath)
.thumbnail({
timestamps: [0],
filename: '%b.png',
- folder: path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, 'thumbs'),
+ folder: ThumbUtil.thumbPath,
size: '150x?'
})
.on('error', error => log.error(error.message));
+
+ try {
+ generatePreview({
+ input: filePath,
+ width: 150,
+ output: path.join(ThumbUtil.videoPreviewPath, output)
+ });
+ } catch (e) {
+ console.error(e);
+ }
}
static getFileThumbnail(filename) {
if (!filename) return null;
const ext = path.extname(filename).toLowerCase();
- if (!imageExtensions.includes(ext) && !videoExtensions.includes(ext)) return null;
+ if (!ThumbUtil.imageExtensions.includes(ext) && !ThumbUtil.videoExtensions.includes(ext)) return null;
return `${filename.slice(0, -ext.length)}.png`;
}
+
+ static async removeThumbs(thumbName) {
+ await jetpack.removeAsync(path.join(ThumbUtil.thumbPath, thumbName));
+ await jetpack.removeAsync(ThumbUtil.squareThumbPath, thumbName);
+ }
}
module.exports = ThumbUtil;
diff --git a/src/api/utils/Util.js b/src/api/utils/Util.js
index 8c9428d..c997581 100644
--- a/src/api/utils/Util.js
+++ b/src/api/utils/Util.js
@@ -24,6 +24,8 @@ const ThumbUtil = require('./ThumbUtil');
const blockedExtensions = process.env.BLOCKED_EXTENSIONS.split(',');
class Util {
+ static uploadPath = path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER);
+
static uuid() {
return uuidv4();
}
@@ -55,7 +57,7 @@ class Util {
}) + path.extname(name).toLowerCase();
// TODO: Change this to look for the file in the db instead of in the filesystem
- const exists = jetpack.exists(path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, filename));
+ const exists = jetpack.exists(path.join(Util.uploadPath, filename));
if (!exists) return filename;
if (i < 5) return retry(i + 1);
log.error('Couldnt allocate identifier for file');
@@ -86,10 +88,7 @@ class Util {
}
static async getFileHash(filename) {
- const file = await jetpack.readAsync(
- path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, filename),
- 'buffer'
- );
+ const file = await jetpack.readAsync(path.join(Util.uploadPath, filename), 'buffer');
if (!file) {
log.error(`There was an error reading the file < ${filename} > for hashing`);
return null;
@@ -115,13 +114,9 @@ class Util {
static async deleteFile(filename, deleteFromDB = false) {
const thumbName = ThumbUtil.getFileThumbnail(filename);
try {
- await jetpack.removeAsync(path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, filename));
- await jetpack.removeAsync(
- path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, 'thumbs', thumbName)
- );
- await jetpack.removeAsync(
- path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, 'thumbs', 'square', thumbName)
- );
+ await jetpack.removeAsync(path.join(Util.uploadPath, filename));
+ await ThumbUtil.removeThumbs(thumbName);
+
if (deleteFromDB) {
await db
.table('files')
@@ -205,7 +200,7 @@ class Util {
try {
const zip = new Zip();
for (const file of files) {
- zip.addLocalFile(path.join(__dirname, '..', '..', '..', process.env.UPLOAD_FOLDER, file));
+ zip.addLocalFile(path.join(Util.uploadPath, file));
}
zip.writeZip(
path.join(