feat: automatische Content-Pipeline (release → pairs → übersetzen → audio → ready)

- pictures.pipeline_* Spalten + app_settings Tabelle (Migration)
- lib/placeholders.js: Placeholder-Auflösung; TTS spricht keine UUIDs mehr
- lib/pairContent.js: geteilte Pair-Logik (Readiness mit Skip-Optionen)
- lib/generatePairs.js: Claude-Generierung (konfigurierbare Anzahl, nur
  Nomen/Adjektive bei word-Pairs) + serverseitige Persistenz inkl. object_pairs
- lib/pipeline.js: In-Process-Runner, idempotente Schritte, Boot-Resume
- routes/pipeline.js: release/retry/overview/bundle/settings + Bild-Publish
  (kaskadiert Fragen/Statements/Pairs/Wörter/Objekte/Bild)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 20:52:11 +02:00
parent 29a260e351
commit 6af2428df5
10 changed files with 946 additions and 151 deletions

View File

@@ -43,6 +43,7 @@ app.use('/api/users', auth, require('./routes/users'));
app.use('/api/audios', auth, require('./routes/audios'));
app.use('/api/tts-settings', auth, require('./routes/tts-settings'));
app.use('/api/claude', auth, require('./routes/claude'));
app.use('/api/pipeline', auth, require('./routes/pipeline'));
// 404
app.use((req, res) => {
@@ -56,5 +57,10 @@ app.use((err, req, res, next) => {
});
migrate()
.then(() => app.listen(PORT, '0.0.0.0', () => console.log(`snakkimo-API running on port ${PORT}`)))
.then(() => {
app.listen(PORT, '0.0.0.0', () => console.log(`snakkimo-API running on port ${PORT}`));
// Hängengebliebene Pipeline-Läufe (z.B. nach Redeploy) wieder aufnehmen
require('./lib/pipeline').resumePending()
.catch(err => console.error('Pipeline-Resume fehlgeschlagen:', err));
})
.catch(err => { console.error('Migration failed:', err); process.exit(1); });