const express = require("express"); const Eta = require("eta"); const fs = require("fs"); const request = require("request"); var Config = require('config-js'); const app = express(); const PrismaClient = require('@prisma/client').PrismaClient; const nameToImdb = require("name-to-imdb"); const imdbHelper = require("./node_modules/name-to-imdb/helpers"); const imdbLight = require("imdb-light"); const port = 4000; const eanConvAdress = "http://127.0.0.1:9999/" const typeIndex = { 0: "Physical", 1: "Digital - Maxdome", 2: "Digital - Amazon Prime Video", 3: "Digital - DVR" } const prisma = new PrismaClient(); var responseBuffer = { allBufferd: [] }; const imdbBuffer = {} responseBuffer = JSON.parse(fs.readFileSync("chache.bin", "utf8")); var config = new Config('key.cfg'); app.use(express.static("static")); app.use(express.static("node_modules")); app.get("/", async function handleIndex(req, res) { // https://imdb-api.com/de/API/Posters//[ID HERE] const rows = await prisma.movieInfo.findMany({ orderBy: [ { movieTitel: 'asc', } ] }) // 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("/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) { console.log(req.query.id) prisma.movieInfo.delete({ where: { id: parseInt(req.query.id) } }).then(function handleFinishDelete(result) { console.log(result) }) console.log("Deleted entries") 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"], }) ); }); /******** * test endpoint */ app.get("/test", function (req, res) { const respo = imdbLight.fetch(req.query.id, (details) => { console.log(details) res.send(details) }) }); app.get("/showDetails", async function (req, res) { const data = fs.readFileSync("template/movieDetails.html", "utf8"); const movie = await prisma.movieInfo.findFirst({ where: { movieID: req.query["id"] } }) imdbLight.fetch(req.query.id, function handleImdbResp(details) { console.log(details); res.send( Eta.render(data, { internalID: movie.id, id: movie.movieID, cover: movie.posterUrl, titleByAPI: details.Title, type: typeIndex[movie.type], extendedData: details }) ) }) }); app.get("/editDetails", async function (req, res) { const data = fs.readFileSync("template/editDetails.html", "utf8"); console.log(req.query["id"]) const movie = await prisma.movieInfo.findFirst({ where: { movieID: req.query["id"] } }) res.send( Eta.render(data, { internalID: movie.id, id: movie.movieID, cover: movie.posterUrl, titleByAPI: movie.movieTitel, type: typeIndex[movie.type], typeId: movie.type }) ) }); app.get("/api/edit", function handleEdit(req, res) { console.log(req.query) prisma.movieInfo.update({ where: { id: parseInt(req.query["id"]) }, data: { type: parseInt(req.query["type"]) } }).then(function handleFinishEdit(result) { console.log(result) }) res.send("Done."); }) app.get("/apiCallBack", function (req, res) { //console.log(req.query); if (!responseBuffer.allBufferd.includes(req.query["ean"])) { request( eanConvAdress + "?ean=" + req.query["ean"], function (error, response, body) { console.log(response, error, body) if (response.statusCode != 200) { console.log("OH NO"); res.send({ state: "ERR_EAN_CONV_NO_200" }); } else { var searchTerm = response.body; searchTerm = searchTerm.replace("/", " ") imdbLight.fetch(imdbID, function handleLightReponse(details) { console.log(details); jsonBody = jsonBody.results[0]; timest = new Date().valueOf(); responseJson = { state: "OK", id: jsonBody.id, coverImage: details.Poster, titleByAPI: details.Title, ean: req.query["ean"], reponseID: req.query["ean"], }; responseBuffer[req.query["ean"]] = responseJson; responseBuffer.allBufferd.push(req.query["ean"]); try { fs.writeFileSync("chache.bin", JSON.stringify(responseBuffer)); } catch (err) { console.error(err); } res.send(responseJson); }); } } ); } else { console.log("Using chache"); responseJson = responseBuffer[req.query["ean"]]; res.send(responseJson); } }); 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); } imdbLight.fetch(imdbID, function handleLightReponse(details) { const randId = Math.floor(Math.random() * 100000) + "NO_EAN"; responseJson = { state: "OK", id: imdbID, coverImage: details.Poster, titleByAPI: details.Title, ean: String(randId), reponseID: String(randId), }; responseBuffer[randId] = responseJson; res.send(responseJson); }) }) }); app.get("/save", async function handleSave(req, res) { responseJson = responseBuffer[req.query["reponseID"]]; const type = parseInt(req.query["type"]) || 0; const moveiTest = await prisma.movieInfo.findMany({ where: { movieID: responseJson.id } }) if (moveiTest.length == 0) { prisma.movieInfo.create({ data: { movieID: responseJson.id, movieTitel: responseJson.titleByAPI, place: 0, type: type, posterUrl: responseJson.coverImage } }).then(function handleFinishCreate(result) { console.log(result) }) res.send({ status: "OK" }); } else { res.send({ status: "ERR_ALREADY_EXIST" }); } }); app.listen(port, () => { console.log(`Movie DB app listening at http://localhost:${port}`); });