335 lines
10 KiB
JavaScript
335 lines
10 KiB
JavaScript
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 +=
|
|
"<a href='/showDetails?id=" +
|
|
row.id +
|
|
"'><div style='width: 150px; float: left; padding: 5px;'><img src='" +
|
|
posterLink +
|
|
'\' style="width: 100%;"><br><center><b>' +
|
|
row.movieTitel +
|
|
"</b></center></div></a>";
|
|
|
|
});*/
|
|
|
|
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("<script>", "").replace("<html>", "").replace("\n", "").replace("\r", "").replace("\t", "")
|
|
//htmlBlock = htmlParser.parse(temp)
|
|
//temp2 = temp2.split(/\r?\n/)
|
|
//temp = temp.split('img src="https://ssl.ofdb.de/images/shim.gif" width="1" height="10" border="0" alt=""></td>')[0]
|
|
//console.log(temp2.find(checkForString))
|
|
|
|
app.listen(port, () => {
|
|
console.log(`Movie DB app listening at http://localhost:${port}`);
|
|
});
|