From d4a08ac45a94b6d3b92464c37a96d4b8d2c322c5 Mon Sep 17 00:00:00 2001 From: James Ketrenos Date: Mon, 8 Oct 2018 13:45:55 -0700 Subject: [PATCH] File checks implemented. --- util/check.js | 138 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 112 insertions(+), 26 deletions(-) diff --git a/util/check.js b/util/check.js index f204eae..7d17154 100644 --- a/util/check.js +++ b/util/check.js @@ -10,7 +10,7 @@ if (process.argv.length <= 2) { } const items = process.argv.splice(2); -const picturesPath = config.get("picturesPath").replace(/\/$/, ""); +const picturesPath = config.get("picturesPath").replace(/\/$/, "") + "/"; for (let i = 0; i < items.length; i++) { if (parseInt(items[i]) == items[i]) { @@ -27,10 +27,10 @@ for (let i = 0; i < items.length; i++) { } const exists = function(path) { - return stat(path).then(function() { - return true; + return stat(path).then(function(stats) { + return stats; }).catch(function() { - return false; + return null; }); } @@ -51,28 +51,114 @@ const stat = function (_path) { }); } -require("../server/db/photos").then(function(db) { - const photoDB = db; - return Promise.mapSeries(items, function(item) { - switch (item.type) { - case "file": - return exists(item.value).then(function(exists) { - console.log("File '" + item.value + "' " + (exists ? "exists" : "does not exist.")); - }); - case "id": - return photoDB.sequelize.query("SELECT * FROM photos WHERE id=:id", { - replacements: { - id: item.value - }, - type: photoDB.Sequelize.QueryTypes.SELECT, - raw: true - }).then(function(photos) { - if (photos.length == 0) { - console.log("Item " + item.value + " does not exist."); - } else { - console.log("Item " + item.value + " exists:", photos[0]); - } - }); +const imageExtensions = [ "jpg", "jpeg", "png", "gif", "nef" ], + imageRegExp = new RegExp("\.((" + imageExtensions.join(")|(") + "))$", "i"), + videoExtensions = [ "mov", "avi", "mp4", "webm" ], + videoRegExp = new RegExp("\.((" + videoExtensions.join(")|(") + "))$", "i"); + +function getAssetInfoFromDisk(asset, filepath) { + return exists(filepath).then(function(stats) { + asset.filepath = filepath; + if (stats) { + asset.stats = stats; } + + /* Check if entry exists in DB */ + let parts = /^(.*)\/([^/]+)$/.exec(filepath), path, filename; + if (parts) { + path = parts[1] + "/"; + filename = parts[2]; + } else { + path = ""; + filename = filepath; + } + + return photoDB.sequelize.query("SELECT photos.*,(albums.path || photos.filename) AS filepath " + + "FROM photos LEFT JOIN albums ON albums.id=photos.albumId " + + "WHERE albums.path=:path AND photos.filename=:filename", { + replacements: { + path: path, + filename: filename + }, + type: photoDB.Sequelize.QueryTypes.SELECT, + raw: true + }).then(function(photos) { + if (photos.length == 1) { + Object.assign(asset, photos[0]); + } + }); + }).then(function() { + return asset; + }); +} + +function getAssetInfoFromDB(asset, id) { + return photoDB.sequelize.query("SELECT photos.*,(albums.path || photos.filename) AS filepath " + + "FROM photos LEFT JOIN albums ON albums.id=photos.albumId " + + "WHERE photos.id=:id", { + replacements: { + id: id + }, + type: photoDB.Sequelize.QueryTypes.SELECT, + raw: true + }).then(function(photos) { + if (photos.length == 1) { + Object.assign(asset, photos[0]); + } + }).then(function() { + if (!asset.filepath) { + return; + } + + return exists(asset.filepath).then(function(stats) { + if (stats) { + asset.stats = stats; + } + }); + }).then(function() { + return asset; + }); +} + +let photoDB; + +require("../server/db/photos").then(function(db) { + photoDB = db; + + return Promise.mapSeries(items, function(item) { + const asset = {}; + + return Promise.resolve().then(function() { + switch (item.type) { + case "file": + return getAssetInfoFromDisk(asset, item.value); + break; + + case "id": + return getAssetInfoFromDB(asset, item.value); + break; + } + }).then(function(asset) { + if (!asset.stats && !asset.id) { + console.log("Item " + item.value + " exists neither on disk nor in the DB."); + return; + } + + if (!asset.id) { + console.log("Item " + asset.filepath + " does not exist in the DB."); + } + + if (!asset.stats) { + console.log("Item " + asset.id + " does not exist on disk."); + } else { + if (asset.modified > asset.stats.mtime) { + asset.needsUpdate = true; + } + } + + if (asset.needsUpdate) { + console.log("DB needs to be updated for " + item.value); + } + }) }); });