import sqlite3 import os from datetime import datetime, date DB_PATH = os.environ.get('DB_PATH', '/data/redax.db') def get_conn(): conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row conn.execute("PRAGMA journal_mode=WAL") conn.execute("PRAGMA foreign_keys=ON") return conn def init_db(): conn = get_conn() c = conn.cursor() c.executescript(""" CREATE TABLE IF NOT EXISTS articles ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, content TEXT, content_raw TEXT, source_url TEXT, article_type TEXT NOT NULL DEFAULT 'ki', -- 'ki' or 'rss' source_feed_id INTEGER REFERENCES feeds(id), status TEXT NOT NULL DEFAULT 'draft', tone TEXT DEFAULT 'informativ', post_date TEXT, post_time TEXT DEFAULT '19:00', wp_post_id INTEGER, wp_url TEXT, category_id INTEGER, featured_image_url TEXT, seo_title TEXT, seo_description TEXT, focus_keyword TEXT, send_to_telegram INTEGER DEFAULT 0, version INTEGER DEFAULT 1, created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')), published_at TEXT, UNIQUE(post_date, post_time) ); CREATE TABLE IF NOT EXISTS feeds ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, url TEXT NOT NULL UNIQUE, schedule TEXT DEFAULT '*/2 * * * *', active INTEGER DEFAULT 1, auto_publish INTEGER DEFAULT 0, ki_rewrite INTEGER DEFAULT 0, teaser_only INTEGER DEFAULT 1, category_id INTEGER, blacklist TEXT DEFAULT '', last_fetched_at TEXT, last_error TEXT, created_at TEXT DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS feed_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, feed_id INTEGER NOT NULL REFERENCES feeds(id), guid TEXT NOT NULL, title TEXT, url TEXT, summary TEXT, published_at TEXT, status TEXT DEFAULT 'new', article_id INTEGER REFERENCES articles(id), fetched_at TEXT DEFAULT (datetime('now')), UNIQUE(feed_id, guid) ); CREATE TABLE IF NOT EXISTS prompts ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, system_prompt TEXT NOT NULL, is_default INTEGER DEFAULT 0, last_tested_at TEXT, test_result TEXT, created_at TEXT DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS settings ( key TEXT PRIMARY KEY, value TEXT ); CREATE TABLE IF NOT EXISTS post_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, article_id INTEGER REFERENCES articles(id), wp_post_id INTEGER, wp_url TEXT, tg_message_id INTEGER, posted_at TEXT DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS mirror_posts ( id INTEGER PRIMARY KEY AUTOINCREMENT, article_id INTEGER NOT NULL REFERENCES articles(id), mirror_name TEXT NOT NULL, mirror_label TEXT, mirror_wp_id INTEGER, mirror_url TEXT, status TEXT DEFAULT 'pending', error TEXT, posted_at TEXT DEFAULT (datetime('now')), UNIQUE(article_id, mirror_name) ); """) # Seed default prompt c.execute("SELECT COUNT(*) FROM prompts") if c.fetchone()[0] == 0: c.execute(""" INSERT INTO prompts (name, system_prompt, is_default) VALUES ( 'Standard', 'Du bist ein erfahrener Redakteur. Schreibe einen vollständigen, gut strukturierten Artikel auf Basis der folgenden Quelle. Ton: {tone} Datum: {date} Formatierung: - Titel als erste Zeile (ohne #) - Dann den Artikeltext in HTML (H2, H3,

,