commit acc661d15b51178ed4f1cbc0bb8b32d992e7a98c Author: grey Date: Sat Apr 10 22:44:45 2021 +0200 Initial commit. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9be5eda --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +.vscode/ +*.sqllite +testStuff/ +chache.bin +key.cfg \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..86d5ebc --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# openMovieBookshelf diff --git a/index.js b/index.js new file mode 100644 index 0000000..0dddde9 --- /dev/null +++ b/index.js @@ -0,0 +1,334 @@ +const express = require("express"); +const Eta = require("eta"); +const fs = require("fs"); +const request = require("request"); +const imdb = require("imdb-api"); +const sqlite3 = require("sqlite3"); +const requestSync = require("sync-request"); +var Config = require('config-js'); +const app = express(); +const port = 4000; + +const initalTableSQL = + "CREATE TABLE `movieInfo` ( \ + `id` INT NOT NULL, \ + `movieID` VARCHAR(128), \ + `movieTitel` VARCHAR(255), \ + `place` INT zerofill, \ + `type` INT zerofill, \ + `posterUrl` VARCHAR(255) \ +);"; + +const initalTableSQL2 = + "CREATE TABLE `apiChache` ( \ + `imdbID` VARCHAR(128), \ + `url` VARCHAR(255) \ +);"; + +var responseBuffer = { allBufferd: [] }; + +responseBuffer = JSON.parse(fs.readFileSync("chache.bin", "utf8")); + +var db = new sqlite3.Database("database.sqllite"); +if (!fs.existsSync("database.sqllite")) { + console.log("Creating table."); + db.serialize(() => { + db.run(initalTableSQL); + //db.run(initalTableSQL2); + }); +} +db.close(); +var db = new sqlite3.Database("database.sqllite"); + +var config = new Config('key.cfg'); + + +async function doesMovieExistInDatabase(imdbID) { + console.warn(imdbID); + db.all( + "SELECT * FROM movieInfo WHERE movieID='" + imdbID + "'", + function (err, rows) { + console.log("!!!" + rows); + if (rows == undefined) { + console.log(false); + return false; + } else { + console.log(true); + return true; + } + } + ); +} + +function getBufferdResponse(type, imdbID) { + // Cover image + if (type == 1) { + db.all( + "SELECT * FROM apiChache WHERE imdbID=" + imdbID, + function (err, rows) { + // Okay, there is no result, lets ask the real api + if (rows == undefined) { + console.log("No chache"); + var res = requestSync( + "GET", + "https://imdb-api.com/en/API/Posters//" + imdbID, + {} + ); + const jsonParsed = JSON.parse(res.body); + // Well frick, api limit reached + if (jsonParsed.errorMessage.includes("Maximum usage")) { + console.warn("API limit reached!"); + + return "https://tse2.mm.bing.net/th?id=OIP.SW4X5yWbxOMofUFxMwSTbAHaJQ&pid=Api"; // Return "No cover image" + console.log("unreachable"); + } else { + // Cool, we got an response + posterUrl = + "https://tse2.mm.bing.net/th?id=OIP.SW4X5yWbxOMofUFxMwSTbAHaJQ&pid=Api"; // Just a fallback + if (jsonParsed.posters[0] != undefined) { + posterUrl = jsonParsed.posters[0].link; + // Lets save the response + db.run( + "INSERT INTO apiChache(imdbID, url) VALUES(?, ?)", + [imdbID, posterUrl], + (err) => { + if (err) { + return console.log(err.message); + } + console.log("Saved url to chache"); + } + ); + } + // Return the url + return posterUrl; + } + } else { + // There is a result, lets return the result + return rows[0].url; + } + } + ); + } +} + +app.use(express.static("static")); + +app.get("/", function (req, res) { + // https://imdb-api.com/de/API/Posters//[ID HERE] + var buildString = ""; + db.serialize(function () { + db.all("SELECT * FROM movieInfo ORDER BY movieTitel ASC;", function (err, rows) { + /* rows.forEach((row) => { + console.log(row.id + ": " + row.movieTitel); + //var posterLink = getBufferdResponse(1, row.movieID); + posterLink = row.posterUrl; + console.log(posterLink); + + /*var res = requestSync( + "GET", + "https://imdb-api.com/en/API/Posters//" + row.movieID, + {} + ); + const jsonParsed = JSON.parse(res.body); + console.log(jsonParsed); + posterLink = ""; + if (jsonParsed.posters[0] == undefined) { + posterLink = + "https://tse2.mm.bing.net/th?id=OIP.SW4X5yWbxOMofUFxMwSTbAHaJQ&pid=Api"; + } else { + posterLink = jsonParsed.posters[0].link; + }*/ + /*buildString += + "

