"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); require("dotenv/config"); const log_1 = require("./log"); const promises_1 = require("fs/promises"); const path_1 = require("path"); const util_1 = require("util"); const shell_1 = require("./shell"); const hash_1 = require("./hash"); const files3_1 = require("./files3"); const env_1 = require("./env"); const db_1 = require("./db"); const sizeOf = (0, util_1.promisify)(require('image-size')); class Generate { constructor() { this.inbox = (0, env_1.envString)('INBOX', '~/Photos/toprocess'); this.photos = (0, env_1.envString)('PHOTOS', '~/Photos/processed'); this.log = (0, log_1.createLog)('generate'); this.log.info(`Generating site: ${new Date()}`); this.db = new db_1.DB(); this.s3 = new files3_1.Files3((0, env_1.envString)('S3_BUCKET', 'mmcwilliamsphotos'), true); this.generate(); } async generate() { //check version //sync await this.checkInbox(); //validate } async checkInbox() { let inbox; let images; let filename; let meta; let photo; try { inbox = await (0, promises_1.realpath)(this.inbox); } catch (err) { this.log.error(err); return; } try { images = await (0, promises_1.readdir)(inbox); } catch (err) { this.log.error(err); return; } images = images.filter((el) => { if (el.toLowerCase().indexOf('.jpg') !== -1 || el.toLowerCase().indexOf('.jpeg') !== -1 || el.toLowerCase().indexOf('.tif') !== -1 || el.toLowerCase().indexOf('.tiff') !== -1) { return true; } return false; }); if (images.length === 0) { this.log.info(`No new images found`); return; } images = await Promise.all(images.map(async (el) => { return await (0, promises_1.realpath)((0, path_1.join)(inbox, el)); })); for (let image of images) { this.log.info(image); filename = (0, path_1.basename)(image); meta = this.parseFilename(filename); try { photo = await this.createPhoto(image, meta); } catch (err) { this.log.error(`Error creating photo record metadata`, err); continue; } try { await this.db.create(photo); } catch (err) { this.log.error(`Error inserting photo into database`, err); continue; } try { await this.upload(image); } catch (err) { this.log.error(`Error uploading image`, err); continue; } //await this.move(image); } } async img(file, exif) { const cmd = ['bash', 'scripts/img.sh', file, exif]; const shell = new shell_1.Shell(cmd); try { await shell.execute(); } catch (err) { this.log.error(err); return; } this.log.info(`Processed image file for ${file}`); } async getImageDimensions(imagePath) { let dimensions; try { dimensions = await sizeOf(imagePath); return dimensions; } catch (err) { this.log.error('Error getting image dimensions:', err); } } capitalize(str) { return (str.substring(0, 1).toUpperCase()) + str.substring(1); } formatProperNouns(str) { let parts = str.split('-'); parts = parts.map(el => this.capitalize(el)); return parts.join(' '); } //year //month //day //format //filmstock //location //description //original //2024_12_02_35mm_Kodak-Gold-200_Somerville-MA_Walk-towards-Harvard-Square#000061280009.tif parseFilename(filename) { const halves = filename.split('#'); const parts = halves[0].split('_'); let meta = {}; for (let i = 0; i < parts.length; i++) { switch (i) { case 0: meta.year = parseInt(parts[i]); break; case 1: meta.month = parseInt(parts[i]); break; case 2: meta.day = parseInt(parts[i]); break; case 3: meta.format = parts[i]; break; case 4: meta.filmstock = parts[i].split('-').join(' '); break; case 5: meta.location = parts[i].split('-').join(' '); break; case 6: meta.description = parts[i].split('-').join(' '); break; } } meta.original = halves[1]; return meta; } async createPhoto(image, meta) { const hash = await hash_1.Hashes.fileHash(image); const dimensions = await this.getImageDimensions(image); const now = Date.now(); return { name: (0, path_1.basename)(image), original: meta.original, hash, width: dimensions.width, height: dimensions.height, format: meta.format, filmstock: meta.filmstock, location: meta.location, discovered: now, updated: now, created: +new Date(meta.year, meta.month, meta.day) }; } async upload(image) { const name = (0, path_1.basename)(image); return this.s3.createFromPath(image, name); } } new Generate(); //# sourceMappingURL=generate.js.map