public/index.html aktualisiert

This commit is contained in:
M_Viper 2024-10-17 22:48:11 +00:00
parent 41812c93f5
commit a22a773e0a
1 changed files with 298 additions and 297 deletions

View File

@ -1,297 +1,298 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/styles.css"> <link rel="stylesheet" href="css/styles.css">
<link rel="icon" type="image/png" href="img/Viper-plex-logo.png"> <link rel="icon" type="image/png" href="img/Viper-plex-logo.png">
<title>Viper-Plex</title> <title>Viper-Plex</title>
</head> </head>
<body> <body>
<!-- Logo separat einfügen --> <!-- Logo separat einfügen -->
<div class="logo-container"> <div class="logo-container">
<a href="index.html"> <a href="index.html">
<img src="img/Viper-plex-logo.png" alt="Viper-Plex Logo" class="logo"> <img src="img/Viper-plex-logo.png" alt="Viper-Plex Logo" class="logo">
</a> </a>
</div> </div>
<div class="welcome-box"> <div class="welcome-box">
<h1>Willkommen bei Viper-Plex</h1> <h1>Willkommen bei Viper-Plex</h1>
<nav class="navbar"> <nav class="navbar">
<div class="navbar-container"> <div class="navbar-container">
<a href="index.html" class="navbar-link">Home</a> <a href="index.html" class="navbar-link">Home</a>
<a href="wunsch.html" class="navbar-link">Film & Serien Wunsch</a> <a href="wunsch.html" class="navbar-link">Film & Serien Wunsch</a>
<a href="anleitung.html" class="navbar-link">Anleitung</a> <a href="anleitung.html" class="navbar-link">Anleitung</a>
<a href="funktionen.html" class="navbar-link">Funktionen</a> <a href="funktionen.html" class="navbar-link">Funktionen</a>
<a href="faq.html" class="navbar-link">FAQs</a> <a href="faq.html" class="navbar-link">FAQs</a>
<a href="kontakt.html" class="navbar-link">Kontakt</a> <a href="kontakt.html" class="navbar-link">Kontakt</a>
<a href="link.html" class="navbar-link">Links</a> <a href="link.html" class="navbar-link">Links</a>
<a href="report.html" class="navbar-link">Meldungen</a> <a href="report.html" class="navbar-link">Meldungen</a>
<a href="admin.html" class="navbar-link">Admin</a> <a href="admin.html" class="navbar-link">Admin</a>
</div> </div>
</nav> </nav>
<label class="switch"> <label class="switch">
<input type="checkbox" id="dark-mode-toggle"> <input type="checkbox" id="dark-mode-toggle">
<span class="slider"></span> <span class="slider"></span>
</label> </label>
</div> </div>
<div class="container"> <div class="container">
<main> <main>
<div class="movies-box"> <div class="movies-box">
<h2>Neueste Filme</h2> <h2>Neueste Filme</h2>
<ul id="movies-list"></ul> <ul id="movies-list"></ul>
</div> </div>
</main> </main>
<aside class="sidebar"> <aside class="sidebar">
<div class="newsletter-box"> <div class="newsletter-box">
<h2>Newsletter Anmeldung</h2> <h2>Newsletter Anmeldung</h2>
<form id="subscribe-form"> <form id="subscribe-form">
<input type="email" id="email" placeholder="E-Mail-Adresse" required> <input type="email" id="email" placeholder="E-Mail-Adresse" required>
<input type="text" id="username" placeholder="Benutzername" required> <input type="text" id="username" placeholder="Benutzername" required>
<button type="submit">Anmelden</button> <button type="submit">Anmelden</button>
</form> </form>
</div> </div>
<div class="gitea-box"> <div class="gitea-box">
<p>Sieh dir den Code auf <a href="https://git.viper.ipv64.net/M_Viper/Plex-Telegram-Bot" target="_blank">Gitea</a> an!</p> <p>Sieh dir den Code auf <a href="https://git.viper.ipv64.net/M_Viper/Plex-Telegram-Bot" target="_blank">Gitea</a> an!</p>
<p>Aktuelle Version: <span id="bot-version"></span></p> <p>Aktuelle Version: <span id="bot-version"></span></p>
<div class="telegram-connect-box"> <div class="telegram-connect-box">
<p>Verbinde dich mit unserem Telegram-Bot!</p> <p>Verbinde dich mit unserem Telegram-Bot!</p>
<a id="telegram-link" href="#" target="_blank">Jetzt verbinden</a> <a id="telegram-link" href="#" target="_blank">Jetzt verbinden</a>
</div> </div>
</div> </div>
</aside> </aside>
</div> </div>
<footer class="footer"> <footer class="footer">
<p>&copy; 2024 Viper-Plex. Alle Rechte vorbehalten.</p> <p>&copy; 2024 Viper-Plex. Alle Rechte vorbehalten.</p>
<span id="changelog-icon" style="cursor: pointer;"></span> <span id="changelog-icon" style="cursor: pointer;"></span>
</footer> </footer>
<div id="changelog-popup" class="popup"> <div id="changelog-popup" class="popup">
<div class="popup-content"> <div class="popup-content">
<span class="close" id="close-popup">&times;</span> <span class="close" id="close-popup">&times;</span>
<h2>Changelog</h2> <h2>Changelog</h2>
<ul id="changelog-list"></ul> <ul id="changelog-list"></ul>
</div> </div>
</div> </div>
<script> <script>
// Funktion, um die Umgebungsvariablen abzurufen // Funktion, um die Umgebungsvariablen abzurufen
const fetchEnvVariables = async () => { const fetchEnvVariables = async () => {
const response = await fetch('/api/env'); const response = await fetch('/api/env');
const data = await response.json(); const data = await response.json();
document.getElementById('bot-alias').textContent = data.botAlias; document.getElementById('bot-alias').textContent = data.botAlias;
document.getElementById('telegram-link').href = data.telegramLink; document.getElementById('telegram-link').href = data.telegramLink;
}; };
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
fetch('/api/telegram-link') // API-Endpunkt zum Abrufen des Telegram-Links fetch('/api/telegram-link') // API-Endpunkt zum Abrufen des Telegram-Links
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
const telegramLink = document.getElementById('telegram-link'); const telegramLink = document.getElementById('telegram-link');
telegramLink.href = data.link; // Setze den Link im Anchor-Tag telegramLink.href = data.link; // Setze den Link im Anchor-Tag
}) })
.catch(error => console.error('Fehler beim Abrufen des Telegram-Links:', error)); .catch(error => console.error('Fehler beim Abrufen des Telegram-Links:', error));
// Version abrufen // Version abrufen
fetch('/api/bot-version') fetch('/api/bot-version')
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
const botVersion = document.getElementById('bot-version'); const botVersion = document.getElementById('bot-version');
botVersion.textContent = data.version; // Setze die Versionsnummer botVersion.textContent = data.version; // Setze die Versionsnummer
}) })
.catch(error => console.error('Fehler beim Abrufen der Bot-Version:', error)); .catch(error => console.error('Fehler beim Abrufen der Bot-Version:', error));
// Funktion, um die neuesten Filme abzurufen // Funktion, um die neuesten Filme abzurufen
async function fetchLatestMovies() { async function fetchLatestMovies() {
try { try {
const response = await fetch('/api/latest-movies'); // API-URL const response = await fetch('/api/latest-movies'); // API-URL
const movies = await response.json(); // Filme abrufen const movies = await response.json(); // Filme abrufen
const moviesList = document.getElementById('movies-list'); const moviesList = document.getElementById('movies-list');
// Leere die Liste, bevor du neue Filme hinzufügst // Leere die Liste, bevor du neue Filme hinzufügst
moviesList.innerHTML = ''; moviesList.innerHTML = '';
// Füge die neuesten Filme zur Liste hinzu // Füge die neuesten Filme zur Liste hinzu
movies.forEach(movie => { movies.forEach(movie => {
const listItem = document.createElement('li'); const listItem = document.createElement('li');
listItem.classList.add('movie-item'); // Füge Klasse hinzu für CSS listItem.classList.add('movie-item'); // Füge Klasse hinzu für CSS
// Erstelle das Coverbild // Erstelle das Coverbild
const coverImage = document.createElement('img'); const coverImage = document.createElement('img');
coverImage.src = movie.coverImage; // URL des Coverbilds coverImage.src = movie.coverImage; // URL des Coverbilds
coverImage.alt = movie.title; // Alternativtext für das Bild coverImage.alt = movie.title; // Alternativtext für das Bild
// Überprüfen, ob das Bild geladen werden kann // Überprüfen, ob das Bild geladen werden kann
coverImage.onerror = () => { coverImage.onerror = () => {
console.error(`Konnte das Bild für ${movie.title} nicht laden: ${coverImage.src}`); console.error(`Konnte das Bild für ${movie.title} nicht laden: ${coverImage.src}`);
coverImage.src = 'fallback-image-url.jpg'; // Fallback-Bild, wenn das Bild nicht geladen werden kann coverImage.src = 'fallback-image-url.jpg'; // Fallback-Bild, wenn das Bild nicht geladen werden kann
}; };
// Füge das Bild zur Liste hinzu // Füge das Bild zur Liste hinzu
listItem.appendChild(coverImage); listItem.appendChild(coverImage);
moviesList.appendChild(listItem); moviesList.appendChild(listItem);
}); });
// Animation für das Einblenden der Filme // Animation für das Einblenden der Filme
requestAnimationFrame(() => { requestAnimationFrame(() => {
moviesList.childNodes.forEach((item, index) => { moviesList.childNodes.forEach((item, index) => {
setTimeout(() => { setTimeout(() => {
item.style.opacity = 1; // Opazität für sanftes Einblenden item.style.opacity = 1; // Opazität für sanftes Einblenden
}, index * 100); // Verzögerung für jeden Film }, index * 100); // Verzögerung für jeden Film
}); });
}); });
} catch (error) { } catch (error) {
console.error('Fehler beim Abrufen der Filme:', error); console.error('Fehler beim Abrufen der Filme:', error);
} }
} }
// Event-Listener für das Formular // Event-Listener für das Formular
document.getElementById('subscribe-form').addEventListener('submit', function(event) { document.getElementById('subscribe-form').addEventListener('submit', function(event) {
event.preventDefault(); event.preventDefault();
const email = document.getElementById('email').value; const email = document.getElementById('email').value;
const username = document.getElementById('username').value; const username = document.getElementById('username').value;
// Generiere eine Dummy-Chat-ID // Generiere eine Dummy-Chat-ID
const chatId = Math.floor(Math.random() * 1000000); // Zufällige Zahl zwischen 0 und 999999 const chatId = Math.floor(Math.random() * 1000000); // Zufällige Zahl zwischen 0 und 999999
fetch('/subscribe', { fetch('/subscribe', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, chatId, username }) body: JSON.stringify({ email, chatId, username })
}) })
.then(response => response.text()) .then(response => response.text())
.then(data => alert(data)) .then(data => alert(data))
.catch(error => alert('Fehler: ' + error)); .catch(error => alert('Fehler: ' + error));
}); });
// Darkmode umschalten // Darkmode umschalten
const toggle = document.getElementById('dark-mode-toggle'); const toggle = document.getElementById('dark-mode-toggle');
// Darkmode-Zustand beim Laden der Seite überprüfen und anwenden // Darkmode-Zustand beim Laden der Seite überprüfen und anwenden
const darkModeEnabled = localStorage.getItem('darkMode') === 'true'; const darkModeEnabled = localStorage.getItem('darkMode') === 'true';
toggle.checked = darkModeEnabled; toggle.checked = darkModeEnabled;
if (darkModeEnabled) { if (darkModeEnabled) {
document.body.classList.add('dark-mode'); document.body.classList.add('dark-mode');
} }
toggle.addEventListener('change', () => { toggle.addEventListener('change', () => {
const isChecked = toggle.checked; const isChecked = toggle.checked;
document.body.classList.toggle('dark-mode', isChecked); document.body.classList.toggle('dark-mode', isChecked);
// Speichere den Zustand in localStorage // Speichere den Zustand in localStorage
localStorage.setItem('darkMode', isChecked); localStorage.setItem('darkMode', isChecked);
}); });
// Beim Laden der Seite die neuesten Filme abrufen // Beim Laden der Seite die neuesten Filme abrufen
window.onload = fetchLatestMovies; window.onload = fetchLatestMovies;
// Aktualisiere die Filme jede Minute (60000 Millisekunden) // Aktualisiere die Filme jede Minute (60000 Millisekunden)
setInterval(fetchLatestMovies, 60000); setInterval(fetchLatestMovies, 60000);
// Changelog-Daten // Changelog-Daten
const changelogData = { const changelogData = {
"changelog": [ "changelog": [
{ {
"version": "1.8.4", "version": "1.8.4",
"date": "2024-10-17", "date": "2024-10-17",
"changes": [ "changes": [
"Backups Passwort schutz" "Backups Passwort schutz",
] "Verbesserter Passwort schutz für Frontend"
}, ]
{ },
"version": "1.8.3", {
"date": "2024-10-17", "version": "1.8.3",
"changes": [ "date": "2024-10-17",
"Logout Timer hinzugefügt.", "changes": [
"Automatisches Logout bei Inaktivität", "Logout Timer hinzugefügt.",
"Login-Seite überarbeitet für bessere Benutzerfreundlichkeit.", "Automatisches Logout bei Inaktivität",
"Darkmode im Adminbereich hinzugefügt." "Login-Seite überarbeitet für bessere Benutzerfreundlichkeit.",
] "Darkmode im Adminbereich hinzugefügt."
}, ]
{ },
"version": "1.8.2", {
"date": "2024-10-16", "version": "1.8.2",
"changes": [ "date": "2024-10-16",
"Neue FAQ-Seite für Benutzer hinzugefügt.", "changes": [
"Benutzerfreundliche Darstellung der FAQs.", "Neue FAQ-Seite für Benutzer hinzugefügt.",
"Verbesserte Performance bei der Datenabfrage.", "Benutzerfreundliche Darstellung der FAQs.",
"Diverse kleinere Fehlerbehebungen." "Verbesserte Performance bei der Datenabfrage.",
] "Diverse kleinere Fehlerbehebungen."
}, ]
{ },
"version": "1.8.1", {
"date": "2024-10-16", "version": "1.8.1",
"changes": [ "date": "2024-10-16",
"Bugfix mit Darkmode.", "changes": [
"Dev-Report hinzugefügt (Bug-Report & Funktionswünsche)." "Bugfix mit Darkmode.",
] "Dev-Report hinzugefügt (Bug-Report & Funktionswünsche)."
}, ]
{ },
"version": "1.8.0", {
"date": "2024-10-14", "version": "1.8.0",
"changes": [ "date": "2024-10-14",
"Neue Funktionen hinzugefügt.", "changes": [
"Verbesserte Benutzeroberfläche für die Admin-Seite.", "Neue Funktionen hinzugefügt.",
"Optimierungen im Bot für schnellere Reaktionen." "Verbesserte Benutzeroberfläche für die Admin-Seite.",
] "Optimierungen im Bot für schnellere Reaktionen."
}, ]
{ },
"version": "1.7.9", {
"date": "2024-10-10", "version": "1.7.9",
"changes": [ "date": "2024-10-10",
"Fehlerbehebungen und Optimierungen.", "changes": [
"Verbesserte Sicherheit der Benutzerdaten.", "Fehlerbehebungen und Optimierungen.",
"Aktualisierte Dokumentation." "Verbesserte Sicherheit der Benutzerdaten.",
] "Aktualisierte Dokumentation."
} ]
] }
}; ]
};
// Changelog im Popup anzeigen
const changelogList = document.getElementById('changelog-list'); // Changelog im Popup anzeigen
const changelogList = document.getElementById('changelog-list');
changelogData.changelog.forEach(entry => {
const changelogItem = document.createElement('div'); changelogData.changelog.forEach(entry => {
changelogItem.classList.add('changelog-entry'); // Füge eine Klasse für das Styling hinzu const changelogItem = document.createElement('div');
changelogItem.classList.add('changelog-entry'); // Füge eine Klasse für das Styling hinzu
changelogItem.innerHTML = `
<strong>Version ${entry.version} (${entry.date}):</strong> changelogItem.innerHTML = `
<ul> <strong>Version ${entry.version} (${entry.date}):</strong>
${entry.changes.map(change => `<li>${change}</li>`).join('')} <ul>
</ul> ${entry.changes.map(change => `<li>${change}</li>`).join('')}
`; </ul>
changelogList.appendChild(changelogItem); `;
}); changelogList.appendChild(changelogItem);
});
// Changelog-Popup-Elemente
const changelogIcon = document.getElementById('changelog-icon'); // Changelog-Popup-Elemente
const popup = document.getElementById('changelog-popup'); const changelogIcon = document.getElementById('changelog-icon');
const closePopup = document.getElementById('close-popup'); const popup = document.getElementById('changelog-popup');
const closePopup = document.getElementById('close-popup');
// Popup öffnen
changelogIcon.addEventListener('click', () => { // Popup öffnen
popup.style.display = 'block'; changelogIcon.addEventListener('click', () => {
document.body.classList.toggle('dark-mode', toggle.checked); // Darkmode bei Popup-Anzeige aktivieren popup.style.display = 'block';
}); document.body.classList.toggle('dark-mode', toggle.checked); // Darkmode bei Popup-Anzeige aktivieren
});
// Popup schließen
closePopup.addEventListener('click', () => { // Popup schließen
popup.style.display = 'none'; closePopup.addEventListener('click', () => {
document.body.classList.toggle('dark-mode', toggle.checked); // Darkmode wieder zurücksetzen popup.style.display = 'none';
}); document.body.classList.toggle('dark-mode', toggle.checked); // Darkmode wieder zurücksetzen
});
// Klick außerhalb des Popups schließt es
window.addEventListener('click', (event) => { // Klick außerhalb des Popups schließt es
if (event.target === popup) { window.addEventListener('click', (event) => {
popup.style.display = 'none'; if (event.target === popup) {
document.body.classList.toggle('dark-mode', toggle.checked); // Darkmode wieder zurücksetzen popup.style.display = 'none';
} document.body.classList.toggle('dark-mode', toggle.checked); // Darkmode wieder zurücksetzen
}); }
}); });
});
</script>
</body> </script>
</html> </body>
</html>