' + + row.movieTitel + + "
"; + + });*/ + + console.log(rows) + const data = fs.readFileSync("template/bookshelf.html", "utf8"); + res.send(Eta.render(data, {jsonRespo: JSON.stringify(rows)})); + }); + }); +}); + +app.get("/add", function (req, res) { + const data = fs.readFileSync("template/add.html", "utf8"); + res.send(Eta.render(data, { isDisplay: false })); +}); + +app.get("/delete", function (req, res) { + db.run(`DELETE FROM movieInfo WHERE id=?`, req.query["id"], function (err) { + if (err) { + return console.error(err.message); + } + console.log(`Row(s) deleted ${this.changes}`); + res.send("Done."); + }); +}); + +app.get("/returnSaveResult", function (req, res) { + const data = fs.readFileSync("template/addToShelf.html", "utf8"); + responseJson = responseBuffer[req.query["reponseID"]]; + console.log(responseBuffer); + res.send( + Eta.render(data, { + id: responseJson.id, + cover: responseJson.coverImage, + titleByAPI: responseJson.titleByAPI, + ean: responseJson.ean, + isDisplay: true, + responseID: req.query["reponseID"], + }) + ); +}); + +app.get("/showDetails", function (req, res) { + const data = fs.readFileSync("template/movieDetails.html", "utf8"); + console.log( req.query["id"]) + db.serialize(function () { + db.all( + "SELECT * FROM movieInfo WHERE movieID='" + req.query["id"] + "'", + function (err, rows) { + //+ req.params["id"] + row = rows[0]; + console.log(row); + + res.send( + Eta.render(data, { + internalID: row.id, + id: row.movieID, + cover: row.posterUrl, + titleByAPI: row.movieTitel, + }) + ); + } + ); + }); + /*responseJson = responseBuffer[req.query["reponseID"]]; + console.log(responseBuffer); + res.send( + Eta.render(data, { + id: responseJson.id, + cover: responseJson.coverImage, + titleByAPI: responseJson.titleByAPI, + ean: responseJson.ean, + isDisplay: true, + responseID: req.query["reponseID"] + }) + );*/ +}); + +app.get("/apiCallBack", function (req, res) { + //console.log(req.query); + if (!responseBuffer.allBufferd.includes(req.query["ean"])) { + request( + "http://localhost:9999/?ean=" + req.query["ean"], + function (error, response, body) { + if (response.statusCode != 200) { + console.log("OH NO"); + res.send({ state: "ERR_EAN_CONV_NO_200" }); + } else { + var reqString = + "https://imdb-api.com/en/API/SearchTitle/" + config.get('keys.imdb') + "/" + + response.body; + request(reqString, function (error, response2, body) { + jsonBody = JSON.parse(response2.body); + console.log(response.body); + if (jsonBody.errorMessage.includes("Maximum usage")) { + res.send({ state: "ERR_IMDB_LIMIT_REACHED" }); + } else { + jsonBody = jsonBody.results[0]; + //const data = fs.readFileSync("template/addToShelf.html.html", "utf8"); + timest = new Date().valueOf(); + responseJson = { + state: "OK", + id: jsonBody.id, + coverImage: jsonBody.image, + titleByAPI: response.body, + ean: req.query["ean"], + reponseID: req.query["ean"], + }; + responseBuffer[req.query["ean"]] = responseJson; + responseBuffer.allBufferd.push(req.query["ean"]); + + // ToDo: Rewrite chache (and all pages!!!) to use ean instead of timeid + + + try { + fs.writeFileSync("chache.bin", JSON.stringify(responseBuffer)); + } catch (err) { + console.error(err); + } + res.send(responseJson); + /* res.send( + Eta.render(data, { + id: jsonBody.id, + cover: jsonBody.image, + titleByAPI: response.body, + ean: req.query["ean"], + isDisplay: true, + }) + );*/ + } + }); + } + } + ); + } else { + console.log("Using chache"); + responseJson = responseBuffer[req.query["ean"]]; + res.send(responseJson); + } +}); + +app.get("/save", function (req, res) { + responseJson = responseBuffer[req.query["reponseID"]]; + + db.all( + "SELECT * FROM movieInfo WHERE movieID='" + responseJson.id + "'", + function (err, rows) { + console.log(rows); + if (rows == undefined || rows.length == 0) { + db.run( + "INSERT INTO movieInfo(id, movieID, movieTitel, place, type, posterUrl) VALUES(?, ?, ?, ?, ?, ?)", + [ + new Date().valueOf(), + responseJson.id, + responseJson.titleByAPI, + 0, + 0, + responseJson.coverImage, + ], + (err) => { + if (err) { + return console.log(err.message); + } + } + ); + res.send({ status: "OK" }); + } else { + res.send({ status: "ERR_ALREADY_EXIST" }); + } + } + ); +}); + +//var res = request('POST', 'https://ssl.ofdb.de/view.php?page=suchergebnis', { +// json: {'SText': '4030521376748', 'Kat':'EAN'}, +//}); + +//var temp2 = String(res.getBody('utf8')) +//temp = //temp.replace(" + + + + + + +
+
+
+

