search by title function added

This commit is contained in:
2022-04-11 21:24:34 +02:00
parent 2d795b680b
commit 94f9dbd84a
7 changed files with 822 additions and 123 deletions

Binary file not shown.

View File

@@ -2,11 +2,13 @@ const express = require("express");
const Eta = require("eta"); const Eta = require("eta");
const fs = require("fs"); const fs = require("fs");
const request = require("request"); const request = require("request");
const imdb = require("imdb-api");
const requestSync = require("sync-request"); const requestSync = require("sync-request");
var Config = require('config-js'); var Config = require('config-js');
const app = express(); const app = express();
const PrismaClient = require('@prisma/client').PrismaClient; const PrismaClient = require('@prisma/client').PrismaClient;
const nameToImdb = require("name-to-imdb");
const imdbHelper = require("./node_modules/name-to-imdb/helpers");
const imdb = require("imdb");
const port = 4000; const port = 4000;
const eanConvAdress = "http://127.0.0.1:9999/" const eanConvAdress = "http://127.0.0.1:9999/"
@@ -15,6 +17,7 @@ const typeIndex = {0: "Physical", 1: "Digital - Maxdome", 2: "Digital - Amazon P
const prisma = new PrismaClient(); const prisma = new PrismaClient();
var responseBuffer = { allBufferd: [] }; var responseBuffer = { allBufferd: [] };
const imdbBuffer = {}
responseBuffer = JSON.parse(fs.readFileSync("chache.bin", "utf8")); responseBuffer = JSON.parse(fs.readFileSync("chache.bin", "utf8"));
@@ -42,6 +45,11 @@ app.get("/add", function (req, res) {
res.send(Eta.render(data, { isDisplay: false })); res.send(Eta.render(data, { isDisplay: false }));
}); });
app.get("/addByTitle", function (req, res) {
const data = fs.readFileSync("template/addByTitle.html", "utf8");
res.send(Eta.render(data, { isDisplay: false }));
});
app.get("/delete", function (req, res) { app.get("/delete", function (req, res) {
console.log(req.query.id) console.log(req.query.id)
prisma.movieInfo.delete({ prisma.movieInfo.delete({
@@ -55,6 +63,7 @@ app.get("/delete", function (req, res) {
res.send("Done."); res.send("Done.");
}); });
app.get("/returnSaveResult", function (req, res) { app.get("/returnSaveResult", function (req, res) {
const data = fs.readFileSync("template/addToShelf.html", "utf8"); const data = fs.readFileSync("template/addToShelf.html", "utf8");
responseJson = responseBuffer[req.query["reponseID"]]; responseJson = responseBuffer[req.query["reponseID"]];
@@ -79,6 +88,16 @@ app.get("/showDetails", async function (req, res) {
movieID: req.query["id"] movieID: req.query["id"]
} }
}) })
nameToImdb({name: imdbHelper.parseSearchTerm(movie.movieTitel)}, function handleImdbResp(err, imdbID, imdbData) {
if (err) {
console.log(err.stack);
}
if(imdbData.isCached != true) {
imdbBuffer[imdbID] = imdbData;
} else {
imdbData = imdbBuffer[imdbID];
}
console.log(imdbData, movie.movieID, imdbID);
res.send( res.send(
Eta.render(data, { Eta.render(data, {
internalID: movie.id, internalID: movie.id,
@@ -86,8 +105,11 @@ app.get("/showDetails", async function (req, res) {
cover: movie.posterUrl, cover: movie.posterUrl,
titleByAPI: movie.movieTitel, titleByAPI: movie.movieTitel,
type: typeIndex[movie.type], type: typeIndex[movie.type],
extendedData: imdbData.meta
}) })
) )
})
}); });
app.get("/editDetails", async function (req, res) { app.get("/editDetails", async function (req, res) {
@@ -149,7 +171,6 @@ app.get("/apiCallBack", function (req, res) {
res.send({ state: "ERR_IMDB_LIMIT_REACHED" }); res.send({ state: "ERR_IMDB_LIMIT_REACHED" });
} else { } else {
jsonBody = jsonBody.results[0]; jsonBody = jsonBody.results[0];
//const data = fs.readFileSync("template/addToShelf.html.html", "utf8");
timest = new Date().valueOf(); timest = new Date().valueOf();
responseJson = { responseJson = {
state: "OK", state: "OK",
@@ -161,25 +182,12 @@ app.get("/apiCallBack", function (req, res) {
}; };
responseBuffer[req.query["ean"]] = responseJson; responseBuffer[req.query["ean"]] = responseJson;
responseBuffer.allBufferd.push(req.query["ean"]); responseBuffer.allBufferd.push(req.query["ean"]);
// ToDo: Rewrite chache (and all pages!!!) to use ean instead of timeid
try { try {
fs.writeFileSync("chache.bin", JSON.stringify(responseBuffer)); fs.writeFileSync("chache.bin", JSON.stringify(responseBuffer));
} catch (err) { } catch (err) {
console.error(err); console.error(err);
} }
res.send(responseJson); res.send(responseJson);
/* res.send(
Eta.render(data, {
id: jsonBody.id,
cover: jsonBody.image,
titleByAPI: response.body,
ean: req.query["ean"],
isDisplay: true,
})
);*/
} }
}); });
} }
@@ -193,6 +201,35 @@ app.get("/apiCallBack", function (req, res) {
}); });
app.get("/apiCallBackTitle", function (req, res) {
//console.log(req.query);
nameToImdb({name: imdbHelper.parseSearchTerm(req.query.title)}, function handleImdbResp(err, imdbID, imdbData) {
if (err) {
res.send({ state: "ERR_BACK_FAIL" });
console.log(err.stack);
}
if(imdbData.isCached != true) {
imdbBuffer[imdbID] = imdbData;
} else {
imdbData = imdbBuffer[imdbID];
}
const randId = Math.floor(Math.random() * 100000) + "NO_EAN";
responseJson = {
state: "OK",
id: imdbID,
coverImage: imdbData.meta.image.src,
titleByAPI: imdbData.meta.name,
ean: String(randId),
reponseID: String(randId),
};
responseBuffer[randId] = responseJson;
res.send(responseJson);
})
});
app.get("/save", async function handleSave(req, res) { app.get("/save", async function handleSave(req, res) {
responseJson = responseBuffer[req.query["reponseID"]]; responseJson = responseBuffer[req.query["reponseID"]];
const type = parseInt(req.query["type"]) || 0; const type = parseInt(req.query["type"]) || 0;

403
package-lock.json generated
View File

@@ -13,7 +13,9 @@
"eta": "^1.12.1", "eta": "^1.12.1",
"express": "^4.17.1", "express": "^4.17.1",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"imdb": "^1.1.0",
"imdb-api": "^4.4.1", "imdb-api": "^4.4.1",
"name-to-imdb": "^3.0.2",
"node-fetch": "^2.6.1", "node-fetch": "^2.6.1",
"node-html-parser": "^3.1.2", "node-html-parser": "^3.1.2",
"prisma": "^3.12.0", "prisma": "^3.12.0",
@@ -277,6 +279,80 @@
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
}, },
"node_modules/cheerio": {
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz",
"integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=",
"dependencies": {
"css-select": "~1.0.0",
"dom-serializer": "~0.1.0",
"entities": "~1.1.1",
"htmlparser2": "~3.8.1",
"lodash": "^3.2.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cheerio/node_modules/css-select": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz",
"integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=",
"dependencies": {
"boolbase": "~1.0.0",
"css-what": "1.0",
"domutils": "1.4",
"nth-check": "~1.0.0"
}
},
"node_modules/cheerio/node_modules/css-what": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz",
"integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=",
"engines": {
"node": "*"
}
},
"node_modules/cheerio/node_modules/dom-serializer": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
"integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
"dependencies": {
"domelementtype": "^1.3.0",
"entities": "^1.1.1"
}
},
"node_modules/cheerio/node_modules/domelementtype": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
},
"node_modules/cheerio/node_modules/domutils": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz",
"integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=",
"dependencies": {
"domelementtype": "1"
}
},
"node_modules/cheerio/node_modules/entities": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
},
"node_modules/cheerio/node_modules/lodash": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
"integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
},
"node_modules/cheerio/node_modules/nth-check": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
"integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
"dependencies": {
"boolbase": "~1.0.0"
}
},
"node_modules/chownr": { "node_modules/chownr": {
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
@@ -522,6 +598,11 @@
"node": ">=0.10" "node": ">=0.10"
} }
}, },
"node_modules/diacritics": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz",
"integrity": "sha1-PvqHMj67hj5mls67AILUj/PW96E="
},
"node_modules/dom-serializer": { "node_modules/dom-serializer": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
@@ -919,6 +1000,94 @@
"he": "bin/he" "he": "bin/he"
} }
}, },
"node_modules/htmlparser2": {
"version": "3.8.3",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
"integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
"dependencies": {
"domelementtype": "1",
"domhandler": "2.3",
"domutils": "1.5",
"entities": "1.0",
"readable-stream": "1.1"
}
},
"node_modules/htmlparser2/node_modules/dom-serializer": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
"integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
"dependencies": {
"domelementtype": "^2.0.1",
"entities": "^2.0.0"
}
},
"node_modules/htmlparser2/node_modules/dom-serializer/node_modules/domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
]
},
"node_modules/htmlparser2/node_modules/dom-serializer/node_modules/entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/htmlparser2/node_modules/domelementtype": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
},
"node_modules/htmlparser2/node_modules/domhandler": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
"integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
"dependencies": {
"domelementtype": "1"
}
},
"node_modules/htmlparser2/node_modules/domutils": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
"integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
"dependencies": {
"dom-serializer": "0",
"domelementtype": "1"
}
},
"node_modules/htmlparser2/node_modules/entities": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
"integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
},
"node_modules/htmlparser2/node_modules/isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"node_modules/htmlparser2/node_modules/readable-stream": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
}
},
"node_modules/htmlparser2/node_modules/string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
},
"node_modules/http-basic": { "node_modules/http-basic": {
"version": "8.1.3", "version": "8.1.3",
"resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
@@ -994,6 +1163,15 @@
"minimatch": "^3.0.4" "minimatch": "^3.0.4"
} }
}, },
"node_modules/imdb": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/imdb/-/imdb-1.1.0.tgz",
"integrity": "sha1-6X0syyARjvFAGQBRiai5FcZQjDI=",
"dependencies": {
"cheerio": "^0.19.0",
"request": "^2.65.0"
}
},
"node_modules/imdb-api": { "node_modules/imdb-api": {
"version": "4.4.1", "version": "4.4.1",
"resolved": "https://registry.npmjs.org/imdb-api/-/imdb-api-4.4.1.tgz", "resolved": "https://registry.npmjs.org/imdb-api/-/imdb-api-4.4.1.tgz",
@@ -1320,6 +1498,37 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}, },
"node_modules/name-to-imdb": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/name-to-imdb/-/name-to-imdb-3.0.2.tgz",
"integrity": "sha512-CT94YfG6FPdXccrv/FUC1ZIkRMkMWrAoGcX7v3Sa/kntnB05xzaPIRHt7s4f43BvgLx/bmn6AhZ8TzkphGticQ==",
"dependencies": {
"diacritics": "~1.3.0",
"named-queue": "^2.1.0",
"needle": "^1.1.2",
"node-fetch": "^2.2.0"
}
},
"node_modules/name-to-imdb/node_modules/needle": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-1.6.0.tgz",
"integrity": "sha1-9SpYWJchIWGOAC+OY4TK2sItYk8=",
"dependencies": {
"debug": "^2.1.2",
"iconv-lite": "^0.4.4"
},
"bin": {
"needle": "bin/needle"
},
"engines": {
"node": ">= 0.10.x"
}
},
"node_modules/named-queue": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/named-queue/-/named-queue-2.2.1.tgz",
"integrity": "sha1-GBRURVNZnVqeQD0N+pN6TODR5qc="
},
"node_modules/ndarray": { "node_modules/ndarray": {
"version": "1.0.19", "version": "1.0.19",
"resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz",
@@ -2547,6 +2756,76 @@
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
}, },
"cheerio": {
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz",
"integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=",
"requires": {
"css-select": "~1.0.0",
"dom-serializer": "~0.1.0",
"entities": "~1.1.1",
"htmlparser2": "~3.8.1",
"lodash": "^3.2.0"
},
"dependencies": {
"css-select": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz",
"integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=",
"requires": {
"boolbase": "~1.0.0",
"css-what": "1.0",
"domutils": "1.4",
"nth-check": "~1.0.0"
}
},
"css-what": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz",
"integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w="
},
"dom-serializer": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
"integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
"requires": {
"domelementtype": "^1.3.0",
"entities": "^1.1.1"
}
},
"domelementtype": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
},
"domutils": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz",
"integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=",
"requires": {
"domelementtype": "1"
}
},
"entities": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
},
"lodash": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
"integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
},
"nth-check": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
"integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
"requires": {
"boolbase": "~1.0.0"
}
}
}
},
"chownr": { "chownr": {
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
@@ -2741,6 +3020,11 @@
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
}, },
"diacritics": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz",
"integrity": "sha1-PvqHMj67hj5mls67AILUj/PW96E="
},
"dom-serializer": { "dom-serializer": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
@@ -3054,6 +3338,89 @@
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
}, },
"htmlparser2": {
"version": "3.8.3",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
"integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
"requires": {
"domelementtype": "1",
"domhandler": "2.3",
"domutils": "1.5",
"entities": "1.0",
"readable-stream": "1.1"
},
"dependencies": {
"dom-serializer": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
"integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
"requires": {
"domelementtype": "^2.0.1",
"entities": "^2.0.0"
},
"dependencies": {
"domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
},
"entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
}
}
},
"domelementtype": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
},
"domhandler": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
"integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
"requires": {
"domelementtype": "1"
}
},
"domutils": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
"integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
"requires": {
"dom-serializer": "0",
"domelementtype": "1"
}
},
"entities": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
"integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
},
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"readable-stream": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
}
}
},
"http-basic": { "http-basic": {
"version": "8.1.3", "version": "8.1.3",
"resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
@@ -3118,6 +3485,15 @@
"minimatch": "^3.0.4" "minimatch": "^3.0.4"
} }
}, },
"imdb": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/imdb/-/imdb-1.1.0.tgz",
"integrity": "sha1-6X0syyARjvFAGQBRiai5FcZQjDI=",
"requires": {
"cheerio": "^0.19.0",
"request": "^2.65.0"
}
},
"imdb-api": { "imdb-api": {
"version": "4.4.1", "version": "4.4.1",
"resolved": "https://registry.npmjs.org/imdb-api/-/imdb-api-4.4.1.tgz", "resolved": "https://registry.npmjs.org/imdb-api/-/imdb-api-4.4.1.tgz",
@@ -3375,6 +3751,33 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}, },
"name-to-imdb": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/name-to-imdb/-/name-to-imdb-3.0.2.tgz",
"integrity": "sha512-CT94YfG6FPdXccrv/FUC1ZIkRMkMWrAoGcX7v3Sa/kntnB05xzaPIRHt7s4f43BvgLx/bmn6AhZ8TzkphGticQ==",
"requires": {
"diacritics": "~1.3.0",
"named-queue": "^2.1.0",
"needle": "^1.1.2",
"node-fetch": "^2.2.0"
},
"dependencies": {
"needle": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-1.6.0.tgz",
"integrity": "sha1-9SpYWJchIWGOAC+OY4TK2sItYk8=",
"requires": {
"debug": "^2.1.2",
"iconv-lite": "^0.4.4"
}
}
}
},
"named-queue": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/named-queue/-/named-queue-2.2.1.tgz",
"integrity": "sha1-GBRURVNZnVqeQD0N+pN6TODR5qc="
},
"ndarray": { "ndarray": {
"version": "1.0.19", "version": "1.0.19",
"resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz",

View File

@@ -21,7 +21,9 @@
"eta": "^1.12.1", "eta": "^1.12.1",
"express": "^4.17.1", "express": "^4.17.1",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"imdb": "^1.1.0",
"imdb-api": "^4.4.1", "imdb-api": "^4.4.1",
"name-to-imdb": "^3.0.2",
"node-fetch": "^2.6.1", "node-fetch": "^2.6.1",
"node-html-parser": "^3.1.2", "node-html-parser": "^3.1.2",
"prisma": "^3.12.0", "prisma": "^3.12.0",
@@ -31,7 +33,7 @@
"sync-request": "^6.1.0" "sync-request": "^6.1.0"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^17.0.23", "@prisma/client": "^3.12.0",
"@prisma/client": "^3.12.0" "@types/node": "^17.0.23"
} }
} }

