deal with hash instead of spliting filename in various locations, and make use of post file delete helper

merge-requests/208/head
fatchan 5 years ago
parent 13c226f066
commit ddfe6241b5
  1. 13
      helpers/files/deletepostfiles.js
  2. 6
      helpers/files/imagethumbnail.js
  3. 6
      helpers/files/videothumbnail.js
  4. 36
      models/forms/deletepostsfiles.js
  5. 7
      models/forms/makepost.js
  6. 2
      views/mixins/catalogtile.pug
  7. 2
      views/mixins/post.pug
  8. 6
      views/pages/thread.pug

@ -3,15 +3,14 @@
const { remove } = require('fs-extra') const { remove } = require('fs-extra')
, uploadDirectory = require(__dirname+'/uploadDirectory.js') , uploadDirectory = require(__dirname+'/uploadDirectory.js')
module.exports = (fileNames) => { module.exports = (files) => {
//delete all the psot files and thumbs using the filenames //delete all the files and thumbs
return Promise.all(fileNames.map(async filename => { return Promise.all(files.map(async file => {
//dont question it.
return Promise.all([ return Promise.all([
remove(`${uploadDirectory}img/${filename}`), remove(`${uploadDirectory}img/${file.filename}`),
remove(`${uploadDirectory}img/thumb-${filename.split('.')[0]}.jpg`) remove(`${uploadDirectory}img/thumb-${file.hash}.jpg`)
]).catch(e => console.error) //ignore for now ]).catch(e => console.error)
})); }));
} }

@ -2,12 +2,12 @@ const gm = require('gm')
, configs = require(__dirname+'/../../configs/main.json') , configs = require(__dirname+'/../../configs/main.json')
, uploadDirectory = require(__dirname+'/uploadDirectory.js'); , uploadDirectory = require(__dirname+'/uploadDirectory.js');
module.exports = (filename) => { module.exports = (file) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
gm(`${uploadDirectory}img/${filename}`) gm(`${uploadDirectory}img/${file.filename}`)
.resize(128, 128) .resize(128, 128)
.write(`${uploadDirectory}img/thumb-${filename.split('.')[0]}.jpg`, function (err) { .write(`${uploadDirectory}img/thumb-${file.hash}.jpg`, function (err) {
if (err) { if (err) {
return reject(err); return reject(err);
} }

@ -2,17 +2,17 @@ const ffmpeg = require('fluent-ffmpeg')
, configs = require(__dirname+'/../../configs/main.json') , configs = require(__dirname+'/../../configs/main.json')
, uploadDirectory = require(__dirname+'/uploadDirectory.js'); , uploadDirectory = require(__dirname+'/uploadDirectory.js');
module.exports = (filename, geometry) => { module.exports = (file, geometry) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
ffmpeg(`${uploadDirectory}img/${filename}`) ffmpeg(`${uploadDirectory}img/${file.filename}`)
.on('end', () => { .on('end', () => {
return resolve(); return resolve();
}) })
.screenshots({ .screenshots({
timestamps: ['1%'],//1% should remedy black first frames or fade-ins timestamps: ['1%'],//1% should remedy black first frames or fade-ins
count: 1, count: 1,
filename: `thumb-${filename.split('.')[0]}.jpg`, filename: `thumb-${file.hash}.jpg`,
folder: `${uploadDirectory}img/`, folder: `${uploadDirectory}img/`,
size: geometry.width > geometry.height ? '128x?' : '?x128' size: geometry.width > geometry.height ? '128x?' : '?x128'
//keep aspect ratio, but also making sure taller/wider thumbs dont exceed 128 in either dimension //keep aspect ratio, but also making sure taller/wider thumbs dont exceed 128 in either dimension

@ -1,50 +1,48 @@
'use strict'; 'use strict';
const { remove } = require('fs-extra') const { Files } = require(__dirname+'/../../db/')
, { Files } = require(__dirname+'/../../db/') , deletePostFiles = require(__dirname+'/../../helpers/files/deletepostfiles.js');
, uploadDirectory = require(__dirname+'/../../helpers/files/uploadDirectory.js')
module.exports = async (posts, unlinkOnly) => { module.exports = async (posts, unlinkOnly) => {
//get filenames from all the posts //get filenames from all the posts
let fileNames = []; let files = [];
for (let i = 0; i < posts.length; i++) { for (let i = 0; i < posts.length; i++) {
const post = posts[i]; const post = posts[i];
if (post.files.length > 0) { if (post.files.length > 0) {
fileNames = fileNames.concat(post.files.map(x => x.filename)); files = files.concat(post.files.map(file => {
return {
filename: file.filename,
hash: file.hash
};
}));
} }
} }
fileNames = [...new Set(fileNames)]; files = [...new Set(files)];
if (fileNames.length == 0) { if (files.length == 0) {
return { return {
message: 'No files found' message: 'No files found'
}; };
} }
if (fileNames.length > 0) { if (files.length > 0) {
await Files.decrement(fileNames); await Files.decrement(files.map(x => x.filename));
} }
if (unlinkOnly) { if (unlinkOnly) {
return { return {
message:`Unlinked ${fileNames.length} file(s) across ${posts.length} post(s)`, message:`Unlinked ${files.length} file(s) across ${posts.length} post(s)`,
action:'$set', action:'$set',
query: { query: {
'files': [] 'files': []
} }
}; };
} else { } else {
//delete all the files using the filenames //delete all the files
await Promise.all(fileNames.map(async filename => { await deletePostFiles(files);
//dont question it.
return Promise.all([
remove(`${uploadDirectory}img/${filename}`),
remove(`${uploadDirectory}img/thumb-${filename.split('.')[0]}.jpg`)
])
}));
return { return {
message:`Deleted ${fileNames.length} file(s) from server`, message:`Deleted ${files.length} file(s) from server`,
//NOTE: only deletes from selected posts. other posts with same image will 404 //NOTE: only deletes from selected posts. other posts with same image will 404
action:'$set', action:'$set',
query: { query: {

@ -155,7 +155,6 @@ module.exports = async (req, res, next) => {
filename: file.filename, filename: file.filename,
originalFilename: file.name, originalFilename: file.name,
mimetype: file.mimetype, mimetype: file.mimetype,
maintype: file.mimetype.split('/')[0],
size: file.size, size: file.size,
}; };
@ -166,7 +165,7 @@ module.exports = async (req, res, next) => {
const existsThumb = await pathExists(`${uploadDirectory}img/thumb-${processedFile.hash}.jpg`); const existsThumb = await pathExists(`${uploadDirectory}img/thumb-${processedFile.hash}.jpg`);
//handle video/image ffmpeg or graphicsmagick //handle video/image ffmpeg or graphicsmagick
switch (processedFile.maintype) { switch (processedFile.mimetype.split('/')[0]) {
case 'image': case 'image':
const imageData = await imageIdentify(req.files.file[i].tempFilePath, null, true); const imageData = await imageIdentify(req.files.file[i].tempFilePath, null, true);
processedFile.geometry = imageData.size // object with width and height pixels processedFile.geometry = imageData.size // object with width and height pixels
@ -179,7 +178,7 @@ module.exports = async (req, res, next) => {
await imageUpload(file, processedFile.filename, 'img'); await imageUpload(file, processedFile.filename, 'img');
} }
if (!existsThumb && processedFile.hasThumb) { if (!existsThumb && processedFile.hasThumb) {
await imageThumbnail(processedFile.filename); await imageThumbnail(processedFile);
} }
processedFile = fixGifs(processedFile); processedFile = fixGifs(processedFile);
break; break;
@ -205,7 +204,7 @@ module.exports = async (req, res, next) => {
await videoUpload(file, processedFile.filename, 'img'); await videoUpload(file, processedFile.filename, 'img');
} }
if (!existsThumb) { if (!existsThumb) {
await videoThumbnail(processedFile.filename, processedFile.geometry); await videoThumbnail(processedFile, processedFile.geometry);
} }
break; break;
default: default:

@ -17,7 +17,7 @@ mixin catalogtile(board, post, index)
img.catalog-thumb(src='/img/spoiler.png' width='64' height='64') img.catalog-thumb(src='/img/spoiler.png' width='64' height='64')
else else
if post.files[0].hasThumb if post.files[0].hasThumb
img.catalog-thumb(src=`/img/thumb-${post.files[0].filename.split('.')[0]}.jpg` width='64' height='64') img.catalog-thumb(src=`/img/thumb-${post.files[0].hash}.jpg` width='64' height='64')
else else
img.catalog-thumb(src=`/img/${post.files[0].filename}` width='64' height='64') img.catalog-thumb(src=`/img/${post.files[0].filename}` width='64' height='64')
if post.message if post.message

@ -57,7 +57,7 @@ mixin post(post, truncate, manage=false, globalmanage=false, ban=false)
if post.spoiler if post.spoiler
img.file-thumb(src='/img/spoiler.png' width='128' height='128') img.file-thumb(src='/img/spoiler.png' width='128' height='128')
else if file.hasThumb else if file.hasThumb
img.file-thumb(src=`/img/thumb-${file.filename.split('.')[0]}.jpg` height=file.geometry.thumbheight width=file.geometry.thumbwidth) img.file-thumb(src=`/img/thumb-${file.hash}.jpg` height=file.geometry.thumbheight width=file.geometry.thumbwidth)
else else
img.file-thumb(src=`/img/${file.filename}` height=file.geometry.height width=file.geometry.width) img.file-thumb(src=`/img/${file.filename}` height=file.geometry.height width=file.geometry.width)
if post.message if post.message

@ -11,10 +11,10 @@ block head
if thread.files.length > 0 if thread.files.length > 0
if thread.spoiler if thread.spoiler
meta(property='og:image', content='/img/spoiler.png') meta(property='og:image', content='/img/spoiler.png')
else if thread.files[0].hasThumb else if thread.files[0].hasThumb === true
meta(property='og:image', content='/img/thumb-'+thread.files[0].filename.split('.')[0]+'.jpg') meta(property='og:image', content=`/img/thumb-${thread.files[0].hash}.jpg`)
else else
meta(property='og:image', content='/img/'+thread.files[0].filename) meta(property='og:image', content=`/img/${thread.files[0].filename}`)
block content block content
include ../includes/boardheader.pug include ../includes/boardheader.pug

Loading…
Cancel
Save