add search

This commit is contained in:
2026-09-02 20:06:04 +02:00
parent d415f6952b
commit 0f4560ee01
3 changed files with 36 additions and 2 deletions
+5
View File
@@ -40,6 +40,7 @@ import logging
import multiprocessing as mp import multiprocessing as mp
from collections import defaultdict from collections import defaultdict
from html import unescape from html import unescape
from pathlib import Path
from urllib.parse import urljoin, urlparse, urldefrag from urllib.parse import urljoin, urlparse, urldefrag
from urllib.robotparser import RobotFileParser from urllib.robotparser import RobotFileParser
from dotenv import load_dotenv from dotenv import load_dotenv
@@ -54,7 +55,11 @@ try:
except ImportError: except ImportError:
BeautifulSoup = None BeautifulSoup = None
# .env zuerst aus dem Arbeitsverzeichnis laden (Standard), zusätzlich aus
# dem Projektordner – so findet der Prozess die Konfiguration auch dann,
# wenn er von woanders gestartet wird (z. B. via systemd).
load_dotenv() load_dotenv()
load_dotenv(Path(__file__).resolve().parent / ".env")
# ============================================================ # ============================================================
+26 -2
View File
@@ -198,10 +198,11 @@ function urlFor(page) {
} }
function render(data) { function render(data) {
const query = data.query || "";
meta.textContent = data.total meta.textContent = data.total
? data.total + " Ergebnisse in " + data.took_ms + " ms" ? data.total + " Ergebnisse in " + data.took_ms + " ms"
+ (data.pages > 1 ? " – Seite " + data.page + "/" + data.pages : "") + (data.pages > 1 ? " – Seite " + data.page + "/" + data.pages : "")
: "Keine Ergebnisse für „" + data.query + "“"; : "Keine Ergebnisse für „" + query + "“";
results.innerHTML = ""; results.innerHTML = "";
@@ -271,8 +272,31 @@ function render(data) {
} }
} }
function showError(message) {
meta.textContent = message;
results.innerHTML = "";
pagination.innerHTML = "";
}
async function loadPage(page) { async function loadPage(page) {
const response = await fetch(urlFor(page)); let response;
try {
response = await fetch(urlFor(page));
} catch (e) {
showError("Suche fehlgeschlagen – Server nicht erreichbar.");
return;
}
if (!response.ok) {
let message = "Suche fehlgeschlagen (HTTP " + response.status + ").";
try {
const err = await response.json();
if (err && err.error) message = err.error;
} catch (e) { /* Antwort war kein JSON */ }
showError(message);
return;
}
const data = await response.json(); const data = await response.json();
currentPage = data.page; currentPage = data.page;
render(data); render(data);
+5
View File
@@ -35,12 +35,17 @@ import os
import re import re
import time import time
from dataclasses import dataclass, field from dataclasses import dataclass, field
from pathlib import Path
from typing import List, Optional, Tuple from typing import List, Optional, Tuple
from dotenv import load_dotenv from dotenv import load_dotenv
import psycopg2 import psycopg2
# .env zuerst aus dem Arbeitsverzeichnis laden (Standard), zusätzlich aus
# dem Projektordner – so findet der Prozess die Konfiguration auch dann,
# wenn er von woanders gestartet wird (z. B. via systemd).
load_dotenv() load_dotenv()
load_dotenv(Path(__file__).resolve().parent.parent / ".env")
# ============================================================ # ============================================================
# KONFIGURATION # KONFIGURATION