OpenMovieDB - Add a new movie

+ + <% if(it.isDisplay == true) { %> + <%= it.titleByAPI %>
+ <%= it.id %>
+ Cover image
+ + <% } else{ %> +
+ +
EAN: Waiting for valid EAN...
+ + + <% } %> +
+
+
+ + + + + + \ No newline at end of file diff --git a/template/addToShelf.html b/template/addToShelf.html new file mode 100644 index 0000000..02fba1a --- /dev/null +++ b/template/addToShelf.html @@ -0,0 +1,133 @@ + + + + + + OpenMovieDB - Bookshelf + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

!

This movie already exists in the DB.
+
+ +
+
+
+

OpenMovieDB - Add a new movie

+
+ Cover image
+
<%= it.titleByAPI %>
<%= it.id %>
+
+ + + +
+
+
+ + + + + + \ No newline at end of file diff --git a/template/bookshelf.html b/template/bookshelf.html new file mode 100644 index 0000000..6310998 --- /dev/null +++ b/template/bookshelf.html @@ -0,0 +1,90 @@ + + + + + + OpenMovieDB - Bookshelf + + + + + + + + + + + + + + + + + + + +
+
+ +
+

OpenMovieDB - Bookshelf

+
+ +
+
+
+
+ +
+
+ + + + diff --git a/template/index.html b/template/index.html new file mode 100644 index 0000000..2090abc --- /dev/null +++ b/template/index.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + <%= it.titleByAPI %>
+ <%= it.id %>
+ Cover image + +
+ +
Waiting for proper EAN..
+ + + + + + + + \ No newline at end of file diff --git a/template/movieDetails.html b/template/movieDetails.html new file mode 100644 index 0000000..8a026a2 --- /dev/null +++ b/template/movieDetails.html @@ -0,0 +1,126 @@ + + + + + + OpenMovieDB - Bookshelf + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
Do you really want to remove this movie?
+ + + +
+
+ +
+
+
+

OpenMovieDB - Moviedetails

+
+ Cover image
+
<%= it.titleByAPI %>
<%= it.id %>
+
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/testEANconver.js b/testEANconver.js new file mode 100644 index 0000000..1eb1ff1 --- /dev/null +++ b/testEANconver.js @@ -0,0 +1,26 @@ + + + + +/*const FormData = require('form-data'); +const http = require('http'); + +const form = new FormData(); +form.append('SText', '4010884546217'); +form.append('Kat', 'EAN'); +const uploadResponse = fetch("https://ssl.ofdb.de/view.php?page=suchergebnis", {method: 'POST', body: form }); + +setTimeout(() => { + console.log(uploadResponse) +}, 500); +*/ + +const { URLSearchParams } = require('url'); +const fetch = require('node-fetch'); + +const params = new URLSearchParams(); +params.append('SText', '4010884546217'); +params.append('Kat', 'EAN'); + +fetch('https://ssl.ofdb.de/view.php?page=suchergebnis', { method: 'POST', body: params }) + .then(res => console.log(res.statusCode)) \ No newline at end of file