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:
@@ -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); });
|
||||
|
||||
Reference in New Issue
Block a user