Dark mode

This commit is contained in:
2022-04-12 21:35:11 +02:00
parent 94f9dbd84a
commit 1edc90103b
11 changed files with 630 additions and 1993 deletions

Binary file not shown.

View File

@ -2,13 +2,12 @@ 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 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 nameToImdb = require("name-to-imdb");
const imdbHelper = require("./node_modules/name-to-imdb/helpers"); const imdbHelper = require("./node_modules/name-to-imdb/helpers");
const imdb = require("imdb"); const imdbLight = require("imdb-light");
const port = 4000; const port = 4000;
const eanConvAdress = "http://127.0.0.1:9999/" const eanConvAdress = "http://127.0.0.1:9999/"
@ -25,6 +24,7 @@ var config = new Config('key.cfg');
app.use(express.static("static")); app.use(express.static("static"));
app.use(express.static("node_modules"));
app.get("/", async function handleIndex(req, res) { app.get("/", async function handleIndex(req, res) {
// https://imdb-api.com/de/API/Posters//[ID HERE] // https://imdb-api.com/de/API/Posters//[ID HERE]
@ -80,32 +80,35 @@ app.get("/returnSaveResult", function (req, res) {
); );
}); });
/********
* 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) { app.get("/showDetails", async function (req, res) {
const data = fs.readFileSync("template/movieDetails.html", "utf8"); const data = fs.readFileSync("template/movieDetails.html", "utf8");
console.log(req.query["id"])
const movie = await prisma.movieInfo.findFirst({ const movie = await prisma.movieInfo.findFirst({
where: { where: {
movieID: req.query["id"] movieID: req.query["id"]
} }
}) })
nameToImdb({name: imdbHelper.parseSearchTerm(movie.movieTitel)}, function handleImdbResp(err, imdbID, imdbData) { imdbLight.fetch(req.query.id, function handleImdbResp(details) {
if (err) { console.log(details);
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,
id: movie.movieID, id: movie.movieID,
cover: movie.posterUrl, cover: movie.posterUrl,
titleByAPI: movie.movieTitel, titleByAPI: details.Title,
type: typeIndex[movie.type], type: typeIndex[movie.type],
extendedData: imdbData.meta extendedData: details
}) })
) )
}) })
@ -160,23 +163,17 @@ app.get("/apiCallBack", function (req, res) {
} else { } else {
var searchTerm = response.body; var searchTerm = response.body;
searchTerm = searchTerm.replace("/", " ") searchTerm = searchTerm.replace("/", " ")
var reqString =
"https://imdb-api.com/en/API/SearchTitle/" + config.get('keys.imdb') + "/" +
searchTerm;
request(reqString, function (error, response2, body) {
jsonBody = JSON.parse(response2.body);
console.log(jsonBody.length); imdbLight.fetch(imdbID, function handleLightReponse(details) {
if (jsonBody.errorMessage.includes("Maximum usage")) {
res.send({ state: "ERR_IMDB_LIMIT_REACHED" }); console.log(details);
} else {
jsonBody = jsonBody.results[0]; jsonBody = jsonBody.results[0];
timest = new Date().valueOf(); timest = new Date().valueOf();
responseJson = { responseJson = {
state: "OK", state: "OK",
id: jsonBody.id, id: jsonBody.id,
coverImage: jsonBody.image, coverImage: details.Poster,
titleByAPI: response.body, titleByAPI: details.Title,
ean: req.query["ean"], ean: req.query["ean"],
reponseID: req.query["ean"], reponseID: req.query["ean"],
}; };
@ -188,7 +185,7 @@ app.get("/apiCallBack", function (req, res) {
console.error(err); console.error(err);
} }
res.send(responseJson); res.send(responseJson);
}
}); });
} }
} }
@ -209,24 +206,21 @@ app.get("/apiCallBackTitle", function (req, res) {
res.send({ state: "ERR_BACK_FAIL" }); res.send({ state: "ERR_BACK_FAIL" });
console.log(err.stack); console.log(err.stack);
} }
if(imdbData.isCached != true) { imdbLight.fetch(imdbID, function handleLightReponse(details) {
imdbBuffer[imdbID] = imdbData;
} else {
imdbData = imdbBuffer[imdbID];
}
const randId = Math.floor(Math.random() * 100000) + "NO_EAN"; const randId = Math.floor(Math.random() * 100000) + "NO_EAN";
responseJson = { responseJson = {
state: "OK", state: "OK",
id: imdbID, id: imdbID,
coverImage: imdbData.meta.image.src, coverImage: details.Poster,
titleByAPI: imdbData.meta.name, titleByAPI: details.Title,
ean: String(randId), ean: String(randId),
reponseID: String(randId), reponseID: String(randId),
}; };
responseBuffer[randId] = responseJson; responseBuffer[randId] = responseJson;
res.send(responseJson); res.send(responseJson);
}) })
})
}); });

1926
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "openmoviedb", "name": "openmoviedb",
"version": "1.0.0", "version": "1.0.5",
"description": "An openmoviedb where you can save which movies you own.", "description": "An openmoviedb where you can save which movies you own.",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
@ -15,22 +15,21 @@
"imdb" "imdb"
], ],
"author": "TheGreydiamond", "author": "TheGreydiamond",
"license": "ISC", "license": "",
"dependencies": { "dependencies": {
"config-js": "^1.1.14", "config-js": "^1.1.14",
"darkreader": "^4.9.46",
"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",
"imdb-light": "^1.1.5",
"name-to-imdb": "^3.0.2", "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",
"quagga": "^0.12.1", "quagga": "^0.12.1",
"request": "^2.88.2", "request": "^2.88.2"
"sqlite3": "^5.0.2",
"sync-request": "^6.1.0"
}, },
"devDependencies": { "devDependencies": {
"@prisma/client": "^3.12.0", "@prisma/client": "^3.12.0",

View File

@ -24,6 +24,75 @@
--> -->
<link rel="stylesheet" href="css/normalize.css" /> <link rel="stylesheet" href="css/normalize.css" />
<link rel="stylesheet" href="css/skeleton.css" /> <link rel="stylesheet" href="css/skeleton.css" />
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://kit.fontawesome.com/d7b80a780b.js" crossorigin="anonymous"></script>
<script src="/darkreader/darkreader.js"> </script>
<style>
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked + .slider {
background-color: #2196F3;
}
input:focus + .slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}
/* Rounded sliders */
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
iconContainer {
padding: 4px;
font-size: 1.5em;
}
</style>
<style> <style>
/* In order to place the tracking correctly */ /* In order to place the tracking correctly */
@ -97,7 +166,16 @@
</div> </div>
</div> </div>
<!-- Include the image-diff library --> <!-- Include the image-diff library -->
<script>
DarkReader.auto()
$("#darkToggle").on("change", function(test){
if(test.currentTarget.checked){
DarkReader.enable()
} else {
DarkReader.disable()
}
})
</script>
<script> <script>
var coll = document.getElementsByClassName("collapsible"); var coll = document.getElementsByClassName("collapsible");

