diff --git a/frontend/face-explorer.html b/frontend/face-explorer.html
index 72edca9..e40cd73 100644
--- a/frontend/face-explorer.html
+++ b/frontend/face-explorer.html
@@ -294,7 +294,12 @@ document.addEventListener("DOMContentLoaded", function() {
}
window.fetch("api/v1/photos/random" + id)
- .then(res => res.json()).then(function(data) {
+ .then((res) => {
+ if (res.status >= 400) {
+ throw res.status;
+ }
+ return res.json();
+ }).then(function(data) {
info.textContent = "Random photo: " + data.id;
photoIndex = 0;
photos = [data];
diff --git a/server/face-recognizer.js b/server/face-recognizer.js
index b5d6191..80cd6da 100644
--- a/server/face-recognizer.js
+++ b/server/face-recognizer.js
@@ -61,7 +61,7 @@ faceapi.nets.ssdMobilenetv1.loadFromDisk('./models')
return photoDB.sequelize.query("SELECT photos.id,photos.filename,photos.width,photos.height,albums.path " +
"FROM photos " +
"LEFT JOIN albums ON (albums.id=photos.albumId) " +
- "WHERE faces=-1 AND deleted=0 ORDER BY albums.path,photos.filename", {
+ "WHERE faces=-1 AND photos.duplicate=0 AND photos.deleted=0 ORDER BY albums.path,photos.filename", {
type: photoDB.sequelize.QueryTypes.SELECT,
raw: true
}
@@ -166,7 +166,7 @@ faceapi.nets.ssdMobilenetv1.loadFromDisk('./models')
console.log("Looking for face distances that need to be updated...");
const descriptors = {};
- return photoDB.sequelize.query("SELECT id FROM faces ORDER BY id DESC LIMIT 1", {
+ return photoDB.sequelize.query("SELECT faces.id FROM faces ORDER BY faces.id DESC LIMIT 1", {
type: photoDB.sequelize.QueryTypes.SELECT,
raw: true
}).then((results) => {
@@ -176,9 +176,9 @@ faceapi.nets.ssdMobilenetv1.loadFromDisk('./models')
}
const maxId = results[0].id;
return photoDB.sequelize.query(
- "SELECT id,lastComparedId " +
- "FROM faces " +
- "WHERE lastComparedId<:maxId OR lastComparedId IS NULL", {
+ "SELECT faces.id,faces.lastComparedId " +
+ "FROM faces INNER JOIN photos ON photos.duplicate=0 AND photos.deleted=0 AND photos.id=faces.photoId " +
+ "WHERE faces.lastComparedId<:maxId OR faces.lastComparedId IS NULL", {
replacements: {
maxId: maxId
},
diff --git a/server/routes/photos.js b/server/routes/photos.js
index c1807a1..382e5c6 100755
--- a/server/routes/photos.js
+++ b/server/routes/photos.js
@@ -836,15 +836,18 @@ router.get("/faces/:id", (req, res) => {
});
router.get("/random/:id?", (req, res) => {
- const id = parseInt(req.params.id);
- let filter = "";
+ let id = parseInt(req.params.id),
+ filter = "";
if (id == req.params.id) {
+ console.log("GET /random/" + id);
filter = "AND id=:id";
} else {
filter = "AND faces>0";
+ id = undefined;
}
- return photoDB.sequelize.query("SELECT id FROM photos WHERE deleted=0 " + filter, {
+
+ return photoDB.sequelize.query("SELECT id,duplicate FROM photos WHERE deleted=0 " + filter, {
replacements: {
id: id
},
@@ -852,9 +855,15 @@ router.get("/random/:id?", (req, res) => {
raw: true
}).then((results) => {
if (!results.length) {
- return res.status(404);
+ return res.status(404).send(id + " not found.");
+ }
+ if (id) {
+ if (results[0].duplicate) {
+ id = results[0].duplicate;
+ }
+ } else {
+ id = results[Math.floor(Math.random() * results.length)].id;
}
- const id = results[Math.floor(Math.random() * results.length)].id;
return photoDB.sequelize.query(
"SELECT photos.*,albums.path AS path FROM photos " +
@@ -868,7 +877,7 @@ router.get("/random/:id?", (req, res) => {
});
}).then(function(photos) {
if (!photos.length) {
- return res.status(404);
+ return res.status(404).send(id + " not found.");
}
const photo = photos[0];
for (var key in photo) {