* Updated path resolving for upload folder option.
This SHOULD now allow using an absolute path, even those outside of
the lolisafe installation.

* Added a config option at uploads -> generateThumbs, named placeholder.
It's a string option that lets you set path of the placeholder image
for files whose thumbnail could not be generated.
It defaults to the old hard-coded path when set to falsy value.

* Fixed thumbs script not using upload folder from config file.

* Added filters for thumb generation error handling.
This is used to ignore some common error messages,
such as file formats not being supported.
This commit is contained in:
Bobby Wibowo 2019-08-23 16:49:53 +07:00
parent 3a398721b5
commit e45d854c09
No known key found for this signature in database
GPG Key ID: 51C3A1E1E22D26CF
4 changed files with 18 additions and 9 deletions

View File

@ -282,10 +282,12 @@ module.exports = {
/* /*
Thumbnails are only used in the dashboard and album's public pages. Thumbnails are only used in the dashboard and album's public pages.
You need to install a separate binary called ffmpeg (https://ffmpeg.org/) for video thumbnails. You need to install a separate binary called ffmpeg (https://ffmpeg.org/) for video thumbnails.
NOTE: Placeholder defaults to 'public/images/unavailable.png'.
*/ */
generateThumbs: { generateThumbs: {
image: true, image: true,
video: false video: false,
placeholder: null
}, },
/* /*

View File

@ -11,7 +11,7 @@ const albumsController = {}
const maxTries = config.uploads.maxTries || 1 const maxTries = config.uploads.maxTries || 1
const homeDomain = config.homeDomain || config.domain const homeDomain = config.homeDomain || config.domain
const uploadsDir = path.join(__dirname, '..', config.uploads.folder) const uploadsDir = path.resolve(config.uploads.folder)
const zipsDir = path.join(uploadsDir, 'zips') const zipsDir = path.join(uploadsDir, 'zips')
const zipMaxTotalSize = config.cloudflare.zipMaxTotalSize const zipMaxTotalSize = config.cloudflare.zipMaxTotalSize
const zipMaxTotalSizeBytes = parseInt(config.cloudflare.zipMaxTotalSize) * 1000000 const zipMaxTotalSizeBytes = parseInt(config.cloudflare.zipMaxTotalSize) * 1000000

View File

@ -36,9 +36,9 @@ const _stats = {
} }
} }
const uploadsDir = path.join(__dirname, '..', config.uploads.folder) const uploadsDir = path.resolve(config.uploads.folder)
const thumbsDir = path.join(uploadsDir, 'thumbs') const thumbsDir = path.join(uploadsDir, 'thumbs')
const thumbUnavailable = path.join(__dirname, '../public/images/unavailable.png') const thumbPlaceholder = path.resolve(config.uploads.generateThumbs.placeholder || 'public/images/unavailable.png')
const cloudflareAuth = config.cloudflare.apiKey && config.cloudflare.email && config.cloudflare.zoneId const cloudflareAuth = config.cloudflare.apiKey && config.cloudflare.email && config.cloudflare.zoneId
utilsController.imageExtensions = ['.webp', '.jpg', '.jpeg', '.gif', '.png', '.tiff', '.tif', '.svg'] utilsController.imageExtensions = ['.webp', '.jpg', '.jpeg', '.gif', '.png', '.tiff', '.tif', '.svg']
@ -250,11 +250,17 @@ utilsController.generateThumbs = (name, force) => {
}) })
.then(resolve) .then(resolve)
.catch(error => { .catch(error => {
console.error(`${name}: ${error.toString()}`) const errorString = error.toString()
fs.symlink(thumbUnavailable, thumbname, error => { const tests = [
if (error) console.error(error) /Error: Input file contains unsupported image format/,
/Error: ffprobe exited with code 1/
]
if (!tests.some(t => t.test(errorString)))
console.error(`${name}: ${errorString}`)
fs.symlink(thumbPlaceholder, thumbname, err => {
if (err) console.error(err)
// We return true if we could make a symlink to the placeholder image // We return true if we could make a symlink to the placeholder image
resolve(!error) resolve(!err)
}) })
}) })
}) })

View File

@ -1,4 +1,5 @@
const { stripIndents } = require('./_utils') const { stripIndents } = require('./_utils')
const config = require('./../config')
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const utils = require('./../controllers/utilsController') const utils = require('./../controllers/utilsController')
@ -58,7 +59,7 @@ thumbs.do = async () => {
cfcache: 0 = do not clear cloudflare cache (default), 1 = clear cloudflare cache cfcache: 0 = do not clear cloudflare cache (default), 1 = clear cloudflare cache
`)) `))
const uploadsDir = path.join(__dirname, '..', 'uploads') const uploadsDir = path.resolve(config.uploads.folder)
const thumbsDir = path.join(uploadsDir, 'thumbs') const thumbsDir = path.join(uploadsDir, 'thumbs')
const _uploads = await thumbs.getFiles(uploadsDir) const _uploads = await thumbs.getFiles(uploadsDir)