mirror of
https://github.com/GenderDysphoria/GenderDysphoria.fyi.git
synced 2025-01-31 07:16:17 +00:00
136 lines
2.9 KiB
JavaScript
136 lines
2.9 KiB
JavaScript
|
|
const path = require('path');
|
|
const { pick } = require('lodash');
|
|
const actions = require('./actions');
|
|
const File = require('./file');
|
|
const { TYPE } = require('./resolve');
|
|
const getImageDimensions = require('./lib/dimensions');
|
|
const getVideoDimensions = require('get-video-dimensions');
|
|
|
|
const RESOLUTIONS = [ 2048, 1024, 768, 576, 300, 100 ];
|
|
|
|
module.exports = exports = class Asset extends File {
|
|
|
|
constructor (filepath) {
|
|
super(filepath);
|
|
|
|
this.serializable.push(
|
|
'dimensions',
|
|
'sizes',
|
|
);
|
|
}
|
|
|
|
load () {
|
|
switch (this.type) {
|
|
case TYPE.VIDEO: return this.loadVideo();
|
|
case TYPE.IMAGE: return this.loadImage();
|
|
default:
|
|
}
|
|
}
|
|
|
|
async loadImage () {
|
|
|
|
const { width, height } = await getImageDimensions(this.input);
|
|
|
|
const ratioH = Math.round((height / width) * 100);
|
|
const ratioW = Math.round((width / height) * 100);
|
|
let orientation = 'wide';
|
|
if (ratioH > 100) {
|
|
orientation = 'tall';
|
|
} else if (ratioH === 100) {
|
|
orientation = 'square';
|
|
}
|
|
|
|
this.dimensions = {
|
|
width,
|
|
height,
|
|
ratioH,
|
|
ratioW,
|
|
orientation,
|
|
};
|
|
|
|
if (this.preprocessed) {
|
|
this.sizes = [ {
|
|
output: this.out,
|
|
url: this.url,
|
|
width,
|
|
height,
|
|
} ];
|
|
} else {
|
|
this.sizes = [
|
|
{
|
|
output: this.out,
|
|
url: this.url,
|
|
width,
|
|
height,
|
|
},
|
|
];
|
|
|
|
for (const w of RESOLUTIONS) {
|
|
if (w > width) continue;
|
|
const name = `${this.name}.${w}w${this.ext}`;
|
|
this.sizes.push({
|
|
output: path.join(this.base, name),
|
|
url: path.join(this.dir, name),
|
|
width: w,
|
|
height: Math.ceil((w / width) * height),
|
|
});
|
|
}
|
|
|
|
this.sizes.reverse();
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
async loadVideo () {
|
|
const { width, height } = await getVideoDimensions(this.input);
|
|
|
|
const ratioH = Math.round((height / width) * 100);
|
|
const ratioW = Math.round((width / height) * 100);
|
|
let orientation = 'wide';
|
|
if (ratioH > 100) {
|
|
orientation = 'tall';
|
|
} else if (ratioH === 100) {
|
|
orientation = 'square';
|
|
}
|
|
|
|
this.dimensions = {
|
|
width,
|
|
height,
|
|
ratioH,
|
|
ratioW,
|
|
orientation,
|
|
};
|
|
|
|
this.sizes = [ {
|
|
output: path.join(this.base, this.basename),
|
|
url: path.join(this.dir, this.basename),
|
|
width,
|
|
height,
|
|
} ];
|
|
|
|
return this;
|
|
}
|
|
|
|
webready () {
|
|
const { type, name, sizes } = this;
|
|
return {
|
|
type,
|
|
name,
|
|
sizes: sizes.map((s) => pick(s, [ 'url', 'width', 'height' ])),
|
|
};
|
|
}
|
|
|
|
tasks () {
|
|
return this.sizes.map(({ output, width }) => ({
|
|
input: this.input,
|
|
output,
|
|
format: this.preprocessed ? undefined : this.ext.slice(1),
|
|
width: this.preprocessed ? undefined : width,
|
|
action: this.preprocessed ? actions.copy : actions.image,
|
|
}));
|
|
}
|
|
|
|
};
|