Files
legolog/db/imagesorter.js
Ben 245b8fd4d1 the image database
Former-commit-id: ac868cf24e85a95fd65ddea93ea2324942c2cdb3
2022-02-03 19:56:09 +00:00

48 lines
1.7 KiB
JavaScript

// sorts images
// Take the file name `2336p68.png`, which is a Lego "Cockpit Space Nose",
// after a simple MD5 hash, the result is:
// ```text
// "d2ef319ea58566b55070e06096165cb8"
// ^^^^
// ```
// Using the first four characters in the hash, we can allocate images
// into buckets for storage and quick retreval. This acts very similar
// to a hash table implemented in the filesystem.
const md5 = require('md5');
const fs = require('fs');
fs.readdir('./image/', (err, files) => {
files.forEach((file) => {
file = file.split('.png')[0];
const hash = md5(file);
const bucket = hash.substring(0, 4);
const newFile = `./image/${bucket[0]}/${bucket[1]}/${bucket[2]}/${bucket[3]}/${file}.png`;
// if directory doesn't exist, create it
if (!fs.existsSync(`./image/`)) {
fs.mkdirSync(`./image/`);
}
if (!fs.existsSync(`./image/${bucket[0]}/`)) {
fs.mkdirSync(`./image/${bucket[0]}/`);
}
if (!fs.existsSync(`./image/${bucket[0]}/${bucket[1]}/`)) {
fs.mkdirSync(`./image/${bucket[0]}/${bucket[1]}/`);
}
if (!fs.existsSync(`./image/${bucket[0]}/${bucket[1]}/${bucket[2]}/`)) {
fs.mkdirSync(`./image/${bucket[0]}/${bucket[1]}/${bucket[2]}/`);
}
if (!fs.existsSync(`./image/${bucket[0]}/${bucket[1]}/${bucket[2]}/${bucket[3]}/`)) {
fs.mkdirSync(`./image/${bucket[0]}/${bucket[1]}/${bucket[2]}/${bucket[3]}/`);
}
fs.rename(`./image/${file}.png`, newFile, (err) => {
if (err) {
console.log(err);
}
});
});
});