108 lines
No EOL
3.2 KiB
JavaScript
108 lines
No EOL
3.2 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
const ExifReader = require('exifreader');
|
|
const sharp = require('sharp');
|
|
|
|
var productsDatabase = { photos: []}
|
|
var i = 1;
|
|
var s = 0;
|
|
//console.log("start search");
|
|
async function searchFile(dir, fileExt) {
|
|
s++;
|
|
// read the contents of the directory
|
|
const files = fs.readdirSync(dir);
|
|
|
|
// search through the files
|
|
for (let k = 0; k < files.length; k++) {
|
|
file = files[k];
|
|
const filePath = path.join(dir, file);
|
|
|
|
// get the file stats
|
|
const fileStat = fs.statSync(filePath);
|
|
// if the file is a directory, recursively search the directory
|
|
if (fileStat.isDirectory()) {
|
|
await searchFile(filePath, fileExt);
|
|
} else if (path.extname(file).toLowerCase() == fileExt) {
|
|
// if the file is a match, print it
|
|
var dd = dir.split("/");
|
|
var d = dd.slice(1);
|
|
var d1 = dd.slice(1);
|
|
d1[1]= "thumbs";
|
|
var ff = file.split(".");
|
|
var fn = ff.slice(0,-1).join(".");
|
|
var f1 = fn+'_min'+'.'+ff.at(-1);
|
|
var f2 = fn+'_avg'+'.'+ff.at(-1);
|
|
var f3 = fn+'_sharp'+'.'+ff.at(-1);
|
|
var extFilePath = path.join(d.join("/"),file);
|
|
var extThumbMinPath = path.join(d1.join("/"),f1);
|
|
var extThumbAvgPath = path.join(d1.join("/"),f2);
|
|
var extThumbSharpPath = path.join("public",d1.join("/"),f3);
|
|
var thumbMinPath = path.join("public",extThumbMinPath);
|
|
var thumbAvgPath = path.join("public",extThumbAvgPath);
|
|
var dt = path.join("public",d1.join("/"));
|
|
if (!fs.existsSync(dt)){
|
|
fs.mkdirSync(dt, { recursive: true });
|
|
}
|
|
var data;
|
|
try {
|
|
data = fs.readFileSync(filePath);
|
|
} catch (err) {
|
|
//console.error(err);
|
|
}
|
|
const tags = await ExifReader.load(filePath, {expanded: true});
|
|
//console.log(tags);
|
|
var time = tags.exif.DateTimeOriginal;
|
|
if (time === undefined){} else {time=time.value[0]}
|
|
var gps = tags['gps'];
|
|
//if (time === undefined ){console.log(filePath)}
|
|
//console.log("read: "+filePath);
|
|
await sharp(data)
|
|
.resize(100,100,"inside")
|
|
.withMetadata()
|
|
.toFile(thumbMinPath, (err, info) => {});
|
|
await sharp(data)
|
|
.resize(400)
|
|
.withMetadata()
|
|
.toFile(thumbAvgPath, (err, info) => {});
|
|
console.log(i+" - "+file);
|
|
productsDatabase.photos.push({
|
|
id: i,
|
|
name: file,
|
|
path: extFilePath,
|
|
thub1: extThumbMinPath,
|
|
thub2: extThumbAvgPath,
|
|
gps: tags['gps'],
|
|
data: time
|
|
});
|
|
i++;
|
|
}
|
|
if(k == files.length-1) {
|
|
if (s == 1) {
|
|
fs.writeFileSync("api_v1/db.json", JSON.stringify(productsDatabase));
|
|
//console.log("finito");
|
|
//console.log(productsDatabase);
|
|
} else {
|
|
s--;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
async function thumb(filePath, opt){
|
|
try {
|
|
const thumbnail = await imageThumbnail(filePath, opt);
|
|
//console.log(thumbnail);
|
|
return thumbnail;
|
|
} catch (err) {
|
|
//console.error(err);
|
|
}
|
|
}
|
|
// start the search in the current directory
|
|
async function run(){
|
|
await searchFile('./public/photos/original', '.jpg');
|
|
//console.log(JSON.stringify(productsDatabase))
|
|
}
|
|
|
|
run() |