View File

@ -61,12 +61,76 @@
</style> </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://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>
<script src="https://kit.fontawesome.com/d7b80a780b.js" crossorigin="anonymous"></script>
<script src="/darkreader/darkreader.js"> </script>
<style>
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked + .slider {
background-color: #2196F3;
}
input:focus + .slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}
/* Rounded sliders */
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
iconContainer {
padding: 4px;
font-size: 1.5em;
}
</style>
</head> </head>
<body> <body>
@ -92,7 +156,16 @@
</div> </div>
</div> </div>
<!-- Include the image-diff library --> <!-- Include the image-diff library -->
<script>
DarkReader.auto()
$("#darkToggle").on("change", function(test){
if(test.currentTarget.checked){
DarkReader.enable()
} else {
DarkReader.disable()
}
})
</script>
<script> <script>
var coll = document.getElementsByClassName("collapsible"); var coll = document.getElementsByClassName("collapsible");

View File

@ -66,9 +66,76 @@
<!-- Favicon <!-- Favicon
--> -->
<link rel="icon" type="image/png" href="images/favicon.png" /> <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://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>
<script src="https://kit.fontawesome.com/d7b80a780b.js" crossorigin="anonymous"></script>
<script src="/darkreader/darkreader.js"> </script>
<style>
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked + .slider {
background-color: #2196F3;
}
input:focus + .slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}
/* Rounded sliders */
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
iconContainer {
padding: 4px;
font-size: 1.5em;
}
</style>
</head> </head>
<body> <body>
@ -108,7 +175,16 @@
</div> </div>
</div> </div>
<!-- Include the image-diff library --> <!-- Include the image-diff library -->
<script>
DarkReader.auto()
$("#darkToggle").on("change", function(test){
if(test.currentTarget.checked){
DarkReader.enable()
} else {
DarkReader.disable()
}
})
</script>
<script> <script>
function on() { function on() {
document.getElementById("overlay").style.display = "block"; document.getElementById("overlay").style.display = "block";

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,8 @@
<!-- 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
--> -->
@ -28,12 +26,79 @@
<!-- Favicon <!-- Favicon
--> -->
<link rel="icon" type="image/png" href="images/favicon.png" /> <link rel="icon" type="image/png" href="images/favicon.png" />
<script <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
src="https://kit.fontawesome.com/d7b80a780b.js" <script src="https://kit.fontawesome.com/d7b80a780b.js" crossorigin="anonymous"></script>
crossorigin="anonymous" <script src="/darkreader/darkreader.js"> </script>
></script> <style>
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked + .slider {
background-color: #2196F3;
}
input:focus + .slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}
/* Rounded sliders */
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
iconContainer {
padding: 4px;
font-size: 1.5em;
}
</style>
</head> </head>
<body> <body>
<!-- Primary Page Layout <!-- Primary Page Layout
--> -->
<div class="container"> <div class="container">
@ -41,20 +106,38 @@
<div class="eleven column" style="margin-top: 15%"> <div class="eleven column" style="margin-top: 15%">
<h4>OpenMovieDB - Bookshelf</h4> <h4>OpenMovieDB - Bookshelf</h4>
<div style="float: right; top: -20px;"> <div style="float: right; top: -20px;">
<input class="u-full-width" type="text" placeholder="Search" id="search"> <input class="u-full-width" type="text" placeholder="Search" id="search">
</div> </div>
<button
class="button-primary"
onclick="window.location.href = '/add'"
>
<i class="fas fa-plus"></i> Add new movie</button <button class="button-primary" onclick="window.location.href = '/add'">
><br /> <i class="fas fa-plus"></i> Add new movie</button>
<label class="switch" style="">
<input type="checkbox" checked id="darkToggle">
<span class="slider round"><iconContainer> <i class="fas fa-sun"></i> <i class="fas fa-moon"></i></iconContainer></span>
</label><br />
<div id="listOfMovies" class=""></div> <div id="listOfMovies" class=""></div>
</div> </div>
</div> </div>
</div> </div>
<script>
DarkReader.auto()
$("#darkToggle").on("change", function(test){
if(test.currentTarget.checked){
DarkReader.enable()
} else {
DarkReader.disable()
}
})
</script>
<script> <script>
ser = document.getElementById("search"); ser = document.getElementById("search");
ser.addEventListener("input", updateValue); ser.addEventListener("input", updateValue);
@ -87,4 +170,5 @@
<!-- End Document <!-- End Document
--> -->
</body> </body>
</html> </html>

View File

@ -64,12 +64,75 @@
} }
</style> </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> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://kit.fontawesome.com/d7b80a780b.js" crossorigin="anonymous"></script>
<script src="/darkreader/darkreader.js"> </script>
<style>
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked + .slider {
background-color: #2196F3;
}
input:focus + .slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}
/* Rounded sliders */
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
iconContainer {
padding: 4px;
font-size: 1.5em;
}
</style>
</head> </head>
<body> <body>
@ -98,6 +161,17 @@
</div> </div>
</div> </div>
</div> </div>
<script>
DarkReader.auto()
$("#darkToggle").on("change", function(test){
if(test.currentTarget.checked){
DarkReader.enable()
} else {
DarkReader.disable()
}
})
</script>
<script> <script>
function on() { function on() {

View File

@ -5,6 +5,7 @@
<title></title> <title></title>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<script src="/darkreader/darkreader.js"> </script>
<style> <style>
/* In order to place the tracking correctly */ /* In order to place the tracking correctly */
canvas.drawing, canvas.drawingBuffer { canvas.drawing, canvas.drawingBuffer {
@ -26,7 +27,16 @@
<button onclick="sendEanConvRequest()"> Search</button> <button onclick="sendEanConvRequest()"> Search</button>
<!-- Include the image-diff library --> <!-- Include the image-diff library -->
<script>
DarkReader.auto()
$("#darkToggle").on("change", function(test){
if(test.currentTarget.checked){
DarkReader.enable()
} else {
DarkReader.disable()
}
})
</script>
<script> <script>
var _scannerIsRunning = false; var _scannerIsRunning = false;

View File

@ -189,9 +189,27 @@
Details Details
</summary><br> </summary><br>
<p> <p>
Year: <%= it.extendedData.year %> Year: <%= it.extendedData.Year %>
<br> <br>
Starring: <%= it.extendedData.starring %> Director: <%= it.extendedData.Director %>
<br>
Starring: <%= it.extendedData.Actors %>
<br>
Writers: <%= it.extendedData.Writers %>
<br>
Release: <%= it.extendedData.Release %>
<br>
Rating: <%= it.extendedData.Rating %>
<br>
<details>
<summary>
Plot
</summary>
<p>
<%~ it.extendedData.Plot %>
</p>
</details>
</p> </p>
</details> </details>
<br> <br>
@ -206,6 +224,17 @@
</div> </div>
</div> </div>
</div> </div>
<script>
DarkReader.auto()
$("#darkToggle").on("change", function(test){
if(test.currentTarget.checked){
DarkReader.enable()
} else {
DarkReader.disable()
}
})
</script>
<script> <script>
function on() { function on() {