mirror of https://github.com/thumbsup/thumbsup
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
2.9 KiB
JavaScript
61 lines
2.9 KiB
JavaScript
const path = require('path')
|
|
const urljoin = require('url-join')
|
|
const url = require('./url')
|
|
|
|
const BROWSER_SUPPORTED_EXT = /(jpg|jpeg|png|gif)$/i
|
|
|
|
exports.folders = function (filepath, rel, options = {}) {
|
|
const dir = path.dirname(filepath)
|
|
const name = path.basename(filepath, path.extname(filepath))
|
|
const ext = path.extname(filepath).substr(1)
|
|
const photoExt = photoExtension(filepath)
|
|
const videoExt = options.videoFormat || 'mp4'
|
|
switch (rel) {
|
|
case 'photo:thumbnail': return path.normalize(`media/thumbs/${dir}/${name}.${photoExt}`)
|
|
case 'photo:small': return path.normalize(`media/small/${dir}/${name}.${photoExt}`)
|
|
case 'photo:large': return path.normalize(`media/large/${dir}/${name}.${photoExt}`)
|
|
case 'video:thumbnail': return path.normalize(`media/thumbs/${dir}/${name}.jpg`)
|
|
case 'video:small': return path.normalize(`media/small/${dir}/${name}.jpg`)
|
|
case 'video:poster': return path.normalize(`media/large/${dir}/${name}.jpg`)
|
|
case 'video:resized': return path.normalize(`media/large/${dir}/${name}.${videoExt}`)
|
|
case 'fs:copy': return path.normalize(`media/original/${dir}/${name}.${ext}`)
|
|
case 'fs:symlink': return path.normalize(`media/original/${dir}/${name}.${ext}`)
|
|
case 'fs:link': return join(options.linkPrefix, filepath)
|
|
default: throw new Error(`Invalid relationship: ${rel}`)
|
|
}
|
|
}
|
|
|
|
exports.suffix = function (filepath, rel, options = {}) {
|
|
const dir = path.dirname(filepath)
|
|
const name = path.basename(filepath, path.extname(filepath))
|
|
const ext = path.extname(filepath).substr(1)
|
|
const photoExt = photoExtension(filepath)
|
|
const videoExt = options.videoFormat || 'mp4'
|
|
switch (rel) {
|
|
case 'photo:thumbnail': return path.normalize(`media/${dir}/${name}_${ext}_thumb.${photoExt}`)
|
|
case 'photo:small': return path.normalize(`media/${dir}/${name}_${ext}_small.${photoExt}`)
|
|
case 'photo:large': return path.normalize(`media/${dir}/${name}_${ext}_large.${photoExt}`)
|
|
case 'video:thumbnail': return path.normalize(`media/${dir}/${name}_${ext}_thumb.jpg`)
|
|
case 'video:small': return path.normalize(`media/${dir}/${name}_${ext}_small.jpg`)
|
|
case 'video:poster': return path.normalize(`media/${dir}/${name}_${ext}_poster.jpg`)
|
|
case 'video:resized': return path.normalize(`media/${dir}/${name}_${ext}_large.${videoExt}`)
|
|
case 'fs:copy': return path.normalize(`media/${dir}/${name}.${ext}`)
|
|
case 'fs:symlink': return path.normalize(`media/${dir}/${name}.${ext}`)
|
|
case 'fs:link': return join(options.linkPrefix, filepath)
|
|
default: throw new Error(`Invalid relationship: ${rel}`)
|
|
}
|
|
}
|
|
|
|
function photoExtension (filepath) {
|
|
const extension = path.extname(filepath).substr(1)
|
|
return extension.match(BROWSER_SUPPORTED_EXT) ? extension : 'jpg'
|
|
}
|
|
|
|
function join (prefix, filepath) {
|
|
if (prefix.match(/^(http|https|file):\/\//)) {
|
|
return urljoin(prefix, url.fromPath(filepath))
|
|
} else {
|
|
return path.join(prefix, filepath)
|
|
}
|
|
}
|