View File

@@ -84,7 +84,8 @@
<% } else{ %> <% } else{ %>
<div id="scanner-container"></div> <div id="scanner-container"></div>
<input type="button" id="btn" value="Start/Stop the scanner" /> <input type="button" id="btn" value="Start/Stop the scanner" />
<div id="currentEAN">EAN: Waiting for valid EAN...</div> <div id="currentEAN">EAN: Waiting for valid EAN...</div><br>
<button onclick="window.location.href = '/addByTitle'"><i class="fas fa-radar"></i> Search by title</button>
<button onclick="sendEanConvRequest()" disabled id="searchBtn"> <i class="fas fa-search"></i>Search</button> <button onclick="sendEanConvRequest()" disabled id="searchBtn"> <i class="fas fa-search"></i>Search</button>
<button onclick="window.location.href = '/'"><i class="fas fa-home"></i> Back to home</button> <button onclick="window.location.href = '/'"><i class="fas fa-home"></i> Back to home</button>
<button type="button" class="collapsible">Manual input</button> <button type="button" class="collapsible">Manual input</button>

151
template/addByTitle.html Normal file
View File

@@ -0,0 +1,151 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Basic Page Needs
-->
<meta charset="utf-8" />
<title>OpenMovieDB - Bookshelf</title>
<meta name="description" content="OpenMovieDB - Bookshelf" />
<meta name="author" content="TheGreydiamond" />
<!-- Mobile Specific Metas
-->
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- FONT
-->
<link
href="//fonts.googleapis.com/css?family=Raleway:400,300,600"
rel="stylesheet"
type="text/css"
/>
<!-- CSS
-->
<link rel="stylesheet" href="css/normalize.css" />
<link rel="stylesheet" href="css/skeleton.css" />
<style>
/* In order to place the tracking correctly */
canvas.drawing, canvas.drawingBuffer {
position: absolute;
left: 0;
top: 0;
}
/* Style the button that is used to open and close the collapsible content */
.collapsible {
background-color: #eee;
color: #444;
cursor: pointer;
/*padding: 18px;*/
/*width: 100%;*/
border: none;
/*text-align: left;*/
outline: none;
font-size: 15px;
}
/* Add a background color to the button if it is clicked on (add the .active class with JS), and when you move the mouse over it (hover) */
.active, .collapsible:hover {
background-color: #ccc;
}
/* Style the collapsible content. Note: hidden by default */
.content {
padding: 0 18px;
display: none;
overflow: hidden;
background-color: #f1f1f1;
}
</style>
<!-- Favicon
-->
<link rel="icon" type="image/png" href="images/favicon.png" />
<script src="https://kit.fontawesome.com/d7b80a780b.js" crossorigin="anonymous"></script>
<script src="https://cdn.rawgit.com/serratus/quaggaJS/0420d5e0/dist/quagga.min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<body>
<div class="container">
<div class="row">
<div class="one-half column" style="margin-top: 15%" id="mainCont">
<h4>OpenMovieDB - Add a new movie (by title)</h4>
<!-- Div to show the scanner -->
<% if(it.isDisplay == true) { %>
<%= it.titleByAPI %><br>
<%= it.id %><br>
<img src="<%= it.cover %>" alt="Cover image" style="height: 200px;"></img><br>
<button onclick="saveToLibary()"> Add to libary</button>
<% } else { %>
<input type="text" placeholder="Movie title" id="movieTitle">
<button onclick="sendEanConvRequest()" id="searchBtn"> <i class="fas fa-search"></i>Search</button><br>
<button onclick="window.location.href = '/add'"><i class="fas fa-radar"></i> Search by EAN</button>
<button onclick="window.location.href = '/'"><i class="fas fa-home"></i> Back to home</button>
<% } %>
</div>
</div>
</div>
<!-- Include the image-diff library -->
<script>
var coll = document.getElementsByClassName("collapsible");
var i;
for (i = 0; i < coll.length; i++) {
coll[i].addEventListener("click", function() {
this.classList.toggle("active");
var content = this.nextElementSibling;
if (content.style.display === "block") {
content.style.display = "none";
} else {
content.style.display = "block";
}
});
}
setTimeout(function(){
document.getElementById("btn").style.backgroundColor = "rgba(255, 0, 0, 0.5)";
document.getElementById("searchBtn").style.backgroundColor = "rgba(10, 10, 10, 0.5);"
}, 20)
function sendEanConvRequest(){
const curTitle = document.getElementById("movieTitle").value;
document.getElementById("mainCont").innerHTML = "<h4>OpenMovieDB - Add a new movie</h4><center><div class=\"lds-grid\"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div><br><i>Searching database...</i></center>";
/*if(curEan[0] == "0"){
curEan = curEan.substring(1);
}*/
console.warn(curTitle)
url = "/apiCallBackTitle?title=" + curTitle;
//window.open(url)
$.get(url,function(data,status) {
var respon = JSON.parse(data)
if(respon.state == "OK"){
url = "/returnSaveResult?reponseID=" + respon.reponseID;
window.location.href = url
}else{
// alert("An error with the api occured.")
document.getElementById("mainCont").innerHTML = "<h4>OpenMovieDB - Add a new movie</h4><center><i style='color: #cc0000; font-size: 100px;' class=\"fas fa-exclamation-circle\"></i><br>Ohno, the API returned an error. Errorcode: <br> <code>" + respon.state + "</code><br><br><button onclick=\"window.location.href = '/'\"><i class=\"fas fa-home\"></i> Back to home</button></center>"
}
console.log(data);
},'html');
//alert(curEan)
}
function saveToLibary(){
url = "/saveTitle?title=<%= it.ean %>";
$.get(url,function(data,status) { console.log(data); console.log(status) },'html');
}
</script>
</body>
</html>

View File

@@ -1,5 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<!-- Basic Page Needs <!-- Basic Page Needs
--> -->
@@ -14,11 +15,7 @@
<!-- FONT <!-- FONT
--> -->
<link <link href="//fonts.googleapis.com/css?family=Raleway:400,300,600" rel="stylesheet" type="text/css" />
href="//fonts.googleapis.com/css?family=Raleway:400,300,600"
rel="stylesheet"
type="text/css"
/>
<!-- CSS <!-- CSS
--> -->
@@ -62,6 +59,33 @@
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%); -ms-transform: translate(-50%, -50%);
} }
summary::-webkit-details-marker {
display: none
}
summary:after {
border-radius: 5px;
content: "+";
color: #fff;
float: left;
font-size: 1.5em;
font-weight: bold;
margin: -5px 10px 0 0;
padding: 0;
text-align: center;
width: 20px;
}
details[open] summary:after {
content: "-";
}
details {
background-color: rgba(65, 65, 65, 0.39);
border-radius: 4px;
padding: 5px;
}
</style> </style>
<!-- Favicon <!-- Favicon
@@ -71,17 +95,79 @@
<script src="https://cdn.rawgit.com/serratus/quaggaJS/0420d5e0/dist/quagga.min.js"></script> <script src="https://cdn.rawgit.com/serratus/quaggaJS/0420d5e0/dist/quagga.min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head> </head>
<body> <body>
<body> <body>
<div id="overlay" onclick="off()"> <div id="overlay" onclick="off()">
<div id="text"><svg class='checkmark' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 52 52'><circle class='checkmark__circle ' cx='26' cy='26' r='25' fill='none'/><path class='checkmark__check' fill='none' d='M14.1 27.2l7.1 7.2 16.7-16.8'/></svg><style>.checkmark__circle { stroke-dasharray: 166; stroke-dashoffset: 166; stroke-width: 2; stroke-miterlimit: 10; stroke: #7ac142; fill: none; animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;}.checkmark { width: 56px; height: 56px; border-radius: 50%; display: block; stroke-width: 2; stroke: #fff; stroke-miterlimit: 10; margin: 10% auto; box-shadow: inset 0px 0px 0px #7ac142; animation: fill .4s ease-in-out .4s forwards, scale .3s ease-in-out .9s both;}.checkmark__check { transform-origin: 50% 50%; stroke-dasharray: 48; stroke-dashoffset: 48; animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards;}@keyframes stroke { 100% { stroke-dashoffset: 0; }}@keyframes scale { 0%, 100% { transform: none; } 50% { transform: scale3d(1.1, 1.1, 1); }}@keyframes fill { 100% { box-shadow: inset 0px 0px 0px 30px #7ac142; }}</style></div> <div id="text"><svg class='checkmark' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 52 52'>
<circle class='checkmark__circle ' cx='26' cy='26' r='25' fill='none' />
<path class='checkmark__check' fill='none' d='M14.1 27.2l7.1 7.2 16.7-16.8' />
</svg>
<style>
.checkmark__circle {
stroke-dasharray: 166;
stroke-dashoffset: 166;
stroke-width: 2;
stroke-miterlimit: 10;
stroke: #7ac142;
fill: none;
animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;
}
.checkmark {
width: 56px;
height: 56px;
border-radius: 50%;
display: block;
stroke-width: 2;
stroke: #fff;
stroke-miterlimit: 10;
margin: 10% auto;
box-shadow: inset 0px 0px 0px #7ac142;
animation: fill .4s ease-in-out .4s forwards, scale .3s ease-in-out .9s both;
}
.checkmark__check {
transform-origin: 50% 50%;
stroke-dasharray: 48;
stroke-dashoffset: 48;
animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards;
}
@keyframes stroke {
100% {
stroke-dashoffset: 0;
}
}
@keyframes scale {
0%,
100% {
transform: none;
}
50% {
transform: scale3d(1.1, 1.1, 1);
}
}
@keyframes fill {
100% {
box-shadow: inset 0px 0px 0px 30px #7ac142;
}
}
</style>
</div>
</div> </div>
<div id="overlay2" onclick="off()"> <div id="overlay2" onclick="off()">
<div id="text">Do you really want to remove this movie?<br> <div id="text">Do you really want to remove this movie?<br>
<button onclick="sureDelete()" style="background-color: rgba(174, 255, 128, 0.699)"><i class="fas fa-trash"></i> Yes</button> <button onclick="sureDelete()" style="background-color: rgba(174, 255, 128, 0.699)"><i class="fas fa-trash"></i>
<button onclick="off()" style="background-color: rgba(255, 95, 95, 0.719)"><i class="fas fa-times"></i> No</button> Yes</button>
<button onclick="off()" style="background-color: rgba(255, 95, 95, 0.719)"><i class="fas fa-times"></i>
No</button>
</div> </div>
</div> </div>
@@ -92,8 +178,27 @@
<h4>OpenMovieDB - Moviedetails</h4> <h4>OpenMovieDB - Moviedetails</h4>
<div style="width: 300px;"> <div style="width: 300px;">
<img src="<%= it.cover %>" alt="Cover image" style="width: 100%;"></img><br> <img src="<%= it.cover %>" alt="Cover image" style="width: 100%;"></img><br>
<center><%= it.titleByAPI %><br><i><%= it.id %></i><br> <center>
<b>Type: </b> <%= it.type %></center> <%= it.titleByAPI %><br><i>
<%= it.id %>
</i><br>
</center>
<details>
<summary>
Details
</summary><br>
<p>
Year: <%= it.extendedData.year %>
<br>
Starring: <%= it.extendedData.starring %>
</p>
</details>
<br>
<b>Type: </b>
<%= it.type %>
</div><br> </div><br>
<button onclick="handleEdit()" id="editBtn"><i class="fas fa-pen"></i> Edit</button> <button onclick="handleEdit()" id="editBtn"><i class="fas fa-pen"></i> Edit</button>
<button onclick="handelDelete()" id="delBtn"><i class="fas fa-trash"></i> Delete</button> <button onclick="handelDelete()" id="delBtn"><i class="fas fa-trash"></i> Delete</button>